diff --git a/Android.mk b/Android.mk
index 159bda0..4251262 100644
--- a/Android.mk
+++ b/Android.mk
@@ -14,6 +14,6 @@
 # limitations under the License.
 #
 
-include cts/CtsNativeTestCase.mk
-include cts/CtsTestCoverage.mk
+include cts/CtsBuild.mk
+include cts/CtsCoverage.mk
 include $(call all-subdir-makefiles)
diff --git a/CtsBuild.mk b/CtsBuild.mk
new file mode 100644
index 0000000..b4273bd
--- /dev/null
+++ b/CtsBuild.mk
@@ -0,0 +1,66 @@
+# 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)
+
+# CTS build rules that are needed to generate the corresponding XML
+# for a test package. CTS needs these XML files to know what tests
+# to run as well as detect which ones were not executed.
+#
+# 1. Replace the regular build command with the CTS variant:
+#
+#    BUILD_EXECUTABLE -> BUILD_CTS_EXECUTABLE
+#    BUILD_PACKAGE -> BUILD_CTS_PACKAGE
+#    BUILD_HOST_JAVA_LIBRARY -> BUILD_HOST_JAVA_LIBRARY
+#
+# 2. Define LOCAL_CTS_TEST_PACKAGE if you are using
+#    BUILD_EXECUTABLE or BUILD_HOST_JAVA_LIBRARY.
+#
+BUILD_CTS_EXECUTABLE := $(LOCAL_PATH)/tools/build/test_executable.mk
+BUILD_CTS_PACKAGE := $(LOCAL_PATH)/tools/build/test_package.mk
+BUILD_CTS_HOST_JAVA_LIBRARY := $(LOCAL_PATH)/tools/build/test_host_java_library.mk
+
+# Test XMLs, native executables, and packages will be placed in this
+# directory before creating the final CTS distribution.
+CTS_TESTCASES_OUT := $(HOST_OUT)/cts-testcases
+
+# Scanners of source files for tests which are then inputed into
+# the XML generator to produce test XMLs.
+CTS_NATIVE_TEST_SCANNER := $(HOST_OUT_EXECUTABLES)/cts-native-scanner
+CTS_JAVA_TEST_SCANNER := $(HOST_OUT_EXECUTABLES)/cts-java-scanner
+CTS_JAVA_TEST_SCANNER_DOCLET := $(HOST_OUT_JAVA_LIBRARIES)/cts-java-scanner-doclet.jar
+
+# Generator of test XMLs from scanner output.
+CTS_XML_GENERATOR := $(HOST_OUT_EXECUTABLES)/cts-xml-generator
+
+# File indicating which tests should be blacklisted due to problems.
+CTS_EXPECTATIONS := cts/tests/expectations/knownfailures.txt
+
+# Functions to get the paths of the build outputs.
+
+define cts-get-lib-paths
+	$(foreach lib,$(1),$(HOST_OUT_JAVA_LIBRARIES)/$(lib).jar)
+endef
+
+define cts-get-native-paths
+	$(foreach exe,$(1),$(call intermediates-dir-for,EXECUTABLES,$(exe))/$(exe))
+endef
+
+define cts-get-package-paths
+	$(foreach pkg,$(1),$(CTS_TESTCASES_OUT)/$(pkg).apk)
+endef
+
+define cts-get-test-xmls
+	$(foreach name,$(1),$(CTS_TESTCASES_OUT)/$(name).xml)
+endef
diff --git a/CtsTestCoverage.mk b/CtsCoverage.mk
similarity index 100%
rename from CtsTestCoverage.mk
rename to CtsCoverage.mk
diff --git a/CtsHostLibraryList.mk b/CtsHostLibraryList.mk
deleted file mode 100644
index ac9a700..0000000
--- a/CtsHostLibraryList.mk
+++ /dev/null
@@ -1,15 +0,0 @@
-# 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.
-
-CTS_HOST_LIBRARY_JARS := 
diff --git a/CtsNativeTestCase.mk b/CtsNativeTestCase.mk
deleted file mode 100644
index f70ec0c..0000000
--- a/CtsNativeTestCase.mk
+++ /dev/null
@@ -1,32 +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.
-
-# Include this file to gain access to functions to build native CTS
-# test packages. Replace "include $(BUILD_EXECUTABLE)" with
-# "include $(BUILD_CTS_EXECUTABLE)".
-
-LOCAL_PATH := $(call my-dir)
-BUILD_CTS_EXECUTABLE := $(LOCAL_PATH)/tools/build/test_executable.mk
-
-CTS_NATIVE_XML_OUT := $(HOST_OUT)/cts-native-xml
-
-CTS_NATIVE_XML_GENERATOR := $(HOST_OUT_EXECUTABLES)/cts-native-xml-generator
-
-define cts-get-native-paths
-	$(foreach exe,$(1),$(call intermediates-dir-for,EXECUTABLES,$(exe))/$(exe))
-endef
-
-define cts-get-native-xmls
-	$(foreach exe,$(1),$(CTS_NATIVE_XML_OUT)/$(exe).xml)
-endef
diff --git a/CtsTestCaseList.mk b/CtsTestCaseList.mk
index f87d3a3..76eb814 100644
--- a/CtsTestCaseList.mk
+++ b/CtsTestCaseList.mk
@@ -12,7 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-CTS_SECURITY_APPS_LIST := \
+cts_security_apps_list := \
 	CtsAppAccessData \
 	CtsAppWithData \
 	CtsInstrumentationAppDiffCert \
@@ -22,14 +22,31 @@
 	CtsSimpleAppInstall \
 	CtsSimpleAppInstallDiffCert \
 	CtsTargetInstrumentationApp \
-	CtsUsePermissionDiffCert \
+	CtsUsePermissionDiffCert
+
+cts_support_packages := \
+	CtsAccelerationTestStubs \
+	CtsDelegatingAccessibilityService \
+	CtsDeviceAdmin \
 	CtsMonkeyApp \
 	CtsMonkeyApp2 \
+	CtsTestStubs \
+	SignatureTest \
+	TestDeviceSetup \
+	$(cts_security_apps_list)
 
-# These test cases will be analyzed by the CTS API coverage tools. 
-CTS_COVERAGE_TEST_CASE_LIST := \
+cts_external_packages := \
+	com.replica.replicaisland
+
+# Any APKs that need to be copied to the CTS distribution's testcases
+# directory but do not require an associated test package XML.
+CTS_TEST_CASE_LIST := \
+	$(cts_support_packages) \
+	$(cts_external_packages)
+
+# Test packages that require an associated test package XML.
+cts_test_packages := \
 	CtsAccelerationTestCases \
-	CtsAccelerationTestStubs \
 	CtsAccessibilityServiceTestCases \
 	CtsAccountManagerTestCases \
 	CtsAdminTestCases \
@@ -41,6 +58,7 @@
 	CtsDpiTestCases \
 	CtsDpiTestCases2 \
 	CtsDrmTestCases \
+	CtsEffectTestCases \
 	CtsExampleTestCases \
 	CtsGestureTestCases \
 	CtsGraphicsTestCases \
@@ -65,30 +83,39 @@
 	CtsSecurityTestCases \
 	CtsSpeechTestCases \
 	CtsTelephonyTestCases \
-	CtsTestStubs \
 	CtsTextTestCases \
+	CtsThemeTestCases \
 	CtsUtilTestCases \
 	CtsViewTestCases \
 	CtsWebkitTestCases \
 	CtsWidgetTestCases
 
-CTS_TEST_CASE_LIST := \
-	TestDeviceSetup \
-	CtsDelegatingAccessibilityService \
-	CtsDeviceAdmin \
-	com.replica.replicaisland \
-	SignatureTest \
-	ApiDemos \
-	ApiDemosReferenceTest \
-	$(CTS_COVERAGE_TEST_CASE_LIST) \
-	$(CTS_SECURITY_APPS_LIST)
+# All APKs that need to be scanned by the coverage utilities.
+CTS_COVERAGE_TEST_CASE_LIST := \
+	$(cts_support_packages) \
+	$(cts_test_packages)
 
-CTS_NATIVE_EXES := \
-	CtsNativeMediaTestCases
+# Host side only tests
+cts_host_libraries := \
+	CtsAppSecurityTests \
+	CtsMonkeyTestCases
 
-CTS_TEST_CASES := $(call cts-get-native-paths,$(CTS_NATIVE_EXES))
+# Native test executables that need to have associated test XMLs.
+cts_native_exes := \
+	NativeMediaTest_SL \
+	NativeMediaTest_XA
 
-CTS_TEST_XMLS := $(call cts-get-native-xmls,$(CTS_NATIVE_EXES))
+# All the files that will end up under the repository/testcases
+# directory of the final CTS distribution.
+CTS_TEST_CASES := $(call cts-get-lib-paths,$(cts_host_libraries)) \
+		$(call cts-get-package-paths,$(cts_test_packages)) \
+		$(call cts-get-native-paths,$(cts_native_exes))
+
+# All the XMLs that will end up under the repository/testcases
+# and that need to be created before making the final CTS distribution.
+CTS_TEST_XMLS := $(call cts-get-test-xmls,$(cts_host_libraries)) \
+		$(call cts-get-test-xmls,$(cts_test_packages)) \
+		$(call cts-get-test-xmls,$(cts_native_exes))
 
 # The following files will be placed in the tools directory of the CTS distribution
 CTS_TOOLS_LIST :=
diff --git a/apps/CtsVerifier/AndroidManifest.xml b/apps/CtsVerifier/AndroidManifest.xml
index 945419b..d9afe8d 100644
--- a/apps/CtsVerifier/AndroidManifest.xml
+++ b/apps/CtsVerifier/AndroidManifest.xml
@@ -5,9 +5,9 @@
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
      You may obtain a copy of the License at
-  
+
           http://www.apache.org/licenses/LICENSE-2.0
-  
+
      Unless required by applicable law or agreed to in writing, software
      distributed under the License is distributed on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -18,7 +18,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
       package="com.android.cts.verifier"
       android:versionCode="1"
-      android:versionName="4.0.3_r1">
+      android:versionName="1337">
 
     <!-- Using 10 for more complete NFC support... -->
     <uses-sdk android:minSdkVersion="10"></uses-sdk>
@@ -28,17 +28,24 @@
     <uses-permission android:name="android.permission.CAMERA" />
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.NFC" />
+    <uses-feature android:name="android.hardware.camera.front"
+                  android:required="false" />
+    <uses-feature android:name="android.hardware.camera.autofocus"
+                  android:required="false" />
     <uses-permission android:name="android.permission.RECORD_AUDIO" />
     <uses-permission android:name="android.permission.WAKE_LOCK" />
-    
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <uses-feature android:name="android.hardware.usb.accessory" />
+
     <!-- Needed by the Audio Quality Verifier to store the sound samples that will be mailed. -->
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 
-    <application android:label="@string/app_name" 
+    <application android:label="@string/app_name"
             android:icon="@drawable/icon"
-            android:backupAgent="VerifierBackupAgent" 
+            android:backupAgent="VerifierBackupAgent"
             android:debuggable="true">
-            
+
+        <uses-library android:name="com.android.future.usb.accessory" />
         <meta-data android:name="com.google.android.backup.api_key"
                 android:value="AEdPqrEAAAAIbK6ldcOzoeRtQ1u1dFVJ1A7KetRhit-a1Xa82Q" />
 
@@ -70,7 +77,7 @@
 
         <provider android:name=".TestResultsProvider" 
                 android:authorities="com.android.cts.verifier.testresultsprovider" />
-                
+
         <activity android:name=".admin.PolicySerializationTestActivity"
                 android:label="@string/da_policy_serialization_test"
                 android:configChanges="keyboardHidden|orientation">
@@ -117,7 +124,7 @@
             <meta-data android:name="test_category" android:value="@string/test_category_networking" />
             <meta-data android:name="test_required_features" android:value="android.hardware.bluetooth" />
         </activity>
-        
+
         <activity android:name=".bluetooth.BluetoothToggleActivity"
                 android:label="@string/bt_toggle_bluetooth"
                 android:configChanges="keyboardHidden|orientation">
@@ -139,7 +146,7 @@
             <meta-data android:name="test_category" android:value="@string/bt_device_communication" />
             <meta-data android:name="test_parent" android:value="com.android.cts.verifier.bluetooth.BluetoothTestActivity" />
         </activity>
-        
+
         <activity android:name=".bluetooth.InsecureServerActivity"
                 android:label="@string/bt_insecure_server"
                 android:configChanges="keyboardHidden|orientation">
@@ -161,7 +168,7 @@
             <meta-data android:name="test_category" android:value="@string/bt_device_communication" />
             <meta-data android:name="test_parent" android:value="com.android.cts.verifier.bluetooth.BluetoothTestActivity" />
         </activity>
-        
+
         <activity android:name=".bluetooth.InsecureClientActivity"
                 android:label="@string/bt_insecure_client"
                 android:configChanges="keyboardHidden|orientation">
@@ -173,11 +180,33 @@
             <meta-data android:name="test_parent" android:value="com.android.cts.verifier.bluetooth.BluetoothTestActivity" />
         </activity>
 
+        <activity android:name=".bluetooth.ConnectionAccessServerActivity"
+                android:label="@string/bt_connection_access_server"
+                android:configChanges="keyboardHidden|orientation">
+            <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/bt_device_communication" />
+            <meta-data android:name="test_parent" android:value="com.android.cts.verifier.bluetooth.BluetoothTestActivity" />
+        </activity>
+
+        <activity android:name=".bluetooth.ConnectionAccessClientActivity"
+                android:label="@string/bt_connection_access_client"
+                android:configChanges="keyboardHidden|orientation">
+            <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/bt_device_communication" />
+            <meta-data android:name="test_parent" android:value="com.android.cts.verifier.bluetooth.BluetoothTestActivity" />
+        </activity>
+
         <activity android:name=".bluetooth.DevicePickerActivity"
                 android:label="@string/bt_device_picker"
                 android:configChanges="keyboardHidden|orientation" />
 
-        <activity android:name=".suid.SuidFilesActivity" 
+        <activity android:name=".suid.SuidFilesActivity"
                 android:label="@string/suid_files"
                 android:configChanges="keyboardHidden|orientation">
             <intent-filter>
@@ -272,7 +301,19 @@
         <service android:name=".audioquality.ExperimentService" />
 
         <activity android:name=".camera.analyzer.CameraAnalyzerActivity"
-                android:label="@string/camera_analyzer">
+                 android:label="@string/camera_analyzer"
+                 android:screenOrientation="landscape">
+            <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" />
+
+            <intent-filter>
+                <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
+            </intent-filter>
+            <meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
+                android:resource="@xml/accessory_filter_adk" />
         </activity>
 
         <activity android:name=".usb.UsbAccessoryTestActivity"
@@ -288,4 +329,4 @@
 
    </application>
 
-</manifest> 
+</manifest>
diff --git a/apps/CtsVerifier/include/colorchecker/autolocktest.h b/apps/CtsVerifier/include/colorchecker/autolocktest.h
new file mode 100644
index 0000000..0d30bd7
--- /dev/null
+++ b/apps/CtsVerifier/include/colorchecker/autolocktest.h
@@ -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.
+ */
+
+#ifndef AUTOLOCKTEST_H
+#define AUTOLOCKTEST_H
+
+#include <vector>
+
+#include "imagetesthandler.h"
+
+class AutoLockTest : public ImageTestHandler {
+  public:
+    AutoLockTest() : ImageTestHandler() {}
+    AutoLockTest(int debugHeight, int debugWidth) :
+        ImageTestHandler(debugHeight, debugWidth) {}
+    ~AutoLockTest() {}
+
+    void addDataToList(const std::vector<Vec3f>* checkerColors) {
+      mCheckerColors.push_back(*checkerColors);
+      delete checkerColors;
+    }
+
+    void processData();
+
+    void clearData();
+
+    const std::vector<bool>* getComparisonResults() const {
+      return (&mComparisonResults);
+    }
+
+  private:
+    bool IsBrighterThan(const std::vector<Vec3f>* colorCheckers1,
+                        const std::vector<Vec3f>* colorCheckers2) const;
+    bool IsEquivalentTo(const std::vector<Vec3f>* colorCheckers1,
+                        const std::vector<Vec3f>* colorCheckers2) const;
+
+    std::vector<std::vector<Vec3f> > mCheckerColors;
+    std::vector<bool> mComparisonResults;
+    int mNumPatches;
+};
+
+#endif
diff --git a/apps/CtsVerifier/include/colorchecker/colorchecker.h b/apps/CtsVerifier/include/colorchecker/colorchecker.h
deleted file mode 100644
index 5409b04..0000000
--- a/apps/CtsVerifier/include/colorchecker/colorchecker.h
+++ /dev/null
@@ -1,60 +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.
- */
-
-#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/include/colorchecker/colorcheckertest.h b/apps/CtsVerifier/include/colorchecker/colorcheckertest.h
new file mode 100644
index 0000000..f733b32
--- /dev/null
+++ b/apps/CtsVerifier/include/colorchecker/colorcheckertest.h
@@ -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.
+ */
+
+#ifndef COLORCHECKERTEST_H
+#define COLORCHECKERTEST_H
+
+#include <vector>
+#include <string>
+
+#include "testingimage.h"
+#include "imagetesthandler.h"
+
+class ColorCheckerTest : public ImageTestHandler {
+public:
+    ColorCheckerTest() : ImageTestHandler() {
+        mImage = NULL;
+        mSuccess = false;
+    }
+    ColorCheckerTest(int debugHeight, int inputWidth) :
+            ImageTestHandler(debugHeight, inputWidth) {
+        mImage = NULL;
+        mSuccess = false;
+    }
+    ~ColorCheckerTest();
+
+    void addTestingImage(TestingImage* inputImage);
+    void processData();
+
+    const std::vector<std::vector<Vec2f> >* getCheckerCenterAdd() const {
+        std::vector<std::vector<Vec2f> >* returnPositions =
+                new std::vector<std::vector<Vec2f> >(
+                        4, std::vector<Vec2f>(6, Vec2f(0.f, 0.f)));
+
+        for (int i = 0; i < 4; ++i) {
+            for (int j = 0; j < 6; ++j) {
+                (*returnPositions)[i][j] = (*mMatchPositions[i][j]);
+            }
+        }
+        return (returnPositions);
+    }
+
+    const std::vector<std::vector<float> >* getCheckerRadiusAdd() const {
+        std::vector<std::vector<float> >* returnRadius=
+              new std::vector<std::vector<float> >(
+                      4, std::vector<float>(6, 0.f));
+
+        for (int i = 0; i < 4; ++i) {
+            for (int j = 0; j < 6; ++j) {
+                (*returnRadius)[i][j] = mMatchRadius[i][j];
+            }
+        }
+        return (returnRadius);
+    }
+
+    bool getSuccess() const {
+        return mSuccess;
+    }
+
+private:
+    void initializeRefColor();
+
+    void edgeDetection();
+    void computeGradient(unsigned char* layer, float* gradientMap);
+    void houghLineDetection(bool* edgeMap, float* gradientAbsolute,
+                            float* gradientDirection);
+
+    void findCheckerBoards(std::vector<std::vector<int> > linesDir1,
+                           std::vector<std::vector<int> > linesDir2);
+    Vec2f findCrossing(std::vector<int> line1, std::vector<int> line2);
+    void findBestMatch(int i1, int i2, int j1, int j2);
+
+    bool verifyPointPair(Vec2f pointUpperLeft, Vec2f pointBottomRight,
+                         Vec2f* pointCenter, Vec3i* color);
+    void verifyColorGrid();
+
+    void fillRefColorGrid();
+
+    TestingImage* mImage;
+
+    std::vector<std::vector< Vec3i* > > mCandidateColors;
+    std::vector<std::vector< Vec2f* > > mCandidatePositions;
+
+    std::vector<std::vector< Vec3i* > > mReferenceColors;
+    std::vector<std::vector< Vec2f* > > mMatchPositions;
+    std::vector<std::vector< Vec3f* > > mMatchColors;
+    std::vector<std::vector< float > > mMatchRadius;
+
+    bool mSuccess;
+};
+
+#endif
diff --git a/apps/CtsVerifier/include/colorchecker/exposurecompensationtest.h b/apps/CtsVerifier/include/colorchecker/exposurecompensationtest.h
new file mode 100644
index 0000000..0ad70dc
--- /dev/null
+++ b/apps/CtsVerifier/include/colorchecker/exposurecompensationtest.h
@@ -0,0 +1,59 @@
+/*
+ * 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 EXPOSURECOMPENSATIONTEST_H
+#define EXPOSURECOMPENSATIONTEST_H
+
+#include <vector>
+
+#include "imagetesthandler.h"
+
+class ExposureCompensationTest : public ImageTestHandler {
+  public:
+    ExposureCompensationTest() : ImageTestHandler() {
+        mDebugText = NULL;
+        initializeReferenceColors();
+    }
+    ExposureCompensationTest(int debugHeight, int debugWidth) :
+            ImageTestHandler(debugHeight, debugWidth) {
+        mDebugText = NULL;
+        initializeReferenceColors();
+    }
+    ~ExposureCompensationTest() {}
+
+    void addDataToList(const float exposureValue,
+                  const std::vector<Vec3f>* checkerColors) {
+        mExposureValues.push_back(exposureValue);
+        mCheckerColors.push_back(*checkerColors);
+    }
+
+    const char* getDebugText() {
+        return mDebugText;
+    }
+
+    void processData();
+
+  private:
+    void initializeReferenceColors();
+
+    std::vector<std::vector<Vec3f> > mCheckerColors;
+    std::vector<Vec3i> mReferenceColors;
+    std::vector<float> mExposureValues;
+
+    char* mDebugText;
+};
+
+#endif
diff --git a/apps/CtsVerifier/include/colorchecker/imagetesthandler.h b/apps/CtsVerifier/include/colorchecker/imagetesthandler.h
new file mode 100644
index 0000000..d66a1d2
--- /dev/null
+++ b/apps/CtsVerifier/include/colorchecker/imagetesthandler.h
@@ -0,0 +1,57 @@
+/*
+ * 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 IMAGETESTHANDLER_H
+#define IMAGETESTHANDLER_H
+
+#include "vec2.h"
+#include "vec3.h"
+
+class ImageTestHandler{
+  public:
+    ImageTestHandler() {
+        initDebugImage();
+    }
+    ImageTestHandler(int debugHeight, int debugWidth) {
+        initDebugImage(debugHeight, debugWidth);
+    }
+    virtual ~ImageTestHandler() { delete[] mDebugOutput; }
+
+    virtual void processData() {}
+
+    int getDebugWidth() const { return mDebugWidth; }
+    int getDebugHeight() const { return mDebugHeight; }
+    const unsigned char* debug_output() const { return mDebugOutput; }
+    void copyDebugImage(int inputHeight, int inputWidth,
+                        const unsigned char* inputImage);
+
+    void drawPoint(const Vec2i &point, const Vec3i &color);
+    void drawPoint(int row, int column, const Vec3i &color);
+    void drawLine(int angle, int radius, const Vec3i &color);
+
+  protected:
+    void clearDebugImage();
+
+  private:
+    void initDebugImage();
+    void initDebugImage(int debugHeight, int debugWidth);
+
+    unsigned char* mDebugOutput;
+    int mDebugWidth;
+    int mDebugHeight;
+};
+
+#endif
diff --git a/apps/CtsVerifier/include/colorchecker/meteringtest.h b/apps/CtsVerifier/include/colorchecker/meteringtest.h
new file mode 100644
index 0000000..3115d93
--- /dev/null
+++ b/apps/CtsVerifier/include/colorchecker/meteringtest.h
@@ -0,0 +1,59 @@
+/*
+ * 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 METERINGTEST_H
+#define METERINGTEST_H
+
+#include <vector>
+
+#include "imagetesthandler.h"
+
+// Constructs a test handler for the metering test. The instance holds the pixel
+// values of the gray checkers on the color checker under different metering
+// settins. It can also compare two arrays of pixel values to tell whether one
+// is brighter or equivalent or darker than the other one.
+class MeteringTest : public ImageTestHandler {
+  public:
+    MeteringTest() : ImageTestHandler() {}
+    MeteringTest(const int debugHeight, const int debugWidth) :
+            ImageTestHandler(debugHeight, debugWidth) {}
+    ~MeteringTest() {}
+
+    void addDataToList(const std::vector<Vec3f>* checkerColors) {
+        mCheckerColors.push_back(*checkerColors);
+        delete checkerColors;
+    }
+
+    void processData();
+
+    void clearData();
+
+    const std::vector<bool>* getComparisonResults() const {
+        return (&mComparisonResults);
+    }
+
+  private:
+    bool isDarkerThan(const std::vector<Vec3f>* checkerColors1,
+                      const std::vector<Vec3f>* checkerColors2) const;
+    bool isEquivalentTo(const std::vector<Vec3f>* checkerColors1,
+                        const std::vector<Vec3f>* checkerColors2) const;
+
+    std::vector<std::vector<Vec3f> > mCheckerColors;
+    std::vector<bool> mComparisonResults;
+    int mNumPatches;
+};
+
+#endif
diff --git a/apps/CtsVerifier/include/colorchecker/testingimage.h b/apps/CtsVerifier/include/colorchecker/testingimage.h
new file mode 100644
index 0000000..f9649d5
--- /dev/null
+++ b/apps/CtsVerifier/include/colorchecker/testingimage.h
@@ -0,0 +1,69 @@
+/*
+ * 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 TESTINGIMAGE_H
+#define TESTINGIMAGE_H
+
+#include <vector>
+#include "vec3.h"
+#include "vec2.h"
+
+// Implements a class for image representation.
+class TestingImage {
+  public:
+    // Constructs a new instance with the inputImage's row and column counts.
+    // No change in size.
+    TestingImage(const unsigned char* inputImage,
+                 int inputWidth, int inputHeight,
+                 int inputChannels, int inputRowSpan);
+    // Constructs a new instance with an inputImage but resize it to a given
+    // new size.
+    TestingImage(const unsigned char* inputImage,
+                 int inputHeight, int inputWidth,
+                 int inputChannel, int inputRowSpan,
+                 int newHeight, int newWidth);
+    virtual ~TestingImage();
+
+    // Reads the pixel value of a given location.
+    int getPixelValue(int row, int column, int channel) const;
+    Vec3i getPixelValue(int row, int column) const;
+    Vec3i getPixelValue(const Vec2i &pixelPosition) const;
+    Vec3i getPixelValue(const Vec2f &pixelPosition) const;
+
+    inline const unsigned char* getImage() const { return mImage; }
+    inline int getWidth() const { return mWidth; }
+    inline int getHeight() const { return mHeight; }
+    inline int getChannels() const { return mChannels; }
+    inline int getRowSpan() const { return mRowSpan; }
+
+    // Reads the colors of a color checker in the image with the given checker
+    // coordinates including centers and radius.
+    const std::vector<Vec3f>* getColorChecker(
+            int rowStart, int rowEnd, int columnStart, int columnEnd,
+            const std::vector<std::vector< Vec2f > >* centerAddress,
+            const std::vector<std::vector< float > >* radiusAddress) const;
+
+    // Computes the luminance value of a color image.
+    bool rgbToGrayScale(unsigned char* grayLayer) const;
+
+  private:
+    unsigned char* mImage;
+    int mWidth;
+    int mHeight;
+    int mRowSpan;
+    int mChannels;
+};
+
+#endif
diff --git a/apps/CtsVerifier/include/colorchecker/vec2.h b/apps/CtsVerifier/include/colorchecker/vec2.h
new file mode 100644
index 0000000..9de614c
--- /dev/null
+++ b/apps/CtsVerifier/include/colorchecker/vec2.h
@@ -0,0 +1,77 @@
+/*
+ * 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 VEC2_H
+#define VEC2_H
+
+#include <assert.h>
+#include <cmath>
+
+// Implements a class to represent the location of a pixel.
+template <class T>
+class Vec2{
+  public:
+    Vec2(T inputX, T inputY) {
+        mX = inputX;
+        mY = inputY;
+    }
+
+    Vec2() {}
+
+    inline Vec2<T> operator+ (const Vec2<T> &param) const {
+        Vec2<T> temp(mX + param.x(), mY + param.y());
+        return temp;
+    }
+
+    inline Vec2<T> operator- (const Vec2<T> &param) const {
+        Vec2<T> temp(mX - param.x(), mY - param.y());
+        return temp;
+    }
+
+    inline Vec2<float> operator/ (const int param) const {
+        Vec2<float> temp();
+        assert(param != 0);
+        temp.set(static_cast<float>(mX) / static_cast<float>(param),
+                 static_cast<float>(mY) / static_cast<float>(param));
+
+        return temp;
+    }
+
+    template <class U>
+    float squareDistance(const Vec2<U> &param) const {
+        int difference = 0.f;
+        difference = (static_cast<float>(mX) - static_cast<float>(param.x())) *
+              (static_cast<float>(mX) - static_cast<float>(param.x())) +
+              (static_cast<float>(mY) - static_cast<float>(param.y())) *
+              (static_cast<float>(mY) - static_cast<float>(param.y()));
+        return difference;
+    }
+
+    inline T x() const { return mX; }
+    inline T y() const { return mY; }
+
+    inline void set(const T inputX, const T inputY) {
+        mX = inputX;
+        mY = inputY;
+    }
+
+  private:
+    T mX;
+    T mY;
+};
+
+typedef Vec2<int> Vec2i;
+typedef Vec2<float> Vec2f;
+#endif
diff --git a/apps/CtsVerifier/include/colorchecker/vec3.h b/apps/CtsVerifier/include/colorchecker/vec3.h
new file mode 100644
index 0000000..1d48188
--- /dev/null
+++ b/apps/CtsVerifier/include/colorchecker/vec3.h
@@ -0,0 +1,116 @@
+/*
+ * 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 VEC3_H
+#define VEC3_H
+
+#include <assert.h>
+#include <cmath>
+
+// Implementes a class to represent the pixel value in a 3-dimensional color
+// space. The colors are all represented by int as it is mostly used as RGB.
+template <class T>
+class Vec3{
+  public:
+    Vec3(T inputRed, T inputGreen, T inputBlue) {
+        mRed = inputRed;
+        mGreen = inputGreen;
+        mBlue = inputBlue;
+    }
+
+    Vec3() {}
+
+    template <class U>
+    inline Vec3<T> operator+ (const Vec3<U> &param) const {
+        Vec3<T> temp(mRed + param.r(), mGreen + param.g(), mBlue + param.b());
+        return temp;
+    }
+
+    inline Vec3<T> operator- (const Vec3<T> &param) const {
+        Vec3<T> temp(mRed - param.r(), mGreen - param.g(), mBlue - param.b());
+        return temp;
+    }
+
+    inline Vec3<T> operator* (const int param) const {
+        Vec3<T> temp(mRed * param, mGreen * param, mBlue * param);
+        return temp;
+    }
+
+    template <class U>
+    inline Vec3<float> operator* (const Vec3<U> &param) const {
+        Vec3<float> temp(mRed * static_cast<U>(param.r()),
+                         mGreen * static_cast<U>(param.g()),
+                         mBlue * static_cast<U>(param.b()));
+        return temp;
+    }
+
+
+    inline Vec3<float> operator/ (const int param) const {
+        Vec3<float> temp;
+        assert(param != 0);
+        temp.set(static_cast<float>(mRed) / static_cast<float>(param),
+                 static_cast<float>(mGreen) / static_cast<float>(param),
+                 static_cast<float>(mBlue) / static_cast<float>(param));
+        return temp;
+    }
+
+    template <class U>
+    inline Vec3<float> operator/ (const Vec3<U> &param) const {
+        Vec3<float> temp;
+        assert((param.r() != 0.f) && (param.g() != 0.f) && (param.b() != 0.f));
+        temp.set(static_cast<float>(mRed) / static_cast<float>(param.r()),
+                 static_cast<float>(mGreen) / static_cast<float>(param.g()),
+                 static_cast<float>(mBlue) / static_cast<float>(param.b()));
+        return temp;
+    }
+
+    template <class U>
+    float squareDistance(const Vec3<U> &param) const {
+        float difference = 0.f;
+        difference = static_cast<float>(mRed - param.r()) *
+                static_cast<float>(mRed - param.r()) +
+                static_cast<float>(mGreen - param.g()) *
+                static_cast<float>(mGreen - param.g()) +
+                static_cast<float>(mBlue - param.b()) *
+                static_cast<float>(mBlue - param.b());
+        return difference;
+    }
+
+    // Assumes conversion from sRGB to luminance.
+    float convertToLuminance() const {
+        return (0.299 * static_cast<float>(mRed) +
+                0.587 * static_cast<float>(mGreen) +
+                0.114 * static_cast<float>(mBlue));
+    }
+
+    inline T r() const { return mRed; }
+    inline T g() const { return mGreen; }
+    inline T b() const { return mBlue; }
+
+    inline void set(const T inputRed, const T inputGreen, const T inputBlue){
+        mRed = inputRed;
+        mGreen = inputGreen;
+        mBlue = inputBlue;
+    }
+
+  private:
+    T mRed;
+    T mGreen;
+    T mBlue;
+};
+
+typedef Vec3<int> Vec3i;
+typedef Vec3<float> Vec3f;
+#endif
diff --git a/apps/CtsVerifier/include/colorchecker/whitebalancetest.h b/apps/CtsVerifier/include/colorchecker/whitebalancetest.h
new file mode 100644
index 0000000..a347ff0
--- /dev/null
+++ b/apps/CtsVerifier/include/colorchecker/whitebalancetest.h
@@ -0,0 +1,59 @@
+/*
+ * 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 WHITEBALANCETEST_H
+#define WHITEBALANCETEST_H
+
+#include <vector>
+#include <string>
+
+#include "imagetesthandler.h"
+
+class WhiteBalanceTest : public ImageTestHandler {
+  public:
+    WhiteBalanceTest() : ImageTestHandler() {}
+    WhiteBalanceTest(int debugHeight, int debugWidth) :
+            ImageTestHandler(debugHeight, debugWidth) {}
+    ~WhiteBalanceTest() {}
+
+    void addDataToList(const std::string &mode,
+                       const std::vector<Vec3f>* checkerColors) {
+        mMode = mode;
+        mCheckerColors = *checkerColors;
+        delete checkerColors;
+    }
+
+    void processData();
+
+    int getCorrelatedColorTemp() const {
+        return mCorrelatedColorTemp;
+    }
+
+    int getAutoTemp();
+
+  private:
+    int findCorrelatedColorTemp(const Vec3f &whitePoint);
+    Vec3f initializeFromRGB(const Vec3f &rgb);
+    float convertToLinear(float color);
+
+    std::string mMode;
+    std::vector<Vec3f> mCheckerColors;
+    std::vector<Vec3f> mCheckerXyzColors;
+    std::vector<Vec3f> mXyzColorsDaylight;
+    int mCorrelatedColorTemp;
+};
+
+#endif
diff --git a/apps/CtsVerifier/jni/audioquality/LinearityTestRms.cpp b/apps/CtsVerifier/jni/audioquality/LinearityTestRms.cpp
index cf47ec7..d83b056 100644
--- a/apps/CtsVerifier/jni/audioquality/LinearityTestRms.cpp
+++ b/apps/CtsVerifier/jni/audioquality/LinearityTestRms.cpp
@@ -260,10 +260,10 @@
     float outDet;
     if(!solveLeastSquares(levels, rmsValues, numSignals, NO_COEFFS,
                           coeffs, &outDet)) {
-        LOGI(" solveLeastSquares fails with det %f", outDet);
+        ALOGI(" solveLeastSquares fails with det %f", outDet);
         return ERROR_LINEAR_FITTING;
     }
-    LOGI(" coeffs offset %f linear %f", coeffs[0], coeffs[1]);
+    ALOGI(" coeffs offset %f linear %f", coeffs[0], coeffs[1]);
     float maxDev = 0.0f;
     for(int i = 0; i < numSignals; i++) {
         float residue = coeffs[0] + coeffs[1] * levels[i] - rmsValues[i];
@@ -271,7 +271,7 @@
         // then normalize
         float devInDb = 20.0f * log10f((fabs(residue) + rmsValues[i])
                                        / rmsValues[i]);
-        LOGI(" %d-th residue %f dB", i, devInDb);
+        ALOGI(" %d-th residue %f dB", i, devInDb);
         if (devInDb > maxDev) {
             maxDev = devInDb;
         }
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/Android.mk b/apps/CtsVerifier/jni/cameraanalyzer/Android.mk
index ccc0998..2859074 100644
--- a/apps/CtsVerifier/jni/cameraanalyzer/Android.mk
+++ b/apps/CtsVerifier/jni/cameraanalyzer/Android.mk
@@ -16,12 +16,18 @@
 LOCAL_PATH := $(call my-dir)
 
 include $(CLEAR_VARS)
+include external/stlport/libstlport.mk
 
 LOCAL_MODULE := libcameraanalyzer
 
 LOCAL_MODULE_TAGS := optional
 
-LOCAL_SRC_FILES := com_android_cts_verifier_camera_analyzer_ColorChecker.cpp
+LOCAL_SRC_FILES := com_android_cts_verifier_camera_analyzer_CameraTests.cpp \
+                com_android_cts_verifier_camera_analyzer_ColorCheckerTest.cpp \
+                com_android_cts_verifier_camera_analyzer_ExposureCompensationTest.cpp \
+                com_android_cts_verifier_camera_analyzer_AutoLockTest.cpp \
+                com_android_cts_verifier_camera_analyzer_MeteringTest.cpp \
+                com_android_cts_verifier_camera_analyzer_WhiteBalanceTest.cpp
 
 LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../include/colorchecker $(JNI_H_INCLUDE)
 
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_AutoLockTest.cpp b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_AutoLockTest.cpp
new file mode 100644
index 0000000..fac39e1
--- /dev/null
+++ b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_AutoLockTest.cpp
@@ -0,0 +1,95 @@
+/*
+ * 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
+
+#define LOG_TAG "AutoLockJNI"
+#include <utils/Log.h>
+#include "com_android_cts_verifier_camera_analyzer_AutoLockTest.h"
+
+#include <vector>
+#include <string>
+#include <string.h>
+
+#include "testingimage.h"
+#include "autolocktest.h"
+#include "vec2.h"
+#include "android/bitmap.h"
+
+jlong Java_com_android_cts_verifier_camera_analyzer_AutoLockTest_createAutoLockTest(
+        JNIEnv*      env,
+        jobject      thiz) {
+
+    AutoLockTest* testHandler = new AutoLockTest();
+    long handlerAddress = (long)testHandler;
+    return handlerAddress;
+}
+
+void Java_com_android_cts_verifier_camera_analyzer_AutoLockTest_createAutoLockClass(
+        JNIEnv*      env,
+        jobject      thiz,
+        jlong        inputImageAddress,
+        jlong        inputHandlerAddress,
+        jlong        checkercenterAddress,
+        jlong        checkerradiusAddress) {
+
+    ALOGV("JNI createAutoLockClass starts!");
+    long imageAddress = (long)inputImageAddress;
+    long handlerAddress = (long)inputHandlerAddress;
+
+    TestingImage *image = (TestingImage*) imageAddress;
+    AutoLockTest *testHandler = (AutoLockTest*) handlerAddress;
+
+    std::vector<std::vector< Vec2f > >* checkerCenter =
+            (std::vector<std::vector< Vec2f > >*) (long) checkercenterAddress;
+    std::vector<std::vector< float > >* checkerRadius =
+            (std::vector<std::vector< float > >*) (long) checkerradiusAddress;
+    ALOGV("Classes recovered");
+
+    // Uses only the gray patches on the color checker for comparison.
+    testHandler->addDataToList(image->getColorChecker(3, 4, 0, 6,
+                                                      checkerCenter,
+                                                      checkerRadius));
+
+    delete image;
+}
+
+void Java_com_android_cts_verifier_camera_analyzer_AutoLockTest_processAutoLockTest(
+        JNIEnv*          env,
+        jobject          thiz,
+        jlong            inputHandlerAddress,
+        jbooleanArray    tempArray) {
+
+    ALOGV("Processing Auto Lock data!");
+
+    long handlerAddress = (long) inputHandlerAddress;
+    AutoLockTest *testHandler = (AutoLockTest*) handlerAddress;
+
+    testHandler->processData();
+
+    // Converts the native boolean array into a java boolean array.
+    const std::vector<bool>* nativeComparisonResults =
+            testHandler->getComparisonResults();
+    jboolean comparisonResults[nativeComparisonResults->size()];
+
+    for (int i = 0; i < nativeComparisonResults->size(); ++i) {
+        comparisonResults[i] = (jboolean) (*nativeComparisonResults)[i];
+    }
+
+    env->SetBooleanArrayRegion(tempArray,
+                               0, nativeComparisonResults->size(),
+                               comparisonResults);
+    testHandler->clearData();
+}
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_AutoLockTest.h b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_AutoLockTest.h
new file mode 100644
index 0000000..dc40bc2
--- /dev/null
+++ b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_AutoLockTest.h
@@ -0,0 +1,52 @@
+/*
+ * 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_AUTOLOCKTEST_H
+#define JNI_CAMERAANALYZER_AUTOLOCKTEST_H
+
+#include <jni.h>
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+JNIEXPORT jlong JNICALL
+Java_com_android_cts_verifier_camera_analyzer_AutoLockTest_createAutoLockTest(
+        JNIEnv*      env,
+        jobject      thiz);
+
+JNIEXPORT void JNICALL
+Java_com_android_cts_verifier_camera_analyzer_AutoLockTest_createAutoLockClass(
+        JNIEnv *env,
+        jobject thiz,
+        jlong inputImageAddress,
+        jlong inputHandlerAddress,
+        jlong checkercenterAddress,
+        jlong checkerradiusAddress);
+
+JNIEXPORT void JNICALL
+Java_com_android_cts_verifier_camera_analyzer_AutoLockTest_processAutoLockTest(
+        JNIEnv*      env,
+        jobject      thiz,
+        jlong        inputHandlerAddress,
+        jbooleanArray    tempArray);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_CameraTests.cpp b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_CameraTests.cpp
new file mode 100644
index 0000000..83f5c17
--- /dev/null
+++ b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_CameraTests.cpp
@@ -0,0 +1,223 @@
+/*
+ * 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
+
+#define LOG_TAG "CameraTestsJNI"
+#include <utils/Log.h>
+#include "com_android_cts_verifier_camera_analyzer_CameraTests.h"
+#include "android/bitmap.h"
+#include "testingimage.h"
+#include "imagetesthandler.h"
+
+#include <string.h>
+
+jlong Java_com_android_cts_verifier_camera_analyzer_CameraTests_findNative(
+        JNIEnv*      env,
+        jobject      thiz,
+        jobject      inputBitmap) {
+
+    ALOGV("JNI findNative starts!");
+
+    // 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) {
+        ALOGE("Only RGBA_8888 and RGB_565 bitmaps are supported, type was %d.",
+             inputInfo.format);
+    }
+
+    // Get some references to the fields and class type of ColorChecker
+    jclass thizCls = env->GetObjectClass(thiz);
+    ALOGV("ColorChecker field and classes reference finished!");
+
+    // Get raw inputs and outputs ready
+    uint8_t *inputBuffer = NULL;
+    int result = AndroidBitmap_lockPixels(
+            env,
+            inputBitmap,
+            reinterpret_cast<void**>(&inputBuffer));
+
+    if (result != ANDROID_BITMAP_RESUT_SUCCESS) {
+        ALOGE("Unable to lock input bitmap");
+    }
+
+    uint8_t *outputImage = NULL;
+    int outputWidth, outputHeight;
+
+    ALOGV("Input and output images created!");
+
+    // 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;
+
+            ALOGV("RGB_565 Format with width, height and stride as %d, %d, %d",
+                 inputInfo.width, inputInfo.height, inputStride);
+            break;
+        }
+        case ANDROID_BITMAP_FORMAT_RGBA_8888: {
+            // Already in RGBA
+            inputBufferRGBA = inputBuffer;
+            inputStride = inputInfo.stride;
+            ALOGV("RGB_8888 Format with width, height and stride as %d, %d, %d",
+                 inputInfo.width, inputInfo.height, inputStride);
+            break;
+        }
+    }
+
+    TestingImage *input_testing_image =
+            new TestingImage(inputBufferRGBA, inputInfo.height, inputInfo.width,
+                             4, inputStride, 120, 160);
+
+    long lp = (long)input_testing_image;
+
+    result = AndroidBitmap_unlockPixels(env, inputBitmap);
+    if (result != ANDROID_BITMAP_RESUT_SUCCESS) {
+        ALOGE("Unable to unlock input bitmap");
+    }
+
+    if (freeInputRGBA) {
+        ALOGV("Deleteing inputbufferRGBA");
+        delete[] inputBufferRGBA;
+    }
+
+    return lp;
+    ALOGV("Input format switched!");
+}
+
+jlong Java_com_android_cts_verifier_camera_analyzer_CameraTests_createImageTestHandler(
+        JNIEnv*      env,
+        jobject      thiz,
+        jint         debugHeight,
+        jint         debugWidth) {
+
+    ImageTestHandler* testHandler =
+            new ImageTestHandler(debugHeight, debugWidth);
+    long handlerAddress = (long)testHandler;
+    return handlerAddress;
+}
+
+void Java_com_android_cts_verifier_camera_analyzer_CameraTests_cleanUpHandler(
+        JNIEnv*      env,
+        jobject      thiz,
+        jlong        inputHandlerAddress) {
+
+    ImageTestHandler* testHandler = (ImageTestHandler*) (long) inputHandlerAddress;
+    delete testHandler;
+}
+
+void Java_com_android_cts_verifier_camera_analyzer_CameraTests_displayHandlerDebugOutput(
+        JNIEnv*      env,
+        jobject      thiz,
+        jlong        inputHandlerAddress) {
+
+    jclass thizCls = env->GetObjectClass(thiz);
+    jfieldID outputId = env->GetFieldID(thizCls, "mDebugOutput",
+                                        "Landroid/graphics/Bitmap;");
+
+    ImageTestHandler* testHandler = (ImageTestHandler*) (long) inputHandlerAddress;
+    uint8_t *outputImage =  new uint8_t[testHandler->getDebugHeight() *
+                                        testHandler->getDebugWidth() * 4];
+
+    const unsigned char *debugoutput = testHandler->debug_output();
+    memcpy(outputImage, debugoutput, testHandler->getDebugHeight() *
+            testHandler->getDebugWidth() * 4);
+
+    int outputWidth = testHandler->getDebugWidth();
+    int outputHeight = testHandler->getDebugHeight();
+    bool success = false;
+
+    if (outputImage == NULL) {
+        ALOGV("output Image is null!");
+    } else {
+        ALOGV("output Image is ready!");
+    }
+
+    // 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) {
+            ALOGE("Unable to lock output bitmap");
+        }
+
+        memcpy(outputBuffer, outputImage, outputWidth * outputHeight * 4);
+
+        result = AndroidBitmap_unlockPixels(env, outputBitmap);
+        if (result != ANDROID_BITMAP_RESUT_SUCCESS) {
+            ALOGE("Unable to unlock output bitmap");
+        }
+
+        // Write new Bitmap reference into mDebugOutput class member
+        env->SetObjectField(thiz, outputId, outputBitmap);
+        ALOGV("Copied to outputBitmap");
+        delete [] outputImage;
+        env->DeleteLocalRef(outputBitmap);
+        env->DeleteLocalRef(rgbaConfig);
+        env->DeleteLocalRef(bitmapClass);
+        env->DeleteLocalRef(bitmapConfigClass);
+    }
+}
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_CameraTests.h b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_CameraTests.h
new file mode 100644
index 0000000..e071dc1
--- /dev/null
+++ b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_CameraTests.h
@@ -0,0 +1,57 @@
+/*
+ * 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_CAMERATESTS_H
+#define JNI_CAMERAANALYZER_CAMERATESTS_H
+
+#include <jni.h>
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+JNIEXPORT jlong JNICALL
+Java_com_android_cts_verifier_camera_analyzer_CameraTests_findNative(
+        JNIEnv *env,
+        jobject thiz,
+        jobject inputBitmap);
+
+JNIEXPORT jlong JNICALL
+Java_com_android_cts_verifier_camera_analyzer_CameraTests_createImageTestHandler(
+        JNIEnv*      env,
+        jobject      thiz,
+        jint         debugHeight,
+        jint         debugWidth);
+
+JNIEXPORT void JNICALL
+Java_com_android_cts_verifier_camera_analyzer_CameraTests_cleanUpHandler(
+        JNIEnv*      env,
+        jobject      thiz,
+        jlong        inputHandlerAddress);
+
+JNIEXPORT void JNICALL
+Java_com_android_cts_verifier_camera_analyzer_CameraTests_displayHandlerDebugOutput(
+        JNIEnv*      env,
+        jobject      thiz,
+        jlong        inputHandlerAddress);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
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
deleted file mode 100644
index 4d247ab..0000000
--- a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ColorChecker.cpp
+++ /dev/null
@@ -1,170 +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.
- */
-
-#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
deleted file mode 100644
index a9b4487..0000000
--- a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ColorChecker.h
+++ /dev/null
@@ -1,37 +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.
- */
-
-#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/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ColorCheckerTest.cpp b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ColorCheckerTest.cpp
new file mode 100644
index 0000000..94e3ac2
--- /dev/null
+++ b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ColorCheckerTest.cpp
@@ -0,0 +1,84 @@
+/*
+ * 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
+
+#define LOG_TAG "FindColorCheckerJNI"
+#include <utils/Log.h>
+#include "com_android_cts_verifier_camera_analyzer_ColorCheckerTest.h"
+
+#include <string.h>
+#include "android/bitmap.h"
+#include "colorcheckertest.h"
+#include "testingimage.h"
+
+jlong Java_com_android_cts_verifier_camera_analyzer_ColorCheckerTest_createColorCheckerTest(
+        JNIEnv*      env,
+        jobject      thiz,
+        jint         debugHeight,
+        jint         debugWidth) {
+    ColorCheckerTest* testHandler = new ColorCheckerTest(debugHeight,
+                                                         debugWidth);
+    long testHandlerAddress = (long)testHandler;
+    return testHandlerAddress;
+}
+
+void Java_com_android_cts_verifier_camera_analyzer_ColorCheckerTest_createColorCheckerClass(
+        JNIEnv*      env,
+        jobject      thiz,
+        jlong        inputImageAddress,
+        jlong        inputHandlerAddress) {
+    ALOGV("JNI createColorCheckerClass starts!");
+
+    TestingImage *testImage = (TestingImage*) (long) inputImageAddress;
+    ColorCheckerTest *testHandler = (ColorCheckerTest*)
+            (long) inputHandlerAddress;
+
+    testHandler->addTestingImage(testImage);
+}
+
+jboolean Java_com_android_cts_verifier_camera_analyzer_ColorCheckerTest_processColorCheckerTest(
+        JNIEnv*      env,
+        jobject      thiz,
+        jlong        inputHandlerAddress) {
+
+    ColorCheckerTest *testHandler = (ColorCheckerTest*)
+            (long) inputHandlerAddress;
+    testHandler->processData();
+    return testHandler->getSuccess();
+}
+
+jlong Java_com_android_cts_verifier_camera_analyzer_ColorCheckerTest_getColorCheckerRadiusAdd(
+        JNIEnv*      env,
+        jobject      thiz,
+        jlong        inputHandlerAddress) {
+
+    ColorCheckerTest *testHandler = (ColorCheckerTest*)
+            (long) inputHandlerAddress;
+    long rtn = (long) testHandler->getCheckerRadiusAdd();
+    return rtn;
+}
+
+jlong Java_com_android_cts_verifier_camera_analyzer_ColorCheckerTest_getColorCheckerCenterAdd(
+        JNIEnv*      env,
+        jobject      thiz,
+        jlong        inputHandlerAddress) {
+
+    ColorCheckerTest *testHandler = (ColorCheckerTest*)
+            (long) inputHandlerAddress;
+
+    long rtn = (long) testHandler->getCheckerCenterAdd();
+    return rtn;
+}
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ColorCheckerTest.h b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ColorCheckerTest.h
new file mode 100644
index 0000000..fb87735
--- /dev/null
+++ b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ColorCheckerTest.h
@@ -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.
+ */
+
+#ifndef JNI_CAMERAANALYZER_COLORCHECKERTEST_H
+#define JNI_CAMERAANALYZER_COLORCHECKERTEST_H
+
+#include <jni.h>
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+JNIEXPORT jlong JNICALL
+Java_com_android_cts_verifier_camera_analyzer_ColorCheckerTest_createColorCheckerTest(
+    JNIEnv*      env,
+    jobject      thiz,
+    jint         output_height,
+    jint         output_width);
+
+JNIEXPORT void JNICALL
+Java_com_android_cts_verifier_camera_analyzer_ColorCheckerTest_createColorCheckerClass(
+    JNIEnv *env,
+    jobject thiz,
+    jlong buffer_address,
+    jlong handler_address);
+
+JNIEXPORT jlong JNICALL
+Java_com_android_cts_verifier_camera_analyzer_ColorCheckerTest_getColorCheckerRadiusAdd(
+    JNIEnv *env,
+    jobject thiz,
+    jlong handler_address);
+
+JNIEXPORT jlong JNICALL
+Java_com_android_cts_verifier_camera_analyzer_ColorCheckerTest_getColorCheckerCenterAdd(
+    JNIEnv *env,
+    jobject thiz,
+    jlong handler_address);
+
+JNIEXPORT jboolean JNICALL
+Java_com_android_cts_verifier_camera_analyzer_ColorCheckerTest_processColorCheckerTest(
+    JNIEnv*      env,
+    jobject      thiz,
+    jlong        handler_address);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ExposureCompensationTest.cpp b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ExposureCompensationTest.cpp
new file mode 100644
index 0000000..0224639
--- /dev/null
+++ b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ExposureCompensationTest.cpp
@@ -0,0 +1,88 @@
+/*
+ * 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
+
+#define LOG_TAG "ExposureCompensationJNI"
+#include <utils/Log.h>
+#include <vector>
+#include <string.h>
+
+#include "android/bitmap.h"
+#include "testingimage.h"
+#include "exposurecompensationtest.h"
+#include "vec2.h"
+
+#include "com_android_cts_verifier_camera_analyzer_ExposureCompensationTest.h"
+
+jlong Java_com_android_cts_verifier_camera_analyzer_ExposureCompensationTest_createExposureCompensationTest(
+      JNIEnv*      env,
+      jobject      thiz,
+      jint         debugHeight,
+      jint         debugWidth) {
+
+    ExposureCompensationTest* testHandler =
+            new ExposureCompensationTest(debugHeight, debugWidth);
+    long handlerAddress = (long)testHandler;
+
+    return handlerAddress;
+}
+
+void Java_com_android_cts_verifier_camera_analyzer_ExposureCompensationTest_createExposureCompensationClass(
+        JNIEnv*      env,
+        jobject      thiz,
+        jlong        inputImageAddress,
+        jlong        inputHandlerAddress,
+        jlong        checkerCenterAddress,
+        jlong        checkerRadiusAddress,
+        jfloat       exposureValue) {
+
+    ALOGV("JNI createExposureCompensationClass starts!");
+
+    long imageAddress = (long)inputImageAddress;
+    long handlerAddress = (long)inputHandlerAddress;
+
+    TestingImage *inputImage = (TestingImage*) imageAddress;
+    ExposureCompensationTest *testHandler =
+            (ExposureCompensationTest*) handlerAddress;
+
+    std::vector<std::vector< Vec2f > >* checkerCenter =
+            (std::vector<std::vector< Vec2f > >*) (long) checkerCenterAddress;
+    std::vector<std::vector< float > >* checkerRadius =
+            (std::vector<std::vector< float > >*) (long) checkerRadiusAddress;
+
+    const std::vector<Vec3f>* checkerValue =
+            inputImage->getColorChecker(3, 4, 0, 6,
+                                        checkerCenter, checkerRadius);
+    testHandler->addDataToList((float) exposureValue, checkerValue);
+    delete inputImage;
+    delete checkerValue;
+}
+
+jstring Java_com_android_cts_verifier_camera_analyzer_ExposureCompensationTest_processExposureCompensationTest(
+        JNIEnv*      env,
+        jobject      thiz,
+        jlong        inputHandlerAddress) {
+
+    long handlerAddress = (long) inputHandlerAddress;
+    ExposureCompensationTest *testHandler =
+            (ExposureCompensationTest*) handlerAddress;
+
+    testHandler->processData();
+
+    const char* nativeDebugText = testHandler->getDebugText();
+    ALOGV("%s", nativeDebugText);
+    return env->NewStringUTF(nativeDebugText);
+}
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ExposureCompensationTest.h b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ExposureCompensationTest.h
new file mode 100644
index 0000000..8e8761d
--- /dev/null
+++ b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_ExposureCompensationTest.h
@@ -0,0 +1,54 @@
+/*
+ * 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_EXPOSURECOMPENSATIONTEST_H
+#define JNI_CAMERAANALYZER_EXPOSURECOMPENSATIONTEST_H
+
+#include <jni.h>
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+JNIEXPORT jlong JNICALL
+Java_com_android_cts_verifier_camera_analyzer_ExposureCompensationTest_createExposureCompensationTest(
+        JNIEnv*      env,
+        jobject      thiz,
+        jint         debugHeight,
+        jint         debugWidth);
+
+JNIEXPORT void JNICALL
+Java_com_android_cts_verifier_camera_analyzer_ExposureCompensationTest_createExposureCompensationClass(
+        JNIEnv*      env,
+        jobject      thiz,
+        jlong        inputImageAddress,
+        jlong        inputHandlerAddress,
+        jlong        checkerCenterAddress,
+        jlong        checkerRadiusAddress,
+        jfloat       exposureValue);
+
+
+JNIEXPORT jstring JNICALL
+Java_com_android_cts_verifier_camera_analyzer_ExposureCompensationTest_processExposureCompensationTest(
+        JNIEnv*      env,
+        jobject      thiz,
+        jlong        inputHandlerAddress);
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_MeteringTest.cpp b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_MeteringTest.cpp
new file mode 100644
index 0000000..faebe21
--- /dev/null
+++ b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_MeteringTest.cpp
@@ -0,0 +1,142 @@
+/*
+ * 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
+
+#define LOG_TAG "MeteringJNI"
+#include <utils/Log.h>
+#include "com_android_cts_verifier_camera_analyzer_MeteringTest.h"
+
+#include <vector>
+#include <string>
+#include <string.h>
+#include <math.h>
+
+#include "testingimage.h"
+#include "meteringtest.h"
+#include "vec2.h"
+#include "android/bitmap.h"
+
+jlong Java_com_android_cts_verifier_camera_analyzer_MeteringTest_createMeteringTest(
+        JNIEnv*      env,
+        jobject      thiz) {
+
+    MeteringTest* testHandler = new MeteringTest();
+    long handlerAddress = (long)testHandler;
+    return handlerAddress;
+}
+
+void Java_com_android_cts_verifier_camera_analyzer_MeteringTest_createMeteringClass(
+        JNIEnv*      env,
+        jobject      thiz,
+        jlong        inputImageAddress,
+        jlong        inputHandlerAddress,
+        jlong        checkercenterAddress,
+        jlong        checkerradiusAddress){
+
+    ALOGV("JNI createMeteringClass starts!");
+    long imageAddress = (long)inputImageAddress;
+    long handlerAddress = (long)inputHandlerAddress;
+
+    TestingImage *image = (TestingImage*) imageAddress;
+    MeteringTest *testHandler = (MeteringTest*) handlerAddress;
+
+    std::vector<std::vector< Vec2f > >* checkerCenter =
+            (std::vector<std::vector< Vec2f > >*) (long) checkercenterAddress;
+    std::vector<std::vector< float > >* checkerRadius =
+            (std::vector<std::vector< float > >*) (long) checkerradiusAddress;
+    ALOGV("Classes recovered");
+
+    testHandler->addDataToList(image->getColorChecker(3, 4, 0, 6,
+                                                      checkerCenter,
+                                                      checkerRadius));
+
+    delete image;
+}
+
+void Java_com_android_cts_verifier_camera_analyzer_MeteringTest_processMeteringTest(
+        JNIEnv*          env,
+        jobject          thiz,
+        jlong            inputHandlerAddress,
+        jbooleanArray    tempArray) {
+
+    ALOGV("Processing Auto Lock data!");
+
+    long handlerAddress = (long) inputHandlerAddress;
+    MeteringTest *testHandler = (MeteringTest*) handlerAddress;
+
+    testHandler->processData();
+
+    const std::vector<bool>* nativeComparisonResults =
+            testHandler->getComparisonResults();
+    jboolean jComparisonResults[nativeComparisonResults->size()];
+
+    for (int i = 0; i < nativeComparisonResults->size(); ++i) {
+        jComparisonResults[i] = (jboolean) (*nativeComparisonResults)[i];
+    }
+
+    env->SetBooleanArrayRegion(tempArray,
+                               0, nativeComparisonResults->size(),
+                               jComparisonResults);
+    testHandler->clearData();
+}
+
+// Find the gray checker borders from the native array of checker center and
+// radius. Convert the coordinate to the coordinates accepted by Android
+// Camera.Area type, which defines the top left corner to (-1000, -1000) and
+// bottom right corner to (1000, 1000).
+void Java_com_android_cts_verifier_camera_analyzer_MeteringTest_findGreyCoordinates(
+        JNIEnv*      env,
+        jobject      thiz,
+        jintArray    greyCoordinates,
+        jlong        checkercenterAddress,
+        jlong        checkerradiusAddress){
+
+    ALOGV("Start finding grey coordinates");
+
+    std::vector<std::vector< Vec2f > >* checkerCenter =
+            (std::vector<std::vector< Vec2f > >*) (long) checkercenterAddress;
+    std::vector<std::vector< float > >* checkerRadius =
+            (std::vector<std::vector< float > >*) (long) checkerradiusAddress;
+
+    ALOGV("Checker recovered!");
+    int nativeGreyCoordinates[24];
+
+    for (int i = 0; i < 6; ++i) {
+        float radius = sqrt((*checkerRadius)[3][i]);
+        nativeGreyCoordinates[i * 4] = static_cast<int>(
+                ((*checkerCenter)[3][i].y() - radius)
+                / 160.0 * 2000.0 - 1000.0);
+        nativeGreyCoordinates[i * 4 + 1] = static_cast<int>(
+                ((*checkerCenter)[3][i].x() - radius)
+                / 120.0 * 2000.0 - 1000.0);
+        nativeGreyCoordinates[i * 4 + 2] = static_cast<int>(
+                ((*checkerCenter)[3][i].y() + radius)
+                / 160.0 * 2000.0 - 1000.0);
+        nativeGreyCoordinates[i * 4 + 3] = static_cast<int>(
+                ((*checkerCenter)[3][i].x() + radius)
+                / 120.0 * 2000.0 - 1000.0);
+
+        ALOGV("checker is bounded by %f, %f, %f",
+             (*checkerCenter)[3][i].x(), (*checkerCenter)[3][i].y(), radius);
+
+        ALOGV("Square is bounded by %d, %d, %d, %d",
+             nativeGreyCoordinates[i * 4], nativeGreyCoordinates[i * 4 + 1],
+             nativeGreyCoordinates[i * 4 + 2],
+             nativeGreyCoordinates[i * 4 + 3]);
+    }
+
+    env->SetIntArrayRegion(greyCoordinates, 0, 24, nativeGreyCoordinates);
+}
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_MeteringTest.h b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_MeteringTest.h
new file mode 100644
index 0000000..ecc1b96
--- /dev/null
+++ b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_MeteringTest.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 JNI_CAMERAANALYZER_METERINGTEST_H
+#define JNI_CAMERAANALYZER_METERINGTEST_H
+
+#include <jni.h>
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+JNIEXPORT jlong JNICALL
+Java_com_android_cts_verifier_camera_analyzer_MeteringTest_createMeteringTest(
+        JNIEnv*      env,
+        jobject      thiz);
+
+JNIEXPORT void JNICALL
+Java_com_android_cts_verifier_camera_analyzer_MeteringTest_createMeteringClass(
+        JNIEnv *env,
+        jobject thiz,
+        jlong inputAddress,
+        jlong handlerAddress,
+        jlong checkercenterAddress,
+        jlong checkerradiusAddress);
+
+JNIEXPORT void JNICALL
+Java_com_android_cts_verifier_camera_analyzer_MeteringTest_processMeteringTest(
+        JNIEnv*      env,
+        jobject      thiz,
+        jlong        handlerAddress,
+        jbooleanArray    tempArray);
+
+JNIEXPORT void JNICALL
+Java_com_android_cts_verifier_camera_analyzer_MeteringTest_findGreyCoordinates(
+        JNIEnv*      env,
+        jobject      thiz,
+        jintArray    greyCoordinates,
+        jlong        checkercenterAddress,
+        jlong        checkerradiusAddress);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_WhiteBalanceTest.cpp b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_WhiteBalanceTest.cpp
new file mode 100644
index 0000000..bce0fca
--- /dev/null
+++ b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_WhiteBalanceTest.cpp
@@ -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.
+ */
+#define LOG_NDEBUG 0
+
+#define LOG_TAG "WhiteBalanceJNI"
+#include <utils/Log.h>
+#include "com_android_cts_verifier_camera_analyzer_WhiteBalanceTest.h"
+
+#include <vector>
+#include <string>
+#include <string.h>
+
+#include "testingimage.h"
+#include "whitebalancetest.h"
+#include "vec2.h"
+#include "android/bitmap.h"
+
+jlong Java_com_android_cts_verifier_camera_analyzer_WhiteBalanceTest_createWhiteBalanceTest(
+        JNIEnv*      env,
+        jobject      thiz) {
+
+    WhiteBalanceTest* testHandler = new WhiteBalanceTest();
+    long handlerAddress = (long)testHandler;
+    return handlerAddress;
+}
+
+void Java_com_android_cts_verifier_camera_analyzer_WhiteBalanceTest_createWhiteBalanceClass(
+        JNIEnv*      env,
+        jobject      thiz,
+        jlong        inputImageAddress,
+        jlong        inputHandlerAddress,
+        jlong        checkercenterAddress,
+        jlong        checkerradiusAddress,
+        jstring      whiteBalance){
+
+    ALOGV("JNI createWhiteBalanceClass starts!");
+    long imageAddress = (long)inputImageAddress;
+    long handlerAddress = (long)inputHandlerAddress;
+
+    TestingImage *image = (TestingImage*) imageAddress;
+    WhiteBalanceTest *testHandler = (WhiteBalanceTest*) handlerAddress;
+
+    std::vector<std::vector< Vec2f > >* checkerCenter =
+        (std::vector<std::vector< Vec2f > >*) (long) checkercenterAddress;
+    std::vector<std::vector< float > >* checkerRadius =
+        (std::vector<std::vector< float > >*) (long) checkerradiusAddress;
+    ALOGV("Classes recovered");
+
+    jboolean isCopy;
+    const char* stringWhiteBalance =
+            env->GetStringUTFChars(whiteBalance, &isCopy);
+    ALOGV("White Balance is %s", stringWhiteBalance);
+
+    // Adds the gray checker's RGB values to the test handler.
+    testHandler->addDataToList(stringWhiteBalance,
+                               image->getColorChecker(3, 4, 0, 6,
+                                                      checkerCenter,
+                                                      checkerRadius));
+
+    env->ReleaseStringUTFChars(whiteBalance, stringWhiteBalance);
+    delete image;
+}
+
+jint Java_com_android_cts_verifier_camera_analyzer_WhiteBalanceTest_processWhiteBalanceTest(
+    JNIEnv*      env,
+    jobject      thiz,
+    jlong        inputHandlerAddress) {
+  ALOGV("Processing white balance test");
+
+  long handlerAddress = (long) inputHandlerAddress;
+  WhiteBalanceTest *testHandler = (WhiteBalanceTest*) handlerAddress;
+
+  testHandler->processData();
+
+  ALOGV("CCT is %d", testHandler->getCorrelatedColorTemp());
+  return testHandler->getCorrelatedColorTemp();
+}
diff --git a/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_WhiteBalanceTest.h b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_WhiteBalanceTest.h
new file mode 100644
index 0000000..88cf52e
--- /dev/null
+++ b/apps/CtsVerifier/jni/cameraanalyzer/com_android_cts_verifier_camera_analyzer_WhiteBalanceTest.h
@@ -0,0 +1,53 @@
+/*
+ * 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_WHITEBALANCETEST_H
+#define JNI_CAMERAANALYZER_WHITEBALANCETEST_H
+
+#include <jni.h>
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+JNIEXPORT jlong JNICALL
+Java_com_android_cts_verifier_camera_analyzer_WhiteBalanceTest_createWhiteBalanceTest(
+        JNIEnv*      env,
+        jobject      thiz);
+
+JNIEXPORT void JNICALL
+Java_com_android_cts_verifier_camera_analyzer_WhiteBalanceTest_createWhiteBalanceClass(
+        JNIEnv *env,
+        jobject thiz,
+        jlong inputAddress,
+        jlong handlerAddress,
+        jlong checkercenterAddress,
+        jlong checkerradiusAddress,
+        jstring whiteBalance);
+
+JNIEXPORT jint JNICALL
+Java_com_android_cts_verifier_camera_analyzer_WhiteBalanceTest_processWhiteBalanceTest(
+        JNIEnv*      env,
+        jobject      thiz,
+        jlong        handlerAddress);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/apps/CtsVerifier/lib/colorchecker/Android.mk b/apps/CtsVerifier/lib/colorchecker/Android.mk
index 97f0089..38f595f 100644
--- a/apps/CtsVerifier/lib/colorchecker/Android.mk
+++ b/apps/CtsVerifier/lib/colorchecker/Android.mk
@@ -24,7 +24,16 @@
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE := libcolorchecker
 
-LOCAL_SRC_FILES += colorchecker.cpp
+LOCAL_SRC_FILES += testingimage.cpp \
+                   vec3.cpp \
+                   vec2.cpp \
+                   imagetesthandler.cpp \
+                   colorcheckertest.cpp \
+                   exposurecompensationtest.cpp \
+                   autolocktest.cpp \
+                   meteringtest.cpp \
+                   whitebalancetest.cpp
+
 LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../include/colorchecker
 LOCAL_SHARED_LIBRARIES := libstlport \
                           libcutils \
diff --git a/apps/CtsVerifier/lib/colorchecker/autolocktest.cpp b/apps/CtsVerifier/lib/colorchecker/autolocktest.cpp
new file mode 100644
index 0000000..6bfa922
--- /dev/null
+++ b/apps/CtsVerifier/lib/colorchecker/autolocktest.cpp
@@ -0,0 +1,101 @@
+/*
+ * 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
+
+#define LOG_TAG "AutoLockTest"
+#include <utils/Log.h>
+#include <utils/Timers.h>
+#include <cmath>
+#include <string>
+
+#include "vec2.h"
+#include "vec3.h"
+#include "autolocktest.h"
+
+const float kOverExposure = 230.f;
+const float kEqThreshold = 0.05f;
+// Processes the color checker values and compare the two values from
+// the same individual test.
+void AutoLockTest::processData() {
+    ALOGV("Start Processing Auto Lock Test Data!");
+
+    int numTests = mCheckerColors.size() / 2;
+    mNumPatches = 0;
+
+    if (numTests > 0) {
+        mNumPatches = mCheckerColors[0].size();
+    }
+
+    for (int i = 0; i < numTests; ++i) {
+        mComparisonResults.push_back(
+                IsBrighterThan((&mCheckerColors[i * 2]),
+                               (&mCheckerColors[i * 2 + 1])));
+        mComparisonResults.push_back(
+                IsEquivalentTo((&mCheckerColors[i * 2]),
+                               (&mCheckerColors[i * 2 + 1])));
+    }
+}
+
+// Compares whether one array of gray color patches is brighter than
+// another one.
+bool AutoLockTest::IsBrighterThan(
+        const std::vector<Vec3f>* colorCheckers1,
+        const std::vector<Vec3f>* colorCheckers2) const {
+    float meanRatio = 0.f;
+    int meanNumCount = 0;
+
+    for (int i = 0; i < mNumPatches; ++i) {
+        float luminance1 = (*colorCheckers1)[i].convertToLuminance();
+        float luminance2 = (*colorCheckers2)[i].convertToLuminance();
+
+        // Consider a 5% raise as a considerably large increase.
+        if ((luminance1 < kOverExposure) && (luminance2 != 0.f)) {
+            meanRatio += luminance1 / luminance2;
+            ++meanNumCount;
+        }
+    }
+    meanRatio = meanRatio / meanNumCount;
+
+    return (meanRatio > 1 + kEqThreshold);
+}
+
+// Compares whether one array of gray color patches is within a small range
+// of the other one to be considered equivalent.
+bool AutoLockTest::IsEquivalentTo(
+        const std::vector<Vec3f>* colorCheckers1,
+        const std::vector<Vec3f>* colorCheckers2) const {
+    float meanRatio = 0.f;
+    int meanNumCount = 0;
+
+    for (int i = 0; i < mNumPatches; ++i) {
+        float luminance1 = (*colorCheckers1)[i].convertToLuminance();
+        float luminance2 = (*colorCheckers2)[i].convertToLuminance();
+        ALOGV("Luma_1 and Luma_2 is %f, %f", luminance1, luminance2);
+
+        if ((luminance1 < kOverExposure) && (luminance2 < kOverExposure)) {
+              meanRatio += luminance2 / luminance1;
+              ++meanNumCount;
+        }
+    }
+    meanRatio = meanRatio / meanNumCount;
+
+    return ((meanRatio >= 1 - kEqThreshold) && (meanRatio <= 1 + kEqThreshold));
+}
+
+void AutoLockTest::clearData() {
+    mCheckerColors.clear();
+    mComparisonResults.clear();
+}
diff --git a/apps/CtsVerifier/lib/colorchecker/colorchecker.cpp b/apps/CtsVerifier/lib/colorchecker/colorchecker.cpp
deleted file mode 100644
index 1e0ae97..0000000
--- a/apps/CtsVerifier/lib/colorchecker/colorchecker.cpp
+++ /dev/null
@@ -1,714 +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.
- */
-
-//#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/colorcheckertest.cpp b/apps/CtsVerifier/lib/colorchecker/colorcheckertest.cpp
new file mode 100644
index 0000000..46b8cc8
--- /dev/null
+++ b/apps/CtsVerifier/lib/colorchecker/colorcheckertest.cpp
@@ -0,0 +1,979 @@
+/*
+ * 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
+
+#define LOG_TAG "ColorCheckerTest"
+#include <utils/Log.h>
+#include <utils/Timers.h>
+#include <cmath>
+#include <string>
+
+#include "vec2.h"
+#include "vec3.h"
+#include "colorcheckertest.h"
+
+const float GAMMA_CORRECTION = 2.2f;
+const float COLOR_ERROR_THRESHOLD = 200.f;
+ColorCheckerTest::~ColorCheckerTest() {
+    ALOGV("Deleting color checker test handler");
+
+    if (mImage != NULL) {
+        delete mImage;
+    }
+    ALOGV("Image deleted");
+
+    int numHorizontalLines = mCandidateColors.size();
+    int numVerticalLines = mCandidateColors[0].size();
+
+    for (int i = 0; i < numHorizontalLines; ++i) {
+        for (int j = 0; j < numVerticalLines; ++j) {
+            if (mCandidateColors[i][j] != NULL) {
+                delete mCandidateColors[i][j];
+            }
+            if (mCandidatePositions[i][j] != NULL) {
+                delete mCandidatePositions[i][j];
+            }
+        }
+    }
+    ALOGV("Candidates deleted!");
+
+    for (int i = 0; i < 4; ++i) {
+        for (int j = 0; j < 6; ++j) {
+            if (mMatchPositions[i][j] != NULL) {
+                delete mMatchPositions[i][j];
+            }
+            if (mReferenceColors[i][j] != NULL) {
+                delete mReferenceColors[i][j];
+            }
+            if (mMatchColors[i][j] != NULL) {
+                delete mMatchColors[i][j];
+            }
+        }
+    }
+}
+
+// Adds a new image to the test handler.
+void ColorCheckerTest::addTestingImage(TestingImage* inputImage) {
+    if (mImage != NULL) {
+        delete mImage;
+    }
+    mImage = NULL;
+    ALOGV("Original image deleted");
+    mImage = inputImage;
+
+    if ((mImage->getHeight() == getDebugHeight()) &&
+        (mImage->getWidth() == getDebugWidth())) {
+        copyDebugImage(getDebugHeight(), getDebugWidth(), mImage->getImage());
+    }
+}
+
+void ColorCheckerTest::processData() {
+    mSuccess = false;
+    initializeRefColor();
+    edgeDetection();
+}
+
+void ColorCheckerTest::initializeRefColor() {
+    mReferenceColors.resize(4, std::vector<Vec3i*>(6, NULL));
+    mMatchPositions.resize(4, std::vector<Vec2f*>(6, NULL));
+    mMatchColors.resize(4, std::vector<Vec3f*>(6, NULL));
+    mMatchRadius.resize(4, std::vector<float>(6, 0.f));
+
+    mReferenceColors[0][0]= new Vec3i(115, 82, 68);
+    mReferenceColors[0][1]= new Vec3i(194, 150, 130);
+    mReferenceColors[0][2]= new Vec3i(98, 122, 157);
+    mReferenceColors[0][3]= new Vec3i(87, 108, 67);
+    mReferenceColors[0][4]= new Vec3i(133, 128, 177);
+    mReferenceColors[0][5]= new Vec3i(103, 189, 170);
+    mReferenceColors[1][0]= new Vec3i(214, 126, 44);
+    mReferenceColors[1][1]= new Vec3i(80, 91, 166);
+    mReferenceColors[1][2]= new Vec3i(193, 90, 99);
+    mReferenceColors[1][3]= new Vec3i(94,  60, 108);
+    mReferenceColors[1][4]= new Vec3i(157, 188, 64);
+    mReferenceColors[1][5]= new Vec3i(224, 163, 46);
+    mReferenceColors[2][0]= new Vec3i(56, 61, 150);
+    mReferenceColors[2][1]= new Vec3i(70, 148, 73);
+    mReferenceColors[2][2]= new Vec3i(175, 54, 60);
+    mReferenceColors[2][3]= new Vec3i(231, 199, 31);
+    mReferenceColors[2][4]= new Vec3i(187, 86, 149);
+    mReferenceColors[2][5]= new Vec3i(8, 133, 161);
+    mReferenceColors[3][0]= new Vec3i(243, 243, 242);
+    mReferenceColors[3][1]= new Vec3i(200, 200, 200);
+    mReferenceColors[3][2]= new Vec3i(160, 160, 160);
+    mReferenceColors[3][3]= new Vec3i(122, 122, 121);
+    mReferenceColors[3][4]= new Vec3i(85, 85, 85);
+    mReferenceColors[3][5]= new Vec3i(52, 52, 52);
+}
+
+void ColorCheckerTest::edgeDetection() {
+    int width = mImage->getWidth();
+    int height = mImage->getHeight();
+
+    bool* edgeMap = new bool[height * width];
+    unsigned char* grayImage = new unsigned char[height * width];
+
+    // If the image is a color image and can be converted to a luminance layer
+    if (mImage->rgbToGrayScale(grayImage)) {
+        float* gradientMap = new float[height * width * 2];
+
+        // Computes the gradient image on the luminance layer.
+        computeGradient(grayImage, gradientMap);
+
+        float* gradientMagnitude = new float[height * width];
+        int* gradientDirectionInt = new int[height * width];
+        float* gradientDirection = new float[height * width];
+
+        // Computes the absolute gradient of the image without padding.
+        for (int i = 1; i < height - 1; ++i) {
+            for (int j = 1; j < width - 1; ++j) {
+                gradientMagnitude[i * width + j] =
+                        sqrt(gradientMap[(i * width + j) * 2] *
+                             gradientMap[(i * width + j) * 2] +
+                             gradientMap[(i * width + j ) * 2 + 1] *
+                             gradientMap[(i * width + j ) * 2 + 1]);
+
+                // Computes the gradient direction of the image.
+                if (gradientMap[(i * width + j) * 2] == 0 ) {
+                    // If the vertical gradient is 0, the edge is horizontal
+                    // Mark the gradient direction as 90 degrees.
+                    gradientDirectionInt[i * width + j] = 2;
+                    gradientDirection[i * width + j] = 90.0f;
+                } else {
+                    // Otherwise the atan operation is valid and can decide
+                    // the gradient direction of the edge.
+                    float gradient = atan(gradientMap[(i * width + j) * 2 + 1]
+                            / gradientMap[(i * width + j) * 2])
+                            / (M_PI / 4);
+
+                    gradientDirection[i * width + j] = gradient * 45.0f;
+
+                    // Maps the gradient direction to 4 major directions with
+                    // 0 mapped to up and 2 mapped to right.
+                    if (gradient - floor(gradient) > 0.5) {
+                        gradientDirectionInt[i * width + j] =
+                                (static_cast<int>(ceil(gradient)) + 4) % 4;
+                    } else {
+                        gradientDirectionInt[i * width + j] =
+                                (static_cast<int>(floor(gradient)) + 4) % 4;
+                    }
+                }
+            }
+        }
+
+        // Compute a boolean map to show whether a pixel is on the edge.
+        for (int i = 1; i < height - 1; ++i) {
+            for (int j = 1; j < width - 1; ++j) {
+                edgeMap[i * width + j] = false;
+
+                switch (gradientDirectionInt[i * width + j]) {
+                    case 0:
+                        // If the gradient points rightwards, the pixel is
+                        // on an edge if it has a larger absolute gradient than
+                        // pixels on its left and right sides.
+                        if ((gradientMagnitude[i * width + j] >=
+                                gradientMagnitude[i * width + j + 1]) &&
+                            (gradientMagnitude[i * width + j] >=
+                                gradientMagnitude[i * width + j - 1])) {
+                            edgeMap[i * width + j] = true;
+                        }
+                        break;
+                    case 1:
+                        // If the gradient points right-downwards, the pixel is
+                        // on an edge if it has a larger absolute gradient than
+                        // pixels on its upper left and bottom right sides.
+                        if ((gradientMagnitude[i * width + j] >=
+                                gradientMagnitude[(i + 1) * width + j + 1]) &&
+                            (gradientMagnitude[i * width + j] >=
+                                gradientMagnitude[(i - 1) * width + j - 1])) {
+                            edgeMap[i * width + j] = true;
+                        }
+                        break;
+                    case 2:
+                        // If the gradient points upwards, the pixel is
+                        // on an edge if it has a larger absolute gradient than
+                        // pixels on its up and down sides.
+                        if ((gradientMagnitude[i * width + j] >=
+                                gradientMagnitude[(i + 1) * width + j]) &&
+                            (gradientMagnitude[i * width + j] >=
+                                gradientMagnitude[(i - 1) * width + j])) {
+                            edgeMap[i * width + j] = true;
+                        }
+                        break;
+                    case 3:
+                        // If the gradient points right-upwards, the pixel is
+                        // on an edge if it has a larger absolute gradient than
+                        // pixels on its bottom left and upper right sides.
+                        if ((gradientMagnitude[i * width + j] >=
+                                gradientMagnitude[(i - 1) * width + j + 1]) &&
+                            (gradientMagnitude[i * width + j] >=
+                                gradientMagnitude[(i + 1) * width + j - 1])) {
+                            edgeMap[i * width + j] = true;
+                        }
+                  }
+
+             }
+        }
+
+        houghLineDetection(edgeMap, gradientMagnitude, gradientDirection);
+
+        // Cleans up
+        delete[] gradientMap;
+        delete[] gradientDirectionInt;
+        delete[] gradientMagnitude;
+        delete[] gradientDirection;
+
+    } else {
+        ALOGE("Not a color image!");
+    }
+
+    delete[] edgeMap;
+    delete[] grayImage;
+}
+
+// Runs the hough voting algorithm to find the grid of the color checker
+// with the edge map, gradient direction and gradient magnitude as inputs.
+void ColorCheckerTest::houghLineDetection(bool* edgeMap,
+                                          float* gradientMagnitude,
+                                          float* gradientDirection) {
+    // Constructs a graph for Hough voting. The vertical axis counts the vote
+    // for a certain angle. The horizontal axis counts the vote for the distance
+    // of a line from the origin of the image.
+    int houghHeight = 180;
+    int houghWidth = 200;
+    int houghCounts[houghHeight][houghWidth];
+    int houghSum[houghHeight][houghWidth];
+
+    int** houghVote;
+    houghVote = new int*[180];
+    for (int i = 0; i < 180; ++i) {
+        houghVote[i] = new int[200];
+    }
+
+    for (int i = 0; i < houghHeight; ++i) {
+        for (int j = 0; j < houghWidth; ++j) {
+            houghCounts[i][j] = 0;
+            houghVote[i][j] = 0;
+            houghSum[i][j] = 0;
+        }
+    }
+
+    // Vectors to record lines in two orthogonal directions.
+    // Each line is represented by its direction and its distance to the origin.
+    std::vector<std::vector<int> > verticalLines;
+    std::vector<std::vector<int> > horizontalLines;
+    float radius;
+    int height = mImage->getHeight();
+    int width = mImage->getWidth();
+
+    // Processes the signicant edge pixels and cast vote for the corresponding
+    // edge passing this pixel.
+    for (int i = 1; i < height - 1; ++i) {
+        for (int j = 1; j < width - 1; ++j) {
+            // Sets threashold for the gradient magnitude to discount noises
+            if (edgeMap[i * width + j] &&
+                (gradientMagnitude[i * width + j] > 15)) {
+                int shiftedAngle;
+
+                // Shifts angles for 45 degrees so the vertical and horizontal
+                // direction is mapped to 45 and 135 degrees to avoid padding.
+                // This uses the assumption that the color checker is placed
+                // roughly parallel to the image boarders. So that the edges
+                // at the angle of 45 will be rare.
+                shiftedAngle = (static_cast<int>(
+                        -gradientDirection[i * width + j]) + 225 % 180);
+                float shiftedAngleRad = static_cast<float>(shiftedAngle)
+                        * M_PI / 180.0f;
+
+                // Computes the distance of the line from the origin.
+                float a, b;
+                a = static_cast<float>(i - j) / sqrt(2.0f);
+                b = static_cast<float>(i + j) / sqrt(2.0f);
+                radius = a * sin(shiftedAngleRad) - b * cos(shiftedAngleRad);
+
+                // Adds one vote for the line. The line's angle is shifted by
+                // 45 degrees to avoid avoid padding for the vertical lines,
+                // which is more common than diagonal lines. The line's
+                // distance is mapped to [0, 200] from [-200, 200].
+                ++houghCounts[shiftedAngle][static_cast<int>((radius / 2.0f) +
+                                                              100.0f)];
+
+                drawPoint(i, j, Vec3i(255, 255, 255));
+            }
+        }
+    }
+
+    int houghAngleSum[houghHeight];
+    int primaryVerticalAngle, primaryHorizontalAngle;
+    int max1 = 0;
+    int max2 = 0;
+
+    // Looking for the two primary angles of the lines.
+    for (int i = 5; i < houghHeight - 5; ++i) {
+        houghAngleSum[i] = 0;
+        for (int j = 0; j < houghWidth; ++j) {
+            for (int l = -5; l <= 5; ++l) {
+                houghSum[i][j] += houghCounts[i + l][j];
+            }
+            houghAngleSum[i] += houghSum[i][j];
+        }
+
+        if ((i < houghHeight / 2) && (houghAngleSum[i] > max1)) {
+            max1 = houghAngleSum[i];
+            primaryVerticalAngle = i;
+        } else if ((i > houghHeight / 2) && (houghAngleSum[i] > max2)) {
+            max2 = houghAngleSum[i];
+            primaryHorizontalAngle = i;
+        }
+    }
+
+    ALOGV("Primary angles are %d, %d",
+         primaryVerticalAngle, primaryHorizontalAngle);
+
+    int angle;
+
+    // For each primary angle, look for the highest voted lines.
+    for (int k = 0; k < 2; ++k) {
+        if (k == 0) {
+            angle = primaryVerticalAngle;
+        } else {
+            angle = primaryHorizontalAngle;
+        }
+
+        std::vector<int> line(2);
+        for (int j = 2; j < houghWidth - 2; ++j) {
+            houghVote[angle][j] = houghSum[angle][j];
+            houghSum[angle][j] = 0;
+        }
+
+        // For each radius, average the vote with nearby ones.
+        for (int j = 2; j < houghWidth - 2; ++j) {
+            for (int m = -2; m <= 2; ++m) {
+                houghSum[angle][j] += houghVote[angle][j + m];
+            }
+        }
+
+        bool isCandidate[houghWidth];
+
+        // Find whether a lines is a candidate by rejecting the ones that have
+        // lower vote than others in the neighborhood.
+        for (int j = 2; j < houghWidth - 2; ++j) {
+            isCandidate[j] = true;
+            for (int m = -2; ((isCandidate[j]) && (m <= 2)); ++m) {
+                if ((houghSum[angle][j] < 20) ||
+                    (houghSum[angle][j] < houghSum[angle][j + m])) {
+                    isCandidate[j] = false;
+                }
+            }
+        }
+
+        int iter1 = 0;
+        int iter2 = 0;
+        int count = 0;
+
+        // Finds the lines that are not too close to each other and add to the
+        // detected lines.
+        while (iter2 < houghWidth) {
+            while ((!isCandidate[iter2]) && (iter2 < houghWidth)) {
+                ++iter2;
+            }
+            if ((isCandidate[iter2]) && (iter2 - iter1 < 5)) {
+                iter1 = (iter2 + iter1) / 2;
+                ++iter2;
+            } else {
+                line[0] = angle;
+                line[1] = (iter1 - 100) * 2;
+                if (iter1 != 0) {
+                    if (k == 0) {
+                        verticalLines.push_back(line);
+                        Vec3i color(verticalLines.size() * 20, 0, 0);
+                        drawLine(line[0], line[1], color);
+                    } else {
+                        horizontalLines.push_back(line);
+                        Vec3i color(0, horizontalLines.size() * 20, 0);
+                        drawLine(line[0], line[1], color);
+                    }
+                }
+                iter1 = iter2;
+                ++iter2;
+                ALOGV("pushing back line %d %d", line[0], line[1]);
+            }
+        }
+    }
+
+    ALOGV("Numbers of lines in each direction is %d, %d",
+         verticalLines.size(), horizontalLines.size());
+
+    for (int i = 0; i < 180; ++i) {
+        delete[] houghVote[i];
+    }
+    delete[] houghVote;
+
+    findCheckerBoards(verticalLines, horizontalLines);
+}
+
+// Computes the gradient in both x and y direction of a layer
+void ColorCheckerTest::computeGradient(unsigned char* layer,
+                                       float* gradientMap) {
+    int width = mImage->getWidth();
+    int height = mImage->getHeight();
+
+    // Computes the gradient in the whole image except the image boarders.
+    for (int i = 1; i < height - 1; ++i) {
+        for (int j = 1; j < width - 1; ++j) {
+            gradientMap[(i * width + j) * 2] =
+                    0.5f * (layer[i * width + j + 1] -
+                            layer[i * width + j - 1]);
+            gradientMap[(i * width + j) * 2 + 1] =
+                    0.5f * (layer[(i + 1) * width + j] -
+                           layer[(i - 1) * width + j]);
+        }
+    }
+}
+
+// Tries to find the checker boards with the highest voted lines
+void ColorCheckerTest::findCheckerBoards(
+        std::vector<std::vector<int> > verticalLines,
+        std::vector<std::vector<int> > horizontalLines) {
+    ALOGV("Start looking for Color checker");
+
+    int numHorizontalLines = mCandidateColors.size();
+    int numVerticalLines;
+    if (numHorizontalLines > 0) {
+        numVerticalLines = mCandidateColors[0].size();
+        for (int i = 0; i < numHorizontalLines; ++i) {
+            for (int j = 0; j < numVerticalLines; ++j) {
+                if (mCandidateColors[i][j] != NULL) {
+                    delete mCandidateColors[i][j];
+                }
+                if (mCandidatePositions[i][j] != NULL) {
+                    delete mCandidatePositions[i][j];
+                }
+            }
+            mCandidateColors[i].clear();
+            mCandidatePositions[i].clear();
+        }
+    }
+    mCandidateColors.clear();
+    mCandidatePositions.clear();
+
+    ALOGV("Candidates deleted!");
+
+    numVerticalLines = verticalLines.size();
+    numHorizontalLines = horizontalLines.size();
+    Vec2f pointUpperLeft;
+    Vec2f pointBottomRight;
+
+    mCandidateColors.resize(numHorizontalLines - 1);
+    mCandidatePositions.resize(numHorizontalLines - 1);
+
+    for (int i = numVerticalLines - 1; i >= 1; --i) {
+        for (int j = 0; j < numHorizontalLines - 1; ++j) {
+            // Finds the upper left and bottom right corner of each rectangle
+            // formed by two neighboring highest voted lines.
+            pointUpperLeft = findCrossing(verticalLines[i], horizontalLines[j]);
+            pointBottomRight = findCrossing(verticalLines[i - 1],
+                                            horizontalLines[j + 1]);
+
+            Vec3i* color = new Vec3i();
+            Vec2f* pointCenter = new Vec2f();
+            // Verifies if they are separated by a reasonable distance.
+            if (verifyPointPair(pointUpperLeft, pointBottomRight,
+                                pointCenter, color)) {
+                mCandidatePositions[j].push_back(pointCenter);
+                mCandidateColors[j].push_back(color);
+                ALOGV("Color at (%d, %d) is (%d, %d, %d)", j, i,color->r(), color->g(), color->b());
+
+            } else {
+                mCandidatePositions[j].push_back(NULL);
+                mCandidateColors[j].push_back(NULL);
+                delete color;
+                delete pointCenter;
+            }
+        }
+    }
+
+    ALOGV("Candidates Number (%d, %d)", mCandidateColors.size(), mCandidateColors[0].size());
+    // Verifies whether the current line candidates form a valid color checker.
+    verifyColorGrid();
+}
+
+// Returns the corssing point of two lines given the lines.
+Vec2f ColorCheckerTest::findCrossing(std::vector<int> line1,
+                                     std::vector<int> line2) {
+    Vec2f crossingPoint;
+    float r1 = static_cast<float>(line1[1]);
+    float r2 = static_cast<float>(line2[1]);
+    float ang1, ang2;
+    float y1, y2;
+
+    ang1 = static_cast<float>(line1[0]) / 180.0f * M_PI;
+    ang2 = static_cast<float>(line2[0]) / 180.0f * M_PI;
+
+    float x, y;
+    x = (r1 * cos(ang2) - r2 * cos(ang1)) / sin(ang1 - ang2);
+    y = (r1 * sin(ang2) - r2 * sin(ang1)) / sin(ang1 - ang2);
+
+    crossingPoint.set((x + y) / sqrt(2.0), (y - x) / sqrt(2.0));
+
+    //ALOGV("Crosspoint at (%f, %f)", crossingPoint.x(), crossingPoint.y());
+    return crossingPoint;
+}
+
+// Verifies whether two opposite corners on a quadrilateral actually can be
+// the two corners of a color checker.
+bool ColorCheckerTest::verifyPointPair(Vec2f pointUpperLeft,
+                                       Vec2f pointBottomRight,
+                                       Vec2f* pointCenter,
+                                       Vec3i* color) {
+    bool success = true;
+
+    /** 5 and 30 are the threshold tuned for resolution 640*480*/
+    if ((pointUpperLeft.x() < 0) ||
+        (pointUpperLeft.x() >= mImage->getHeight()) ||
+        (pointUpperLeft.y() < 0) ||
+        (pointUpperLeft.y() >= mImage->getWidth()) ||
+        (pointBottomRight.x() < 0) ||
+        (pointBottomRight.x() >= mImage->getHeight()) ||
+        (pointBottomRight.y() < 0) ||
+        (pointBottomRight.y() >= mImage->getWidth()) ||
+        (abs(pointUpperLeft.x() - pointBottomRight.x()) <= 5) ||
+        (abs(pointUpperLeft.y() - pointBottomRight.y()) <= 5) ||
+        (abs(pointUpperLeft.x() - pointBottomRight.x()) >= 30) ||
+        (abs(pointUpperLeft.y() - pointBottomRight.y()) >= 30)) {
+
+        // If any of the quadrilateral corners are out of the image or if
+        // the distance between them are too large or too big, the quadrilateral
+        // could not be one of the checkers
+        success = false;
+    } else {
+        // Find the checker center if the corners of the rectangle meet criteria
+        pointCenter->set((pointUpperLeft.x() + pointBottomRight.x()) / 2.0f,
+                       (pointUpperLeft.y() + pointBottomRight.y()) / 2.0f);
+        color->set(mImage->getPixelValue(*pointCenter).r(),
+                   mImage->getPixelValue(*pointCenter).g(),
+                   mImage->getPixelValue(*pointCenter).b());
+        ALOGV("Color at (%f, %f) is (%d, %d, %d)", pointCenter->x(), pointCenter->y(),color->r(), color->g(), color->b());
+    }
+    return success;
+}
+
+// Verifies the color checker centers and finds the match between the detected
+// color checker and the reference MacBeth color checker
+void ColorCheckerTest::verifyColorGrid() {
+    ALOGV("Start looking for Color Grid");
+    int numHorizontalLines = mCandidateColors.size();
+    int numVerticalLines = mCandidateColors[0].size();
+    bool success = false;
+
+    // Computes the standard deviation of one row/column of the proposed color
+    // checker. Discards the row/column if the std is below a threshold.
+    for (int i = 0; i < numHorizontalLines; ++i) {
+        Vec3f meanColor(0.f, 0.f, 0.f);
+        int numNonZero = 0;
+
+        for (int j = 0; j < numVerticalLines; ++j) {
+            if (mCandidateColors[i][j] != NULL) {
+                ALOGV("candidate color (%d, %d) is (%d, %d, %d)", i, j, mCandidateColors[i][j]->r(), mCandidateColors[i][j]->g(), mCandidateColors[i][j]->b());
+
+                meanColor = meanColor + (*mCandidateColors[i][j]);
+                ++numNonZero;
+            }
+        }
+        if (numNonZero > 0) {
+            meanColor = meanColor / numNonZero;
+        }
+        ALOGV("Mean color for vertical direction computed!");
+
+        float std = 0;
+        for (int j = 0; j < numVerticalLines; ++j) {
+            if (mCandidateColors[i][j] != NULL) {
+                std += mCandidateColors[i][j]->squareDistance<float>(meanColor);
+            }
+        }
+        if (numNonZero > 0) {
+            std = sqrt(std / (3 * numNonZero));
+        }
+        ALOGV("st. deviation for the %d dir1 is %d", i, static_cast<int>(std));
+
+        if ((std <= 30) && (numNonZero > 1)) {
+            for (int j = 0; j < numVerticalLines; ++j) {
+                if (mCandidateColors[i][j] != NULL) {
+                    delete mCandidateColors[i][j];
+                    mCandidateColors[i][j] = NULL;
+                }
+            }
+        }
+    }
+
+    // Discards the column/row of the color checker if the std is below a
+    // threshold.
+    for (int j = 0; j < numVerticalLines; ++j) {
+        Vec3f meanColor(0.f, 0.f, 0.f);
+        int numNonZero = 0;
+
+        for (int i = 0; i < numHorizontalLines; ++i) {
+            if (mCandidateColors[i][j] != NULL) {
+                meanColor = meanColor + (*mCandidateColors[i][j]);
+                ++numNonZero;
+            }
+        }
+        if (numNonZero > 0) {
+            meanColor = meanColor / numNonZero;
+        }
+
+        float std = 0;
+        for (int i = 0; i < numHorizontalLines; ++i) {
+            if (mCandidateColors[i][j] != NULL) {
+                std += mCandidateColors[i][j]->squareDistance<float>(meanColor);
+            }
+        }
+        if (numNonZero > 0) {
+            std = sqrt(std / (3 * numNonZero));
+        }
+
+        ALOGV("st. deviation for the %d dir2 is %d", j, static_cast<int>(std));
+
+        if ((std <= 30) && (numNonZero > 1)) {
+            for (int i = 0; i < numHorizontalLines; ++i) {
+                if (mCandidateColors[i][j] != NULL) {
+                    delete mCandidateColors[i][j];
+                    mCandidateColors[i][j] = NULL;
+                }
+            }
+        }
+    }
+
+    for (int i = 0; i < numHorizontalLines; ++i) {
+        for (int j = 0; j < numVerticalLines; ++j) {
+            if (mCandidateColors[i][j] != NULL) {
+                ALOGV("position (%d, %d) is at (%f, %f) with color (%d, %d, %d)",
+                     i, j,
+                     mCandidatePositions[i][j]->x(),
+                     mCandidatePositions[i][j]->y(),
+                     mCandidateColors[i][j]->r(),
+                     mCandidateColors[i][j]->g(),
+                     mCandidateColors[i][j]->b());
+            } else {
+                ALOGV("position (%d, %d) is 0", i, j);
+            }
+        }
+    }
+
+    // Finds the match between the detected color checker and the reference
+    // MacBeth color checker.
+    int rowStart = 0;
+    int rowEnd = 0;
+
+    // Loops until all dectected color checker has been processed.
+    while (!success) {
+        int columnStart = 0;
+        int columnEnd = 0;
+        bool isRowStart = false;
+        bool isRowEnd = true;
+
+        // Finds the row start of the next block of detected color checkers.
+        while ((!isRowStart) && (rowStart <  numHorizontalLines)) {
+            for (int j = 0; j < numVerticalLines; ++j) {
+                if (mCandidateColors[rowStart][j] != NULL) {
+                    isRowStart = true;
+                }
+            }
+            ++rowStart;
+        }
+        rowStart--;
+        rowEnd = rowStart;
+        ALOGV("rowStart is %d", rowStart);
+
+        // Finds the row end of the next block of detected color checkers.
+        while ((isRowEnd) && (rowEnd < numHorizontalLines)) {
+            isRowEnd = false;
+            for (int j = 0; j < numVerticalLines; ++j) {
+                if (mCandidateColors[rowEnd][j] != NULL) {
+                    isRowEnd= true;
+                }
+            }
+            if (isRowEnd) {
+                ++rowEnd;
+            }
+        }
+        if ((!isRowEnd) && isRowStart) {
+            rowEnd--;
+        }
+        if ((isRowEnd) && (rowEnd == numHorizontalLines)) {
+            rowEnd--;
+            isRowEnd = false;
+        }
+        ALOGV("rowEnd is %d", rowEnd);
+
+        // Matches color checkers between the start row and the end row.
+        bool successVertical = false;
+
+        while (!successVertical) {
+            bool isColumnEnd = true;
+            bool isColumnStart = false;
+
+            // Finds the start column of the next block of color checker
+            while ((!isColumnStart) && (columnStart < numVerticalLines)) {
+                if (mCandidateColors[rowStart][columnStart] != NULL) {
+                    isColumnStart = true;
+                }
+                ++columnStart;
+            }
+            columnStart--;
+            columnEnd = columnStart;
+
+            // Finds the end column of the next block of color checker
+            while ((isColumnEnd) && (columnEnd < numVerticalLines)) {
+                isColumnEnd = false;
+                if (mCandidateColors[rowStart][columnEnd] != NULL)
+                    isColumnEnd = true;
+                if (isColumnEnd) {
+                    ++columnEnd;
+                }
+            }
+
+            if ((!isColumnEnd) && isColumnStart) {
+                columnEnd--;
+            }
+            if ((isColumnEnd) && (columnEnd == numVerticalLines)) {
+                columnEnd--;
+                isColumnEnd = false;
+            }
+
+            // Finds the best match on the MacBeth reference color checker for
+            // the continuous block of detected color checker
+            if (isRowStart && (!isRowEnd) &&
+                isColumnStart && (!isColumnEnd)) {
+                findBestMatch(rowStart, rowEnd, columnStart, columnEnd);
+            }
+            ALOGV("FindBestMatch for %d, %d, %d, %d", rowStart,
+                 rowEnd, columnStart, columnEnd);
+
+            // If the column search finishes, go out of the loop
+            if (columnEnd >= numVerticalLines - 1) {
+                successVertical = true;
+            } else {
+                columnStart = columnEnd + 1;
+            }
+        }
+        ALOGV("Continuing to search for direction 1");
+
+        // If the row search finishes, go out of the loop
+        if (rowEnd >= numHorizontalLines - 1) {
+            success = true;
+        } else {
+            rowStart = rowEnd + 1;
+        }
+    }
+
+    for (int i = 0; i < 4; ++i) {
+        for (int j = 0; j < 6; ++j) {
+            if (mMatchPositions[i][j] != NULL) {
+                ALOGV("Reference Match position for (%d, %d) is (%f, %f)", i, j,
+                     mMatchPositions[i][j]->x(), mMatchPositions[i][j]->y());
+            }
+        }
+    }
+
+    fillRefColorGrid();
+}
+
+// Finds the best match on the MacBeth color checker for the continuous block of
+// detected color checkers bounded by row i1, row i2 and column j1 and column j2
+// Assumes that the subsample is less than 4*6.
+void ColorCheckerTest::findBestMatch(int i1, int i2, int j1, int j2) {
+    int numHorizontalGrid = i2 - i1 + 1;
+    int numVerticalGrid = j2 - j1 + 1;
+
+    if (((numHorizontalGrid > 1) || (numVerticalGrid > 1)) &&
+        (numHorizontalGrid <= 4) && (numVerticalGrid <= 6)) {
+        ALOGV("i1, j2, j1, j2 is %d, %d, %d, %d", i1, i2, j1, j2);
+        float minError;
+        float error = 0.f;
+        int horizontalMatch, verticalMatch;
+
+        // Finds the match start point where the error is minimized.
+        for (int i = 0; i < numHorizontalGrid; ++i) {
+            for (int j = 0; j < numVerticalGrid; ++j) {
+                if (mCandidateColors[i1 + i][j1 + j] != NULL) {
+                    error += mCandidateColors[i1 + i][j1 + j]->squareDistance<int>(
+                            *mReferenceColors[i][j]);
+                }
+            }
+        }
+        ALOGV("Error is %f", error);
+        minError = error;
+        horizontalMatch = 0;
+        verticalMatch = 0;
+
+        for (int i = 0; i <= 4 - numHorizontalGrid; ++i) {
+            for (int j = 0; j <= 6 - numVerticalGrid; ++j) {
+                error = 0.f;
+
+                for (int id = 0; id < numHorizontalGrid; ++id) {
+                    for (int jd = 0; jd < numVerticalGrid; ++jd) {
+                        if (mCandidateColors[i1 + id][j1 + jd] != NULL) {
+                            error += mCandidateColors[i1 + id][j1 + jd]->
+                                    squareDistance<int>(
+                                            *mReferenceColors[i + id][j + jd]);
+                        }
+                    }
+                }
+
+                if (error < minError) {
+                    minError = error;
+                    horizontalMatch = i;
+                    verticalMatch = j;
+                }
+                ALOGV("Processed %d, %d and error is %f", i, j, error );
+            }
+        }
+
+        for (int id = 0; id < numHorizontalGrid; ++id) {
+            for (int jd = 0; jd < numVerticalGrid; ++jd) {
+                if (mCandidatePositions[i1 + id][j1 + jd] != NULL) {
+                    mMatchPositions[horizontalMatch + id][verticalMatch + jd] =
+                            new Vec2f(mCandidatePositions[i1 + id][j1 + jd]->x(),
+                                      mCandidatePositions[i1 + id][j1 + jd]->y());
+                }
+            }
+        }
+        ALOGV("Grid match starts at %d, %d", horizontalMatch, verticalMatch);
+    }
+}
+
+// Finds the boundary of a color checker by its color similarity to the center.
+// Also predicts the location of unmatched checkers.
+void ColorCheckerTest::fillRefColorGrid() {
+    int rowStart = 0;
+    int columnStart = 0;
+    bool foundStart = true;
+
+    for (int i = 0; (i < 4) && foundStart; ++i) {
+        for (int j = 0; (j < 6) && foundStart; ++j) {
+            if (mMatchPositions[i][j] != NULL) {
+                rowStart = i;
+                columnStart = j;
+                foundStart = false;
+            }
+        }
+    }
+    ALOGV("First match found at (%d, %d)", rowStart, columnStart);
+
+    float rowDistance, columnDistance;
+    rowDistance = 0;
+    columnDistance = 0;
+    int numRowGrids = 0;
+    int numColumnGrids = 0;
+
+    for (int i = rowStart; i < 4; ++i) {
+        for (int j = columnStart; j < 6; ++j) {
+            if (mMatchPositions[i][j] != NULL) {
+                if (i > rowStart) {
+                    ++numRowGrids;
+                    rowDistance += (mMatchPositions[i][j]->x() -
+                                mMatchPositions[rowStart][columnStart]->x()) /
+                                static_cast<float>(i - rowStart);
+                }
+                if (j > columnStart) {
+                    ++numColumnGrids;
+                    columnDistance += (mMatchPositions[i][j]->y() -
+                                mMatchPositions[rowStart][columnStart]->y()) /
+                                static_cast<float>(j - columnStart);
+                }
+            }
+        }
+    }
+
+    if ((numRowGrids > 0) && (numColumnGrids > 0)) {
+        rowDistance = rowDistance / numRowGrids;
+        columnDistance = columnDistance / numColumnGrids;
+        ALOGV("delta is %f, %f", rowDistance, columnDistance);
+
+        for (int i = 0; i < 4; ++i) {
+            for (int j = 0 ; j < 6; ++j) {
+                if (mMatchPositions[i][j] == NULL) {
+                    mMatchPositions[i][j] = new Vec2f(
+                            mMatchPositions[rowStart][columnStart]->x() +
+                                    (i - rowStart) * rowDistance,
+                            mMatchPositions[rowStart][columnStart]->y() +
+                                    (j - columnStart) * columnDistance);
+                }
+            }
+        }
+        for (int i = 0; i < 4; ++i) {
+            for (int j = 0; j < 6; ++j) {
+                float radius = 0;
+                Vec3i color = mImage->getPixelValue(*mMatchPositions[i][j]);
+                Vec3f meanColor(0.f , 0.f, 0.f);
+
+                int numPixels = 0;
+                for (int ii  = static_cast<int>(mMatchPositions[i][j]->x() -
+                                                rowDistance/2);
+                     ii <= static_cast<int>(mMatchPositions[i][j]->x() +
+                                            rowDistance/2);
+                     ++ii) {
+                    for (int jj = static_cast<int>(mMatchPositions[i][j]->y() -
+                                                   columnDistance/2);
+                         jj <= static_cast<int>(mMatchPositions[i][j]->y() +
+                                                columnDistance/2);
+                         ++jj) {
+                        if ((ii >= 0) && (ii < mImage->getHeight()) &&
+                            (jj >= 0) && (jj < mImage->getWidth())) {
+                            Vec3i pixelColor = mImage->getPixelValue(ii,jj);
+                            float error = color.squareDistance<int>(pixelColor);
+
+                            if (error < COLOR_ERROR_THRESHOLD) {
+                                drawPoint(ii, jj, *mReferenceColors[i][j]);
+                                meanColor = meanColor + pixelColor;
+                                numPixels++;
+                                Vec2i pixelPosition(ii, jj);
+
+                                if (pixelPosition.squareDistance<float>(
+                                        *mMatchPositions[i][j]) > radius) {
+                                    radius = pixelPosition.squareDistance<float>(
+                                            *mMatchPositions[i][j]);
+                                }
+                            }
+                        }
+                    }
+                }
+
+                /** Computes the radius of the checker.
+                 * The above computed radius is the squared distance to the
+                 * furthest point with a matching color. To be conservative, we
+                 * only consider an area with radius half of the above computed
+                 * value. Since radius is computed as a squared root, the one
+                 * that will be recorded is 1/4 of the above computed value.
+                 */
+                mMatchRadius[i][j] = radius / 4.f;
+                mMatchColors[i][j] = new Vec3f(meanColor / numPixels);
+
+                ALOGV("Reference color at (%d, %d) is (%d, %d, %d)", i, j,
+                     mReferenceColors[i][j]->r(),
+                     mReferenceColors[i][j]->g(),
+                     mReferenceColors[i][j]->b());
+                ALOGV("Average color at (%d, %d) is (%f, %f, %f)", i, j,
+                     mMatchColors[i][j]->r(),
+                     mMatchColors[i][j]->g(),
+                     mMatchColors[i][j]->b());
+                ALOGV("Radius is %f", mMatchRadius[i][j]);
+            }
+        }
+
+        mSuccess = true;
+    }
+}
diff --git a/apps/CtsVerifier/lib/colorchecker/exposurecompensationtest.cpp b/apps/CtsVerifier/lib/colorchecker/exposurecompensationtest.cpp
new file mode 100644
index 0000000..da9fc40
--- /dev/null
+++ b/apps/CtsVerifier/lib/colorchecker/exposurecompensationtest.cpp
@@ -0,0 +1,96 @@
+/*
+ * 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
+
+#define LOG_TAG "ExposureCompensationTest"
+#include <utils/Log.h>
+#include <utils/Timers.h>
+#include <cmath>
+#include <string>
+#include <stdio.h>
+
+#include "vec2.h"
+#include "vec3.h"
+#include "exposurecompensationtest.h"
+
+const float GAMMA_CORRECTION = 2.2f;
+void ExposureCompensationTest::processData() {
+    ALOGV("Start Processing Exposure Compensation Test Data!");
+    clearDebugImage();
+
+    if (mDebugText != NULL) {
+        delete mDebugText;
+        mDebugText = NULL;
+    }
+
+    int numTests = mExposureValues.size();
+    int numPatches = mCheckerColors[0].size();
+    ALOGV("Processing %d tests with %d patches", numTests, numPatches);
+
+    mDebugText = new char[320 * numTests];
+    mDebugText[0] = 0;
+    char* debugText = new char[50];
+
+    Vec3i red(255, 0, 0);
+    Vec3i green(0, 255, 0);
+    Vec3i blue(0, 0, 255);
+
+    float minExposure = -3.0f;
+    float scale = 9.0f;
+    for (int i = 0; i < numTests; ++i) {
+        snprintf(debugText, 50, "Exposure is %f \n", mExposureValues[i]);
+        strcat(mDebugText, debugText);
+        for (int j = 0; j < numPatches; ++j) {
+            int exposureRed = static_cast<int>((
+                log(static_cast<float>(mReferenceColors[j].r()))
+                / log(2.0f) * GAMMA_CORRECTION +
+                mExposureValues[i] - minExposure) * scale);
+            int exposureGreen = static_cast<int>((
+                log(static_cast<float>(mReferenceColors[j].g()))
+                / log(2.0f) * GAMMA_CORRECTION +
+                mExposureValues[i] - minExposure) * scale);
+            int exposureBlue = static_cast<int>((
+                log(static_cast<float>(mReferenceColors[j].b()))
+                / log(2.0f) * GAMMA_CORRECTION +
+                mExposureValues[i] - minExposure) * scale);
+
+            snprintf(debugText, 50, "%d %f %d %f %d %f \n",
+                    exposureRed, mCheckerColors[i][j].r(),
+                    exposureGreen, mCheckerColors[i][j].g(),
+                    exposureBlue, mCheckerColors[i][j].b());
+
+            ALOGV("%s", debugText);
+            strcat(mDebugText, debugText);
+
+            drawPoint(200 - exposureRed, mCheckerColors[i][j].r(), red);
+            drawPoint(200 - exposureGreen, mCheckerColors[i][j].g(), green);
+            drawPoint(200 - exposureBlue, mCheckerColors[i][j].b(), blue);
+        }
+    }
+    mExposureValues.clear();
+    mCheckerColors.clear();
+}
+
+void ExposureCompensationTest::initializeReferenceColors() {
+    mReferenceColors.resize(6);
+
+    mReferenceColors[0].set(243, 243, 242);
+    mReferenceColors[1].set(200, 200, 200);
+    mReferenceColors[2].set(160, 160, 160);
+    mReferenceColors[3].set(122, 122, 121);
+    mReferenceColors[4].set(85, 85, 85);
+    mReferenceColors[5].set(52, 52, 52);
+}
diff --git a/apps/CtsVerifier/lib/colorchecker/grouping.h b/apps/CtsVerifier/lib/colorchecker/grouping.h
deleted file mode 100755
index 3125f55..0000000
--- a/apps/CtsVerifier/lib/colorchecker/grouping.h
+++ /dev/null
@@ -1,165 +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.
- */
-
-#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/lib/colorchecker/imagetesthandler.cpp b/apps/CtsVerifier/lib/colorchecker/imagetesthandler.cpp
new file mode 100644
index 0000000..1c5bc17
--- /dev/null
+++ b/apps/CtsVerifier/lib/colorchecker/imagetesthandler.cpp
@@ -0,0 +1,101 @@
+/*
+ * 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
+
+#define LOG_TAG "ImageTestHandler"
+#include <utils/Log.h>
+#include <utils/Timers.h>
+#include <cmath>
+
+#include "vec2.h"
+#include "vec3.h"
+#include "imagetesthandler.h"
+
+void ImageTestHandler::initDebugImage() {
+    mDebugOutput = NULL;
+}
+
+// Initializes the  debug image with a given height and width.
+void ImageTestHandler::initDebugImage(int debugHeight,
+                                      int debugWidth) {
+    mDebugOutput = NULL;
+    mDebugOutput = new unsigned char[debugHeight * debugWidth * 4];
+    memset(mDebugOutput, 0, debugHeight * debugWidth * 4);
+
+    mDebugHeight = debugHeight;
+    mDebugWidth = debugWidth;
+}
+
+// Copies an existing image to the debug image.
+void ImageTestHandler::copyDebugImage(int inputHeight, int inputWidth,
+                                      const unsigned char* inputImage) {
+    if ((inputHeight == mDebugHeight) && (inputWidth == mDebugWidth)) {
+        ALOGV("Copying debug images");
+        memcpy(mDebugOutput, inputImage, mDebugHeight * mDebugWidth * 4);
+    }
+}
+
+void ImageTestHandler::clearDebugImage() {
+    if (mDebugOutput != NULL) {
+        delete[] mDebugOutput;
+        mDebugOutput = new unsigned char[mDebugHeight * mDebugWidth * 4];
+        memset(mDebugOutput, 0, mDebugHeight * mDebugWidth * 4);
+    }
+}
+
+
+// Draws a point of a given color.
+void ImageTestHandler::drawPoint(int row, int column, const Vec3i &color) {
+    if ((row >= 0) && (column >= 0) &&
+        (column < mDebugWidth) && (row < mDebugHeight)) {
+        mDebugOutput[(row*mDebugWidth + column) * 4] = color.r();
+        mDebugOutput[(row*mDebugWidth + column) * 4+1] = color.g();
+        mDebugOutput[(row*mDebugWidth + column) * 4+2] = color.b();
+        mDebugOutput[(row*mDebugWidth + column) * 4+3] = 255;
+    }
+}
+
+// Draws a point in Vec2 format of a given color.
+void ImageTestHandler::drawPoint(const Vec2i &point, const Vec3i &color) {
+    drawPoint((int) point.y(), (int) point.x(), color);
+}
+
+// Draws a line of a given color.
+void ImageTestHandler::drawLine(int angle, int radius, const Vec3i &color) {
+    const int r = color.r();
+    const int g = color.g();
+    const int b = color.b();
+    const int a = 255;
+
+    int shiftedMin = -113;
+    int shiftedMax = 83;
+
+    float radiusDouble = static_cast<float>(radius);
+
+    float angleRad = static_cast<float>(angle) * M_PI / 180.0;
+
+    //ALOGV("draw line for (%d, %d)", angle, radius);
+    for (int i = shiftedMin; i <= shiftedMax; ++i) {
+        float j;
+
+        assert(angle != 0);
+        j = (i - radiusDouble / sin(angleRad)) * tan(angleRad);
+        float x = (static_cast<float>(i) + j) / sqrt(2.0);
+        float y = (j - static_cast<float>(i)) / sqrt(2.0);
+
+        drawPoint(x, y, color);
+    }
+}
diff --git a/apps/CtsVerifier/lib/colorchecker/meteringtest.cpp b/apps/CtsVerifier/lib/colorchecker/meteringtest.cpp
new file mode 100644
index 0000000..47de5d8
--- /dev/null
+++ b/apps/CtsVerifier/lib/colorchecker/meteringtest.cpp
@@ -0,0 +1,102 @@
+/*
+ * 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
+
+#define LOG_TAG "MeteringTest"
+#include <utils/Log.h>
+#include <utils/Timers.h>
+#include <cmath>
+#include <string>
+
+#include "vec2.h"
+#include "vec3.h"
+#include "meteringtest.h"
+
+const float kOverExposure = 230.f;
+const float kEqThreshold = 0.05f;
+// Processes the checker colors stored by comparing the pixel values from the
+// two scenarios in a test.
+void MeteringTest::processData() {
+    ALOGV("Start Processing Metering Test Data!");
+
+    int numTests = mCheckerColors.size() / 2;
+    mNumPatches = 0;
+
+    if (numTests > 0) {
+        mNumPatches = mCheckerColors[0].size();
+    }
+
+    for (int i = 0; i < numTests; ++i) {
+        mComparisonResults.push_back(
+                isEquivalentTo((&mCheckerColors[i * 2]),
+                               (&mCheckerColors[i * 2 + 1])));
+        mComparisonResults.push_back(
+                isDarkerThan((&mCheckerColors[i * 2]),
+                             (&mCheckerColors[i * 2 + 1])));
+    }
+}
+
+void MeteringTest::clearData() {
+    mComparisonResults.clear();
+    mCheckerColors.clear();
+}
+
+// Compares two given arrays of pixel values and decide whether the first one is
+// significantly darker than the second one.
+bool MeteringTest::isDarkerThan(
+        const std::vector<Vec3f>* checkerColors1,
+        const std::vector<Vec3f>* checkerColors2) const {
+    float meanRatio = 0.f;
+    int meanNumCount = 0;
+
+    for (int i = 0; i < mNumPatches; ++i) {
+        float luminance1 = (*checkerColors1)[i].convertToLuminance();
+        float luminance2 = (*checkerColors2)[i].convertToLuminance();
+
+        // Out of the saturation rage, define 5% as a margin for being
+        // significantly brighter.
+        if ((luminance2 < kOverExposure) && (luminance1 != 0.f)) {
+            meanRatio += luminance2 / luminance1;
+            ++meanNumCount;
+        }
+    }
+    meanRatio = meanRatio / meanNumCount;
+
+    return (meanRatio > 1 + kEqThreshold);
+}
+
+// Compares the two givn arrays of pixel values and decide whether they are
+// equivalent within an acceptable range.
+bool MeteringTest::isEquivalentTo(
+        const std::vector<Vec3f>* checkerColors1,
+        const std::vector<Vec3f>* checkerColors2) const {
+    float meanRatio = 0.f;
+    int meanNumCount = 0;
+
+    for (int i = 0; i < mNumPatches; ++i) {
+        float luminance1 = (*checkerColors1)[i].convertToLuminance();
+        float luminance2 = (*checkerColors2)[i].convertToLuminance();
+        ALOGV("Luma_1 and Luma_2 is %f, %f", luminance1, luminance2);
+
+        if ((luminance1 < kOverExposure) && (luminance2 < kOverExposure)) {
+              meanRatio += luminance2 / luminance1;
+              ++meanNumCount;
+        }
+    }
+    meanRatio = meanRatio / meanNumCount;
+
+    return ((meanRatio >= 1 - kEqThreshold) && (meanRatio <= 1 + kEqThreshold));
+}
diff --git a/apps/CtsVerifier/lib/colorchecker/testingimage.cpp b/apps/CtsVerifier/lib/colorchecker/testingimage.cpp
new file mode 100644
index 0000000..28f025f
--- /dev/null
+++ b/apps/CtsVerifier/lib/colorchecker/testingimage.cpp
@@ -0,0 +1,190 @@
+/*
+ * 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
+
+#define LOG_TAG "TestingImage"
+#include <utils/Log.h>
+#include <utils/Timers.h>
+#include <string.h>
+#include <cmath>
+#include <vector>
+#include <assert.h>
+#include "vec3.h"
+
+#include "testingimage.h"
+
+const float GAMMA_CORRECTION = 2.2f;
+
+// Constructs an instance with the given image byte array.
+TestingImage::TestingImage(const unsigned char* inputImage,
+                           int inputHeight, int inputWidth,
+                           int inputChannel, int inputRowSpan) {
+    mImage = new unsigned char[inputRowSpan * inputHeight];
+
+    ALOGV("mImage format created! with size as %d, %d, %d",
+         inputRowSpan, inputHeight, inputChannel);
+    mWidth = inputWidth;
+    mHeight = inputHeight;
+    mChannels = inputChannel;
+    mRowSpan = mWidth * mChannels;
+
+    for (int i = 0; i < mHeight; ++i) {
+        for (int j = 0; j < mWidth; ++j) {
+            for (int k = 0; k < mChannels; ++k) {
+                mImage[i * mRowSpan + j* mChannels + k] =
+                        inputImage[i * inputRowSpan + j * inputChannel + k];
+            }
+        }
+    }
+    ALOGV("mImage converted!");
+}
+
+// Constructs an instance with the given image and resize it to a new size.
+TestingImage::TestingImage(const unsigned char* inputImage,
+                           int inputHeight, int inputWidth,
+                           int inputChannel, int inputRowSpan,
+                           int newHeight, int newWidth) {
+    mImage = new unsigned char[newHeight * newWidth * inputChannel];
+
+    ALOGV("mImage format created! with size as %d, %d, %d",
+         newHeight, newWidth, inputChannel);
+    mHeight = newHeight;
+    mWidth = newWidth;
+    mChannels = inputChannel;
+    mRowSpan = mWidth * mChannels;
+
+    // Computes how many pixels in the original image corresponds to one pixel
+    // in the new image.
+    int heightScale = inputHeight / newHeight;
+    int widthScale = inputWidth / newWidth;
+
+    // Average the corresponding pixels in the original image to compute the
+    // pixel value of the new image.
+    for (int i = 0; i < mHeight; ++i) {
+        for (int j = 0; j < mWidth; ++j) {
+            for (int k = 0; k < mChannels; ++k) {
+                int pixelValue = 0;
+
+                for (int l = 0; l < heightScale; ++l) {
+                    for (int m = 0; m < widthScale; ++m) {
+                        pixelValue += inputImage[
+                                (i * heightScale + l) * inputRowSpan
+                                + (j * widthScale + m) * inputChannel + k];
+                    }
+                }
+                pixelValue = pixelValue / (heightScale * widthScale);
+                mImage[i * mRowSpan + j * mChannels + k] =
+                        (unsigned char) pixelValue;
+            }
+        }
+    }
+}
+
+TestingImage::~TestingImage() {
+    if (mImage!=NULL) {
+        delete[] mImage;
+    }
+}
+
+int TestingImage::getPixelValue(int row, int column, int channel) const {
+    assert ((row >= 0) && (row < mHeight));
+    assert ((column >= 0) && (column < mWidth));
+    assert ((channel >= 0) && (channel < mChannels));
+    return (int)mImage[row * mRowSpan + column * mChannels + channel];
+}
+
+Vec3i TestingImage::getPixelValue(int row, int column) const {
+    Vec3i current_color(getPixelValue(row, column, 0),
+                        getPixelValue(row, column, 1),
+                        getPixelValue(row, column, 2));
+    return current_color;
+}
+
+Vec3i TestingImage::getPixelValue(const Vec2i &pixelPosition) const {
+    return getPixelValue(pixelPosition.x(), pixelPosition.y());
+}
+
+Vec3i TestingImage::getPixelValue(const Vec2f &pixelPosition) const {
+    return getPixelValue(static_cast<int>(pixelPosition.x()),
+                         static_cast<int>(pixelPosition.y()));
+}
+
+// Returns a vector of the colors in the requested block of color checkers.
+// The vector is formatted by going through the block from left to right and
+// from top to bottom.
+const std::vector<Vec3f>* TestingImage::getColorChecker(
+      int rowStart, int rowEnd, int columnStart, int columnEnd,
+      const std::vector<std::vector< Vec2f > >* centerAddress,
+      const std::vector<std::vector< float > >* radiusAddress) const {
+    std::vector<Vec3f>* checkerColors = new std::vector<Vec3f>;
+
+    // Average the pixel values of the pixels within the given radius to the
+    // given center position.
+    for (int i = rowStart; i < rowEnd; ++i) {
+        for (int j = columnStart; j < columnEnd; ++j) {
+            float radius = sqrt((*radiusAddress)[i][j]);
+            Vec2f center((*centerAddress)[i][j].x(),
+                               (*centerAddress)[i][j].y());
+            Vec3f meanColor(0.f, 0.f, 0.f);
+            int numPixels = 0;
+
+            for (int ii = static_cast<int>(center.x() - radius);
+                 ii < static_cast<int>(center.x() + radius); ++ii) {
+                for (int jj = static_cast<int>(center.y() - radius);
+                     jj < static_cast<int>(center.y() + radius); ++jj) {
+
+                    Vec2i pixelPosition(ii,jj);
+                    if (pixelPosition.squareDistance<float>(center) <
+                        (*radiusAddress)[i][j]) {
+                        meanColor = meanColor + getPixelValue(pixelPosition);
+                        ++numPixels;
+                    }
+                }
+            }
+            meanColor = meanColor / numPixels;
+            checkerColors->push_back(meanColor);
+        }
+    }
+
+    return checkerColors;
+}
+
+bool TestingImage::rgbToGrayScale(unsigned char* grayLayer) const {
+    if (mChannels == 4) {
+        for (int i = 0; i < mWidth; i++) {
+            for (int j = 0; j < mHeight; j++) {
+                float redLinear = pow(getPixelValue(j, i, 0),
+                                       GAMMA_CORRECTION);
+                float greenLinear = pow(getPixelValue(j,i,1),
+                                         GAMMA_CORRECTION);
+                float blueLinear = pow(getPixelValue(j,i,2),
+                                        GAMMA_CORRECTION);
+
+                // Computes the luminance value
+                grayLayer[j * mWidth + i] =
+                        (unsigned char)((int)pow((0.299f * redLinear
+                                                  + 0.587f * greenLinear
+                                                  + 0.114f * blueLinear),
+                                                  1/GAMMA_CORRECTION));
+            }
+        }
+
+        return true;
+    } else {
+
+        return false;
+    }
+}
diff --git a/apps/CtsVerifier/lib/colorchecker/vec2.cpp b/apps/CtsVerifier/lib/colorchecker/vec2.cpp
new file mode 100644
index 0000000..29736bb
--- /dev/null
+++ b/apps/CtsVerifier/lib/colorchecker/vec2.cpp
@@ -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.
+ */
+#define LOG_NDEBUG 0
+
+#define LOG_TAG "Vec2"
+#include <utils/Log.h>
+#include <utils/Timers.h>
+
+#include "vec2.h"
diff --git a/apps/CtsVerifier/lib/colorchecker/vec3.cpp b/apps/CtsVerifier/lib/colorchecker/vec3.cpp
new file mode 100644
index 0000000..ac16620
--- /dev/null
+++ b/apps/CtsVerifier/lib/colorchecker/vec3.cpp
@@ -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.
+ */
+#define LOG_NDEBUG 0
+
+#define LOG_TAG "Vec3"
+#include <utils/Log.h>
+#include <utils/Timers.h>
+
+#include "vec3.h"
diff --git a/apps/CtsVerifier/lib/colorchecker/whitebalancetest.cpp b/apps/CtsVerifier/lib/colorchecker/whitebalancetest.cpp
new file mode 100644
index 0000000..6413a2b
--- /dev/null
+++ b/apps/CtsVerifier/lib/colorchecker/whitebalancetest.cpp
@@ -0,0 +1,122 @@
+/*
+ * 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
+
+#define LOG_TAG "WhiteBalanceTest"
+#include <utils/Log.h>
+#include <utils/Timers.h>
+#include <cmath>
+#include <string>
+
+#include "vec2.h"
+#include "vec3.h"
+#include "whitebalancetest.h"
+
+// White point in XYZ color space under 5200k illumination.
+const Vec3f kDaylightWhitePoint(0.9781f, 1.f, 0.9021f);
+
+// Process the data of checker colors collected under different white balance.
+// Assuming the Daylight CCT is set to 5200k, compute the CCT of other white
+// balance modes.
+void WhiteBalanceTest::processData() {
+    ALOGV("Start Processing White Balance Test Data!");
+
+    int numPatches = mCheckerColors.size();
+    ALOGV("Processing %d tests with %d patches", 2, numPatches);
+
+    std::vector<Vec3f> xyzColors(numPatches);
+    for (int j = 0; j < numPatches; ++j) {
+        Vec3f xyzCheckerColor = initializeFromRGB(mCheckerColors[j]);
+        xyzColors[j] = xyzCheckerColor;
+        ALOGV("XYZ coordinate is %f, %f, %f", xyzCheckerColor.r(),
+              xyzCheckerColor.g(), xyzCheckerColor.b());
+    }
+
+    Vec3f meanScale(0.f, 0.f, 0.f);
+
+    if (mMode == "daylight") {
+        mXyzColorsDaylight = xyzColors;
+        // For testing the auto white balance mode. Compute a CCT that would
+        // map the gray checkers to a white point.
+        for (int j = 1; j < numPatches; ++j) {
+            meanScale = meanScale +
+                    (mXyzColorsDaylight[j] / kDaylightWhitePoint);
+        }
+    } else {
+        for (int j = 1; j < numPatches; ++j) {
+            meanScale = meanScale + (mXyzColorsDaylight[j] / xyzColors[j]);
+        }
+    }
+
+    meanScale = meanScale / (numPatches - 1);
+    ALOGV("Scale: %f, %f, %f", meanScale.r(), meanScale.g(), meanScale.b());
+
+    Vec3f whitePoint;
+    whitePoint = meanScale * kDaylightWhitePoint;
+
+    ALOGV("White point is %f, %f, %f", whitePoint.r(),
+         whitePoint.g(), whitePoint.b());
+
+    mCorrelatedColorTemp = findCorrelatedColorTemp(whitePoint);
+    ALOGV("CCT is %d", mCorrelatedColorTemp);
+}
+
+// Given a white point, find the correlated color temperature.
+// Formula taken from the paper "Calculating Correlated Color Temperatures
+// Across the Entire Gamut of Daylight and Skylight Chromaticities" by Hernandez
+// Andres et al. in 1999. The numbers are fitting parameters.
+int WhiteBalanceTest::findCorrelatedColorTemp(const Vec3f &whitePoint) {
+    Vec2f chromaOfWhitePoint(
+        whitePoint.r() / (whitePoint.r() + whitePoint.g() + whitePoint.b()),
+        whitePoint.g() / (whitePoint.r() + whitePoint.g() + whitePoint.b()));
+
+    float n = (chromaOfWhitePoint.x() - 0.3366f)
+                / (chromaOfWhitePoint.y() - 0.1735f);
+    float y = -949.86315f + 6253.80338f * exp(-n / 0.92159f)
+               + 28.70599f * exp(-n / 0.20039f) + 0.00004f * exp(-n / 0.07125f);
+
+    return static_cast<int>(y);
+}
+
+// Converts a RGB pixel value to XYZ color space.
+Vec3f WhiteBalanceTest::initializeFromRGB(const Vec3f &rgb) {
+    float linearRed = convertToLinear(rgb.r());
+    float linearGreen = convertToLinear(rgb.g());
+    float linearBlue = convertToLinear(rgb.b());
+
+    float x = 0.4124f * linearRed + 0.3576f * linearGreen +
+            0.1805f * linearBlue;
+    float y = 0.2126f * linearRed + 0.7152f * linearGreen +
+            0.0722f * linearBlue;
+    float z = 0.0193f * linearRed + 0.1192f * linearGreen +
+            0.9505f * linearBlue;
+
+    return Vec3f(x, y, z);
+}
+
+float WhiteBalanceTest::convertToLinear(float color) {
+    float norm = color/ 255.0f;
+    float linearColor;
+
+    // Convert from sRGB space to linear RGB value
+    if (norm > 0.04045f) {
+        linearColor = pow(((norm + 0.055f) / 1.055f), 2.4f);
+    } else {
+        linearColor = norm / 12.92f;
+    }
+
+    return linearColor;
+}
diff --git a/apps/CtsVerifier/res/layout/ca_main.xml b/apps/CtsVerifier/res/layout/ca_main.xml
index 98ec049..c41bcf6 100644
--- a/apps/CtsVerifier/res/layout/ca_main.xml
+++ b/apps/CtsVerifier/res/layout/ca_main.xml
@@ -19,25 +19,60 @@
   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 xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="horizontal" android:layout_width="fill_parent"
+    android:layout_height="wrap_content">
+    <!--Button android:id="@+id/focusmodesbutton" android:layout_width="0px"
+      android:layout_height="wrap_content" android:text="@string/ca_focus_modes_label"
+      android:layout_weight="1" /-->
+    <Button android:id="@+id/findcheckerboardbutton" android:layout_width="0px"
+      android:layout_height="wrap_content" android:text="@string/ca_find_checkerboard_label"
+      android:layout_weight="1" />
+
+    <Button android:id="@+id/meteringbutton" android:layout_width="0px"
+      android:layout_height="wrap_content" android:text="@string/ca_metering_label"
+      android:layout_weight="1" />
+
+    <Button android:id="@+id/exposurecompensationbutton" android:layout_width="0px"
+      android:layout_height="wrap_content" android:text="@string/ca_exposure_test_label"
+      android:layout_weight="1"/>
+
+    <Button android:id="@+id/whitebalancebutton" android:layout_width="0px"
+      android:layout_height="wrap_content" android:text="@string/ca_wb_test_label"
+      android:layout_weight="1" />
+
+    <Button android:id="@+id/lockbutton" android:layout_width="0px"
+      android:layout_height="wrap_content" android:text="@string/ca_lock_test_label"
+      android:layout_weight="1" />
+  </LinearLayout>
 
   <LinearLayout android:orientation="horizontal"
-    android:layout_width="fill_parent" android:layout_height="wrap_content">
+    android:layout_width="fill_parent" android:layout_height="0px"
+    android:layout_weight="1">
 
-    <SurfaceView android:id="@+id/cameraview" android:layout_height="match_parent"
-      android:layout_width="match_parent"
-      android:layout_weight="1" />
+    <SurfaceView android:id="@+id/cameraview" android:layout_height="fill_parent"
+      android:layout_width="wrap_content"
+      android:layout_weight="0" />
 
-    <ImageView android:id="@+id/resultview" android:layout_height="match_parent"
-      android:layout_width="match_parent"
-      android:layout_weight="1" />
+    <LinearLayout android:orientation="vertical"
+      android:layout_width="fill_parent" android:layout_height="match_parent"
+      android:layout_weight="1">
+	       
+       <ListView android:id="@+id/ca_tests"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+	    android:layout_weight="1"
+            android:layout_marginLeft="10px"/>
+
+      <ImageView android:id="@+id/resultview" android:layout_height="wrap_content"
+        android:layout_width="fill_parent"
+        android:layout_weight="1" />
+    </LinearLayout>
 
   </LinearLayout>
+
+  <include layout="@layout/pass_fail_buttons" />
+
 </LinearLayout>
 
diff --git a/apps/CtsVerifier/res/layout/ca_row.xml b/apps/CtsVerifier/res/layout/ca_row.xml
new file mode 100644
index 0000000..0e09793
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/ca_row.xml
@@ -0,0 +1,19 @@
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="horizontal"
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content"
+    >
+    <TextView
+        android:id="@+id/caTestName"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginRight="10px"
+        />
+    <TextView
+        android:id="@+id/caTestResult"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:gravity="right"
+        android:layout_marginLeft="10px"
+        />
+</LinearLayout>
diff --git a/apps/CtsVerifier/res/menu/ca_menu.xml b/apps/CtsVerifier/res/menu/ca_menu.xml
new file mode 100644
index 0000000..c33e7e8
--- /dev/null
+++ b/apps/CtsVerifier/res/menu/ca_menu.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+</menu>
diff --git a/apps/CtsVerifier/res/values/strings.xml b/apps/CtsVerifier/res/values/strings.xml
index 6e7d399..0b449a5 100644
--- a/apps/CtsVerifier/res/values/strings.xml
+++ b/apps/CtsVerifier/res/values/strings.xml
@@ -101,7 +101,7 @@
     <string name="da_screen_lock_test">Screen Lock Test</string>
     <string name="da_screen_lock_info">This test checks that the DevicePolicyManager\'s lockNow
         method immediately locks the screen. It should lock the screen immediately despite any
-        settings that may specify a timeout.\n\nClick the \"Force Lock\" button to lock the screen. 
+        settings that may specify a timeout.\n\nClick the \"Force Lock\" button to lock the screen.
         Your screen should be locked and require the password to be entered.
     </string>
     <string name="da_force_lock">Force Lock</string>
@@ -206,6 +206,11 @@
         button below to goto Settings and enable it.</string>
     <string name="nfc_settings">NFC Settings</string>
 
+    <string name="ndef_push_not_enabled">NDEF Push is not enabled!</string>
+    <string name="ndef_push_not_enabled_message">These tests require Android Beam to be enabled.
+        Click the button below to goto NFC Sharing Settings and enable it.</string>
+    <string name="ndef_push_settings">NFC Sharing Settings</string>
+
     <string name="nfc_pee_2_pee">Peer-to-Peer Data Exchange</string>
     <string name="nfc_ndef_push_sender">NDEF Push Sender</string>
     <string name="nfc_ndef_push_receiver">NDEF Push Receiver</string>
@@ -367,8 +372,14 @@
 
     <!-- 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>
+    <string name="ca_find_checkerboard_label">Find color checker</string>
+    <string name="ca_exposure_test_label">Exposure Comp. Test</string>
+    <string name="ca_result_label">Results will be here</string>
+    <string name="ca_wb_test_label">White Balance Test</string>
+    <string name="ca_lock_test_label">Auto Exposure Lock Test</string>
+    <string name="ca_metering_label">Metering Area Test</string>
+    <string name="ca_focus_modes_label">Focus Modes Test</string>
+    <string name="ca_info">This test checks the image quality of the camera of this device. It requires a MacBeth 4x6 color checker. With an ADK board and a lamp connected to it on the Relay 1 port, all tests can be run automatically. Without the ADK board, all the tests except the Auto Exposure Lock Test can be run automatically and the Auto Exposure Lock Test will require users to turn on/off a lamp according to the instruction given. </string>
 
     <!-- Strings for USB accessory test activity -->
     <string name="usb_accessory_test">USB Accessory Test</string>
diff --git a/apps/CtsVerifier/res/xml/accessory_filter_adk.xml b/apps/CtsVerifier/res/xml/accessory_filter_adk.xml
new file mode 100644
index 0000000..a5dc89a
--- /dev/null
+++ b/apps/CtsVerifier/res/xml/accessory_filter_adk.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<resources>
+    <usb-accessory model="DemoKit" manufacturer="Google" version="1.0"/>
+</resources>
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/AutoLockTest.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/AutoLockTest.java
new file mode 100644
index 0000000..6b40d2a
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/AutoLockTest.java
@@ -0,0 +1,1078 @@
+/*
+ * 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.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.ImageFormat;
+import android.hardware.Camera;
+import android.hardware.usb.UsbAccessory;
+import android.hardware.usb.UsbManager;
+import android.os.ParcelFileDescriptor;
+import android.util.Log;
+import android.view.SurfaceView;
+import android.widget.ImageView;
+import android.widget.Toast;
+
+import java.io.FileDescriptor;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Implements a test to verify whether the Auto Exposure Lock functions as
+ * described in the API.
+ *
+ * The test consists three sub-categories. The first set of tests focus on
+ * testing whether the auto exposure lock works in various situations.
+ * For all tests in this set, the lock is set during the period when the camera
+ * preview is open. In this way the lock locks exposure according to the
+ * lighting at the moment of setting the lock. The second set of tests focus on
+ * testing whether the auto exposure lock works as expected after turning the
+ * preview off and on. The lock is set during the period when the camera
+ * preview is turned off. The lock is expected to lock an exposure level
+ * identical to the one before the preview is turned off. One special case in
+ * this category is to set lock before the preview is turned on for the first
+ * time.
+ */
+public class AutoLockTest extends CameraTests {
+
+    private static final String TAG = "AutoLockTest";
+    /** USB permission to connect to ADK. */
+    private static final String ACTION_USB_PERMISSION = "com.android.cts.verifier.USB_PERMISSION";
+    /** Defines a long sleep period.*/
+    private static final int SHORT_SLEEP = 2000;
+    /** Defines a short sleep period. */
+    private static final int LONG_SLEEP = 4000;
+
+    /** Test results in text format. */
+    private String mDebugText = new String();
+    /** Detailed report. */
+    private String mResultText = new String();
+    /** Thread lock of the camera callbacks. */
+    private final Object mProcessingImage = new Object();
+    /** Memory address of the native test handler. */
+    private long mTestHandler;
+    /** Array storing the reference test results. */
+    private ArrayList<Boolean> mReferenceCompareResults;
+    /** Array storing the reference test scenario logs. */
+    private ArrayList<String> mReferenceLogs;
+    /** Number of tests so far. */
+    private int mTestCount;
+
+    /** Usb Manager of the USB connections. */
+    private UsbManager mUsbManager;
+    /** Intent for getting the permission to access the ADK. */
+    private PendingIntent mPermissionIntent;
+    /** Boolean to represent whether a permission is gained. */
+    private boolean mPermissionRequestPending;
+    /** USB accessory pointing to the ADK. */
+    private UsbAccessory mAccessory;
+    /** File descriptor of the USB communication port. */
+    private ParcelFileDescriptor mFileDescriptor;
+    /** Output stream to write commands for ADK to. */
+    private FileOutputStream mOutputStream;
+
+    /** Pointer to the CameraAnalyzerActivity activity. */
+    private CameraAnalyzerActivity mActivity;
+    /** Boolean to tell whether the accessory is opened. */
+    private boolean mSetupReady;
+    /** Thread lock for setting up the usb. */
+    private final Object mUsbSetup = new Object();
+    /** Boolean to indicate whether there is an ADK attached. */
+    private boolean mUsingUsb = false;
+    /** Test results.*/
+    private String[] mTestResults;
+    /** Number of tests. */
+    private int mNumTests;
+    /** Singleton test instance.*/
+    private static AutoLockTest singletonTest = null;
+
+    /**
+     * Receives the notice of whether the connection to ADK is granted or
+     * denied.
+     */
+    private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String action = intent.getAction();
+            Log.v(TAG, String.format("Received USB broadcast with action %s ", action));
+
+            if (ACTION_USB_PERMISSION.equals(action)) {
+                synchronized (this) {
+                    UsbAccessory accessory =
+                        (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
+
+                    if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
+                        // Grants the permission to connect to the ADK.
+                        Log.v(TAG, "Open accessory 3");
+                        openAccessory(accessory);
+                        // Overwrites the old camera instsance with the one currently opened
+                        // by the CameraAnalyzerActivity instance, since the permission
+                        // dialogue pauses the CameraAnalyzerActivity and forces the camera to
+                        // be released and reopened when the dialogue disappears.
+                        mTestCamera = mActivity.getCameraInstance();
+                    } else {
+                        // Denies the permission to connect to the ADK.
+                        Log.d(TAG, "permission denied for accessory " + accessory);
+                    }
+                    // Marks that the permission request has been processed.
+                    mPermissionRequestPending = false;
+                }
+            } else if (UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)) {
+                // Invokes when the USB is detached.
+                // Closes the accessory if it has not been closed.
+                Log.v(TAG, "Usb device detached");
+                mUsingUsb = false;
+                UsbAccessory accessory =
+                    (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
+                if (accessory != null && accessory.equals(mAccessory)) {
+                    closeAccessory();
+                }
+            }
+        }
+    };
+
+    /**
+     * Opens the ADK from USB and attaches the output stream with it.
+     *
+     * Notifies the tread lock that the USB setup is ready.
+     */
+    private void openAccessory(UsbAccessory accessory) {
+        Log.d(TAG, "openAccessory: " + accessory);
+	mFileDescriptor = mUsbManager.openAccessory(accessory);
+
+        if (mFileDescriptor != null) {
+	    mAccessory = accessory;
+	    FileDescriptor fd = mFileDescriptor.getFileDescriptor();
+            mOutputStream = new FileOutputStream(fd);
+	    Log.d(TAG, "accessory opened");
+	} else {
+            Log.d(TAG, "accessory open fail");
+	}
+
+        // Unlocks the thread lock of waiting for the USB to be ready.
+        synchronized (mUsbSetup) {
+            mSetupReady = true;
+            Log.v(TAG, "Setup ready");
+            mUsbSetup.notifyAll();
+        }
+    }
+
+    /**
+     * Closes the ADK and detaches the output stream from it.
+     */
+    private void closeAccessory() {
+	try {
+	    if (mFileDescriptor != null) {
+                mFileDescriptor.close();
+	    }
+	} catch (IOException e) {
+        } finally {
+	    mFileDescriptor = null;
+	    mAccessory = null;
+        }
+    }
+
+    /**
+     * Constructs the AutoLockTest class, which can execute a series of tests
+     * to verify whether the device's Auto Exposure Lock is working properly.
+     *
+     * The test uses the LED lights on an ADK device as light source to change
+     * the lighting condition of the environment. The usb connection to the
+     * ADK board is established in the constructor.
+     *
+     * @param hostActivity pointer to the <code>CameraAnalyzerActivity</code>
+     * that instructs the Auto Lock Test
+     * @param mCamera pointer to the current camera instance
+     */
+    private AutoLockTest(){
+        super();
+    }
+
+    public static synchronized AutoLockTest getSingletonTest() {
+        if (singletonTest == null) {
+            Log.v(TAG, "Creating a new AutoLockTest instance");
+            singletonTest = new AutoLockTest();
+            singletonTest.initializeTest();
+        }
+        return singletonTest;
+    }
+
+    private void initializeTest() {
+        // Creates a native test handler with a 120x160 pixel debug output
+        mTestHandler = createAutoLockTest();
+        mReferenceCompareResults = new ArrayList<Boolean>();
+        mReferenceLogs = new ArrayList<String>();
+        mNumTests = 4;
+        mTestResults = new String[mNumTests];
+        for (int i = 0; i < mNumTests; ++i) {
+            mTestResults[i] = "...";
+        }
+    }
+
+    public void updateCamera() {}
+
+    public void setActivity(CameraAnalyzerActivity hostActivity){
+        if (mUsingUsb) {
+            closeConnection();
+        }
+
+        mActivity = hostActivity;
+
+        mSetupReady = false;
+
+        Log.v(TAG, "Start to test ADK connection");
+        // Starts to establish the connection to the ADK board.
+        mUsbManager = (UsbManager) mActivity.getSystemService(Context.USB_SERVICE);
+        mPermissionIntent = PendingIntent.getBroadcast(mActivity, 0,
+                                                       new Intent(ACTION_USB_PERMISSION), 0);
+        IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
+        filter.addAction(UsbManager.ACTION_USB_ACCESSORY_DETACHED);
+        filter.addAction(UsbManager.ACTION_USB_ACCESSORY_ATTACHED);
+        mActivity.registerReceiver(mUsbReceiver, filter);
+
+        if (mActivity.getLastNonConfigurationInstance() != null) {
+            mAccessory = (UsbAccessory) mActivity.getLastNonConfigurationInstance();
+            Log.v(TAG, "Open acceossory 1");
+            openAccessory(mAccessory);
+        }
+
+        // Skips the permission listener if the user already grants the ADK
+        // permission previously in the app.
+        UsbAccessory[] accessories = mUsbManager.getAccessoryList();
+        UsbAccessory accessory = (accessories == null ? null : accessories[0]);
+        if (accessory != null) {
+            if (mUsbManager.hasPermission(accessory)) {
+                Log.v(TAG, "Open accessory 2");
+                openAccessory(accessory);
+            } else {
+                synchronized (mUsbReceiver) {
+                    if (!mPermissionRequestPending) {
+                        mUsbManager.requestPermission(accessory, mPermissionIntent);
+                        mPermissionRequestPending = true;
+                    }
+                }
+            }
+            mUsingUsb = true;
+        } else {
+            Log.d(TAG, "accessory is null");
+            mUsingUsb = false;
+        }
+
+    }
+
+    /**
+     * Closes the accessories and unregister the USB listener at the end of
+     * tests.
+     */
+    public void closeConnection() {
+        closeAccessory();
+        mActivity.unregisterReceiver(mUsbReceiver);
+    }
+
+    protected void finalize ()  {
+        if (mUsingUsb) {
+            closeConnection();
+        }
+    }
+
+    /**
+     * Runs the Auto Lock tests. A total of 19 tests have been coded and
+     * included. Developers can freely comment out tests not interested. In
+     * the release version, all tests will be executed.
+     */
+    @Override
+    public synchronized void run(int index){
+        if (index == 0) {
+            for (int i = 1; i < mNumTests; ++i) {
+                run(i);
+            }
+            return;
+        }
+
+        Log.v(TAG, "AutoLockTest thread started!");
+
+        if (mUsingUsb && (!mSetupReady)) {
+            // USB connection is not set up. Locks thread and wait.
+            Log.v(TAG, "Setup not ready, waiting");
+            synchronized (mUsbSetup) {
+                try{
+                    Log.v(TAG, "Start waiting for Image");
+                    mUsbSetup.wait();
+                } catch (InterruptedException e) {
+                    Log.v(TAG, "Callback wait fails!");
+                }
+            }
+        }
+
+        // Restarts the camera intance and attach the preview to the corrent
+        // UI elements.
+        restartCamera();
+        startPreview();
+
+        mTestCount = 0;
+        switch (index) {
+            case 1:
+                Log.v(TAG, "SP -> TP1 -> SP -> +1 -> Lock -> -1 -> TP2");
+                test0();
+                Log.v(TAG, "SP -> TP1 -> SP -> Lock -> +1 -> TP2 -> -1");
+                test1();
+                Log.v(TAG, "SP -> Lock -> +1 -> TP1 -> SP -> -1 -> Lock -> TP2");
+                test2();
+                Log.v(TAG, "SP -> Lock -> +1 -> TP1 -> SP -> Lock -> -1 -> TP2");
+                test3();
+                break;
+            case 2:
+                Log.v(TAG, "SP -> +1 -> TP1 -> -1 -> Lock -> SP -> TP2");
+                test4();
+                Log.v(TAG, "SP -> +1 -> TP1 -> Lock -> SP -> -1 -> TP2");
+                test5();
+                Log.v(TAG, "SP -> TP1 -> +1 -> Lock -> SP -> -1 -> TP2");
+                test6();
+                Log.v(TAG, "SP -> TP1 -> +1 -> Lock -> SP -> TP2");
+                test7();
+                Log.v(TAG, "SP -> TP1 -> Lock -> SP -> +1 -> TP2");
+                test8();
+                Log.v(TAG, "SP -> +1 -> Lock -> -1 -> TP1 -> Lock -> SP -> TP2");
+                test9();
+                Log.v(TAG, "SP -> +1 -> Lock -> TP1 -> -1 -> Lock -> SP -> TP2");
+                test10();
+                Log.v(TAG, "SP -> Lock -> TP1 -> +1 -> Lock -> SP -> -1 -> TP2");
+                test11();
+                break;
+            case 3:
+                Log.v(TAG, "Restart -> Lock -> SP -> TP1 -> Restart -> Lock -> SP -> +1 -> TP2");
+                test12();
+                Log.v(TAG, "Restart -> Lock -> SP -> +1 -> TP1 -> -1 -> Lock -> SP -> TP2");
+                test13();
+                Log.v(TAG, "Restart -> Lock -> SP -> +1 -> TP1 -> Lock -> SP -> -1 -> TP2");
+                test14();
+                Log.v(TAG, "Restart -> Lock -> SP -> TP1 -> +1 -> Lock -> SP -> -1 -> TP2");
+                test15();
+                Log.v(TAG, "Restart -> Lock -> SP -> TP1 -> +1 -> Lock -> SP -> TP2");
+                test16();
+                Log.v(TAG, "Restart -> Lock -> SP -> TP1 -> Lock -> SP -> +1 -> TP2");
+                test17();
+                Log.v(TAG, "Restart -> Lock -> SP -> TP1 -> Lock -> SP -> TP2");
+                test18();
+                break;
+            default:
+                break;
+        }
+
+        releaseLock();
+
+        Log.v(TAG, "Ready to process data");
+        boolean[] testCompareResults = new boolean[2 * mTestCount];
+
+        // Processes the data stored in the native test handler instance.
+        // Stores the test results into a boolean array.
+        processAutoLockTest(mTestHandler, testCompareResults);
+
+        // Prepares the test result text output with the booelan result array.
+        prepareDebugText(testCompareResults, index);
+        mReferenceCompareResults.clear();
+        mReferenceLogs.clear();
+    }
+
+    /**
+     * Compares two images taken under the same lighting, Image 1 without AE
+     * lock and Image 2 with AE locked under a bright light. Image 1 is
+     * expected to be brighter than Image 2.
+     * Tests whether AE lock works compared to no AE lock.
+     */
+    private void test0() {
+        releaseLock();
+        takePicture();
+        startPreview();
+        turnOnLight();
+        setLock();
+        turnOffLight();
+        takePicture();
+        startPreview();
+        releaseLock();
+        mReferenceCompareResults.add(true);
+        mReferenceCompareResults.add(false);
+        mReferenceLogs.add("Same lighting condition with one different lock");
+        ++mTestCount;
+    }
+
+    /**
+     * Compares two images taken under different lighting, Image 1 without AE
+     * lock and Image 2 with with AE locked under the same light Image 1 is
+     * taken. Image 2 is taken under a bright light. Image 1 is expected to be
+     * darker than Image 2.
+     * Tests whether AE lock works compared to no AE lock.
+     */
+    private void test1() {
+        releaseLock();
+        takePicture();
+        startPreview();
+        setLock();
+        turnOnLight();
+        takePicture();
+        turnOffLight();
+        startPreview();
+        releaseLock();
+        mReferenceCompareResults.add(false);
+        mReferenceCompareResults.add(false);
+        mReferenceLogs.add("One same lock with different lighting");
+        ++mTestCount;
+    }
+
+    /**
+     * Compares two images taken under different light, both with AE locked
+     * under the same lighting. Image 1 is taken under a brighter light.
+     * Image 1 is expected to be brighter than Image 2.
+     * Tests whether AE locks the exposure to the same level in the same
+     * lighting condition after preview restarts.
+     */
+     private void test2() {
+        releaseLock();
+        setLock();
+        turnOnLight();
+        takePicture();
+        startPreview();
+        turnOffLight();
+        setLock();
+        takePicture();
+        startPreview();
+        releaseLock();
+        mReferenceCompareResults.add(true);
+        mReferenceCompareResults.add(false);
+        mReferenceLogs.add("Same locking locations with different lighting");
+        ++mTestCount;
+    }
+
+    /**
+     * Compares two images taken under different light, Image 1 with AE locked
+     * under normal light and Image 2 with AE locked under a bright light.
+     * Image 1 is taken under a bright light and Image 2 is taken in the normal
+     * lighting. Image 1 is expected to be brighter than Image 2.
+     * Tests whether AE lock can adjust to change of lighting conditions.
+     */
+    private void test3() {
+        releaseLock();
+        setLock();
+        turnOnLight();
+        takePicture();
+        startPreview();
+        setLock();
+        turnOffLight();
+        takePicture();
+        startPreview();
+        releaseLock();
+        mReferenceCompareResults.add(true);
+        mReferenceCompareResults.add(false);
+        mReferenceLogs.add("Different locking locations with different lighting");
+        ++mTestCount;
+    }
+
+    /**
+     * Compares two images taken under different lighting, Image 1 without
+     * AE lock and Image 2 with AE lock set before camera preview resumes.
+     * Image 1 is taken under a bright light and the light is turned off before
+     * camera preview starts again. Image 1 is expected to be brighter than
+     * Image 2.
+     * Tests whether setting AE lock between camera preview stops and restarts
+     * can retain the exposure level of the previous AE-unlocked photo.
+     */
+    private void test4() {
+        releaseLock();
+        turnOnLight();
+        takePicture();
+        turnOffLight();
+        setLock();
+        startPreview();
+        takePicture();
+        startPreview();
+        releaseLock();
+        mReferenceCompareResults.add(true);
+        mReferenceCompareResults.add(false);
+        mReferenceLogs.add("Lock after takePicture and light change, before preview");
+        ++mTestCount;
+    }
+
+    /**
+     * Compares two images taken under different lighting, Image 1 without
+     * AE lock and Image 2 with AE lock set before camera preview resumes.
+     * Image 1 is taken under a bright light and the light is turned off after
+     * preview restars but before Image 2 is taken. Image 1 is expected to be
+     * brighter than Image 2.
+     * Tests whether setting AE lock between camera preview stops and restarts
+     * can retain the exposure level of the previous AE-unlocked photo.
+     */
+    private void test5() {
+        releaseLock();
+        turnOnLight();
+        takePicture();
+        setLock();
+        startPreview();
+        turnOffLight();
+        takePicture();
+        startPreview();
+        releaseLock();
+        mReferenceCompareResults.add(true);
+        mReferenceCompareResults.add(false);
+        mReferenceLogs.add("Lock between takePicture and light change, w/o light change");
+        ++mTestCount;
+    }
+
+    private void test6() {
+        releaseLock();
+        takePicture();
+        turnOnLight();
+        setLock();
+        startPreview();
+        turnOffLight();
+        takePicture();
+        startPreview();
+        releaseLock();
+        mReferenceCompareResults.add(false);
+        mReferenceCompareResults.add(true);
+        mReferenceLogs.add("Lock after takePicture and light change, before preview.");
+        ++mTestCount;
+    }
+
+    private void test7() {
+        releaseLock();
+        takePicture();
+        turnOnLight();
+        setLock();
+        startPreview();
+        takePicture();
+        startPreview();
+        releaseLock();
+        turnOffLight();
+        mReferenceCompareResults.add(false);
+        mReferenceCompareResults.add(false);
+        mReferenceLogs.add("Lock after takePicture and light change, before preview.");
+        ++mTestCount;
+    }
+
+    private void test8() {
+        releaseLock();
+        takePicture();
+        setLock();
+        startPreview();
+        turnOnLight();
+        takePicture();
+        startPreview();
+        releaseLock();
+        turnOffLight();
+        mReferenceCompareResults.add(false);
+        mReferenceCompareResults.add(false);
+        mReferenceLogs.add("Lock after takePicture and before startPreview.");
+        ++mTestCount;
+    }
+
+    private void test9() {
+        releaseLock();
+        turnOnLight();
+        setLock();
+        turnOffLight();
+        takePicture();
+        setLock();
+        startPreview();
+        takePicture();
+        releaseLock();
+        startPreview();
+        mReferenceCompareResults.add(false);
+        mReferenceCompareResults.add(true);
+        mReferenceLogs.add("Lock after first lock with changing light");
+        ++mTestCount;
+    }
+
+    private void test10() {
+        releaseLock();
+        turnOnLight();
+        setLock();
+        takePicture();
+        turnOffLight();
+        setLock();
+        startPreview();
+        takePicture();
+        releaseLock();
+        startPreview();
+        mReferenceCompareResults.add(true);
+        mReferenceCompareResults.add(false);
+        mReferenceLogs.add("Lock after first lock with changing light");
+        ++mTestCount;
+    }
+
+    private void test11() {
+        releaseLock();
+        setLock();
+        takePicture();
+        turnOnLight();
+        setLock();
+        startPreview();
+        turnOffLight();
+        takePicture();
+        releaseLock();
+        startPreview();
+        mReferenceCompareResults.add(false);
+        mReferenceCompareResults.add(true);
+        mReferenceLogs.add("Lock after first lock with changing light");
+        ++mTestCount;
+    }
+
+    private void test12() {
+        //"Restart -> Lock -> SP -> TP1 -> Restart -> Lock -> SP -> +1 -> TP2"
+        restartCamera();
+        setLock();
+        startPreview();
+        takePicture();
+        releaseLock();
+        restartCamera();
+        setLock();
+        startPreview();
+        turnOnLight();
+        takePicture();
+        releaseLock();
+        turnOffLight();
+        startPreview();
+        //mTestCamera.release();
+        mReferenceCompareResults.add(false);
+        mReferenceCompareResults.add(false);
+        mReferenceLogs.add("Lock before first preview");
+        ++mTestCount;
+    }
+
+    private void test13() {
+        //"Restart -> Lock -> SP -> +1 -> TP1 -> -1 -> Lock -> SP -> TP2"
+        restartCamera();
+        setLock();
+        startPreview();
+        turnOnLight();
+        takePicture();
+        turnOffLight();
+        setLock();
+        startPreview();
+        takePicture();
+        releaseLock();
+        startPreview();
+        mReferenceCompareResults.add(true);
+        mReferenceCompareResults.add(false);
+        mReferenceLogs.add("Lock after first lock with changing light");
+        ++mTestCount;
+    }
+
+    private void test14() {
+        //"Restart -> Lock -> SP -> +1 -> TP1 -> Lock -> SP -> -1 -> TP2"
+        restartCamera();
+        setLock();
+        startPreview();
+        turnOnLight();
+        takePicture();
+        setLock();
+        startPreview();
+        turnOffLight();
+        takePicture();
+        releaseLock();
+        startPreview();
+        mReferenceCompareResults.add(true);
+        mReferenceCompareResults.add(false);
+        mReferenceLogs.add("Lock after first lock with changing light");
+        ++mTestCount;
+    }
+
+    private void test15() {
+        //"Restart -> Lock -> SP -> TP1 -> +1 -> Lock -> SP -> -1 -> TP2"
+         restartCamera();
+        setLock();
+        startPreview();
+        takePicture();
+        turnOnLight();
+        setLock();
+        startPreview();
+        turnOffLight();
+        takePicture();
+        releaseLock();
+        startPreview();
+        mReferenceCompareResults.add(false);
+        mReferenceCompareResults.add(true);
+        mReferenceLogs.add("Lock after first lock with changing light");
+        ++mTestCount;
+    }
+
+    private void test16() {
+        //"Restart -> Lock -> SP -> TP1 -> +1 -> Lock -> SP -> TP2"
+        restartCamera();
+        setLock();
+        startPreview();
+        takePicture();
+        turnOnLight();
+        setLock();
+        startPreview();
+        takePicture();
+        turnOffLight();
+        releaseLock();
+        startPreview();
+        mReferenceCompareResults.add(false);
+        mReferenceCompareResults.add(false);
+        mReferenceLogs.add("Lock after first lock with changing light");
+        ++mTestCount;
+    }
+
+    private void test17() {
+        //"Restart -> Lock -> SP -> TP1 -> Lock -> SP -> +1 -> TP2"
+        restartCamera();
+        setLock();
+        startPreview();
+        takePicture();
+        setLock();
+        startPreview();
+        turnOnLight();
+        takePicture();
+        turnOffLight();
+        releaseLock();
+        startPreview();
+        mReferenceCompareResults.add(false);
+        mReferenceCompareResults.add(false);
+        mReferenceLogs.add("Lock after first lock with changing light");
+        ++mTestCount;
+    }
+
+    private void test18() {
+        //"Restart -> Lock -> SP -> TP1 -> Lock -> SP -> TP2"
+        restartCamera();
+        setLock();
+        startPreview();
+        takePicture();
+        setLock();
+        startPreview();
+        takePicture();
+        releaseLock();
+        startPreview();
+        mReferenceCompareResults.add(false);
+        mReferenceCompareResults.add(true);
+        mReferenceLogs.add("Lock after first lock with changing light");
+        ++mTestCount;
+    }
+
+    /**
+     * Restarts the camera by releasing the current instance and get a new
+     * instance. Also connects this new camera instance's preview to the proper
+     * UI surfaceview.
+     */
+    private void restartCamera() {
+        Log.v(TAG, "Restarting Camera");
+
+        mTestCamera.release();
+        Log.v(TAG, "Camera released");
+
+        try {
+            mTestCamera = Camera.open(mActivity.getCameraIdx());
+        } catch (RuntimeException e) {
+            throw new RuntimeException("Failed to open the camera", e);
+        }
+
+        Camera.Parameters params = mTestCamera.getParameters();
+        params.setPictureFormat(ImageFormat.JPEG);
+        params.setPictureSize(640, 480);
+        mTestCamera.setParameters(params);
+
+        try {
+            mTestCamera.setPreviewDisplay(super.getCameraView().getHolder());
+        } catch (IOException e) {
+            throw new RuntimeException("Unable to connect camera to display: " + e);
+        }
+    }
+
+    /**
+     * Starts Camera preview with a delay of 2 seconds to let it adjust to
+     * the lighting condition.
+     */
+    private void startPreview() {
+        mTestCamera.startPreview();
+        try{
+            Log.v(TAG, "Waiting");
+            Thread.sleep(2000);
+            Log.v(TAG, "END Waiting");
+        } catch (InterruptedException e){}
+    }
+
+    /**
+     * Sends command to ADK to turn on all the LED lights to white.
+     * Waits for 4 seconds for the camera to adjust to the new lighting.
+     */
+    private void turnOnLight() {
+        Log.v(TAG, "Turn on light");
+        if (mUsingUsb) {
+            byte[] buffer = new byte[3];
+
+            buffer[0] = (byte) 3;
+            buffer[1] = (byte) 0;
+            buffer[2] = (byte) 1;
+            if (mOutputStream != null && buffer[1] != -1) {
+                try {
+                    mOutputStream.write(buffer);
+                } catch (IOException e) {
+                    Log.e(TAG, "write failed", e);
+                }
+            }
+        } else {
+            mActivity.runOnUiThread(new Runnable() {
+                public void run() {
+                    Toast.makeText(mActivity.getApplicationContext(), "Turn on light!", 4).show();
+
+                }
+            });
+        }
+
+        try{
+            Log.v(TAG, "Waiting, Please Turn on light");
+            Thread.sleep(LONG_SLEEP);
+            Log.v(TAG, "END Waiting");
+        } catch (InterruptedException e){}
+    }
+
+    /**
+     * Sends command to ADK to turn off all LED lights.
+     * Waits for 4 seconds for the camera to adjust to the new lighting.
+     */
+    private void turnOffLight() {
+        Log.v(TAG, "Turn off light");
+        if (mUsingUsb) {
+            byte[] buffer = new byte[3];
+
+            buffer[0] = (byte) 3;
+            buffer[1] = (byte) 0;
+            buffer[2] = (byte) 0;
+            if (mOutputStream != null && buffer[1] != -1) {
+                try {
+                    mOutputStream.write(buffer);
+                } catch (IOException e) {
+                    Log.e(TAG, "write failed", e);
+                }
+            }
+        } else {
+            mActivity.runOnUiThread(new Runnable() {
+                public void run() {
+                    Toast.makeText(mActivity.getApplicationContext(), "Turn off light!", 4).show();
+
+                }
+            });
+        }
+
+        try{
+            Log.v(TAG, "Waiting, Please Turn off light");
+            Thread.sleep(LONG_SLEEP);
+            Log.v(TAG, "END Waiting");
+        } catch (InterruptedException e){}
+    }
+
+    /**
+     * Sets the Auto Exposure Lock.
+     * Waits for 2 seonds for the lock to function.
+     */
+    private void setLock() {
+        Camera.Parameters params = mTestCamera.getParameters();
+
+        params.setAutoExposureLock(true);
+        params.setAutoWhiteBalanceLock(true);
+        mTestCamera.setParameters(params);
+        try{
+            Log.v(TAG, "Waiting to set lock");
+            Thread.sleep(2000);
+            Log.v(TAG, "END Waiting");
+        } catch (InterruptedException e){}
+    }
+
+    /**
+     * Releases the Auto Exposure Lock.
+     * Waits for 4 seconds afterwards for the Auto Exposure to be adjusted
+     * to the lighting condition.
+     */
+    private void releaseLock() {
+        Camera.Parameters params = mTestCamera.getParameters();
+
+        params.setAutoExposureLock(false);
+        params.setAutoWhiteBalanceLock(false);
+        mTestCamera.setParameters(params);
+        try{
+            Log.v(TAG, "Waiting to release lock");
+            Thread.sleep(LONG_SLEEP);
+            Log.v(TAG, "END Waiting");
+        } catch (InterruptedException e){}
+
+    }
+
+    /**
+     * Takes a picture and locks thread until the picture callback finishes.
+     */
+    private void takePicture(){
+        mTestCamera.takePicture(null, null, null, mTestJpegListener);
+
+        synchronized (mProcessingImage) {
+            try{
+                Log.v(TAG, "Start waiting for Image");
+              //  System.gc();
+                mProcessingImage.wait();
+            } catch (InterruptedException e){
+                 Log.v(TAG, "Callback wait fails!");
+            }
+        }
+    }
+
+    /**
+     * Prepare for the result to be shown in the UI. The result for each single
+     * test is shown in green if it matches the reference result. It is shown
+     * in red otherwise.
+     */
+    private void prepareDebugText(boolean[] testCompareResults, int index) {
+        boolean groupTestPassed = true;
+         for (int i = 0; i < mTestCount; ++i) {
+              String testLog;
+              boolean testPassed = true;
+              testLog = mReferenceLogs.get(i);
+              mDebugText += (testLog + "<br/>");
+
+              if (testCompareResults[i * 2] == mReferenceCompareResults.get(i * 2)) {
+                  mDebugText += String.format(
+                      "Picture 1 brighter than Picture 2 is %b \n",
+                      testCompareResults[i * 2]);
+              } else {
+                  mDebugText += String.format(
+                      "Picture 1 brighter than Picture 2 is %b \n",
+                      testCompareResults[i * 2]);
+                  testPassed = false;
+              }
+
+              if (testCompareResults[i * 2 + 1] == mReferenceCompareResults.get(i * 2 + 1)) {
+                  mDebugText += String.format(
+                      "Picture 1 is equivalent to Picture 2 is %b \n",
+                      testCompareResults[i * 2 + 1]);
+              } else {
+                  mDebugText += String.format(
+                      "Picture 1 is equivalent to Picture 2 is %b \n",
+                      testCompareResults[i * 2 + 1]);
+                  testPassed = false;
+              }
+
+              if (testPassed) {
+                  mDebugText += "Test passed! \n";
+              } else {
+                  mDebugText += "Test failed! \n";
+                  groupTestPassed = false;
+              }
+         }
+        if (groupTestPassed) {
+            mTestResults[index] = "Passed";
+        } else {
+            mTestResults[index] = "Failed";
+        }
+    }
+
+    /**
+     * Clears the debug text so that new test results can be added.
+     */
+    public void clearDebugText() {
+        mDebugText = "";
+    }
+
+    @Override
+    public String getDebugText() {
+        return mDebugText;
+    }
+
+    @Override
+    public String getResultText() {
+        return mDebugText;
+    }
+
+    @Override
+    public String getTestName() {
+        return "Auto Exposure Lock test: \n";
+    }
+
+    @Override
+    public String getTestName(int index) {
+        switch (index) {
+            case 0:
+                return "Run all tests";
+            case 1:
+                return "Compulsory tests";
+            case 2:
+                return "Recommended tests (preview behavior)";
+            case 3:
+                return "Optional tests (default lock)";
+            default:
+                return "";
+        }
+    }
+
+    @Override
+    public String getResult(int index) {
+        return mTestResults[index];
+    }
+
+    @Override
+    public int getNumTests() {
+        return mNumTests;
+    }
+
+    private Camera.PictureCallback mTestJpegListener = new Camera.PictureCallback() {
+        public void onPictureTaken(byte[] data, Camera mCamera) {
+            Log.v(TAG, "Shutter pressed down!");
+            Bitmap inputImage;
+
+            // Decodes the camera input data into Bitmap.
+            // Constructs a native image class with the image.
+            inputImage = BitmapFactory.decodeByteArray(data, 0, data.length);
+            long bufferAddress = findNative(inputImage);
+            Log.v(TAG, "findNative method finishes");
+
+            // Cleans up memory taken by the Bitmap.
+            data = null;
+            inputImage.recycle();
+            inputImage = null;
+            System.gc();
+
+            // Passes data from the native image class to the native
+            // test handler.
+            createAutoLockClass(bufferAddress, mTestHandler,
+                                getCheckerCenter(), getCheckerRadius());
+
+            // Unlocks the thread lock.
+            synchronized (mProcessingImage) {
+                mProcessingImage.notifyAll();
+            }
+        }
+    };
+
+    private native long createAutoLockTest();
+
+    private native void createAutoLockClass(long bufferAddress, long handlerAddress,
+                                            long checkerCenterAddress,
+                                            long checkerRadiusAddress);
+
+    private native void processAutoLockTest(long handlerAddress, boolean[] testCompareResults);
+
+    static {
+        System.loadLibrary("cameraanalyzer");
+    }
+}
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
index b50dd9e..ffe9d06 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/CameraAnalyzerActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/CameraAnalyzerActivity.java
@@ -15,6 +15,7 @@
  */
 package com.android.cts.verifier.camera.analyzer;
 
+import com.android.cts.verifier.PassFailButtons;
 import com.android.cts.verifier.R;
 
 import android.app.Activity;
@@ -22,112 +23,459 @@
 import android.graphics.BitmapFactory;
 import android.graphics.ImageFormat;
 import android.hardware.Camera;
+import android.hardware.Camera.CameraInfo;
+import android.hardware.Camera.Size;
+import android.os.AsyncTask;
 import android.os.Bundle;
+import android.text.Html;
+import android.text.method.ScrollingMovementMethod;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
 import android.view.SurfaceHolder;
 import android.view.SurfaceView;
 import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
 import android.widget.ImageView;
+import android.widget.ListView;
 import android.widget.TextView;
+import android.widget.Button;
+import android.os.PowerManager;
+import android.os.PowerManager.WakeLock;
+import android.content.Context;
 
 import java.io.IOException;
+import java.lang.Thread;
+import java.util.List;
 
-public class CameraAnalyzerActivity extends Activity {
+/**
+ * Controls the UI activities of the camera quality test app. It is created
+ * as soon as the app started. Users can launch different quality tests with
+ * the buttons in the UI. This class will manage the threading for different
+ * tests. Also it will provide debug output or debug text results for tests.
+ */
+public class CameraAnalyzerActivity extends PassFailButtons.Activity {
 
-    Bitmap mInputImage;
-    TextView mResultText;
-    SurfaceView mCameraView;
-    ImageView mResultView;
-    Camera mCamera;
-    boolean mProcessingPicture = false;
+    private static final String TAG = "CameraAnalyzer";
+    private SurfaceView mCameraView;
+    private ImageView mResultView;
+    private Button mFindCheckerButton;
+    private Button mExposureCompensationButton;
+    private Button mWhiteBalanceButton;
+    private Button mAutoLockButton;
+    private Button mMeteringButton;
+    private ListView mTestList;
+    private TwoColumnAdapter mAdapter;
+
+    private Camera mCamera;
+    private int mCameraIdx = 0;
+    private boolean mIsCameraOpen = false;
+
+    private PowerManager mPowerManager;
+    private PowerManager.WakeLock mWakeLock;
+
+    private boolean mProcessingPicture = false;
+    private boolean mTestInProgress = false;
+    private final Object mProcessingTest = new Object();
+    private CameraTests mCurrentTest = null;
+
+    private long mCheckerCenterAddress;
+    private long mCheckerRadiusAddress;
+
+    private String mResultReport = "";
+    static final String[] TESTS = new String[] {"Test1", "Test2"};
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.ca_main);
+        setPassFailButtonClickListeners();
+        setInfoResources(R.string.camera_analyzer, R.string.ca_info, -1);
 
-        findViewById(R.id.runbutton).setOnClickListener(mRunListener);
+        mFindCheckerButton = (Button) findViewById(R.id.findcheckerboardbutton);
+        mExposureCompensationButton = (Button) findViewById(R.id.exposurecompensationbutton);
+        mWhiteBalanceButton = (Button) findViewById(R.id.whitebalancebutton);
+        mAutoLockButton = (Button) findViewById(R.id.lockbutton);
+        mMeteringButton = (Button) findViewById(R.id.meteringbutton);
+        mCameraView = (SurfaceView) findViewById(R.id.cameraview);
+        mResultView = (ImageView) findViewById(R.id.resultview);
+        mTestList = (ListView) findViewById(R.id.ca_tests);
+        mAdapter = new TwoColumnAdapter(this);
 
-        mCameraView = (SurfaceView)findViewById(R.id.cameraview);
-        mResultView = (ImageView)findViewById(R.id.resultview);
-        mResultText = (TextView)findViewById(R.id.resulttext);
+        // Initialize the list view.
+        initializeAdapter();
+        mTestList.setAdapter(mAdapter);
+        mTestList.setOnItemClickListener(mListListener);
+
+        mFindCheckerButton.setOnClickListener(mFindCheckerListener);
+        mExposureCompensationButton.setOnClickListener(mExposureCompensationListener);
+        mWhiteBalanceButton.setOnClickListener(mWhiteBalanceListener);
+        mAutoLockButton.setOnClickListener(mAutoLockListener);
+        mMeteringButton.setOnClickListener(mMeteringListener);
         mCameraView.getHolder().addCallback(mSurfaceChangeListener);
+
+        // Disables all test buttons except the color checker test one.
+        // They will be enabled after the color checker is located.
+        mExposureCompensationButton.setEnabled(false);
+        mWhiteBalanceButton.setEnabled(false);
+        mAutoLockButton.setEnabled(false);
+        mMeteringButton.setEnabled(false);
     }
 
     @Override
     public void onResume() {
         super.onResume();
-        mCamera = Camera.open(0);
+
+        openCamera(mCameraIdx);
         Camera.Parameters params = mCamera.getParameters();
         params.setPictureFormat(ImageFormat.JPEG);
+        params.setPictureSize(640, 480);
         mCamera.setParameters(params);
+        Log.v(TAG, "Set resolution to 640*480");
     }
 
     @Override
     public void onPause() {
         super.onPause();
-        mCamera.release();
+        CameraTests.getCamera().release();
+        mIsCameraOpen = false;
     }
 
-    private View.OnClickListener mRunListener = new View.OnClickListener() {
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        MenuInflater inflater = getMenuInflater();
+        inflater.inflate(R.menu.ca_menu, menu);
+
+        Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
+        int cameraCount = Camera.getNumberOfCameras();
+        for (int camIdx = 0; camIdx < cameraCount; ++camIdx) {
+            MenuItem cameraMenuItem = menu.add(0, camIdx, Menu.NONE,
+                                               String.format("Open Camera %d", camIdx));
+        }
+      return true;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        if (item.getItemId() != mCameraIdx) {
+            mCameraIdx = item.getItemId();
+            new SwitchCameraTask().execute(mCameraIdx);
+        }
+        return false;
+    }
+
+    private class SwitchCameraTask extends AsyncTask<Integer, Void, Void> {
+        @Override
+        protected Void doInBackground(Integer... camIdx) {
+            if (mTestInProgress) {
+                synchronized (mProcessingTest) {
+                    try{
+                        Log.v(TAG, "Waiting for test to finish");
+                        mProcessingTest.wait();
+                    } catch (InterruptedException e){
+                         Log.v(TAG, "test wait fails!");
+                    }
+                }
+            }
+
+            openCamera((int)camIdx[0]);
+            return null;
+        }
+    }
+
+    private synchronized void openCamera(int camIdx) {
+        if (mIsCameraOpen) {
+            CameraTests.getCamera().release();
+            Log.v(TAG, "Releasing the cameratests camera");
+        }
+        try {
+            mCamera = Camera.open(camIdx);
+            mIsCameraOpen = true;
+        } catch (RuntimeException e) {
+            throw new RuntimeException("Failed to open the camera", e);
+        }
+
+        try {
+            mCamera.setPreviewDisplay(mCameraView.getHolder());
+        } catch (IOException e) {
+            throw new RuntimeException("Unable to connect camera to display: " + e);
+        }
+        mCamera.startPreview();
+        CameraTests.setCamera(mCamera);
+
+        ColorCheckerTest.getSingletonTest().updateCamera();
+        WhiteBalanceTest.getSingletonTest().updateCamera();
+        ExposureCompensationTest.getSingletonTest().updateCamera();
+        MeteringTest.getSingletonTest().updateCamera();
+        AutoLockTest.getSingletonTest().updateCamera();
+    }
+
+    public Camera getCameraInstance() {
+        return mCamera;
+    }
+
+    public void disableAll() {
+        mExposureCompensationButton.setEnabled(false);
+        mWhiteBalanceButton.setEnabled(false);
+        mAutoLockButton.setEnabled(false);
+        mMeteringButton.setEnabled(false);
+        mFindCheckerButton.setEnabled(false);
+    }
+
+    public void enableAll() {
+        mExposureCompensationButton.setEnabled(true);
+        mWhiteBalanceButton.setEnabled(true);
+        mAutoLockButton.setEnabled(true);
+        mMeteringButton.setEnabled(true);
+        mFindCheckerButton.setEnabled(true);
+    }
+
+    /**
+     * Provides an abstraction for the Camera tests. The camera tests will
+     * run in the background and the results will be shown in the UI thread
+     * after the tests are processed.
+     */
+    private class DebugOutputProcessingTask extends AsyncTask<Integer,
+                                                              Integer,
+                                                              Integer> {
+        @Override
+        protected Integer doInBackground(Integer... cameraTestIndex) {
+            Log.v(TAG, "Do in Background started!");
+
+            mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
+            mWakeLock = mPowerManager.newWakeLock(
+                    PowerManager.SCREEN_DIM_WAKE_LOCK, "CameraQualityTest");
+            mWakeLock.acquire();
+
+            mTestInProgress = true;
+
+            // Processes the camera tests one by one and publishes their
+            // debug output or debug text results after each test is done.
+            mCurrentTest.run((int)cameraTestIndex[0]);
+            publishProgress(cameraTestIndex);
+
+            Log.v(TAG, "Do in Background thread returns!");
+            return cameraTestIndex[0];
+        }
+
+        @Override
+        protected void onProgressUpdate(Integer... cameraTestIndex) {
+            Log.v(TAG, "Prepare to get debug output!");
+
+            // Copies the debug output image or text results to the UI.
+            mResultView.setImageBitmap(mCurrentTest.getDebugOutput());
+            mResultReport += (mCurrentTest.getTestName() + mCurrentTest.getDebugText());
+            mAdapter.notifyDataSetChanged();
+        }
+
+        @Override
+        protected void onPostExecute(Integer cameraTestIndex) {
+
+            // If the test is to find the color checker, copy the memory
+            // address of the found color checker centers and radius to the
+            // CameraTests class' static fields.
+            if (mCurrentTest.copyCheckerAddress()) {
+                mCheckerCenterAddress = CameraTests.getCheckerCenter();
+                mCheckerRadiusAddress = CameraTests.getCheckerRadius();
+            }
+
+            if (mCurrentTest.copyCheckerAddress() ||
+                !mCurrentTest.getTestName().contains("Color Checker")) {
+                // Enables the button of all other tests after the color checker
+                // is found. Now the user can start all other available tests.
+                enableAll();
+            }
+
+            mWakeLock.release();
+            mTestInProgress = false;
+            synchronized (mProcessingTest) {
+                mProcessingTest.notifyAll();
+            }
+
+        }
+    }
+
+    // Creates and runs a new test to find color checker in the captured image.
+    // It is invoked when users press the Find color checker button in the UI.
+    private View.OnClickListener mFindCheckerListener = new View.OnClickListener() {
         @Override
         public void onClick(View v) {
-            if (!mProcessingPicture) {
-                mCamera.takePicture(null, null, null, mJpegListener);
-                mProcessingPicture = true;
-            }
+            Log.v(TAG, "Running new color checker finding tests!");
+            ColorCheckerTest colorCheckerTest = ColorCheckerTest.getSingletonTest();
+
+            mCurrentTest = colorCheckerTest;
+            initializeAdapter();
         }
     };
 
-    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!");
+    // Creates and runs a new test to test the exposure compensation function.
+    // It is invoked when users press the Exposure Compensation Test button
+    // in the UI.
+    private View.OnClickListener mExposureCompensationListener = new View.OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            Log.v(TAG, "Running new exposure compensation tests!");
+
+            ExposureCompensationTest exposureCompensationTest =
+                    ExposureCompensationTest.getSingletonTest();
+
+            mCurrentTest = exposureCompensationTest;
+            initializeAdapter();
+
+            // Loads the memory address of the checker centers and radius
+            // from the this class and set the two values for the new test.
+            ExposureCompensationTest.setCheckerAddress(mCheckerCenterAddress,
+                                                   mCheckerRadiusAddress);
+        }
+    };
+
+    // Creates and runs a new test to test the white balance function.
+    // It is invoked when users press the White Balance Test button in the UI.
+    private View.OnClickListener mWhiteBalanceListener = new View.OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            Log.v(TAG, "Running new white balance tests!");
+
+            WhiteBalanceTest whiteBalanceTest = WhiteBalanceTest.getSingletonTest();
+
+            mCurrentTest = whiteBalanceTest;
+            initializeAdapter();
+
+            // Loads the memory address of the checker centers and radius
+            // from the this class and set the two values for the new test.
+            WhiteBalanceTest.setCheckerAddress(mCheckerCenterAddress, mCheckerRadiusAddress);
+        }
+    };
+
+    // Creates and runs a new test to test the camera metering function.
+    // It is invoked when users press the Metering Test button in the UI.
+    private View.OnClickListener mMeteringListener = new View.OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            Log.v(TAG, "Running new metering tests!");
+
+            MeteringTest meteringTest = MeteringTest.getSingletonTest();
+
+            mCurrentTest = meteringTest;
+            initializeAdapter();
+
+            // Loads the memory address of the checker centers and radius
+            // from the this class and set the two values for the new test.
+            MeteringTest.setCheckerAddress(mCheckerCenterAddress, mCheckerRadiusAddress);
+        }
+    };
+
+    // Creates and runs new tests to test the camera auto exposure lock.
+    // It is invoked when users press the AWB and AE Lock Test button
+    // in the UI.
+    private View.OnClickListener mAutoLockListener = new View.OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            Log.v(TAG, "Running New auto exposure/wb lock tests!");
+
+            // Loads the memory address of the checker centers and radius
+            // from the this class and set the two values for the new test.
+            AutoLockTest.setCheckerAddress(mCheckerCenterAddress, mCheckerRadiusAddress);
+
+            // Construct all base case test scenearios for the Auto Lock test.
+            // Detailed documentation on each test can be found in native code.
+            AutoLockTest autoLockTest = AutoLockTest.getSingletonTest();
+            autoLockTest.setActivity(CameraAnalyzerActivity.this);
+
+            mCurrentTest = autoLockTest;
+            initializeAdapter();
+
+        }
+    };
+
+    // Creates a list listner that launches the experiment with the user's click
+    private AdapterView.OnItemClickListener mListListener = new AdapterView.OnItemClickListener() {
+        @Override
+        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+            Log.v(TAG, String.format("Item %d selected!", position));
+            if (!mTestInProgress) {
+                DebugOutputProcessingTask captureTask = new DebugOutputProcessingTask();
+                disableAll();
+                captureTask.execute(position);
             }
-            mProcessingPicture = false;
         }
     };
 
     private SurfaceHolder.Callback mSurfaceChangeListener =
             new SurfaceHolder.Callback() {
+
+        // Sets the aspect ratio of the camera preview to 4:3
         @Override
         public void surfaceChanged(SurfaceHolder holder,
                                    int format,
                                    int width,
                                    int height) {
+            int x = mCameraView.getWidth();
+            int y = mCameraView.getHeight();
+            Log.v(TAG, String.format("Measures are %d, %d", x, y));
 
-        }
+            if ( x > 4.0 / 3.0 * y) {
+                android.view.ViewGroup.LayoutParams lp = mCameraView.getLayoutParams();
+                lp.height =  y;
+                lp.width = (int)(4.0 / 3.0 * lp.height);
+                Log.v(TAG, String.format("params are %d, %d", lp.width, lp.height));
+                mCameraView.setLayoutParams(lp);
+            }
 
-        @Override
-        public void surfaceCreated(SurfaceHolder holder) {
             try {
                 mCamera.setPreviewDisplay(mCameraView.getHolder());
             } catch (IOException e) {
                 throw new RuntimeException("Unable to connect camera to display: " + e);
             }
+            CameraTests.setCameraView(mCameraView);
             mCamera.startPreview();
         }
 
         @Override
-        public void surfaceDestroyed(SurfaceHolder holder) {
+        public void surfaceCreated(SurfaceHolder holder) {}
 
+        @Override
+        public void surfaceDestroyed(SurfaceHolder holder) {}
+    };
+
+    @Override
+    public String getTestDetails() {
+        return mResultReport;
+    }
+
+    class TwoColumnAdapter extends ArrayAdapter<String> {
+        TwoColumnAdapter(Context context) {
+            super(context, R.layout.ca_row);
         }
 
-    };
+        @Override
+        public View getView(int position, View convertView, ViewGroup parent) {
+            LayoutInflater inflater = getLayoutInflater();
+            View row = inflater.inflate(R.layout.ca_row, parent, false);
+            TextView nameField = (TextView) row.findViewById(R.id.caTestName);
+            TextView resultField = (TextView) row.findViewById(R.id.caTestResult);
+            if (mCurrentTest != null) {
+                nameField.setText(mCurrentTest.getTestName(position));
+                resultField.setText(mCurrentTest.getResult(position));
+            }
+            return row;
+        }
+    }
+
+    private void initializeAdapter() {
+        mAdapter.clear();
+        if (mCurrentTest != null) {
+            for (int i = 0; i < mCurrentTest.getNumTests(); ++i) {
+                mAdapter.add(mCurrentTest.getTestName(i));
+            }
+        }
+    }
+
+    public int getCameraIdx() {
+        return mCameraIdx;
+    }
 }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/CameraTests.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/CameraTests.java
new file mode 100644
index 0000000..7cea762
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/CameraTests.java
@@ -0,0 +1,197 @@
+/*
+ * 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;
+import android.hardware.Camera;
+import android.os.Environment;
+import android.util.Log;
+import android.view.SurfaceView;
+
+import java.io.FileOutputStream;
+import java.io.File;
+import java.lang.Runnable;
+
+/**
+ * Provides an abstraction for all camera tests and allows communication
+ * between camera test classes with the UI thread. This base class provides
+ * functions to contruct and access debug output images. It can access and
+ * set the pointer address of checkerboard centers and radius. It also provides
+ * native methods to convert an image shot by the camera into a native
+ * character array. Another native method it provides is to create a native
+ * test handler with desired debug height and width.
+ */
+public abstract class CameraTests{
+
+    private static final String TAG = "CameraTests";
+
+    /** Memory address of the color checker centers. */
+    private static long sCheckerCenterAddress = 0;
+    /** Memory address of the color checker radius. */
+    private static long sCheckerRadiusAddress = 0;
+    /** The surface view linked with the camera preview. */
+    private static SurfaceView sCameraView;
+    /** Image debug output. */
+    private Bitmap mDebugOutput;
+    /** Shared camera instance. */
+    protected static Camera mTestCamera = null;
+
+    /**
+     * Constructs the base CameraTests class.
+     */
+    public CameraTests() {}
+
+    /**
+     * Returns debug Bitmap image. In the test to find the color checker,
+     * the debug image will be the captured image with a matched color checker
+     * overlay on top. In the exposure compensation test, the debug image
+     * will be the response curve of the camera.
+     * @return A low-resolution Bitmap to be displayed in the UI.
+     */
+    public Bitmap getDebugOutput() {
+        return mDebugOutput;
+    }
+
+    public String getDebugText() {
+        return "";
+    }
+
+    public abstract String getTestName();
+
+    /**
+     * Gets the detailed report for CTS output.
+     */
+    public String getResultText(){
+        return "Details not available \n";
+    }
+
+    /**
+     * Provides a polymorphism to start the run() method for all child classes.
+     */
+    public abstract void run(int index);
+
+    public SurfaceView getCameraView() {
+        return sCameraView;
+    }
+
+    public static void setCameraView(SurfaceView cameraView) {
+        sCameraView = cameraView;
+    }
+
+    /**
+     * Refreshes the camera instance when the activity opens a new camera.
+     */
+    public static void setCamera(Camera newCamera) {
+        mTestCamera = newCamera;
+    }
+
+    public static Camera getCamera() {
+        return mTestCamera;
+    }
+
+    /**
+     * Sets the memory address of the checker centers and checker radius.
+     *
+     * @param inputCenterAddress the new memory address of
+     *                           the color checker centers
+     * @param inputRadiusAddress the new memory address of
+     *                           the color checker radius
+     */
+    public static void setCheckerAddress(long inputCenterAddress, long inputRadiusAddress) {
+        sCheckerCenterAddress = inputCenterAddress;
+        sCheckerRadiusAddress = inputRadiusAddress;
+    }
+
+    /**
+     * Provides polymorphism to indicate whether the checker memory addresses
+     * should be copied.
+     *
+     * @return <code>true</code> if the class invoking the method needs to
+     *                           update the memory address of the color checker
+     *                           centers and radius;
+     *         <code>false</code> if the class invoking the method does NOT
+     *                           update the memory address of the color checker
+     *                           centers and radius.
+     */
+    public boolean copyCheckerAddress() {
+        return false;
+    }
+
+    public void cleanUp() {
+    }
+
+    public static long getCheckerCenter() {
+        return sCheckerCenterAddress;
+    }
+
+    public static long getCheckerRadius() {
+        return sCheckerRadiusAddress;
+    }
+
+    public abstract String getTestName(int index);
+
+    public abstract String getResult(int index);
+
+    public abstract int getNumTests();
+
+    /**
+     * Provides a native method to convert the input Bitmap of the captured
+     * image into a native character array and constructs a native image class
+     * with this character array. This method currently supports conversion
+     * of Bitmaps in the formats of RGB_565 and RGB_8888.
+     *
+     * @param input the input Bitmap, which is decoded from the camrea data.
+     *
+     * @return the memory address of the native image class which contains
+     * the character array.
+     */
+    public native long findNative(Bitmap input);
+
+    /**
+     * Provides a native method to create a native image handler class. The
+     * native image handler class is the base class for all test classes and
+     * contains the debug output as a character array.
+     *
+     * @param outputHeight the desired height for the debug output
+     * @param outputWidth the desired width for the debug output
+     *
+     * @return the memory address of the native test handler class.
+     */
+    public native long createImageTestHandler(int outputHeight, int outputWidth);
+
+    /**
+     * Provides a native method to clean up the memory taken by the handler.
+     *
+     * @param handlerAddress the memory address of the native test handler,
+     * which contains the debug output.
+     */
+    public native void cleanUpHandler(long handlerAddress);
+
+    /**
+     * Provides a native method to convert the native debug output from
+     * character array back to Bitmap and copy it to the debug output of this
+     * class.
+     *
+     * @param handlerAddress the memory address of the native test handler,
+     * which contains the debug output.
+     */
+    public native void displayHandlerDebugOutput(long handlerAddress);
+
+    static {
+        System.loadLibrary("cameraanalyzer");
+    }
+}
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
deleted file mode 100644
index c9df24a..0000000
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/ColorChecker.java
+++ /dev/null
@@ -1,104 +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.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/camera/analyzer/ColorCheckerTest.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/ColorCheckerTest.java
new file mode 100644
index 0000000..dd2a966
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/ColorCheckerTest.java
@@ -0,0 +1,293 @@
+/*
+ * 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;
+import android.graphics.BitmapFactory;
+import android.hardware.Camera;
+import android.util.Log;
+import android.widget.ImageView;
+
+import java.util.List;
+
+/** Locates a Xrite Classic Color Checker grid pattern in an image, stores the
+ * center positions and the color checker radius, and provides a function to
+ * get the memory address of these two properties.
+ *
+ * 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 also assumes that the grey squares are in the bottom
+ * row.
+ */
+public class ColorCheckerTest extends CameraTests {
+
+    private static final String TAG = "ColorCheckerTest";
+
+    /** Memory address of the image class instance that contains the image. */
+    private long mClassAddress;
+    /** Memory address of the image test class instance. */
+    private long mTestHandler;
+    /** Thread lock. */
+    private final Object mProcessingImage = new Object();
+    /** Boolean to tell whether auto focus has succeded.*/
+    private boolean mAutoFocusSuccess;
+    /** Boolean to tell whether auto focus is supported.*/
+    private boolean mAutoFocusEnabled = false;
+    /** Singleton instance of the class.*/
+    private static ColorCheckerTest singletonTest = null;
+
+    private boolean mFindCheckerSuccess = false;
+
+    /**
+     * Constructs a <code>ColorCheckerTest</code> instance with a given
+     * Camera pointer.
+     */
+    private ColorCheckerTest() {
+        super();
+    }
+
+    /**
+     * Updates the camera and parameter when the activity switches camera.
+     */
+    public void updateCamera() {
+        Camera.Parameters params = mTestCamera.getParameters();
+        List<String> supportedFocusModes = params.getSupportedFocusModes();
+
+        // Sets camera focus mode to Auto focus if it is supported.
+        if (supportedFocusModes.contains(params.FOCUS_MODE_AUTO)) {
+            Log.v(TAG, "Auto focus possible");
+            params.setFocusMode(params.FOCUS_MODE_AUTO);
+            mTestCamera.setParameters(params);
+            mAutoFocusEnabled = true;
+        } else {
+            mAutoFocusEnabled = false;
+        }
+    }
+
+    public static synchronized ColorCheckerTest getSingletonTest() {
+        if (singletonTest == null) {
+            Log.v(TAG, "Creating a new ColorCheckerTest instance");
+            singletonTest = new ColorCheckerTest();
+            singletonTest.initializeTest();
+        }
+        return singletonTest;
+    }
+
+    private void initializeTest() {
+        // Creates a native test handler with a 120x160 pixel debug output
+        mTestHandler = createColorCheckerTest(120, 160);
+    }
+
+    @Override
+    public synchronized void run(int index) {
+        Log.v(TAG, "ColorCheckerTest thread started!");
+        mAutoFocusSuccess = false;
+        mFindCheckerSuccess = false;
+        // Sets camera focus mode to Auto focus if it is supported.
+        if (mAutoFocusEnabled) {
+            while (!mAutoFocusSuccess) {
+                // Starts the auto focus process of the camera.
+                mTestCamera.autoFocus(mAutoFocusListener);
+
+                // Locks thread until the camera finishes taking picture.
+                synchronized (mProcessingImage) {
+                    try{
+                        Log.v(TAG, "Start waiting for Image");
+                        mProcessingImage.wait();
+                    } catch (InterruptedException e) {
+                        Log.v(TAG, "Callback wait fails!");
+                    }
+                }
+            }
+        } else {
+            mTestCamera.takePicture(null, null, null, mTestJpegListener);
+            synchronized (mProcessingImage) {
+                try{
+                    Log.v(TAG, "Start waiting for Image");
+                    mProcessingImage.wait();
+                } catch (InterruptedException e) {
+                    Log.v(TAG, "Callback wait fails!");
+                }
+            }
+        }
+
+        // Launches the native method to find the color checker in the image.
+        mFindCheckerSuccess = processColorCheckerTest(mTestHandler);
+        // Displays the debug output from the native test handler instance.
+        displayHandlerDebugOutput(mTestHandler);
+
+        Log.v(TAG, "Callback has returned!");
+    }
+
+    private Camera.AutoFocusCallback mAutoFocusListener = new Camera.AutoFocusCallback() {
+        public void onAutoFocus(boolean mSuccess, Camera mCamera) {
+            if (mSuccess) {
+                mAutoFocusSuccess = true;
+                Log.v(TAG, "Autofocus success!");
+                mCamera.takePicture(null, null, null, mTestJpegListener);
+            } else {
+                try{
+                    Log.v(TAG, "Autofocus failed. Please adjust!");
+                    Thread.sleep(4000);
+                    Log.v(TAG, "END Waiting");
+                } catch (InterruptedException e){}
+
+                synchronized (mProcessingImage) {
+                    mProcessingImage.notifyAll();
+                }
+            }
+        }
+    };
+
+    private Camera.PictureCallback mTestJpegListener = new Camera.PictureCallback() {
+        public void onPictureTaken(byte[] data, Camera mCamera) {
+            Log.v(TAG, "Shutter pressed down!");
+
+            // Changes the focus mode to fixed to avoid focus shift after
+            // auto focus is successful.
+            //Camera.Parameters params = mCamera.getParameters();
+            //params.setFocusMode(params.FOCUS_MODE_FIXED);
+            //mCamera.setParameters(params);
+
+            // Decodes the camera data to Bitmap and creates a native image
+            // class with the Bitmap.
+            Bitmap inputImage;
+            inputImage = BitmapFactory.decodeByteArray(data, 0, data.length);
+            long bufferAddress = findNative(inputImage);
+            Log.v(TAG, "findNative method finishes");
+
+            // Cleans up the Bitmap memory space.
+            inputImage.recycle();
+            data = null;
+            inputImage = null;
+            System.gc();
+
+            // Constructs a test handler class to handle the image.
+            createColorCheckerClass(bufferAddress, mTestHandler);
+
+            mCamera.startPreview();
+
+            // Notifies the thread lock the image capture is done.
+            synchronized (mProcessingImage) {
+                mProcessingImage.notifyAll();
+            }
+        }
+    };
+
+    /**
+     * Overrides the base class method and use the memory addresses of the
+     * checker centers and radius computed by the native test handler class
+     * to update the values stored in the base class.
+     *
+     * @return <code>true</code> indicating a memory address upload is needed.
+     */
+    @Override
+    public boolean copyCheckerAddress() {
+        if (mFindCheckerSuccess) {
+            setCheckerAddress(getColorCheckerCenterAdd(mTestHandler),
+                              getColorCheckerRadiusAdd(mTestHandler));
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    @Override
+    public void cleanUp() {
+        cleanUpHandler(mTestHandler);
+    }
+
+    @Override
+    public String getTestName() {
+        return "Color Checker test: \n";
+    }
+
+    @Override
+    public String getTestName(int index) {
+        return "Find color checker";
+    }
+
+    @Override
+    public String getResult(int index) {
+        if (mFindCheckerSuccess) {
+          return "Passed";
+        } else {
+          return "Failed";
+        }
+    }
+
+    @Override
+    public int getNumTests() {
+        return 1;
+    }
+
+    /**
+     * Gets the memory address of the vector storing the color checker centers
+     * from the native test handler instance.
+     *
+     * @param handlerAddress the memory address of the native test handler
+     * instance
+     *
+     * @return memory address of the native vector storing the color checker
+     * centers' coordinates
+     */
+    private native long getColorCheckerRadiusAdd(long handlerAddress);
+
+    /**
+     * Gets the memory address of the vector storing the color checker radius
+     * from the native test handler instance.
+     *
+     * @param handlerAddress the memory address of the native test handler
+     * instance.
+     *
+     * @return memory address of the native vector storing the color checker
+     * centers' coordinates
+     */
+    private native long getColorCheckerCenterAdd(long handlerAddress);
+
+    /**
+     * Creates a native color checker test handler instance.
+     *
+     * @param outputWidth the desired width for the debug output
+     * @param outputHeight the desired height of the debug output
+     *
+     * @return memory address of the native test handler instance
+     */
+    private native long createColorCheckerTest(int outputWidth, int outputHeight);
+
+    /**
+     * Loads a native image class instances and extracts data from it to add
+     * to the test handler.
+     *
+     * @param bufferAddress the memory address of the image class instance
+     * @param handlerAddress the memory address of the test handler instance
+     */
+    private native void createColorCheckerClass(long bufferAddress, long handlerAddress);
+
+    /**
+     * Processes the data in the native test handler instance. Computes test
+     * results with all the data and construct a debug image or debug text
+     * outputs.
+     *
+     * @param handlerAddress the memory address of the test handler instance
+     */
+    private native boolean processColorCheckerTest(long handlerAddress);
+
+    static {
+        System.loadLibrary("cameraanalyzer");
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/ExposureCompensationTest.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/ExposureCompensationTest.java
new file mode 100644
index 0000000..d9da4b6
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/ExposureCompensationTest.java
@@ -0,0 +1,215 @@
+/*
+ * 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;
+import android.graphics.BitmapFactory;
+import android.graphics.ImageFormat;
+import android.hardware.Camera;
+import android.util.Log;
+import android.widget.ImageView;
+
+import java.io.FileOutputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.Random;
+
+public class ExposureCompensationTest extends CameraTests {
+
+    private static final String TAG = "ExposureCompensationTest";
+
+    /** Records the current exposure level. */
+    private float mExposureLevel;
+    /** Lock for the camera object.*/
+    private final Object mProcessingImage = new Object();
+    /** Lock for the camera's auto focusing task.*/
+    private final Object mAutoFocusing = new Object();
+    /** Memory address of the native test handler.*/
+    private long mTestHandler;
+    /** Test results. */
+    private String[] mTestResults;
+    /** Number of sub-tests. */
+    private int mNumTests;
+    /** Camera Parameters. */
+    private Camera.Parameters mParams;
+    /** Debug results in text. */
+    private String mDebugText;
+
+    private static ExposureCompensationTest singletonTest = null;
+
+    private ExposureCompensationTest(){
+        super();
+    }
+
+    /** Prepares the camera and the related parameters for the test.*/
+    public void updateCamera() {
+        mParams = mTestCamera.getParameters();
+        Log.v(TAG, String.format("Exposure level is from %d to %d",
+                                 mParams.getMinExposureCompensation(),
+                                 mParams.getMaxExposureCompensation()));
+        mNumTests = (int) ((float) (mParams.getMaxExposureCompensation() -
+                                    mParams.getMinExposureCompensation())
+                            * mParams.getExposureCompensationStep());
+        mTestResults = new String[mNumTests + 1];
+        for (int i = 0; i < mNumTests + 1; ++i) {
+            mTestResults[i] = "...";
+        }
+    }
+
+    public static synchronized ExposureCompensationTest getSingletonTest() {
+        if (singletonTest == null) {
+            Log.v(TAG, "Creating a new ExposureCompensationTest instance");
+            singletonTest = new ExposureCompensationTest();
+            singletonTest.initializeTest();
+        }
+        return singletonTest;
+    }
+
+    private void initializeTest() {
+        mDebugText = new String();
+        // Creates a native test handler with a 120x160 pixel debug output
+        mTestHandler = createExposureCompensationTest(200, 280);
+    }
+
+    @Override
+    public synchronized void run(int index){
+        Log.v(TAG, "ExposureCompensationTest thread started!");
+
+        int testRangeMin, testRangeMax;
+        if (index == 0) {
+            testRangeMin = mParams.getMinExposureCompensation();
+            testRangeMax = mParams.getMaxExposureCompensation();
+        } else {
+            testRangeMin = (int) ((float)(index - 1) / mParams.getExposureCompensationStep())
+                    + mParams.getMinExposureCompensation();
+            testRangeMax = (int) ((float)(index) / mParams.getExposureCompensationStep())
+                    + mParams.getMinExposureCompensation();
+        }
+
+        /** Checks for each exposure compensation setting within the test range.*/
+        for (int i = testRangeMin;
+                i <= testRangeMax; i += 1){
+            mExposureLevel = i * mParams.getExposureCompensationStep();
+            Log.v(TAG, String.format("Current exposure level is %d", i));
+            int mCameraExposure;
+
+            do{
+                mParams.setExposureCompensation(i);
+                mTestCamera.setParameters(mParams);
+
+                try{
+                    Log.v(TAG, "Waiting");
+                    Thread.sleep(4000);
+                    Log.v(TAG, "END Waiting");
+                } catch (InterruptedException e){
+                    //TODO: error handling.
+                }
+
+                mParams = mTestCamera.getParameters();
+                mCameraExposure = mParams.getExposureCompensation();
+                Log.v(TAG, String.format("Camera exposure level is %d", mCameraExposure));
+            } while (mCameraExposure != i);
+
+            mTestCamera.takePicture(null, null, null, mTestJpegListener);
+
+            synchronized (mProcessingImage) {
+                try{
+                    Log.v(TAG, "Start waiting for Image");
+                    mProcessingImage.wait();
+                } catch (InterruptedException e){
+                    Log.v(TAG, "Callback wait fails!");
+                }
+            }
+        }
+
+        mDebugText = processExposureCompensationTest(mTestHandler);
+        displayHandlerDebugOutput(mTestHandler);
+
+        Log.v(TAG, "Callback has returned!");
+        mParams.setExposureCompensation(0);
+        mTestCamera.setParameters(mParams);
+    }
+
+    private Camera.PictureCallback mTestJpegListener = new Camera.PictureCallback() {
+        public void onPictureTaken(byte[] data, Camera mCamera) {
+            Log.v(TAG, "Shutter pressed down!");
+            Log.v(TAG, String.format("Current exposure is %f", mExposureLevel));
+
+            Bitmap inputImage;
+
+            inputImage = BitmapFactory.decodeByteArray(data, 0, data.length);
+            long bufferAddress = findNative(inputImage);
+            Log.v(TAG, "findNative method finishes");
+
+            inputImage.recycle();
+            data = null;
+            inputImage = null;
+            System.gc();
+
+            createExposureCompensationClass(bufferAddress, mTestHandler,
+                                            getCheckerCenter(), getCheckerRadius(),
+                                            mExposureLevel);
+            mCamera.startPreview();
+
+            synchronized (mProcessingImage) {
+                mProcessingImage.notifyAll();
+            }
+        }
+    };
+
+    @Override
+    public String getTestName(int index) {
+        switch (index) {
+            case 0:
+                return "EC All Range";
+            default:
+                return String.format("EC %d -> %d", (index - mNumTests / 2 - 1) * 10,
+                                     (index - mNumTests / 2) * 10);
+        }
+    }
+
+    @Override
+    public String getResult(int index) {
+        return mTestResults[index];
+    }
+
+    @Override
+    public int getNumTests() {
+        return mNumTests + 1;
+    }
+
+    @Override
+    public String getTestName() {
+        return "Exposure Compensation Test: \n";
+    }
+
+    @Override
+    public String getDebugText() {
+        return mDebugText;
+    }
+
+    private native long createExposureCompensationTest(int outputHeight, int outputWidth);
+
+    private native void createExposureCompensationClass(long bufferAddress, long handlerAddress,
+            long checkerCenterAddress, long checkerAadiusAddress, float mExposureLevel);
+
+    private native String processExposureCompensationTest(long handlerAddress);
+
+    static {
+        System.loadLibrary("cameraanalyzer");
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/MeteringTest.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/MeteringTest.java
new file mode 100644
index 0000000..ff5067a
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/MeteringTest.java
@@ -0,0 +1,685 @@
+/*
+ * 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;
+import android.graphics.BitmapFactory;
+import android.graphics.ImageFormat;
+import android.graphics.Rect;
+import android.hardware.Camera;
+import android.hardware.Camera.Area;
+import android.util.Log;
+import android.widget.ImageView;
+
+import java.io.FileOutputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+/**
+ * Implements a test to verify whether the camera metering system works as
+ * described in the API.
+ *
+ * The test consists two sub-categories. The first one has tests with only
+ * one metering area defined. The second one has tests with two metering areas
+ * defined. For each single sub-test, we use a random number generator to
+ * decide where to put some of the metering areas to and how much weight should
+ * be assigned to each area. For different tests, we use different ways to
+ * define other metering areas and their weight, in order to cover all possible
+ * fail cases. The metering areas are contrained to the grey squares in the
+ * bottom of the color checker.
+ */
+public class MeteringTest extends CameraTests {
+
+    private static final String TAG = "MeteringTest";
+
+    /** A long wait.*/
+    private static final int LONG_SLEEP = 4000;
+    /** Debug result in text. */
+    private String mDebugText;
+    /** Thread lock. */
+    private final Object mProcessingImage = new Object();
+    /** Memory address of the native test handler. */
+    private long mTestHandler;
+    /** The maximum number of metering area the device supports. */
+    private int mMaxNumMeteringArea;
+    /** The metering areas. */
+    private List<Camera.Area> mGreyAreas;
+    /** The coordinates of the grey squares on the color checker. */
+    private int[] mGreyCoordinates = new int[24];
+    /** Random number generator. */
+    private final Random mRandomGenerator = new Random();
+    /** Reference comparison result for tests. */
+    private ArrayList<Boolean>  mReferenceCompareResults;
+    /** Number of tests in the same instance. */
+    private int mTestCount;
+    /** Reference test logs. */
+    private ArrayList<String> mReferenceLogs;
+    /** Test result to show. */
+    private String[] mTestResults;
+    /** Number of tests. */
+    private int mNumTests;
+    /** Camera Parameters. */
+    private Camera.Parameters mParams;
+    /** Singleton test instance. */
+    private static MeteringTest singletonTest = null;
+
+    /** Constructs a <code>MeteringTest</code> instance with the given
+     * camera pointer.
+     */
+    private MeteringTest() {
+        super();
+    }
+
+    public void updateCamera() {
+        // Looks up how many metering area the device supports.
+        mParams = mTestCamera.getParameters();
+        mMaxNumMeteringArea = mParams.getMaxNumMeteringAreas();
+        Log.v(TAG, String.format("Maximum number if metering area is %d", mMaxNumMeteringArea));
+        if (mMaxNumMeteringArea == 0) {
+            mDebugText = "Custom Metering not supported!";
+            Log.v(TAG, "Custom Metering not supported");
+        }
+    }
+
+    public static synchronized MeteringTest getSingletonTest() {
+        if (singletonTest == null) {
+            Log.v(TAG, "Creating a new MeteringTest instance");
+            singletonTest = new MeteringTest();
+            singletonTest.initializeTest();
+        }
+        return singletonTest;
+    }
+
+    private void initializeTest() {
+        // Creates a native metering test handler.
+        mTestHandler = createMeteringTest();
+        mDebugText = new String();
+        mReferenceCompareResults = new ArrayList<Boolean>();
+        mReferenceLogs = new ArrayList<String>();
+        mNumTests = 3;
+        mTestResults = new String[mNumTests];
+        for (int i = 0; i < mNumTests; ++i) {
+            mTestResults[i] = "...";
+        }
+    }
+
+    /**
+     * Runs the metering test instance.
+     */
+    @Override
+    public synchronized void run(int index) {
+        if (index == 0) {
+            run(1);
+            run(2);
+            return;
+        }
+        Log.v(TAG, "MeteringTest thread started!");
+
+        // Finds the coordinates of the grey squares on the color checker.
+        // The coordinate system has (-1000, -1000) on the upper left corner.
+        // And (1000, 1000) on the bottom right corner.
+        findGreyCoordinates(mGreyCoordinates, getCheckerCenter(), getCheckerRadius());
+
+        if (mMaxNumMeteringArea > 0) {
+            mTestCount = 0;
+            // Runs the metering tests category by category.
+            switch (index) {
+                case 1:
+                    runOneAreaTest();
+                    break;
+                case 2:
+                    if (mMaxNumMeteringArea > 1) {
+                        runTwoAreasTest();
+                    }
+                    break;
+                default:
+                    break;
+            }
+        }
+
+        mParams = mTestCamera.getParameters();
+        mParams.setMeteringAreas(null);
+        mTestCamera.setParameters(mParams);
+
+        boolean[] testCompareResults = new boolean[2 * mTestCount];
+
+        // Processes the image data taken so far and stores the test results.
+        processMeteringTest(mTestHandler, testCompareResults);
+        // Prepares debug output based on the test results.
+        prepareDebugText(testCompareResults, index);
+
+        mReferenceCompareResults.clear();
+        mReferenceLogs.clear();
+    }
+
+    /**
+     * Prepares the test results in HTML text string to show in the UI.
+     *
+     * If the test result is the same as the reference result, the text will be
+     * shown in green. Otherwise it would be shown as red.
+     *
+     * @param testCompareResults the array storing the comparison results from
+     * the data taken by the camera so far.
+     */
+    private void prepareDebugText(boolean[] testCompareResults, int index) {
+        mDebugText = "";
+        boolean groupTestPassed = true;
+        for (int i = 0; i < mTestCount; ++i) {
+              String testLog;
+              boolean testPassed = true;
+              testLog = mReferenceLogs.get(i);
+              mDebugText += (testLog + "<br/>");
+
+              if (testCompareResults[i * 2] == mReferenceCompareResults.get(i * 2)) {
+                  mDebugText += String.format(
+                      "Picture 1 equivalent to Picture 2 is %b \n",
+                      testCompareResults[i * 2]);
+              } else {
+                  mDebugText += String.format(
+                      "Picture 1 equivalent to Picture 2 is %b \n",
+                      testCompareResults[i * 2]);
+                  testPassed = false;
+              }
+
+              if (testCompareResults[i * 2 + 1] == mReferenceCompareResults.get(i * 2 + 1)) {
+                  mDebugText += String.format(
+                      "Picture 1 darker than Picture 2 is %b \n",
+                      testCompareResults[i * 2 + 1]);
+              } else {
+                  mDebugText += String.format(
+                      "Picture 1 darker than Picture 2 is %b \n",
+                      testCompareResults[i * 2 + 1]);
+                  testPassed = false;
+              }
+
+              if (testPassed) {
+                  mDebugText += "Test passed! \n";
+              } else {
+                  mDebugText += "Test failed! \n";
+                  groupTestPassed = false;
+              }
+              Log.v(TAG, String.format("%s", mDebugText));
+         }
+
+        if (groupTestPassed) {
+            mTestResults[index] = "Passed";
+        } else {
+            mTestResults[index] = "Failed";
+        }
+
+    }
+
+    /**
+     * Runs tests to check whether the metering functionalities work properly
+     * when one metering area is added.
+     */
+    private void runOneAreaTest() {
+        int weight1;
+        int weight2;
+        int square1;
+        int square2;
+
+        Log.v(TAG, "Running one area Test");
+
+        // Test case 1: Two images have the same metering area. Image 1 has
+        // a diffent weight than Image 2. The result images should be
+        // identical.
+        // Tests whether weight normalization works.
+        square1 = mRandomGenerator.nextInt(6);
+        weight1 = mRandomGenerator.nextInt(100) + 1;
+        runSingleTest(square1, square1, weight1);
+
+        square2 = square1;
+        weight2 = mRandomGenerator.nextInt(100) + 901;
+        runSingleTest(square2, square2, weight2);
+        mReferenceCompareResults.add(true);
+        mReferenceCompareResults.add(false);
+        Log.v(TAG, String.format("Running test for %d square with weights %d, %d",
+                                 square1, weight1, weight2));
+        mReferenceLogs.add(String.format(
+            "Running test for %d 1x1 square with weights %d, %d", square1, weight1, weight2));
+        ++mTestCount;
+
+        // Test case 2: Two images have different metering areas. Image 1 has
+        // one of the grey squares as its metering area. Image 2 has a darker
+        // grey square as its metering area. The weights for both images are
+        // the same. Image 1 is expected to be darker than Image 2.
+        // Tests whether metering on uni-brightness patches work.
+        square1 = mRandomGenerator.nextInt(5);
+        weight1 = mRandomGenerator.nextInt(1000) + 1;
+        runSingleTest(square1, square1, weight1);
+
+        square2 = mRandomGenerator.nextInt(6 - square1 - 1) + square1 + 1;
+        weight2 = weight1;
+        runSingleTest(square2, square2, weight2);
+        mReferenceCompareResults.add(false);
+        mReferenceCompareResults.add(true);
+        mReferenceLogs.add(String.format(
+            "Running test for %d, %d 1x1 square with weight %d", square1, square2, weight1));
+        ++mTestCount;
+
+        // Test case 3: Two images have different metering areas. Image one has
+        // one of the grey squares as its metering area. Image 2 has a
+        // rectangle which contains Image 1's metering area and the neighboring
+        // darker grey square. The weights for both tests are the same. Image 1
+        // is expected to be darker than Image 2.
+        // Tests whether metering on patches with different brightness works.
+        square1 = mRandomGenerator.nextInt(5);
+        weight1 = mRandomGenerator.nextInt(1000) + 1;
+        runSingleTest(square1, square1, weight1);
+
+        square2 = square1;
+        weight2 = weight1;
+        runSingleTest(square2, square2 + 1, weight2);
+        mReferenceCompareResults.add(false);
+        mReferenceCompareResults.add(true);
+        mReferenceLogs.add(String.format(
+            "Running test for %d 1x1, 1x2 square with weight %d", square1, weight1));
+        ++mTestCount;
+
+        // Test case 4: Two images have different metering areas. Image one has
+        // two neighboring grey squares as its metering area. Image 2 has two
+        // darker neighboring grey squares as its metering area. Weights are
+        // the same for both images. Image 1 is expected to be darker than
+        // Image 2.
+        // Tests whether metering on two mixed-brightness patches work.
+        square1 = mRandomGenerator.nextInt(4);
+        weight1 = mRandomGenerator.nextInt(1000) + 1;
+        runSingleTest(square1, square1 + 1, weight1);
+
+        square2 = mRandomGenerator.nextInt(5 - square1 - 1) + square1 + 1;
+        weight2 = weight1;
+        runSingleTest(square2, square2 + 1, weight2);
+        mReferenceCompareResults.add(false);
+        mReferenceCompareResults.add(true);
+        mReferenceLogs.add(String.format(
+            "Running test for %d, %d 1x2 square with weight %d", square1, square2, weight1));
+        ++mTestCount;
+
+        // Test case 5: Two images have different metering areas. Image one has
+        // three neighboring grey squares as its metering area. Image 2 has
+        // three darker neighboring grey squares as its metering area. Weights
+        // are the same. Image 1 is expected to be darker than Image 2.
+        // Tests whether metering on three mixed-brightness patches work.
+        square1 = mRandomGenerator.nextInt(3);
+        weight1 = mRandomGenerator.nextInt(1000) + 1;
+        runSingleTest(square1, square1 + 2, weight1);
+
+        square2 = mRandomGenerator.nextInt(4 - square1 - 1) + square1 + 1;
+        weight2 = weight1;
+        runSingleTest(square2, square2 + 2, weight2);
+        mReferenceCompareResults.add(false);
+        mReferenceCompareResults.add(true);
+        mReferenceLogs.add(String.format(
+            "Running test for %d, %d 1x3 square with weight %d", square1, square2, weight1));
+        ++mTestCount;
+    }
+
+    /**
+     * Runs metering tests to verify the functionalities when there are two
+     * areas set as the metering area.
+     */
+    private void runTwoAreasTest() {
+        int[] weight1 = new int[2];
+        int[] weight2 = new int[2];
+        int[] square1Start = new int[2];
+        int[] square2Start = new int[2];
+        int[] square1End = new int[2];
+        int[] square2End = new int[2];
+
+        Log.v(TAG, "Running two-area Test");
+
+        // Test case 1: Image 1 has two metering areas. They are two adjacent
+        // grey squares (each set as a metering area). The two areas have the
+        // same weight. Image 2 has one metering area, which is the combination
+        // of Image 1's two metering areas as a rectangle. The weight is the
+        // same as that of Image 1's individual area. Image 1 is expected to
+        // be equivalent to Image 2.
+        // Tests whether having seperating a metering area into two will yield
+        // the same result.
+        square1Start[0] = mRandomGenerator.nextInt(5);
+        square1End[0] = square1Start[0];
+        weight1[0] = mRandomGenerator.nextInt(1000) + 1;
+        square1Start[1] = square1Start[0] + 1;
+        square1End[1] = square1Start[1];
+        weight1[1] = weight1[0];
+        runMultipleAreaTest(square1Start, square1End, weight1);
+
+        square2Start[0] = square1Start[0];
+        weight2[0] = weight1[0];
+        runSingleTest(square2Start[0], square2Start[0] + 1, weight2[0]);
+        mReferenceCompareResults.add(true);
+        mReferenceCompareResults.add(false);
+        mReferenceLogs.add(String.format(
+            "Running test for %d, %d 1x1 square with weight %d",
+            square1Start[0], square1Start[1], weight1[0]));
+        ++mTestCount;
+
+        // Test case 2: Image 1 has two metering areas. They are two random
+        // grey squareson the color checker. The brighter square has a larger
+        // weight than the darker square. Image 2 has the same two metering
+        // areas as Image 1. The weights for both are equal to the weight of
+        // the darker square in Image 1, which is smaller than the weight of
+        // the brighter square in Image 1. Image 1 is expected to be darker
+        // than Image 2.
+        // Tests whether giving one of the two metering areas a different
+        // weight would change the image in the correct way.
+        square1Start[0] = mRandomGenerator.nextInt(4);
+        square1End[0] = square1Start[0];
+        weight1[0] = mRandomGenerator.nextInt(100) + 901;
+        square1Start[1] = mRandomGenerator.nextInt(5 - square1Start[0] - 1) + square1Start[0] + 1;
+        square1End[1] = square1Start[1];
+        weight1[1] = mRandomGenerator.nextInt(100) + 1;
+        runMultipleAreaTest(square1Start, square1End, weight1);
+
+        square2Start[0] = square1Start[0];
+        square2End[0] = square2Start[0];
+        weight2[0] = weight1[1];
+        square2Start[1] = square1Start[1];
+        square2End[1] = square1End[1];
+        weight2[1] = weight2[0];
+        runMultipleAreaTest(square2Start, square2End, weight2);
+        mReferenceCompareResults.add(false);
+        mReferenceCompareResults.add(true);
+        mReferenceLogs.add(String.format(
+            "Running test for %d, %d 1x1 square with weight %d, %d",
+            square1Start[0], square1Start[1], weight1[0], weight2[1]));
+        ++mTestCount;
+
+        // Test case 3: Image 1 has two metering areas. Both are set to the
+        // same random grey square on the color checker. The weight for both
+        // are the same. Image 2 has one meterig area, which is the same as
+        // Image 1's chosen grey square. The weight for it is the same as
+        // Image 1's weight for one metering area. Image 1 is expected to be
+        // equivalent to Image 2.
+        // Tests whether defining overlapping metering area works.
+        square1Start[0] = mRandomGenerator.nextInt(6);
+        square1End[0] = square1Start[0];
+        weight1[0] = mRandomGenerator.nextInt(1000) + 1;
+        square1Start[1] = square1Start[0];
+        square1End[1] = square1Start[1];
+        weight1[1] = weight1[0];
+        runMultipleAreaTest(square1Start, square1End, weight1);
+
+        square2Start[0] = square1Start[0];
+        square2End[0] = square2Start[0];
+        weight2[0] = weight1[0];
+        runSingleTest(square2Start[0], square2End[0], weight2[0]);
+        mReferenceCompareResults.add(true);
+        mReferenceCompareResults.add(false);
+        mReferenceLogs.add(String.format(
+            "Running test for %d 1x1 square with weight %d,", square1Start[0], weight1[0]));
+        ++mTestCount;
+
+        // Test case 4: Image 1 has two metering areas. The first one is a
+        // grey square on the color checker. The second one is a rectangle
+        // containing the first metering area's grey square and its neighboring
+        // darker square. The weights for both metering area are the same.
+        // Image 2 has two metering areas. The first one is the same grey
+        // square as Image 1's first metering area. The second one is the
+        // neighboring darker grey square. The weight for the brighter square
+        // is double the weight of Image 1's weights for each metering area.
+        // The weight for the Image 2's darker grey square is the same as
+        // Image 1's weight for each of its metering areas. Image 1 is expected
+        // to be equivalent to Image 2.
+        // Tests whether the weights for overlapping metering area add up.
+        square1Start[0] = mRandomGenerator.nextInt(2);
+        square1End[0] = square1Start[0];
+        weight1[0] = mRandomGenerator.nextInt(500) + 1;
+        square1Start[1] = square1Start[0];
+        square1End[1] = square1Start[1] + 1;
+        weight1[1] = weight1[0];
+        runMultipleAreaTest(square1Start, square1End, weight1);
+
+        square2Start[0] = square1Start[0];
+        square2End[0] = square1End[0];
+        weight2[0] = weight1[0] * 2;
+        square2Start[1] = square2Start[0] + 1;
+        square2End[1] = square2Start[1];
+        weight2[1] = weight1[1];
+        runMultipleAreaTest(square2Start, square2End, weight2);
+        mReferenceCompareResults.add(true);
+        mReferenceCompareResults.add(false);
+        mReferenceLogs.add(String.format(
+            "Running test for %d 1x2 1x1 and 1x2 square with weight %d,",
+            square1Start[0], weight1[0]));
+        ++mTestCount;
+    }
+
+    /**
+     * Runs the metering test when multiple metering areas are defined.
+     *
+     * @param startIndex the array storing the index of the grey square where
+     * one metering area starts
+     * @param endIndex the array storing the index of the grey square where one
+     * metering area ends.
+     * @param weight the array storing the weight for each metering area.
+     */
+    private void runMultipleAreaTest(int[] startIndex, int[] endIndex, int[] weight) {
+        int numAreas = startIndex.length;
+        mParams = mTestCamera.getParameters();
+        List<Camera.Area> meteringAreas = new ArrayList<Camera.Area>();
+
+        for (int i = 0; i < numAreas; ++i) {
+            meteringAreas.add(makeArea(startIndex[i], endIndex[i], weight[i]));
+            Log.v(TAG, String.format("Add metering area for %d, %d, %d",
+                                     startIndex[i], endIndex[i], weight[i]));
+        }
+        mParams.setMeteringAreas(meteringAreas);
+        mTestCamera.setParameters(mParams);
+        takePicture();
+    }
+
+    /**
+     * Runs the metering test when one metering area is defined.
+     *
+     * @param startIndex the index of the grey square where the metering area
+     * starts
+     * @param endIndex the index of the grey square where the metering area
+     * ends.
+     * @param weight the weight for the metering area.
+     */
+    private void runSingleTest(int startIndex, int endIndex, int weight) {
+        mParams = mTestCamera.getParameters();
+        List<Camera.Area> meteringAreas = new ArrayList<Camera.Area>();
+
+        Log.v(TAG, String.format("Single test for %d, %d, %d", startIndex, endIndex, weight));
+        meteringAreas.add(makeArea(startIndex, endIndex, weight));
+        mParams.setMeteringAreas(meteringAreas);
+        mTestCamera.setParameters(mParams);
+        takePicture();
+    }
+
+    /**
+     * Takes picture with the camera instance linked to this test class.
+     */
+    private void takePicture() {
+        // Waits for the metering to be stable
+        try{
+            Log.v(TAG, "Waiting for metering");
+            Thread.sleep(LONG_SLEEP);
+            Log.v(TAG, "END Waiting");
+        } catch (InterruptedException e) {}
+
+        mTestCamera.takePicture(null, null, null, mTestJpegListener);
+
+        // Locks thread until picture is taken and ready for processing.
+        synchronized (mProcessingImage) {
+            try{
+                Log.v(TAG, "Start waiting for Image");
+
+                mProcessingImage.wait();
+            } catch (InterruptedException e) {
+                Log.v(TAG, "Callback wait fails!");
+            }
+        }
+    }
+
+    /**
+     * Constructs a <code>Camera.Area</code> object of the metering area.
+     * Given the start and end index of one metering area, it takes the upper
+     * left corner of the starting square and the bottom right corner of the
+     * end square to construct an Area.
+     *
+     * @param startIndex the index of the grey square where the metering area
+     * starts
+     * @param endIndex the index of the grey square where the metering area
+     * ends
+     * @param weight the weight of this metering area.
+     *
+     * @return a <code>Camera.Area</code> object which represents this metering
+     * area
+     */
+    private Camera.Area makeArea(int startIndex, int endIndex, int weight) {
+        Rect areaRect = new Rect(mGreyCoordinates[startIndex * 4],
+                                 mGreyCoordinates[startIndex * 4 + 1],
+                                 mGreyCoordinates[endIndex * 4 + 2],
+                                 mGreyCoordinates[endIndex * 4 + 3]);
+        Camera.Area area = new Camera.Area(areaRect, weight);
+
+        return area;
+    }
+
+    @Override
+    public String getDebugText() {
+        return mDebugText;
+    }
+
+    @Override
+    public String getResultText() {
+        return mDebugText;
+    }
+
+    @Override
+    public String getTestName() {
+        return "Metering Test: \n";
+    }
+
+    @Override
+    public String getTestName(int index) {
+        switch (index) {
+            case 0:
+                return "Run all tests";
+            case 1:
+                return "One metering area tests";
+            case 2:
+                return "Multiple metering areas tests";
+            default:
+                return "";
+        }
+    }
+
+    @Override
+    public String getResult(int index) {
+        return mTestResults[index];
+    }
+
+    @Override
+    public int getNumTests() {
+        return mNumTests;
+    }
+
+    private Camera.PictureCallback mTestJpegListener = new Camera.PictureCallback() {
+        public void onPictureTaken(byte[] data, Camera mCamera) {
+            Log.v(TAG, "Shutter pressed down!");
+            Bitmap inputImage;
+            try {
+                FileOutputStream outStream = new FileOutputStream(
+                    String.format("/sdcard/metering%d.jpg", System.currentTimeMillis()));
+                outStream.write(data);
+                outStream.close();
+            } catch (FileNotFoundException e) {
+            } catch (IOException e) {}
+
+            // Decodes the input data of the camera.
+            inputImage = BitmapFactory.decodeByteArray(data, 0, data.length);
+
+            // Records the memory address of the native image class instance.
+            long bufferAddress = findNative(inputImage);
+            Log.v(TAG, "findNative method finishes");
+
+            // Cleans up the memory taken by the bitmap.
+            inputImage.recycle();
+            data = null;
+            inputImage = null;
+            System.gc();
+
+            // Add the image data to the native test handler.
+            createMeteringClass(bufferAddress, mTestHandler,
+                                getCheckerCenter(), getCheckerRadius());
+            mCamera.startPreview();
+
+            // Releases thread lock after the image is processed.
+            synchronized (mProcessingImage) {
+                mProcessingImage.notifyAll();
+            }
+        }
+    };
+
+    /**
+     * Finds the coordinates of the grey squares on the color checker.
+     * The coordinates are computed by using the checker center and radius.
+     * The coordinates are converted to a system with (-1000, -1000) in the
+     * upper left corner and (1000, 1000) in the  bottom right corner.
+     *
+     * @param greyCoordinates the array to store the coordinates of the grey
+     * squares
+     * @param checkerCenterAddress the memory address pointing to the vector
+     * storing the color checker's centers.
+     * @param checkerRadiusAddress the memory address pointing to the vetor
+     * storing the color checker's radius.
+     */
+    private native void findGreyCoordinates(int[] greyCoordinates,
+                                            long checkerCenterAddress, long checkerRadiusAddress);
+
+    /**
+     * Creates the native metering test handler with no debug image.
+     *
+     * @return the memory address pointing to the native test handler instance
+     */
+    private native long createMeteringTest();
+
+    /**
+     * Adds the data from the native image class instance to the native test
+     * handler.
+     *
+     * @param bufferAddress the meory address of the native image class
+     * @param handlerAddress the memory address of the native test handler
+     * @param checkerCenterAddress the memory address of the checker cneters
+     * @param checkerRadiusAddress the meory address of the checker radius
+     */
+    private native void createMeteringClass(long bufferAddress, long handlerAddress,
+                                            long checkerCenterAddress,
+                                            long checkerRadiusAddress);
+
+    /**
+     * Process the data stored in the native test handler and stores the
+     * comparison results.
+     *
+     * @param handlerAddress the memory address of the native test handler
+     * @param testCompareResults the boolean array to store the test comparison
+     * results
+     */
+    private native void processMeteringTest(long handlerAddress, boolean[] testCompareResults);
+
+    static {
+        System.loadLibrary("cameraanalyzer");
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/WhiteBalanceTest.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/WhiteBalanceTest.java
new file mode 100644
index 0000000..f3bab86
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/analyzer/WhiteBalanceTest.java
@@ -0,0 +1,398 @@
+/*
+ * 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;
+import android.graphics.BitmapFactory;
+import android.graphics.ImageFormat;
+import android.hardware.Camera;
+import android.util.Log;
+import android.widget.ImageView;
+import java.io.FileOutputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+import java.util.List;
+
+/**
+ * Implements a test to verify whether the correlated color temperatures (CTT)
+ * of the supported white balance modes are inside the range camera
+ * manufacturers generally agree on.
+ *
+ * The test assumes that the Daylight white balance mode has a CCT of 5200K,
+ * which is widely agreed in industry and academics. It then use this as a
+ * benchmark and compare images taken with other white balance settings.
+ * Using the pixel values of the grey squares on the color checker, the CCT
+ * of other white balance modes can be computed. The reference ranges were
+ * summarized with the help of online resources. For the Auto mode, the
+ * reference CCT is computed as the CCT that will keep the grey squares appear
+ * grey in the result image.
+ */
+public class WhiteBalanceTest extends CameraTests {
+
+    private static final String TAG = "WhiteBalanceTest";
+
+    /** Current white balance mode. */
+    private String mWhiteBalance;
+    /** Array to store the reference CCT's of each mode. */
+    private int[][] mReferenceTemperature;
+    /** List of supported white balance mode on a device. */
+    private List<String> mWhiteBalanceList;
+    /** The index of the white balance mode "Auto". */
+    private int mAutoId;
+
+    /** Debug results in text. */
+    private String mDebugText;
+    /** Memory address of the native test handler instance. */
+    private long mTestHandler;
+    /** Thread lock. */
+    private final Object mProcessingImage = new Object();
+    /** Test result to show. */
+    private String[] mTestResults;
+    /** Number of test. */
+    private int mNumTests;
+    /** Camera Parameters. */
+    private Camera.Parameters mParams;
+    /** Singleton test instance. */
+    private static WhiteBalanceTest singletonTest = null;
+    /** Boolean to check whehter daylight wb has been recorded. */
+    private boolean mHasDaylight = false;
+
+    /**
+     * Constructs a <code>WhiteBalanceTest</code> instance with a given
+     * Camera pointer.
+     */
+    private WhiteBalanceTest() {
+        super();
+    }
+
+    public void updateCamera() {
+        mAutoId = 0;
+        mHasDaylight = false;
+        mParams = mTestCamera.getParameters();
+        mWhiteBalanceList = mParams.getSupportedWhiteBalance();
+        mNumTests = mWhiteBalanceList.size() + 1;
+        mTestResults = new String[mNumTests];
+        for (int i = 0; i < mNumTests; ++i) {
+            mTestResults[i] = "...";
+        }
+
+        if (mWhiteBalanceList != null) {
+            mReferenceTemperature = new int[mWhiteBalanceList.size()][2];
+
+            // Sets the reference CCT of the supported white balance modes
+            for (int i = 0; i < mWhiteBalanceList.size(); i++) {
+                setReferenceTemperature(i, mWhiteBalanceList.get(i));
+                if (mWhiteBalanceList.get(i).equals("auto")) {
+                    mAutoId = i;
+                }
+            }
+        }
+    }
+
+    public static synchronized WhiteBalanceTest getSingletonTest() {
+        if (singletonTest == null) {
+            Log.v(TAG, "Creating a new WhiteBalanceTest instance");
+            singletonTest = new WhiteBalanceTest();
+            singletonTest.initializeTest();
+        }
+        return singletonTest;
+    }
+
+    private void initializeTest() {
+        mDebugText = new String();
+        // Creates a native white balance test handler.
+        // mTestHandler stores the memory address of this instance.
+        mTestHandler = createWhiteBalanceTest();
+    }
+
+    private void initializeWhiteBalanceTest() {
+        mWhiteBalance = "daylight";
+        takePicture(mWhiteBalance);
+        int colorTemperature = processWhiteBalanceTest(mTestHandler);
+
+        setReferenceTemperature(mAutoId, colorTemperature);
+        mHasDaylight = true;
+    }
+
+    private void takePicture(String whiteBalance) {
+        mParams.setWhiteBalance(whiteBalance);
+        mTestCamera.setParameters(mParams);
+
+        try{
+            Log.v(TAG, "Waiting for white balance to adjust");
+            Thread.sleep(4000);
+            Log.v(TAG, "END Waiting");
+        } catch (InterruptedException e) {}
+
+        mTestCamera.takePicture(null, null, null, mTestJpegListener);
+
+        // Thread locks until image capture is done
+        synchronized (mProcessingImage) {
+            try{
+                Log.v(TAG, "Start waiting for Image");
+                mProcessingImage.wait();
+            } catch (InterruptedException e) {
+                Log.v(TAG, "Callback wait fails!");
+            }
+        }
+    }
+
+    /**
+     * Runs the white balance camera test instance.
+     */
+    @Override
+    public synchronized void run(int index) {
+        Log.v(TAG, "WhiteBalanceTest thread started!");
+
+        if (!mHasDaylight) {
+            initializeWhiteBalanceTest();
+        }
+
+        if (index != 0) {
+            // Retrieves the list of supported white balance mode.
+            mParams = mTestCamera.getParameters();
+
+            int i = index - 1;
+            mWhiteBalance = mWhiteBalanceList.get(i);
+
+            Log.v(TAG, "Current white balance is " + mWhiteBalance);
+
+            takePicture(mWhiteBalance);
+
+            // Processes the white balance test data in the native code.
+            // Returns an array of CCT of each white balance modes, given the CCT
+            // of the "Daylight" mode is 5200K.
+            int colorTemperature = 0;
+
+            Log.v(TAG, "Finished taking picture, ready to process");
+            colorTemperature = processWhiteBalanceTest(mTestHandler);
+
+            // Records the index of the "Auto" white balance mode
+            if (mWhiteBalance.equals("daylight")) {
+                setReferenceTemperature(mAutoId, colorTemperature);
+                prepareDebugText(5200, index);
+                // Computes the reference CCT range of the "Auto" mode. Assuming that
+                // all grey squares on the color checker should be imaged as grey under
+                // a CCT, this CCT is used as a middle point to provide a range.
+                //setReferenceTemperature(mAutoId, colorTemperature[mWhiteBalanceList.size()]);
+            } else {
+                // Prepares the debug output.
+                prepareDebugText(colorTemperature, index);
+            }
+        } else {
+            for (int i = 0; i < mWhiteBalanceList.size(); i++) {
+                run(i + 1);
+            }
+        }
+
+        mParams.setWhiteBalance("auto");
+        mTestCamera.setParameters(mParams);
+    }
+
+    /**
+     * Prepares the debug results in HTML text. For each white balance mode,
+     * the CCT will be printed in green if it is in the reference range and
+     * red otherwise. The reference CCT range is also printed below, with
+     * green meaning the CCT range is satisfied and red otherwise.
+     *
+     * @param colorTemperature the CCT of the supported white balance modes
+     */
+    private void prepareDebugText(int colorTemperature, int index) {
+        mDebugText += String.format("CCT Ref is %d, %d, and CCT is %d",
+                                  mReferenceTemperature[index - 1][0],
+                                  mReferenceTemperature[index - 1][1],
+                                  colorTemperature);
+        Log.v(TAG, String.format("CCT Ref is %d, %d, and CCT is %d",
+                                  mReferenceTemperature[index - 1][0],
+                                  mReferenceTemperature[index - 1][1],
+                                  colorTemperature));
+        if ((colorTemperature >= mReferenceTemperature[index - 1][0]) &&
+                (colorTemperature <= mReferenceTemperature[index - 1][1])) {
+            mTestResults[index] = "Passed";
+        } else {
+            mTestResults[index] = "Failed";
+        }
+
+    }
+
+    @Override
+    public String getDebugText() {
+        return mDebugText;
+    }
+
+    @Override
+    public String getResultText() {
+        return mDebugText;
+    }
+
+    @Override
+    public String getTestName() {
+        return "White Balance Test: \n";
+    }
+
+    @Override
+    public String getTestName(int index) {
+        if (index != 0){
+            return String.format("%s mode test", mWhiteBalanceList.get(index - 1));
+        } else {
+            return "Run all tests";
+        }
+    }
+
+    @Override
+    public String getResult(int index) {
+        return mTestResults[index];
+    }
+
+    @Override
+    public int getNumTests() {
+        return mNumTests;
+    }
+
+    /**
+     * Sets the reference temperatures for the white balance modes of
+     * incandescent, fluorescent, warm-fluorescent, daylight, cloudy, shade
+     * and twilight. These are the currently supported White balance mode
+     * listed on the Android camera API.
+     *
+     * The reference range are summarized based on the published settings of
+     * Canon, Nikon and the references from Wikipedia on color temperature.
+     *
+     * @param i the index of the current white balance mode
+     * @param referenceWhiteBalance the name of the white balance mode.
+     */
+    private void setReferenceTemperature(int i, String referenceWhiteBalance) {
+        if (referenceWhiteBalance.equals("incandescent")) {
+            mReferenceTemperature[i][0] = 2500;
+            mReferenceTemperature[i][1] = 3500;
+        } else if (referenceWhiteBalance.equals("fluorescent")) {
+            mReferenceTemperature[i][0] = 3000;
+            mReferenceTemperature[i][1] = 6500;
+        } else if (referenceWhiteBalance.equals("warm-fluorescent")) {
+            mReferenceTemperature[i][0] = 2500;
+            mReferenceTemperature[i][1] = 3000;
+        } else if (referenceWhiteBalance.equals("daylight")) {
+            mReferenceTemperature[i][0] = 5000;
+            mReferenceTemperature[i][1] = 5400;
+        } else if (referenceWhiteBalance.equals("cloudy-daylight")) {
+            mReferenceTemperature[i][0] = 5500;
+            mReferenceTemperature[i][1] = 7500;
+        } else if (referenceWhiteBalance.equals("shade")) {
+            mReferenceTemperature[i][0] = 6800;
+            mReferenceTemperature[i][1] = 8000;
+        } else if (referenceWhiteBalance.equals("twilight")) {
+            mReferenceTemperature[i][0] = 10000;
+            mReferenceTemperature[i][1] = 14000;
+        }
+    }
+
+    /** Sets a reference range of CCT based on a given middle point CCT.
+     * The rerence range is from -10% of the CCT value to +10%.
+     *
+     * @param i the index of the current white balance mode
+     * @param t the middle point CCT.
+     */
+    private void setReferenceTemperature(int i, int t) {
+        mReferenceTemperature[i][0] = (int)((double)t * 0.9);
+        mReferenceTemperature[i][1] = (int)((double)t * 1.1);
+    }
+
+    private Camera.PictureCallback mTestJpegListener = new Camera.PictureCallback() {
+        public void onPictureTaken(byte[] data, Camera mCamera) {
+            Log.v(TAG, "Shutter pressed down!");
+            Bitmap inputImage;
+            try {
+                FileOutputStream outStream = new FileOutputStream(
+                        String.format("/sdcard/wb%d.jpg", System.currentTimeMillis()));
+                outStream.write(data);
+                outStream.close();
+            } catch (FileNotFoundException e) {
+            } catch (IOException e) {}
+            // Decodes the camera data to Bitmap and creates a native image
+            // class with the Bitmap.
+            inputImage = BitmapFactory.decodeByteArray(data, 0, data.length);
+            long bufferAddress = findNative(inputImage);
+            Log.v(TAG, "findNative method finishes");
+
+            // Cleans up the Bitmap memory space.
+            inputImage.recycle();
+            data = null;
+            inputImage = null;
+            System.gc();
+
+            // Adds the data from the current image base class to the native
+            // white balance test handler.
+            createWhiteBalanceClass(bufferAddress, mTestHandler,
+                                    getCheckerCenter(), getCheckerRadius(), mWhiteBalance);
+
+            mCamera.startPreview();
+
+            // Notifies the thread lock that the image capture is finished
+            synchronized (mProcessingImage) {
+                mProcessingImage.notifyAll();
+            }
+        }
+    };
+
+    /**
+     * Creates a native white balance test handler.
+     *
+     * @return the memory address of the test handler
+     */
+    private native long createWhiteBalanceTest();
+
+    /**
+     * Adds the data of interest from the image class pointed by
+     * <code>bufferAddress</code> to the handler class pointed by
+     * <code>handlerAddress</code> by using the color checker coordinates.
+     * Also sets the white balance of this test.
+     *
+     * @param bufferAddress the memory address of the native image class
+     * containing the current camera captured image
+     * @param handlerAddress the memory address of the native white balance
+     * test handler instance
+     * @param checkerCenterAddress the memory address of the color checker
+     * center coordinates
+     * @param checkerRadiusAddress the memory address of the color checker
+     * radius
+     * @param whiteBalance the white balance mode used for shooting the image
+     */
+    private native void createWhiteBalanceClass(long bufferAddress, long handlerAddress,
+                                                long checkerCenterAddress,
+                                                long checkerRadiusAddress,
+                                                String whiteBalance);
+
+    /**
+     * Processes the white balance test in the native code. This is executed
+     * after the images are taken with all possible white balance modes. It
+     * uses the "Daylight" white balance mode as reference and computes the
+     * CCT of other white balance modes.
+     *
+     * @param handlerAddress the memory address of the native white balance
+     * test handler instance.
+     * @param colorTemperature the array to store the computed CCT of all white
+     * balance modes.
+     */
+    private native int processWhiteBalanceTest(long handlerAddress);
+
+    private native int getAutoTemperature(long handlerAddress);
+
+    static {
+        System.loadLibrary("cameraanalyzer");
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NdefPushReceiverActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NdefPushReceiverActivity.java
index f976a45..0697be2 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NdefPushReceiverActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NdefPushReceiverActivity.java
@@ -61,15 +61,19 @@
         mNfcAdapter = nfcManager.getDefaultAdapter();
         mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass())
                 .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
-
-        if (!mNfcAdapter.isEnabled()) {
-            showDialog(NFC_NOT_ENABLED_DIALOG_ID);
-        }
     }
 
     @Override
     protected void onResume() {
         super.onResume();
+
+        if (!mNfcAdapter.isEnabled()) {
+            showDialog(NFC_NOT_ENABLED_DIALOG_ID);
+        }
+
+        /* Only the sender requires mNfcAdapter.isNdefPushEnabled == true,
+         * so no need to check it here in the receiver. */
+
         mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);
     }
 
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NdefPushSenderActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NdefPushSenderActivity.java
index 2a507d3..f3f37c4 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NdefPushSenderActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NdefPushSenderActivity.java
@@ -37,6 +37,7 @@
     static final NdefMessage TEST_MESSAGE = getTestMessage();
 
     private static final int NFC_NOT_ENABLED_DIALOG_ID = 1;
+    private static final int NDEF_PUSH_NOT_ENABLED_DIALOG_ID = 2;
 
     private NfcAdapter mNfcAdapter;
 
@@ -52,10 +53,6 @@
 
         NfcManager nfcManager = (NfcManager) getSystemService(NFC_SERVICE);
         mNfcAdapter = nfcManager.getDefaultAdapter();
-
-        if (!mNfcAdapter.isEnabled()) {
-            showDialog(NFC_NOT_ENABLED_DIALOG_ID);
-        }
     }
 
     private static NdefMessage getTestMessage() {
@@ -71,6 +68,14 @@
     @Override
     protected void onResume() {
         super.onResume();
+
+        if (!mNfcAdapter.isEnabled()) {
+            showDialog(NFC_NOT_ENABLED_DIALOG_ID);
+        } else if (!mNfcAdapter.isNdefPushEnabled()) {
+            /* Sender must have NDEF push enabled */
+            showDialog(NDEF_PUSH_NOT_ENABLED_DIALOG_ID);
+        }
+
         mNfcAdapter.enableForegroundNdefPush(this, TEST_MESSAGE);
     }
 
@@ -85,7 +90,8 @@
         switch (id) {
             case NFC_NOT_ENABLED_DIALOG_ID:
                 return NfcDialogs.createNotEnabledDialog(this);
-
+            case NDEF_PUSH_NOT_ENABLED_DIALOG_ID:
+                return NfcDialogs.createNdefPushNotEnabledDialog(this);
             default:
                 return super.onCreateDialog(id, args);
         }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NfcDialogs.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NfcDialogs.java
index 1130f2d..c78062b 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NfcDialogs.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NfcDialogs.java
@@ -35,7 +35,22 @@
                 .setPositiveButton(R.string.nfc_settings, new DialogInterface.OnClickListener() {
                     @Override
                     public void onClick(DialogInterface dialog, int which) {
-                        Intent intent = new Intent(Settings.ACTION_WIRELESS_SETTINGS);
+                        Intent intent = new Intent(Settings.ACTION_NFC_SETTINGS);
+                        context.startActivity(intent);
+                    }
+                })
+                .create();
+    }
+
+    static AlertDialog createNdefPushNotEnabledDialog(final Context context) {
+        return new AlertDialog.Builder(context)
+                .setIcon(android.R.drawable.ic_dialog_alert)
+                .setTitle(R.string.ndef_push_not_enabled)
+                .setMessage(R.string.ndef_push_not_enabled_message)
+                .setPositiveButton(R.string.ndef_push_settings, new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+                        Intent intent = new Intent(Settings.ACTION_NFCSHARING_SETTINGS);
                         context.startActivity(intent);
                     }
                 })
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/TagVerifierActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/TagVerifierActivity.java
index 082c143..85a9de5 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/TagVerifierActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/TagVerifierActivity.java
@@ -104,10 +104,6 @@
             mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass())
                     .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
 
-            if (!mNfcAdapter.isEnabled()) {
-                showDialog(NFC_NOT_ENABLED_DIALOG_ID);
-            }
-
             goToWriteStep();
         } else {
             finish();
@@ -128,6 +124,10 @@
     @Override
     protected void onResume() {
         super.onResume();
+        if (!mNfcAdapter.isEnabled()) {
+            showDialog(NFC_NOT_ENABLED_DIALOG_ID);
+        }
+
         mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);
     }
 
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/streamquality/PlayVideoActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/streamquality/PlayVideoActivity.java
index 2b65421..369d32c 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/streamquality/PlayVideoActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/streamquality/PlayVideoActivity.java
@@ -69,8 +69,6 @@
     private Handler mHandler = new Handler();
     private int mVideoWidth;
     private int mVideoHeight;
-    private boolean mIsVideoSizeKnown = false;
-    private boolean mIsVideoReadyToBePlayed = false;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -170,17 +168,14 @@
 
     @Override
     public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
-        mVideoWidth = width;
-        mVideoHeight = height;
-        mIsVideoSizeKnown = true;
-        if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
-            startVideoPlayback();
+        if (width != 0 && height != 0) {
+            mVideoWidth = width;
+            mVideoHeight = height;
+            fillScreen();
         }
     }
 
     private void startVideoPlayback() {
-        mHolder.setFixedSize(mVideoWidth, mVideoHeight);
-        fillScreen();
         mPlayer.start();
 
         // Enable Pass button after 60 seconds
@@ -189,13 +184,11 @@
 
     @Override
     public void onPrepared(MediaPlayer mp) {
-        mIsVideoReadyToBePlayed = true;
-        if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
-            startVideoPlayback();
-        }
+        startVideoPlayback();
     }
 
     private void fillScreen() {
+        mHolder.setFixedSize(mVideoWidth, mVideoHeight);
         Rect rect = new Rect();
         mVideoFrame.getDrawingRect(rect);
         LayoutParams lp = mSurfaceView.getLayoutParams();
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/streamquality/StreamingVideoActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/streamquality/StreamingVideoActivity.java
index d122dec..d575e5f 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/streamquality/StreamingVideoActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/streamquality/StreamingVideoActivity.java
@@ -140,10 +140,10 @@
     private TestListAdapter getStreamAdapter() {
         ArrayTestListAdapter adapter = new ArrayTestListAdapter(this);
 
-//        adapter.add(TestListItem.newCategory("RTSP"));
-//        for (Stream stream : RTSP_STREAMS) {
-//            addStreamToTests(adapter, stream);
-//        }
+        adapter.add(TestListItem.newCategory("RTSP"));
+        for (Stream stream : RTSP_STREAMS) {
+            addStreamToTests(adapter, stream);
+        }
 
         adapter.add(TestListItem.newCategory("HTTP Progressive"));
         for (Stream stream : HTTP_STREAMS) {
diff --git a/development/ide/eclipse/.classpath b/development/ide/eclipse/.classpath
index 314dd50..0a74154 100644
--- a/development/ide/eclipse/.classpath
+++ b/development/ide/eclipse/.classpath
@@ -4,10 +4,11 @@
     <classpathentry kind="lib" path="prebuilt/common/tradefed/tradefed-prebuilt.jar"/>
     <classpathentry kind="src" path="cts/apps/CtsVerifier/src"/>
     <classpathentry kind="src" path="cts/apps/CtsVerifier/tests/src"/>
-    <classpathentry kind="src" path="cts/tests/appsecurity/src"/>
-    <classpathentry kind="src" path="cts/tests/appsecurity/test-apps/AppWithData/src"/>
-    <classpathentry kind="src" path="cts/tests/appsecurity/test-apps/CtsMonkeyApp/src"/>
-    <classpathentry kind="src" path="cts/tests/appsecurity/test-apps/CtsMonkeyApp2/src"/>
+    <classpathentry kind="src" path="cts/hostsidetests/appsecurity/src"/>
+    <classpathentry kind="src" path="cts/hostsidetests/appsecurity/test-apps/AppWithData/src"/>
+    <classpathentry kind="src" path="cts/hostsidetests/monkey/src"/>
+    <classpathentry kind="src" path="cts/hostsidetests/monkey/test-apps/CtsMonkeyApp/src"/>
+    <classpathentry kind="src" path="cts/hostsidetests/monkey/test-apps/CtsMonkeyApp2/src"/>
     <classpathentry kind="src" path="cts/libs/vogar-expect/src"/>
     <classpathentry kind="src" path="cts/tests/ApiDemosReferenceTest/src"/>
     <classpathentry kind="src" path="cts/tests/ProcessTest/src"/>
@@ -58,13 +59,17 @@
     <classpathentry kind="src" path="cts/tests/tests/speech/src"/>
     <classpathentry kind="src" path="cts/tests/tests/telephony/src"/>
     <classpathentry kind="src" path="cts/tests/tests/text/src"/>
+    <classpathentry kind="src" path="cts/tests/tests/theme/src"/>
     <classpathentry kind="src" path="cts/tests/tests/util/src"/>
     <classpathentry kind="src" path="cts/tests/tests/view/src"/>
     <classpathentry kind="src" path="cts/tests/tests/webkit/src"/>
     <classpathentry kind="src" path="cts/tests/tests/widget/src"/>
     <classpathentry kind="src" path="cts/tools/cts-api-coverage/src"/>
-    <classpathentry kind="src" path="cts/tools/cts-native-xml-generator/src"/>
+    <classpathentry kind="src" path="cts/tools/cts-java-scanner/src"/>
+    <classpathentry kind="src" path="cts/tools/cts-java-scanner-doclet/src"/>
+    <classpathentry kind="src" path="cts/tools/cts-native-scanner/src"/>
     <classpathentry kind="src" path="cts/tools/cts-reference-app-lib/src"/>
+    <classpathentry kind="src" path="cts/tools/cts-xml-generator/src"/>
     <classpathentry kind="src" path="cts/tools/dasm/src"/>
     <classpathentry kind="src" path="cts/tools/device-setup/TestDeviceSetup/src"/>
     <classpathentry kind="src" path="cts/tools/dex-tools/src"/>
@@ -77,6 +82,7 @@
     <classpathentry kind="src" path="cts/tools/tradefed-host/tests/src"/>
     <classpathentry kind="src" path="cts/tools/utils"/>
     <classpathentry kind="src" path="cts/tools/vm-tests/src"/>
+    <classpathentry kind="src" path="external/easymock/src"/>
     <classpathentry kind="src" path="out/target/common/obj/APPS/CtsAccessibilityServiceTestCases_intermediates/src/src"/>
     <classpathentry kind="src" path="out/target/common/obj/APPS/CtsTestStubs_intermediates/src/src"/>
     <classpathentry kind="src" path="out/target/common/obj/APPS/CtsVerifier_intermediates/src"/>
diff --git a/hostsidetests/Android.mk b/hostsidetests/Android.mk
new file mode 100644
index 0000000..c141484
--- /dev/null
+++ b/hostsidetests/Android.mk
@@ -0,0 +1,17 @@
+#
+# Copyright (C) 2012 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+include $(call all-subdir-makefiles)
diff --git a/hostsidetests/appsecurity/Android.mk b/hostsidetests/appsecurity/Android.mk
new file mode 100644
index 0000000..4dd8d5c
--- /dev/null
+++ b/hostsidetests/appsecurity/Android.mk
@@ -0,0 +1,31 @@
+# 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)
+
+include $(CLEAR_VARS)
+
+# Only compile source java files in this apk.
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_MODULE := CtsAppSecurityTests
+
+LOCAL_JAVA_LIBRARIES := cts-tradefed tradefed-prebuilt ddmlib-prebuilt junit
+
+LOCAL_CTS_TEST_PACKAGE := android.tests.appsecurity
+
+include $(BUILD_CTS_HOST_JAVA_LIBRARY)
+
+# Build the test APKs using their own makefiles
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/appsecurity-tests/certs/cts-testkey1.pem b/hostsidetests/appsecurity/certs/cts-testkey1.pem
similarity index 100%
rename from tests/appsecurity-tests/certs/cts-testkey1.pem
rename to hostsidetests/appsecurity/certs/cts-testkey1.pem
diff --git a/tests/appsecurity-tests/certs/cts-testkey1.pk8 b/hostsidetests/appsecurity/certs/cts-testkey1.pk8
similarity index 100%
rename from tests/appsecurity-tests/certs/cts-testkey1.pk8
rename to hostsidetests/appsecurity/certs/cts-testkey1.pk8
Binary files differ
diff --git a/tests/appsecurity-tests/certs/cts-testkey1.x509.pem b/hostsidetests/appsecurity/certs/cts-testkey1.x509.pem
similarity index 100%
rename from tests/appsecurity-tests/certs/cts-testkey1.x509.pem
rename to hostsidetests/appsecurity/certs/cts-testkey1.x509.pem
diff --git a/tests/appsecurity-tests/certs/cts-testkey2.pem b/hostsidetests/appsecurity/certs/cts-testkey2.pem
similarity index 100%
rename from tests/appsecurity-tests/certs/cts-testkey2.pem
rename to hostsidetests/appsecurity/certs/cts-testkey2.pem
diff --git a/tests/appsecurity-tests/certs/cts-testkey2.pk8 b/hostsidetests/appsecurity/certs/cts-testkey2.pk8
similarity index 100%
rename from tests/appsecurity-tests/certs/cts-testkey2.pk8
rename to hostsidetests/appsecurity/certs/cts-testkey2.pk8
Binary files differ
diff --git a/tests/appsecurity-tests/certs/cts-testkey2.x509.pem b/hostsidetests/appsecurity/certs/cts-testkey2.x509.pem
similarity index 100%
rename from tests/appsecurity-tests/certs/cts-testkey2.x509.pem
rename to hostsidetests/appsecurity/certs/cts-testkey2.x509.pem
diff --git a/tests/appsecurity-tests/src/com/android/cts/appsecurity/AppSecurityTests.java b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/AppSecurityTests.java
similarity index 100%
rename from tests/appsecurity-tests/src/com/android/cts/appsecurity/AppSecurityTests.java
rename to hostsidetests/appsecurity/src/com/android/cts/appsecurity/AppSecurityTests.java
diff --git a/tests/appsecurity-tests/test-apps/Android.mk b/hostsidetests/appsecurity/test-apps/Android.mk
similarity index 100%
rename from tests/appsecurity-tests/test-apps/Android.mk
rename to hostsidetests/appsecurity/test-apps/Android.mk
diff --git a/hostsidetests/appsecurity/test-apps/AppAccessData/Android.mk b/hostsidetests/appsecurity/test-apps/AppAccessData/Android.mk
new file mode 100644
index 0000000..6c31fd9
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/AppAccessData/Android.mk
@@ -0,0 +1,30 @@
+# 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)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_SDK_VERSION := current
+
+LOCAL_PACKAGE_NAME := CtsAppAccessData
+
+# although not strictly necessary, sign this app with different cert than CtsAppWithData
+LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey2
+
+include $(BUILD_PACKAGE)
diff --git a/tests/appsecurity-tests/test-apps/AppAccessData/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/AppAccessData/AndroidManifest.xml
similarity index 100%
rename from tests/appsecurity-tests/test-apps/AppAccessData/AndroidManifest.xml
rename to hostsidetests/appsecurity/test-apps/AppAccessData/AndroidManifest.xml
diff --git a/tests/appsecurity-tests/test-apps/AppAccessData/src/com/android/cts/appaccessdata/AccessPrivateDataTest.java b/hostsidetests/appsecurity/test-apps/AppAccessData/src/com/android/cts/appaccessdata/AccessPrivateDataTest.java
similarity index 100%
rename from tests/appsecurity-tests/test-apps/AppAccessData/src/com/android/cts/appaccessdata/AccessPrivateDataTest.java
rename to hostsidetests/appsecurity/test-apps/AppAccessData/src/com/android/cts/appaccessdata/AccessPrivateDataTest.java
diff --git a/hostsidetests/appsecurity/test-apps/AppWithData/Android.mk b/hostsidetests/appsecurity/test-apps/AppWithData/Android.mk
new file mode 100644
index 0000000..ae14b7c
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/AppWithData/Android.mk
@@ -0,0 +1,29 @@
+# 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)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_SDK_VERSION := current
+
+LOCAL_PACKAGE_NAME := CtsAppWithData
+
+LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey1
+
+include $(BUILD_PACKAGE)
diff --git a/tests/appsecurity-tests/test-apps/AppWithData/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/AppWithData/AndroidManifest.xml
similarity index 100%
rename from tests/appsecurity-tests/test-apps/AppWithData/AndroidManifest.xml
rename to hostsidetests/appsecurity/test-apps/AppWithData/AndroidManifest.xml
diff --git a/tests/appsecurity-tests/test-apps/AppWithData/src/com/android/cts/appwithdata/CreatePrivateDataTest.java b/hostsidetests/appsecurity/test-apps/AppWithData/src/com/android/cts/appwithdata/CreatePrivateDataTest.java
similarity index 100%
rename from tests/appsecurity-tests/test-apps/AppWithData/src/com/android/cts/appwithdata/CreatePrivateDataTest.java
rename to hostsidetests/appsecurity/test-apps/AppWithData/src/com/android/cts/appwithdata/CreatePrivateDataTest.java
diff --git a/hostsidetests/appsecurity/test-apps/InstrumentationAppDiffCert/Android.mk b/hostsidetests/appsecurity/test-apps/InstrumentationAppDiffCert/Android.mk
new file mode 100644
index 0000000..67b2246
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/InstrumentationAppDiffCert/Android.mk
@@ -0,0 +1,30 @@
+# 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)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_SDK_VERSION := current
+
+LOCAL_PACKAGE_NAME := CtsInstrumentationAppDiffCert
+
+# sign this app with different cert than CtsTargetInstrumentationApp
+LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey2
+
+include $(BUILD_PACKAGE)
diff --git a/tests/appsecurity-tests/test-apps/InstrumentationAppDiffCert/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/InstrumentationAppDiffCert/AndroidManifest.xml
similarity index 100%
rename from tests/appsecurity-tests/test-apps/InstrumentationAppDiffCert/AndroidManifest.xml
rename to hostsidetests/appsecurity/test-apps/InstrumentationAppDiffCert/AndroidManifest.xml
diff --git a/tests/appsecurity-tests/test-apps/InstrumentationAppDiffCert/src/com/android/cts/instrumentationdiffcertapp/InstrumentationFailToRunTest.java b/hostsidetests/appsecurity/test-apps/InstrumentationAppDiffCert/src/com/android/cts/instrumentationdiffcertapp/InstrumentationFailToRunTest.java
similarity index 100%
rename from tests/appsecurity-tests/test-apps/InstrumentationAppDiffCert/src/com/android/cts/instrumentationdiffcertapp/InstrumentationFailToRunTest.java
rename to hostsidetests/appsecurity/test-apps/InstrumentationAppDiffCert/src/com/android/cts/instrumentationdiffcertapp/InstrumentationFailToRunTest.java
diff --git a/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/Android.mk b/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/Android.mk
new file mode 100644
index 0000000..41ddb64
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/Android.mk
@@ -0,0 +1,30 @@
+# 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)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_SDK_VERSION := current
+
+LOCAL_PACKAGE_NAME := CtsPermissionDeclareApp
+
+# sign this app with a different cert than CtsUsePermissionDiffCert
+LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey1
+
+include $(BUILD_PACKAGE)
diff --git a/tests/appsecurity-tests/test-apps/PermissionDeclareApp/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/AndroidManifest.xml
similarity index 100%
rename from tests/appsecurity-tests/test-apps/PermissionDeclareApp/AndroidManifest.xml
rename to hostsidetests/appsecurity/test-apps/PermissionDeclareApp/AndroidManifest.xml
diff --git a/tests/appsecurity-tests/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/GrantUriPermission.java b/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/GrantUriPermission.java
similarity index 100%
rename from tests/appsecurity-tests/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/GrantUriPermission.java
rename to hostsidetests/appsecurity/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/GrantUriPermission.java
diff --git a/tests/appsecurity-tests/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/PermissionContentProvider.java b/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/PermissionContentProvider.java
similarity index 100%
rename from tests/appsecurity-tests/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/PermissionContentProvider.java
rename to hostsidetests/appsecurity/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/PermissionContentProvider.java
diff --git a/tests/appsecurity-tests/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/PermissionContentProviderGranting.java b/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/PermissionContentProviderGranting.java
similarity index 100%
rename from tests/appsecurity-tests/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/PermissionContentProviderGranting.java
rename to hostsidetests/appsecurity/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/PermissionContentProviderGranting.java
diff --git a/tests/appsecurity-tests/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/PermissionContentProviderPath.java b/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/PermissionContentProviderPath.java
similarity index 100%
rename from tests/appsecurity-tests/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/PermissionContentProviderPath.java
rename to hostsidetests/appsecurity/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/PermissionContentProviderPath.java
diff --git a/tests/appsecurity-tests/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/PrivateContentProvider.java b/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/PrivateContentProvider.java
similarity index 100%
rename from tests/appsecurity-tests/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/PrivateContentProvider.java
rename to hostsidetests/appsecurity/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/PrivateContentProvider.java
diff --git a/tests/appsecurity-tests/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/PrivateContentProviderGranting.java b/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/PrivateContentProviderGranting.java
similarity index 100%
rename from tests/appsecurity-tests/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/PrivateContentProviderGranting.java
rename to hostsidetests/appsecurity/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/PrivateContentProviderGranting.java
diff --git a/tests/appsecurity-tests/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/SetInstallerPackage.java b/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/SetInstallerPackage.java
similarity index 100%
rename from tests/appsecurity-tests/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/SetInstallerPackage.java
rename to hostsidetests/appsecurity/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/SetInstallerPackage.java
diff --git a/hostsidetests/appsecurity/test-apps/SharedUidInstall/Android.mk b/hostsidetests/appsecurity/test-apps/SharedUidInstall/Android.mk
new file mode 100644
index 0000000..f852c56
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/SharedUidInstall/Android.mk
@@ -0,0 +1,32 @@
+# 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)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_SDK_VERSION := current
+
+LOCAL_PACKAGE_NAME := CtsSharedUidInstall
+
+# sign this app with a different cert than CtsSharedUidInstallDiffCert
+LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey1
+
+LOCAL_PROGUARD_ENABLED := disabled
+
+include $(BUILD_PACKAGE)
diff --git a/tests/appsecurity-tests/test-apps/SharedUidInstall/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/SharedUidInstall/AndroidManifest.xml
similarity index 100%
rename from tests/appsecurity-tests/test-apps/SharedUidInstall/AndroidManifest.xml
rename to hostsidetests/appsecurity/test-apps/SharedUidInstall/AndroidManifest.xml
diff --git a/tests/appsecurity-tests/test-apps/SharedUidInstall/src/com/android/cts/shareduidinstall/SharedUidActivity.java b/hostsidetests/appsecurity/test-apps/SharedUidInstall/src/com/android/cts/shareduidinstall/SharedUidActivity.java
similarity index 100%
rename from tests/appsecurity-tests/test-apps/SharedUidInstall/src/com/android/cts/shareduidinstall/SharedUidActivity.java
rename to hostsidetests/appsecurity/test-apps/SharedUidInstall/src/com/android/cts/shareduidinstall/SharedUidActivity.java
diff --git a/hostsidetests/appsecurity/test-apps/SharedUidInstallDiffCert/Android.mk b/hostsidetests/appsecurity/test-apps/SharedUidInstallDiffCert/Android.mk
new file mode 100644
index 0000000..3f0a6b6
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/SharedUidInstallDiffCert/Android.mk
@@ -0,0 +1,30 @@
+# 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)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_SDK_VERSION := current
+
+LOCAL_PACKAGE_NAME := CtsSharedUidInstallDiffCert
+
+# sign this app with a different cert than CtsSharedUidInstall
+LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey2
+
+include $(BUILD_PACKAGE)
diff --git a/tests/appsecurity-tests/test-apps/SharedUidInstallDiffCert/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/SharedUidInstallDiffCert/AndroidManifest.xml
similarity index 100%
rename from tests/appsecurity-tests/test-apps/SharedUidInstallDiffCert/AndroidManifest.xml
rename to hostsidetests/appsecurity/test-apps/SharedUidInstallDiffCert/AndroidManifest.xml
diff --git a/tests/appsecurity-tests/test-apps/SharedUidInstallDiffCert/src/com/android/cts/shareduidinstalldiffcert/SharedUidActivity.java b/hostsidetests/appsecurity/test-apps/SharedUidInstallDiffCert/src/com/android/cts/shareduidinstalldiffcert/SharedUidActivity.java
similarity index 100%
rename from tests/appsecurity-tests/test-apps/SharedUidInstallDiffCert/src/com/android/cts/shareduidinstalldiffcert/SharedUidActivity.java
rename to hostsidetests/appsecurity/test-apps/SharedUidInstallDiffCert/src/com/android/cts/shareduidinstalldiffcert/SharedUidActivity.java
diff --git a/hostsidetests/appsecurity/test-apps/SimpleAppInstall/Android.mk b/hostsidetests/appsecurity/test-apps/SimpleAppInstall/Android.mk
new file mode 100644
index 0000000..f7e0f27
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/SimpleAppInstall/Android.mk
@@ -0,0 +1,30 @@
+# 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)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_SDK_VERSION := current
+
+LOCAL_PACKAGE_NAME := CtsSimpleAppInstall
+
+# sign this app with a different cert than CtsSimpleAppInstallDiffCert
+LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey1
+
+include $(BUILD_PACKAGE)
diff --git a/tests/appsecurity-tests/test-apps/SimpleAppInstall/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/SimpleAppInstall/AndroidManifest.xml
similarity index 100%
rename from tests/appsecurity-tests/test-apps/SimpleAppInstall/AndroidManifest.xml
rename to hostsidetests/appsecurity/test-apps/SimpleAppInstall/AndroidManifest.xml
diff --git a/tests/appsecurity-tests/test-apps/SimpleAppInstall/src/com/android/cts/simpleappinstall/SimpleAppActivity.java b/hostsidetests/appsecurity/test-apps/SimpleAppInstall/src/com/android/cts/simpleappinstall/SimpleAppActivity.java
similarity index 100%
rename from tests/appsecurity-tests/test-apps/SimpleAppInstall/src/com/android/cts/simpleappinstall/SimpleAppActivity.java
rename to hostsidetests/appsecurity/test-apps/SimpleAppInstall/src/com/android/cts/simpleappinstall/SimpleAppActivity.java
diff --git a/hostsidetests/appsecurity/test-apps/SimpleAppInstallDiffCert/Android.mk b/hostsidetests/appsecurity/test-apps/SimpleAppInstallDiffCert/Android.mk
new file mode 100644
index 0000000..06290be
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/SimpleAppInstallDiffCert/Android.mk
@@ -0,0 +1,30 @@
+# 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)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_SDK_VERSION := current
+
+LOCAL_PACKAGE_NAME := CtsSimpleAppInstallDiffCert
+
+# sign this app with a different cert than CtsSimpleAppInstall
+LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey2
+
+include $(BUILD_PACKAGE)
diff --git a/tests/appsecurity-tests/test-apps/SimpleAppInstallDiffCert/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/SimpleAppInstallDiffCert/AndroidManifest.xml
similarity index 100%
rename from tests/appsecurity-tests/test-apps/SimpleAppInstallDiffCert/AndroidManifest.xml
rename to hostsidetests/appsecurity/test-apps/SimpleAppInstallDiffCert/AndroidManifest.xml
diff --git a/tests/appsecurity-tests/test-apps/SimpleAppInstallDiffCert/src/com/android/cts/simpleappinstall/SimpleAppActivity.java b/hostsidetests/appsecurity/test-apps/SimpleAppInstallDiffCert/src/com/android/cts/simpleappinstall/SimpleAppActivity.java
similarity index 100%
rename from tests/appsecurity-tests/test-apps/SimpleAppInstallDiffCert/src/com/android/cts/simpleappinstall/SimpleAppActivity.java
rename to hostsidetests/appsecurity/test-apps/SimpleAppInstallDiffCert/src/com/android/cts/simpleappinstall/SimpleAppActivity.java
diff --git a/hostsidetests/appsecurity/test-apps/TargetInstrumentationApp/Android.mk b/hostsidetests/appsecurity/test-apps/TargetInstrumentationApp/Android.mk
new file mode 100644
index 0000000..532403c
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/TargetInstrumentationApp/Android.mk
@@ -0,0 +1,30 @@
+# 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)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_SDK_VERSION := current
+
+LOCAL_PACKAGE_NAME := CtsTargetInstrumentationApp
+
+# sign this app with different cert than CtsInstrumentationAppDiffCert
+LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey1
+
+include $(BUILD_PACKAGE)
diff --git a/tests/appsecurity-tests/test-apps/TargetInstrumentationApp/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/TargetInstrumentationApp/AndroidManifest.xml
similarity index 100%
rename from tests/appsecurity-tests/test-apps/TargetInstrumentationApp/AndroidManifest.xml
rename to hostsidetests/appsecurity/test-apps/TargetInstrumentationApp/AndroidManifest.xml
diff --git a/tests/appsecurity-tests/test-apps/TargetInstrumentationApp/src/com/android/cts/targetinstrumentationapp/TargetInstrumentationActivity.java b/hostsidetests/appsecurity/test-apps/TargetInstrumentationApp/src/com/android/cts/targetinstrumentationapp/TargetInstrumentationActivity.java
similarity index 100%
rename from tests/appsecurity-tests/test-apps/TargetInstrumentationApp/src/com/android/cts/targetinstrumentationapp/TargetInstrumentationActivity.java
rename to hostsidetests/appsecurity/test-apps/TargetInstrumentationApp/src/com/android/cts/targetinstrumentationapp/TargetInstrumentationActivity.java
diff --git a/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/Android.mk b/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/Android.mk
new file mode 100644
index 0000000..44ff270
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/Android.mk
@@ -0,0 +1,30 @@
+# 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)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_SDK_VERSION := current
+
+LOCAL_PACKAGE_NAME := CtsUsePermissionDiffCert
+
+# sign this app with a different cert than CtsPermissionDeclareApp
+LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey2
+
+include $(BUILD_PACKAGE)
diff --git a/tests/appsecurity-tests/test-apps/UsePermissionDiffCert/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/AndroidManifest.xml
similarity index 100%
rename from tests/appsecurity-tests/test-apps/UsePermissionDiffCert/AndroidManifest.xml
rename to hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/AndroidManifest.xml
diff --git a/tests/appsecurity-tests/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/AccessPermissionWithDiffSigTest.java b/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/AccessPermissionWithDiffSigTest.java
similarity index 100%
rename from tests/appsecurity-tests/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/AccessPermissionWithDiffSigTest.java
rename to hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/AccessPermissionWithDiffSigTest.java
diff --git a/tests/appsecurity-tests/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/ModifyInstallerPackageTest.java b/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/ModifyInstallerPackageTest.java
similarity index 100%
rename from tests/appsecurity-tests/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/ModifyInstallerPackageTest.java
rename to hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/ModifyInstallerPackageTest.java
diff --git a/tests/appsecurity-tests/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/ReceiveUriActivity.java b/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/ReceiveUriActivity.java
similarity index 100%
rename from tests/appsecurity-tests/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/ReceiveUriActivity.java
rename to hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/ReceiveUriActivity.java
diff --git a/tests/appsecurity-tests/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/ReceiveUriService.java b/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/ReceiveUriService.java
similarity index 100%
rename from tests/appsecurity-tests/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/ReceiveUriService.java
rename to hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/ReceiveUriService.java
diff --git a/hostsidetests/monkey/Android.mk b/hostsidetests/monkey/Android.mk
new file mode 100644
index 0000000..8a73df3
--- /dev/null
+++ b/hostsidetests/monkey/Android.mk
@@ -0,0 +1,31 @@
+# Copyright (C) 2012 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_MODULE := CtsMonkeyTestCases
+
+LOCAL_JAVA_LIBRARIES := cts-tradefed tradefed-prebuilt ddmlib-prebuilt junit
+
+LOCAL_CTS_TEST_PACKAGE := android.monkey
+
+include $(BUILD_CTS_HOST_JAVA_LIBRARY)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/appsecurity-tests/src/com/android/cts/monkey/AbstractMonkeyTest.java b/hostsidetests/monkey/src/com/android/cts/monkey/AbstractMonkeyTest.java
similarity index 100%
rename from tests/appsecurity-tests/src/com/android/cts/monkey/AbstractMonkeyTest.java
rename to hostsidetests/monkey/src/com/android/cts/monkey/AbstractMonkeyTest.java
diff --git a/tests/appsecurity-tests/src/com/android/cts/monkey/CategoryTest.java b/hostsidetests/monkey/src/com/android/cts/monkey/CategoryTest.java
similarity index 100%
rename from tests/appsecurity-tests/src/com/android/cts/monkey/CategoryTest.java
rename to hostsidetests/monkey/src/com/android/cts/monkey/CategoryTest.java
diff --git a/tests/appsecurity-tests/src/com/android/cts/monkey/MonkeyTest.java b/hostsidetests/monkey/src/com/android/cts/monkey/MonkeyTest.java
similarity index 100%
rename from tests/appsecurity-tests/src/com/android/cts/monkey/MonkeyTest.java
rename to hostsidetests/monkey/src/com/android/cts/monkey/MonkeyTest.java
diff --git a/tests/appsecurity-tests/src/com/android/cts/monkey/PackageTest.java b/hostsidetests/monkey/src/com/android/cts/monkey/PackageTest.java
similarity index 100%
rename from tests/appsecurity-tests/src/com/android/cts/monkey/PackageTest.java
rename to hostsidetests/monkey/src/com/android/cts/monkey/PackageTest.java
diff --git a/tests/appsecurity-tests/src/com/android/cts/monkey/SeedTest.java b/hostsidetests/monkey/src/com/android/cts/monkey/SeedTest.java
similarity index 100%
rename from tests/appsecurity-tests/src/com/android/cts/monkey/SeedTest.java
rename to hostsidetests/monkey/src/com/android/cts/monkey/SeedTest.java
diff --git a/tests/appsecurity-tests/src/com/android/cts/monkey/VerbosityTest.java b/hostsidetests/monkey/src/com/android/cts/monkey/VerbosityTest.java
similarity index 100%
rename from tests/appsecurity-tests/src/com/android/cts/monkey/VerbosityTest.java
rename to hostsidetests/monkey/src/com/android/cts/monkey/VerbosityTest.java
diff --git a/hostsidetests/monkey/test-apps/Android.mk b/hostsidetests/monkey/test-apps/Android.mk
new file mode 100644
index 0000000..b189007
--- /dev/null
+++ b/hostsidetests/monkey/test-apps/Android.mk
@@ -0,0 +1,19 @@
+# Copyright (C) 2012 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/hostsidetests/monkey/test-apps/CtsMonkeyApp/Android.mk b/hostsidetests/monkey/test-apps/CtsMonkeyApp/Android.mk
new file mode 100644
index 0000000..9365af3
--- /dev/null
+++ b/hostsidetests/monkey/test-apps/CtsMonkeyApp/Android.mk
@@ -0,0 +1,29 @@
+# Copyright (C) 2012 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_SDK_VERSION := current
+
+LOCAL_PACKAGE_NAME := CtsMonkeyApp
+
+LOCAL_PROGUARD_ENABLED := disabled
+
+include $(BUILD_PACKAGE)
diff --git a/tests/appsecurity-tests/test-apps/CtsMonkeyApp/AndroidManifest.xml b/hostsidetests/monkey/test-apps/CtsMonkeyApp/AndroidManifest.xml
similarity index 100%
rename from tests/appsecurity-tests/test-apps/CtsMonkeyApp/AndroidManifest.xml
rename to hostsidetests/monkey/test-apps/CtsMonkeyApp/AndroidManifest.xml
diff --git a/tests/appsecurity-tests/test-apps/CtsMonkeyApp/src/com/android/cts/monkey/BaboonActivity.java b/hostsidetests/monkey/test-apps/CtsMonkeyApp/src/com/android/cts/monkey/BaboonActivity.java
similarity index 100%
rename from tests/appsecurity-tests/test-apps/CtsMonkeyApp/src/com/android/cts/monkey/BaboonActivity.java
rename to hostsidetests/monkey/test-apps/CtsMonkeyApp/src/com/android/cts/monkey/BaboonActivity.java
diff --git a/tests/appsecurity-tests/test-apps/CtsMonkeyApp/src/com/android/cts/monkey/MonkeyActivity.java b/hostsidetests/monkey/test-apps/CtsMonkeyApp/src/com/android/cts/monkey/MonkeyActivity.java
similarity index 100%
rename from tests/appsecurity-tests/test-apps/CtsMonkeyApp/src/com/android/cts/monkey/MonkeyActivity.java
rename to hostsidetests/monkey/test-apps/CtsMonkeyApp/src/com/android/cts/monkey/MonkeyActivity.java
diff --git a/hostsidetests/monkey/test-apps/CtsMonkeyApp2/Android.mk b/hostsidetests/monkey/test-apps/CtsMonkeyApp2/Android.mk
new file mode 100644
index 0000000..0d76f2d
--- /dev/null
+++ b/hostsidetests/monkey/test-apps/CtsMonkeyApp2/Android.mk
@@ -0,0 +1,29 @@
+# Copyright (C) 2012 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_SDK_VERSION := current
+
+LOCAL_PACKAGE_NAME := CtsMonkeyApp2
+
+LOCAL_PROGUARD_ENABLED := disabled
+
+include $(BUILD_PACKAGE)
diff --git a/tests/appsecurity-tests/test-apps/CtsMonkeyApp2/AndroidManifest.xml b/hostsidetests/monkey/test-apps/CtsMonkeyApp2/AndroidManifest.xml
similarity index 100%
rename from tests/appsecurity-tests/test-apps/CtsMonkeyApp2/AndroidManifest.xml
rename to hostsidetests/monkey/test-apps/CtsMonkeyApp2/AndroidManifest.xml
diff --git a/tests/appsecurity-tests/test-apps/CtsMonkeyApp2/src/com/android/cts/monkey2/ChimpActivity.java b/hostsidetests/monkey/test-apps/CtsMonkeyApp2/src/com/android/cts/monkey2/ChimpActivity.java
similarity index 100%
rename from tests/appsecurity-tests/test-apps/CtsMonkeyApp2/src/com/android/cts/monkey2/ChimpActivity.java
rename to hostsidetests/monkey/test-apps/CtsMonkeyApp2/src/com/android/cts/monkey2/ChimpActivity.java
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
index 22905e9..f72ac56 100644
--- a/tests/AndroidManifest.xml
+++ b/tests/AndroidManifest.xml
@@ -71,6 +71,7 @@
     <uses-permission android:name="android.permission.DUMP" />
     <uses-permission android:name="android.permission.NFC" />
     <uses-permission android:name="android.permission.SET_WALLPAPER_HINTS" />
+    <uses-permission android:name="com.android.voicemail.permission.ADD_VOICEMAIL" />
 
     <!-- Used for PackageManager test, don't delete this INTERNET permission -->
     <uses-permission android:name="android.permission.INTERNET" />
@@ -511,14 +512,18 @@
 
         <activity android:name="android.widget.cts.GalleryStubActivity"
             android:label="GalleryStubActivity">
-            <action android:name="android.intent.action.MAIN" />
-            <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            <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.widget.cts.MockPopupWindowStubActivity"
             android:label="MockPopupWindowStubActivity">
-            <action android:name="android.intent.action.MAIN" />
-            <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            <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.media.cts.FaceDetectorStub"
@@ -654,9 +659,11 @@
 
         <activity android:name="android.app.cts.InstrumentationTestActivity"
             android:label="InstrumentationTestActivity">
-            <action android:name="android.intent.action.MAIN" />
-            <category android:name="android.intent.category.DEFAULT" />
-            <data android:mimeType="vnd.android.cursor.dir/person" />
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <data android:mimeType="vnd.android.cursor.dir/person" />
+            </intent-filter>
         </activity>
 
         <activity android:name="android.app.cts.AliasActivityStub">
@@ -765,8 +772,10 @@
 
         <activity android:name="android.view.cts.FocusFinderStubActivity"
             android:label="FocusFinderStubActivity">
-            <action android:name="android.intent.action.MAIN" />
-            <category android:name="android.intent.category.DEFAULT" />
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
         </activity>
 
         <activity android:name="android.view.cts.GestureDetectorStubActivity"
@@ -953,6 +962,15 @@
 
         <activity android:name="android.opengl.cts.EglConfigStubActivity"/>
 
+        <activity android:name="android.opengl.cts.CompressedTextureStubActivity"
+            android:label="CompressedTextureStubActivity"
+            android:screenOrientation="nosensor">
+            <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.preference.cts.PreferenceStubActivity">
             <meta-data android:name="android.preference" 
                     android:resource="@xml/preferences_from_intent" />
@@ -976,6 +994,7 @@
                   android:label="RenderscriptGLStub"/>
     </application>
 
+
     <!--Test for PackageManager, please put this at the very beginning-->
     <instrumentation android:name="android.content.pm.cts.TestPmInstrumentation"
         android:targetPackage="android"
diff --git a/tests/ApiDemosReferenceTest/Android.mk b/tests/ApiDemosReferenceTest/Android.mk
deleted file mode 100644
index 315ecd6..0000000
--- a/tests/ApiDemosReferenceTest/Android.mk
+++ /dev/null
@@ -1,32 +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)
-include $(CLEAR_VARS)
-
-# don't include this package in any target
-LOCAL_MODULE_TAGS := optional
-# and when built explicitly put it in the data partition
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-
-LOCAL_SRC_FILES := $(call all-subdir-java-files)
-
-LOCAL_JAVA_LIBRARIES := android.test.runner
-LOCAL_STATIC_JAVA_LIBRARIES := android.cts.refapp
-
-LOCAL_INSTRUMENTATION_FOR := ApiDemos
-
-LOCAL_PACKAGE_NAME := ApiDemosReferenceTest
-
-include $(BUILD_PACKAGE)
diff --git a/tests/ApiDemosReferenceTest/AndroidManifest.xml b/tests/ApiDemosReferenceTest/AndroidManifest.xml
deleted file mode 100644
index 7700bdd..0000000
--- a/tests/ApiDemosReferenceTest/AndroidManifest.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT 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"
-	android:versionCode="1" android:versionName="1.0.0" package="android.apidemos.cts">
-	<instrumentation android:name="android.test.InstrumentationTestRunner"
-		android:targetPackage="com.example.android.apis" android:label="Tests for Api Demos." />
-	<application>
-		<uses-library android:name="android.test.runner" />
-	</application>
-</manifest>
diff --git a/tests/ApiDemosReferenceTest/src/android/apidemos/cts/AllTests.java b/tests/ApiDemosReferenceTest/src/android/apidemos/cts/AllTests.java
deleted file mode 100644
index 6d9f691..0000000
--- a/tests/ApiDemosReferenceTest/src/android/apidemos/cts/AllTests.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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.apidemos.cts;
-
-import android.test.TestSuiteProvider;
-import android.test.suitebuilder.TestSuiteBuilder;
-
-import junit.framework.TestSuite;
-
-/**
- * Finds all instrumentation and unit tests for this application.
- */
-public class AllTests implements TestSuiteProvider {
-    public TestSuite getTestSuite() {
-        return new TestSuiteBuilder(getClass()).includeAllPackagesUnderHere().build();
-    }
-}
diff --git a/tests/ApiDemosReferenceTest/src/android/apidemos/cts/ApiDemosTest.java b/tests/ApiDemosReferenceTest/src/android/apidemos/cts/ApiDemosTest.java
deleted file mode 100644
index 5382578..0000000
--- a/tests/ApiDemosReferenceTest/src/android/apidemos/cts/ApiDemosTest.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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.apidemos.cts;
-
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.cts.refapp.ReferenceAppTestCase;
-import android.view.KeyEvent;
-
-import com.example.android.apis.ApiDemos;
-
-import java.util.List;
-
-public class ApiDemosTest extends ReferenceAppTestCase<ApiDemos> {
-    public ApiDemosTest() {
-        super("com.example.android.apis", ApiDemos.class);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        // Make sure the list view always resets its selection to the top of
-        // the list.
-        final ApiDemos a = getActivity();
-        getInstrumentation().runOnMainSync(new Runnable() {
-            public void run() {
-                a.setSelection(0);
-            }
-        });
-    }
-
-    public void testdPadNav() {
-        final ApiDemos a = getActivity();
-        assert(a.getSelectedItemPosition() == 0);
-
-        sendKeys(KeyEvent.KEYCODE_DPAD_UP);
-        assert(a.getSelectedItemPosition() == 0);
-
-        sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
-        assert(a.getSelectedItemPosition() == 1);
-
-        sendKeys(KeyEvent.KEYCODE_DPAD_LEFT);
-        assert(a.getSelectedItemPosition() == 1);
-
-        sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
-        assert(a.getSelectedItemPosition() == 1);
-    }
-
-    public void testNumberOfItemsInListView() {
-        final ApiDemos a = getActivity();
-
-        // ApiDemo's builds its list by looking at all the Intent's in it's
-        // package that are marked as CATEGORY_SAMPLE_CODE.
-        Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
-        mainIntent.addCategory(Intent.CATEGORY_SAMPLE_CODE);
-
-        PackageManager pm = a.getPackageManager();
-        List<ResolveInfo> list = pm.queryIntentActivities(mainIntent, 0);
-        int numberOfActivities = list.size();
-
-        for (int x = 0; x < numberOfActivities; ++x) {
-            sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
-            assert(a.getSelectedItemPosition() == x + 1);
-        }
-
-        // Should be at bottom of the list
-        sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
-        assert(a.getSelectedItemPosition() == numberOfActivities);
-
-        // Record what the bottom of the list looks like.
-        takeSnapshot("snap1");
-    }
-}
diff --git a/tests/appsecurity-tests/Android.mk b/tests/appsecurity-tests/Android.mk
deleted file mode 100644
index b5ce83c..0000000
--- a/tests/appsecurity-tests/Android.mk
+++ /dev/null
@@ -1,32 +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)
-
-include $(CLEAR_VARS)
-
-#LOCAL_TEST_TYPE := hostSideOnly
-
-# Only compile source java files in this apk.
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_MODULE := CtsAppSecurityTests
-
-LOCAL_JAVA_LIBRARIES := cts-tradefed tradefed-prebuilt ddmlib-prebuilt junit
-
-include $(BUILD_HOST_JAVA_LIBRARY)
-
-# Build the test APKs using their own makefiles
-include $(call all-makefiles-under,$(LOCAL_PATH))
-
diff --git a/tests/appsecurity-tests/test-apps/AppAccessData/Android.mk b/tests/appsecurity-tests/test-apps/AppAccessData/Android.mk
deleted file mode 100644
index 7acfa79..0000000
--- a/tests/appsecurity-tests/test-apps/AppAccessData/Android.mk
+++ /dev/null
@@ -1,30 +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)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_SDK_VERSION := current
-
-LOCAL_PACKAGE_NAME := CtsAppAccessData
-
-# although not strictly necessary, sign this app with different cert than CtsAppWithData
-LOCAL_CERTIFICATE := cts/tests/appsecurity-tests/certs/cts-testkey2
-
-include $(BUILD_PACKAGE)
diff --git a/tests/appsecurity-tests/test-apps/AppWithData/Android.mk b/tests/appsecurity-tests/test-apps/AppWithData/Android.mk
deleted file mode 100644
index a167a4b..0000000
--- a/tests/appsecurity-tests/test-apps/AppWithData/Android.mk
+++ /dev/null
@@ -1,29 +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)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_SDK_VERSION := current
-
-LOCAL_PACKAGE_NAME := CtsAppWithData
-
-LOCAL_CERTIFICATE := cts/tests/appsecurity-tests/certs/cts-testkey1
-
-include $(BUILD_PACKAGE)
diff --git a/tests/appsecurity-tests/test-apps/CtsMonkeyApp/Android.mk b/tests/appsecurity-tests/test-apps/CtsMonkeyApp/Android.mk
deleted file mode 100644
index 85a82d8..0000000
--- a/tests/appsecurity-tests/test-apps/CtsMonkeyApp/Android.mk
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright (C) 2012 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-LOCAL_PATH:= $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_SDK_VERSION := current
-
-LOCAL_PACKAGE_NAME := CtsMonkeyApp
-
-include $(BUILD_PACKAGE)
diff --git a/tests/appsecurity-tests/test-apps/CtsMonkeyApp2/Android.mk b/tests/appsecurity-tests/test-apps/CtsMonkeyApp2/Android.mk
deleted file mode 100644
index 2f3abd2..0000000
--- a/tests/appsecurity-tests/test-apps/CtsMonkeyApp2/Android.mk
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright (C) 2012 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-LOCAL_PATH:= $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_SDK_VERSION := current
-
-LOCAL_PACKAGE_NAME := CtsMonkeyApp2
-
-include $(BUILD_PACKAGE)
diff --git a/tests/appsecurity-tests/test-apps/InstrumentationAppDiffCert/Android.mk b/tests/appsecurity-tests/test-apps/InstrumentationAppDiffCert/Android.mk
deleted file mode 100644
index 1800287..0000000
--- a/tests/appsecurity-tests/test-apps/InstrumentationAppDiffCert/Android.mk
+++ /dev/null
@@ -1,30 +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)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_SDK_VERSION := current
-
-LOCAL_PACKAGE_NAME := CtsInstrumentationAppDiffCert
-
-# sign this app with different cert than CtsTargetInstrumentationApp
-LOCAL_CERTIFICATE := cts/tests/appsecurity-tests/certs/cts-testkey2
-
-include $(BUILD_PACKAGE)
diff --git a/tests/appsecurity-tests/test-apps/PermissionDeclareApp/Android.mk b/tests/appsecurity-tests/test-apps/PermissionDeclareApp/Android.mk
deleted file mode 100644
index e11f931..0000000
--- a/tests/appsecurity-tests/test-apps/PermissionDeclareApp/Android.mk
+++ /dev/null
@@ -1,30 +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)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_SDK_VERSION := current
-
-LOCAL_PACKAGE_NAME := CtsPermissionDeclareApp
-
-# sign this app with a different cert than CtsUsePermissionDiffCert
-LOCAL_CERTIFICATE := cts/tests/appsecurity-tests/certs/cts-testkey1
-
-include $(BUILD_PACKAGE)
diff --git a/tests/appsecurity-tests/test-apps/SharedUidInstall/Android.mk b/tests/appsecurity-tests/test-apps/SharedUidInstall/Android.mk
deleted file mode 100644
index 4d77b44..0000000
--- a/tests/appsecurity-tests/test-apps/SharedUidInstall/Android.mk
+++ /dev/null
@@ -1,32 +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)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_SDK_VERSION := current
-
-LOCAL_PACKAGE_NAME := CtsSharedUidInstall
-
-# sign this app with a different cert than CtsSharedUidInstallDiffCert
-LOCAL_CERTIFICATE := cts/tests/appsecurity-tests/certs/cts-testkey1
-
-LOCAL_PROGUARD_ENABLED := disabled
-
-include $(BUILD_PACKAGE)
diff --git a/tests/appsecurity-tests/test-apps/SharedUidInstallDiffCert/Android.mk b/tests/appsecurity-tests/test-apps/SharedUidInstallDiffCert/Android.mk
deleted file mode 100644
index 4f24e25..0000000
--- a/tests/appsecurity-tests/test-apps/SharedUidInstallDiffCert/Android.mk
+++ /dev/null
@@ -1,30 +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)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_SDK_VERSION := current
-
-LOCAL_PACKAGE_NAME := CtsSharedUidInstallDiffCert
-
-# sign this app with a different cert than CtsSharedUidInstall
-LOCAL_CERTIFICATE := cts/tests/appsecurity-tests/certs/cts-testkey2
-
-include $(BUILD_PACKAGE)
diff --git a/tests/appsecurity-tests/test-apps/SimpleAppInstall/Android.mk b/tests/appsecurity-tests/test-apps/SimpleAppInstall/Android.mk
deleted file mode 100644
index 9ed7a76..0000000
--- a/tests/appsecurity-tests/test-apps/SimpleAppInstall/Android.mk
+++ /dev/null
@@ -1,30 +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)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_SDK_VERSION := current
-
-LOCAL_PACKAGE_NAME := CtsSimpleAppInstall
-
-# sign this app with a different cert than CtsSimpleAppInstallDiffCert
-LOCAL_CERTIFICATE := cts/tests/appsecurity-tests/certs/cts-testkey1
-
-include $(BUILD_PACKAGE)
diff --git a/tests/appsecurity-tests/test-apps/SimpleAppInstallDiffCert/Android.mk b/tests/appsecurity-tests/test-apps/SimpleAppInstallDiffCert/Android.mk
deleted file mode 100644
index 54959fb..0000000
--- a/tests/appsecurity-tests/test-apps/SimpleAppInstallDiffCert/Android.mk
+++ /dev/null
@@ -1,30 +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)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_SDK_VERSION := current
-
-LOCAL_PACKAGE_NAME := CtsSimpleAppInstallDiffCert
-
-# sign this app with a different cert than CtsSimpleAppInstall
-LOCAL_CERTIFICATE := cts/tests/appsecurity-tests/certs/cts-testkey2
-
-include $(BUILD_PACKAGE)
diff --git a/tests/appsecurity-tests/test-apps/TargetInstrumentationApp/Android.mk b/tests/appsecurity-tests/test-apps/TargetInstrumentationApp/Android.mk
deleted file mode 100644
index 5ebe7d0..0000000
--- a/tests/appsecurity-tests/test-apps/TargetInstrumentationApp/Android.mk
+++ /dev/null
@@ -1,30 +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)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_SDK_VERSION := current
-
-LOCAL_PACKAGE_NAME := CtsTargetInstrumentationApp
-
-# sign this app with different cert than CtsInstrumentationAppDiffCert
-LOCAL_CERTIFICATE := cts/tests/appsecurity-tests/certs/cts-testkey1
-
-include $(BUILD_PACKAGE)
diff --git a/tests/appsecurity-tests/test-apps/UsePermissionDiffCert/Android.mk b/tests/appsecurity-tests/test-apps/UsePermissionDiffCert/Android.mk
deleted file mode 100644
index 06ee5ab..0000000
--- a/tests/appsecurity-tests/test-apps/UsePermissionDiffCert/Android.mk
+++ /dev/null
@@ -1,30 +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)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_SDK_VERSION := current
-
-LOCAL_PACKAGE_NAME := CtsUsePermissionDiffCert
-
-# sign this app with a different cert than CtsPermissionDeclareApp
-LOCAL_CERTIFICATE := cts/tests/appsecurity-tests/certs/cts-testkey2
-
-include $(BUILD_PACKAGE)
diff --git a/tests/assets/webkit/jsform.html b/tests/assets/webkit/jsform.html
index 1781194..ce55498 100644
--- a/tests/assets/webkit/jsform.html
+++ b/tests/assets/webkit/jsform.html
@@ -24,7 +24,7 @@
             }
         }
     </script>
-    <body onload="window.setTimeout(function() { fireSubmit(); }, 0);">
+    <body onload="window.setTimeout(function() { fireSubmit(); }, 500);">
         javascript form test
         <form id="formId" action="test.html#result" method="post">
             <input type="hidden" name="foo" value="bar" />
diff --git a/tests/config_demo/data/case_rep/APICheckTest_java5.apk b/tests/config_demo/data/case_rep/APICheckTest_java5.apk
deleted file mode 100644
index fcb51c4..0000000
--- a/tests/config_demo/data/case_rep/APICheckTest_java5.apk
+++ /dev/null
Binary files differ
diff --git a/tests/config_demo/data/case_rep/APICheckTest_java6.apk b/tests/config_demo/data/case_rep/APICheckTest_java6.apk
deleted file mode 100644
index 76c8f74..0000000
--- a/tests/config_demo/data/case_rep/APICheckTest_java6.apk
+++ /dev/null
Binary files differ
diff --git a/tests/config_demo/data/case_rep/DeviceInforCollector.apk b/tests/config_demo/data/case_rep/DeviceInforCollector.apk
deleted file mode 100644
index 24de83f..0000000
--- a/tests/config_demo/data/case_rep/DeviceInforCollector.apk
+++ /dev/null
Binary files differ
diff --git a/tests/config_demo/data/host_config.xml b/tests/config_demo/data/host_config.xml
deleted file mode 100644
index 4e4cb9a..0000000
--- a/tests/config_demo/data/host_config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<HostConfiguration version="1.0">
-    <Repository>
-        <!-- Specific OEM test plan directory (optional) -->
-        <TestPlan path="plan_rep" />
-        <!-- Specific OEM test case directory (optional) -->
-        <TestCase path="case_rep" />
-        <!-- Specific OEM test result directory (optional) -->
-        <TestResult path="result_rep" />
-    </Repository>
-</HostConfiguration>
diff --git a/tests/config_demo/data/plan_rep/README b/tests/config_demo/data/plan_rep/README
deleted file mode 100644
index 2f36f40..0000000
--- a/tests/config_demo/data/plan_rep/README
+++ /dev/null
@@ -1,17 +0,0 @@
-Copyright (C) 2008 The Android Open Source Project
-
-Licensed under the Apache Licence, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-
-This directory would be the repository of the test plans.
-
-For detailed descriptions, please refer to the architecture document.
diff --git a/tests/config_demo/data/result_rep/cts_result.xsl b/tests/config_demo/data/result_rep/cts_result.xsl
deleted file mode 100644
index 9c9c82a..0000000
--- a/tests/config_demo/data/result_rep/cts_result.xsl
+++ /dev/null
@@ -1,339 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#160;"> ]>
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-    <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
-    <xsl:template match="/">
-       
-        <html>
-            <STYLE type="text/css">
-                    .plan { background-color : #9acd32 }
-                    .head { font-size : 30; background-color : #A8A6A6 }
-                    .head1 { font-size : 20; background-color : #A8A6A6 }
-                    .lgreen {background-color : #9acd32}
-                    .pass {background-color : #00ff00}
-                    .failed {background-color : #ff0000}
-                    .timeout {background-color : #febf00}
-                    .notrun {background-color : #C6C3C3}
-                    .gray {background-color : #C6C3C3}
-            </STYLE>
-            <body>
-                <p class="head">CTS Test result</p>
-
-                <!-- plan information -->
-                <TABLE >
-                    <TR class="plan">
-                        <TD>Plan name</TD>
-                        <TD>Start time</TD>
-                        <TD>End time</TD>
-                        <TD>Version</TD>
-                    </TR>
-                    <TR>
-                        <TD>
-                            <xsl:value-of select="TestResult/@testPlan"/>
-                        </TD>
-                        <TD>
-                            <xsl:value-of select="TestResult/@starttime"/>
-                        </TD>
-                        <TD>
-                            <xsl:value-of select="TestResult/@endtime"/>
-                        </TD>
-                        <TD>
-                            <xsl:value-of select="TestResult/@version"/>
-                        </TD>
-                    </TR>
-                </TABLE>
-                <!-- Device infor -->
-                <p class="head1">Test Device information</p>
-                <TABLE >
-                    <TR>
-                        <TD class="lgreen">Device Make</TD>
-                        <TD>
-                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@buildName"/>
-                        </TD>
-                    </TR>
-                    <TR>
-                        <TD class="lgreen">Build model</TD>
-                        <TD>
-                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@deviceID"/>
-                        </TD>
-                    </TR>
-                    <TR>
-                        <TD class="lgreen">Firmware Version</TD>
-                        <TD>
-                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@buildVersion"/>
-                        </TD>
-                    </TR>
-                    <TR>
-                        <TD class="lgreen">Firmware Build Number</TD>
-                        <TD>
-                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@buildID"/>
-                        </TD>
-                    </TR>
-                    <TR>
-                        <TD class="lgreen">Android Platform Version</TD>
-                        <TD>
-                            <xsl:value-of
-                                select="TestResult/DeviceInfo/BuildInfo/@androidPlatformVersion"/>
-                        </TD>
-                    </TR>
-                    <TR>
-                        <TD class="lgreen">Supported Locales</TD>
-                        <TD>
-                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@locales"/>
-                        </TD>
-                    </TR>
-                    <TR>
-                        <TD class="lgreen">Screen size</TD>
-                        <TD>
-                            <xsl:value-of select="TestResult/DeviceInfo/Screen/@resolution"/>
-                        </TD>
-                    </TR>
-                    <TR>
-                        <TD class="lgreen">Phone number</TD>
-                        <TD>
-                            <xsl:value-of
-                                select="TestResult/DeviceInfo/PhoneSubInfo/@subscriberId"/>
-                        </TD>
-                    </TR>
-                    <TR>
-                        <TD class="lgreen">x dpi</TD>
-                        <TD>
-                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@Xdpi"/>
-                        </TD>
-                    </TR>
-                    <TR>
-                        <TD class="lgreen">y dpi</TD>
-                        <TD>
-                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@Ydpi"/>
-                        </TD>
-                    </TR>
-                    <TR>
-                        <TD class="lgreen">Touch</TD>
-                        <TD>
-                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@touch"/>
-                        </TD>
-                    </TR>
-                    <TR>
-                        <TD class="lgreen">Navigation</TD>
-                        <TD>
-                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@navigation"/>
-                        </TD>
-                    </TR>
-                    <TR>
-                        <TD class="lgreen">Keypad</TD>
-                        <TD>
-                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@keypad"/>
-                        </TD>
-                    </TR>
-                    <TR>
-                        <TD class="lgreen">Network</TD>
-                        <TD>
-                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@network"/>
-                        </TD>
-                    </TR>
-                    <TR>
-                        <TD class="lgreen">IMEI</TD>
-                        <TD>
-                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@imei"/>
-                        </TD>
-                    </TR>
-                    <TR>
-                        <TD class="lgreen">IMSI</TD>
-                        <TD>
-                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@imsi"/>
-                        </TD>
-                    </TR>
-                </TABLE>
-                <!-- Summary -->
-                <p class="head1">Summary</p>
-                <TABLE >
-                    <TR>
-                        <TD class="pass">pass</TD>
-                        <TD>
-                            <xsl:value-of select="TestResult/Summary/@pass"/>
-                        </TD>
-                    </TR>
-                    <TR>
-                        <TD class="failed">failed</TD>
-                        <TD>
-                            <xsl:value-of select="TestResult/Summary/@failed"/>
-                        </TD>
-                    </TR>
-                    <TR>
-                        <TD class="timeout">timeout</TD>
-                        <TD>
-                            <xsl:value-of select="TestResult/Summary/@timeout"/>
-                        </TD>
-                    </TR>
-                    <TR>
-                        <TD class="notrun">notrun</TD>
-                        <TD>
-                            <xsl:value-of select="TestResult/Summary/@notrun"/>
-                        </TD>
-                    </TR>
-                </TABLE>
-                <!-- test package -->
-                <xsl:for-each select="TestResult/TestPackage">
-                    <p class="head1">
-                        TestPackage:
-                        <xsl:value-of select="@name"/>
-                    </p>
-
-                    <TABLE border="0.1">
-                        <!-- level 1 test suite -->
-                        <xsl:for-each select="TestSuite">
-                            <TR>
-                                <TD class="gray">
-                                    <xsl:value-of select="@name"/>
-                                </TD>
-                                <TD class="gray"></TD>
-                                <TD class="gray"></TD>
-                                <TD class="gray"></TD>
-                                <TD class="gray"></TD>
-                            </TR>
-                            <xsl:for-each select="TestCase">
-                                <TR>
-                                    <TD></TD>
-                                    <TD class="gray">
-                                        <xsl:value-of select="@name"/>
-                                    </TD>
-                                    <TD class="gray"></TD>
-                                    <TD class="gray"></TD>
-                                    <TD class="gray"></TD>
-                                </TR>
-                                <xsl:for-each select="Test">
-                                    <TR>
-                                        <TD></TD>
-                                        <TD></TD>
-
-                                            <xsl:if test="@result='pass'">
-                                                <TD class="pass">
-                                                    <xsl:value-of select="@name"/>
-                                                </TD>
-                                                <TD class="pass">
-                                                    <xsl:value-of select="@result"/>
-                                                </TD>
-                                            </xsl:if>
-                                            
-                                            <xsl:if test="@result='fail'">
-                                                <TD class="failed">
-                                                    <xsl:value-of select="@name"/>
-                                                </TD>
-                                                <TD class="failed">
-                                                    <xsl:value-of select="@result"/>
-                                                </TD>
-                                            </xsl:if>
-    
-                                            <xsl:if test="@result='timeout'">
-                                                <TD class="timeout">
-                                                    <xsl:value-of select="@name"/>
-                                                </TD>
-                                                <TD class="timeout">
-                                                    <xsl:value-of select="@result"/>
-                                                </TD>
-                                            </xsl:if>
-
-                                            <xsl:if test="@result='notrun'">
-                                                <TD class="notrun">
-                                                    <xsl:value-of select="@name"/>
-                                                </TD>
-                                                <TD class="notrun">
-                                                    <xsl:value-of select="@result"/>
-                                                </TD>
-                                            </xsl:if>
-
-                                        <TD></TD>
-                                    </TR>
-                                </xsl:for-each>
-                            </xsl:for-each>
-                            <!-- level 2 test suite -->
-                            <xsl:for-each select="TestSuite">
-                                <TR>
-                                    <TD></TD>
-                                    <TD class="gray">
-                                        <xsl:value-of select="@name"/>
-                                    </TD>
-                                    <TD class="gray"></TD>
-                                    <TD class="gray"></TD>
-                                    <TD class="gray"></TD>
-                                </TR>   
-                                    <xsl:for-each select="TestCase">
-                                        <TR>
-                                            <TD></TD>
-                                            <TD></TD>
-                                            <TD class="gray">
-                                                <xsl:value-of select="@name"/>
-                                            </TD>
-                                            <TD class="gray"></TD>
-                                            <TD class="gray"></TD>
-                                        </TR>
-                                        <xsl:for-each select="Test">
-                                            <TR>
-                                                <TD></TD>
-                                                <TD></TD>
-                                                <TD></TD>
-                                                
-                                                <xsl:if test="@result='pass'">
-                                                    <TD class="pass">
-                                                        <xsl:value-of select="@name"/>
-                                                    </TD>
-                                                    <TD class="pass">
-                                                        <xsl:value-of select="@result"/>
-                                                    </TD>
-                                                </xsl:if>
-                                            
-                                                <xsl:if test="@result='fail'">
-                                                    <TD class="failed">
-                                                        <xsl:value-of select="@name"/>
-                                                    </TD>
-                                                    <TD class="failed">
-                                                        <xsl:value-of select="@result"/>
-                                                    </TD>
-                                                </xsl:if>
-        
-                                                <xsl:if test="@result='timeout'">
-                                                    <TD class="timeout">
-                                                        <xsl:value-of select="@name"/>
-                                                    </TD>
-                                                    <TD class="timeout">
-                                                        <xsl:value-of select="@result"/>
-                                                    </TD>
-                                                </xsl:if>
-
-                                                <xsl:if test="@result='notrun'">
-                                                    <TD class="notrun">
-                                                        <xsl:value-of select="@name"/>
-                                                    </TD>
-                                                    <TD class="notrun">
-                                                        <xsl:value-of select="@result"/>
-                                                    </TD>
-                                                </xsl:if>
-                                                
-                                            </TR>
-                                        </xsl:for-each>
-                                    </xsl:for-each>
-                                
-                            </xsl:for-each>
-                        </xsl:for-each>
-                    </TABLE>
-                </xsl:for-each>
-                <!-- end test package -->
-            </body>
-        </html>
-    </xsl:template>
-</xsl:stylesheet>
diff --git a/tests/expectations/knownfailures.txt b/tests/expectations/knownfailures.txt
index b8621a7..0d4f101 100644
--- a/tests/expectations/knownfailures.txt
+++ b/tests/expectations/knownfailures.txt
@@ -1,38 +1,2 @@
 [
-{
-  name: "android.telephony.cts.PhoneNumberFormattingTextWatcherTest#testPhoneNumberFormattingTextWatcher",
-  bug: 3198578
-},
-{
-  name: "android.text.cts.AndroidCharacterTest#testMirror",
-  bug: 4371654
-},
-{
-  name: "android.openglperf.cts.GlVboPerfTest#testVboWithVaryingIndexBufferNumbers",
-  bug: 5898262
-},
-{
-  name: "android.webkit.cts.WebViewTest#testRequestFocusNodeHref",
-  bug: 3241968
-},
-{
-  names: [
-    "libcore.java.net.URLConnectionTest#testServerClosesSocket",
-    "libcore.java.net.URLConnectionTest#testServerShutdownInput",
-    "libcore.java.net.URLConnectionTest#testServerShutdownOutput"
-  ],
-  bug: 5534202
-},
-{
-  names: [
-    "libcore.java.net.ConcurrentCloseTest#test_read",
-    "libcore.net.http.HttpResponseCacheTest#testClientPrematureDisconnectWithChunkedEncoding"
-  ],
-  bug: 5498103
-},
-{
-  name: "libcore.java.security.KeyPairGeneratorTest#test_getInstance",
-  bug: 5513723
-}
 ]
-
diff --git a/tests/jni/android_net_cts_NetlinkSocket.cpp b/tests/jni/android_net_cts_NetlinkSocket.cpp
index 1e671c6..f2fc38f 100644
--- a/tests/jni/android_net_cts_NetlinkSocket.cpp
+++ b/tests/jni/android_net_cts_NetlinkSocket.cpp
@@ -31,7 +31,7 @@
 {
     int sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
     if (sock == -1) {
-        LOGE("Can't create socket %s", strerror(errno));
+        ALOGE("Can't create socket %s", strerror(errno));
         jclass SocketException = env->FindClass("java/net/SocketException");
         env->ThrowNew(SocketException, "Can't create socket");
         return;
diff --git a/tests/res/raw/basetex.png b/tests/res/raw/basetex.png
new file mode 100644
index 0000000..c47a8a5
--- /dev/null
+++ b/tests/res/raw/basetex.png
Binary files differ
diff --git a/tests/res/raw/ddstex.dds b/tests/res/raw/ddstex.dds
new file mode 100644
index 0000000..a865693
--- /dev/null
+++ b/tests/res/raw/ddstex.dds
Binary files differ
diff --git a/tests/res/raw/playlist1.pls b/tests/res/raw/playlist1.pls
new file mode 100644
index 0000000..27ad178f92
--- /dev/null
+++ b/tests/res/raw/playlist1.pls
@@ -0,0 +1,3 @@
+[playlist]
+File1=testmp3.mp3
+File2=testmp3_2.mp3
diff --git a/tests/res/raw/playlist2.m3u b/tests/res/raw/playlist2.m3u
new file mode 100644
index 0000000..b307703
--- /dev/null
+++ b/tests/res/raw/playlist2.m3u
@@ -0,0 +1,7 @@
+# comments should be ignored
+
+# first track
+testmp3_2.mp3
+
+# second track
+testmp3.mp3
diff --git a/tests/res/raw/pvrtex.pvr b/tests/res/raw/pvrtex.pvr
new file mode 100644
index 0000000..c92962d
--- /dev/null
+++ b/tests/res/raw/pvrtex.pvr
Binary files differ
diff --git a/tests/res/raw/set_target_api_11.bc b/tests/res/raw/set_target_api_11.bc
new file mode 100644
index 0000000..cd98c6a
--- /dev/null
+++ b/tests/res/raw/set_target_api_11.bc
Binary files differ
diff --git a/tests/res/raw/set_target_api_12.bc b/tests/res/raw/set_target_api_12.bc
new file mode 100644
index 0000000..20576d6
--- /dev/null
+++ b/tests/res/raw/set_target_api_12.bc
Binary files differ
diff --git a/tests/res/raw/set_target_api_13.bc b/tests/res/raw/set_target_api_13.bc
new file mode 100644
index 0000000..339876a
--- /dev/null
+++ b/tests/res/raw/set_target_api_13.bc
Binary files differ
diff --git a/tests/res/raw/set_target_api_14.bc b/tests/res/raw/set_target_api_14.bc
new file mode 100644
index 0000000..60fe08b
--- /dev/null
+++ b/tests/res/raw/set_target_api_14.bc
Binary files differ
diff --git a/tests/res/raw/set_target_api_15.bc b/tests/res/raw/set_target_api_15.bc
new file mode 100644
index 0000000..d3f1bef
--- /dev/null
+++ b/tests/res/raw/set_target_api_15.bc
Binary files differ
diff --git a/tests/res/raw/set_target_api_16.bc b/tests/res/raw/set_target_api_16.bc
new file mode 100644
index 0000000..1cabc4d
--- /dev/null
+++ b/tests/res/raw/set_target_api_16.bc
Binary files differ
diff --git a/tests/src/android/app/cts/IntentServiceStub.java b/tests/src/android/app/cts/IntentServiceStub.java
index af4cd27..043ff85 100644
--- a/tests/src/android/app/cts/IntentServiceStub.java
+++ b/tests/src/android/app/cts/IntentServiceStub.java
@@ -18,9 +18,9 @@
 
 import android.app.IntentService;
 import android.content.Intent;
+import android.cts.util.PollingCheck;
 import android.os.Binder;
 import android.os.IBinder;
-import android.view.animation.cts.DelayedCheck;
 
 public class IntentServiceStub extends IntentService {
     public IntentServiceStub() {
@@ -50,7 +50,7 @@
     }
 
     public static void waitToFinish(long timeout) throws Throwable {
-        new DelayedCheck(timeout) {
+        new PollingCheck(timeout) {
             @Override
             protected boolean check() {
                 return IntentServiceStub.onDestroyCalled;
diff --git a/tests/src/android/content/cts/MockContentProvider.java b/tests/src/android/content/cts/MockContentProvider.java
index f910576..4cd870f 100644
--- a/tests/src/android/content/cts/MockContentProvider.java
+++ b/tests/src/android/content/cts/MockContentProvider.java
@@ -18,6 +18,7 @@
 
 import java.util.HashMap;
 
+import android.content.CancellationSignal;
 import android.content.ContentProvider;
 import android.content.ContentUris;
 import android.content.ContentValues;
@@ -42,8 +43,9 @@
     private static final UriMatcher URL_MATCHER;
     private static final int TESTTABLE1 = 1;
     private static final int TESTTABLE1_ID = 2;
-    private static final int TESTTABLE2 = 3;
-    private static final int TESTTABLE2_ID = 4;
+    private static final int TESTTABLE1_CROSS = 3;
+    private static final int TESTTABLE2 = 4;
+    private static final int TESTTABLE2_ID = 5;
 
     private static HashMap<String, String> CTSDBTABLE1_LIST_PROJECTION_MAP;
     private static HashMap<String, String> CTSDBTABLE2_LIST_PROJECTION_MAP;
@@ -123,6 +125,8 @@
             return "vnd.android.cursor.dir/com.android.content.testtable1";
         case TESTTABLE1_ID:
             return "vnd.android.cursor.item/com.android.content.testtable1";
+        case TESTTABLE1_CROSS:
+            return "vnd.android.cursor.cross/com.android.content.testtable1";
         case TESTTABLE2:
             return "vnd.android.cursor.dir/com.android.content.testtable2";
         case TESTTABLE2_ID:
@@ -176,6 +180,12 @@
     @Override
     public Cursor query(Uri uri, String[] projection, String selection,
             String[] selectionArgs, String sortOrder) {
+        return query(uri, projection, selection, selectionArgs, sortOrder, null);
+    }
+
+    @Override
+    public Cursor query(Uri uri, String[] projection, String selection,
+            String[] selectionArgs, String sortOrder, CancellationSignal cancellationSignal) {
 
         SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
 
@@ -190,6 +200,13 @@
             qb.appendWhere("_id=" + uri.getPathSegments().get(1));
             break;
 
+        case TESTTABLE1_CROSS:
+            // Create a ridiculous cross-product of the test table.  This is done
+            // to create an artificially long-running query to enable us to test
+            // remote query cancellation in ContentResolverTest.
+            qb.setTables("TestTable1 a, TestTable1 b, TestTable1 c, TestTable1 d, TestTable1 e");
+            break;
+
         case TESTTABLE2:
             qb.setTables("TestTable2");
             qb.setProjectionMap(CTSDBTABLE2_LIST_PROJECTION_MAP);
@@ -212,7 +229,8 @@
             orderBy = sortOrder;
 
         SQLiteDatabase db = mOpenHelper.getReadableDatabase();
-        Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);
+        Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy,
+                null, cancellationSignal);
 
         c.setNotificationUri(getContext().getContentResolver(), uri);
         return c;
@@ -260,6 +278,7 @@
         URL_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
         URL_MATCHER.addURI(AUTHORITY, "testtable1", TESTTABLE1);
         URL_MATCHER.addURI(AUTHORITY, "testtable1/#", TESTTABLE1_ID);
+        URL_MATCHER.addURI(AUTHORITY, "testtable1/cross", TESTTABLE1_CROSS);
         URL_MATCHER.addURI(AUTHORITY, "testtable2", TESTTABLE2);
         URL_MATCHER.addURI(AUTHORITY, "testtable2/#", TESTTABLE2_ID);
 
diff --git a/tests/src/android/cts/util/PollingCheck.java b/tests/src/android/cts/util/PollingCheck.java
new file mode 100644
index 0000000..8870fb9
--- /dev/null
+++ b/tests/src/android/cts/util/PollingCheck.java
@@ -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.
+ */
+
+package android.cts.util;
+
+import junit.framework.Assert;
+
+public abstract class PollingCheck {
+    private static final long TIME_SLICE = 50;
+    private long mTimeout = 3000;
+
+    public PollingCheck() {
+    }
+
+    public PollingCheck(long timeout) {
+        mTimeout = timeout;
+    }
+
+    protected abstract boolean check();
+
+    public void run() {
+        if (check()) {
+            return;
+        }
+
+        long timeout = mTimeout;
+        while (timeout > 0) {
+            try {
+                Thread.sleep(TIME_SLICE);
+            } catch (InterruptedException e) {
+                Assert.fail("unexpected InterruptedException");
+            }
+
+            if (check()) {
+                return;
+            }
+
+            timeout -= TIME_SLICE;
+        }
+
+        Assert.fail("unexpected timeout");
+    }
+}
diff --git a/tests/src/android/opengl/cts/CompressedTextureLoader.java b/tests/src/android/opengl/cts/CompressedTextureLoader.java
new file mode 100644
index 0000000..2cb6910
--- /dev/null
+++ b/tests/src/android/opengl/cts/CompressedTextureLoader.java
@@ -0,0 +1,485 @@
+/*
+ * 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.opengl.cts;
+
+import java.io.InputStream;
+import java.nio.ByteBuffer;
+import java.nio.Buffer;
+import java.nio.ByteOrder;
+import java.util.HashMap;
+
+import com.android.cts.stub.R;
+
+import android.app.Activity;
+import android.content.res.AssetFileDescriptor;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.util.Log;
+
+import android.opengl.ETC1;
+import android.opengl.ETC1Util;
+import android.opengl.GLES20;
+
+import android.graphics.Bitmap;
+import android.graphics.Bitmap.Config;
+import android.graphics.BitmapFactory;
+
+public class CompressedTextureLoader {
+    private static final String TAG = "CompressedTextureLoader";
+
+    public static final String TEXTURE_UNCOMPRESSED = "UNCOMPRESSED";
+    public static final String TEXTURE_ETC1 = "ETC1";
+    public static final String TEXTURE_S3TC = "S3TC";
+    public static final String TEXTURE_ATC = "ATC";
+    public static final String TEXTURE_PVRTC = "PVRTC";
+
+    public static class Texture {
+        public Texture(int width, int height, int internalformat, ByteBuffer data,
+                       String formatName) {
+            mWidth = width;
+            mHeight = height;
+            mInternalFormat = internalformat;
+            mData = data;
+            mFormatName = formatName;
+        }
+
+        /**
+         * Get the width of the texture in pixels.
+         * @return the width of the texture in pixels.
+         */
+        public int getWidth() { return mWidth; }
+
+        /**
+         * Get the height of the texture in pixels.
+         * @return the width of the texture in pixels.
+         */
+        public int getHeight() { return mHeight; }
+
+        /**
+         * Get the compressed data of the texture.
+         * @return the texture data.
+         */
+        public ByteBuffer getData() { return mData; }
+
+        /**
+         * Get the format of the texture.
+         * @return the internal format.
+         */
+        public int getFormat() { return mInternalFormat; }
+
+        /**
+         * Get the format of the texture.
+         * @return the internal format.
+         */
+        public boolean isSupported() { return isFormatSupported(mFormatName); }
+
+        private int mWidth;
+        private int mHeight;
+        private int mInternalFormat;
+        private ByteBuffer mData;
+        private String mFormatName;
+    }
+
+    /*  .pvr header is described by the following c struct
+        typedef struct PVR_TEXTURE_HEADER_TAG{
+            unsigned int  dwHeaderSize;   // size of the structure
+            unsigned int  dwHeight;    // height of surface to be created
+            unsigned int  dwWidth;    // width of input surface
+            unsigned int  dwMipMapCount;   // number of MIP-map levels requested
+            unsigned int  dwpfFlags;   // pixel format flags
+            unsigned int  dwDataSize;   // Size of the compress data
+            unsigned int  dwBitCount;   // number of bits per pixel
+            unsigned int  dwRBitMask;   // mask for red bit
+            unsigned int  dwGBitMask;   // mask for green bits
+            unsigned int  dwBBitMask;   // mask for blue bits
+            unsigned int  dwAlphaBitMask;   // mask for alpha channel
+            unsigned int  dwPVR;    // should be 'P' 'V' 'R' '!'
+            unsigned int  dwNumSurfs;   //number of slices for volume textures or skyboxes
+        } PVR_TEXTURE_HEADER;
+    */
+    static final int PVR_HEADER_SIZE = 13 * 4;
+    static final int PVR_2BPP = 24;
+    static final int PVR_4BPP = 25;
+    static final int PVR_MAGIC_NUMBER = 559044176;
+
+    static final int GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG = 0x8C00;
+    static final int GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG = 0x8C01;
+    static final int GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = 0x8C02;
+    static final int GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG = 0x8C03;
+
+    static class PVRHeader {
+        int mHeaderSize;   // size of the structure
+        int mHeight;    // height of surface to be created
+        int mWidth;    // width of input surface
+        int mMipMapCount;   // number of MIP-map levels requested
+        int mpfFlags;   // pixel format flags
+        int mDataSize;   // Size of the compress data
+        int mBitCount;   // number of bits per pixel
+        int mRBitMask;   // mask for red bit
+        int mGBitMask;   // mask for green bits
+        int mBBitMask;   // mask for blue bits
+        int mAlphaBitMask;   // mask for alpha channel
+        int mPVR;    // should be 'P' 'V' 'R' '!'
+        int mNumSurfs;   //number of slices for volume textures or skyboxes
+    }
+
+    protected static PVRHeader readPVRHeader(InputStream is) {
+
+        byte[] headerData = new byte[PVR_HEADER_SIZE];
+        try {
+            is.read(headerData);
+        } catch (Exception e) {
+            throw new RuntimeException("Unable to read data");
+        }
+
+        ByteBuffer headerBuffer = ByteBuffer.allocateDirect(PVR_HEADER_SIZE)
+                .order(ByteOrder.nativeOrder());
+        headerBuffer.put(headerData, 0, PVR_HEADER_SIZE).position(0);
+
+        PVRHeader header = new PVRHeader();
+
+        header.mHeaderSize = headerBuffer.getInt();
+        header.mHeight = headerBuffer.getInt();
+        header.mWidth = headerBuffer.getInt();
+        header.mMipMapCount = headerBuffer.getInt();
+        header.mpfFlags = headerBuffer.getInt();
+        header.mDataSize = headerBuffer.getInt();
+        header.mBitCount = headerBuffer.getInt();
+        header.mRBitMask = headerBuffer.getInt();
+        header.mGBitMask = headerBuffer.getInt();
+        header.mBBitMask = headerBuffer.getInt();
+        header.mAlphaBitMask = headerBuffer.getInt();
+        header.mPVR = headerBuffer.getInt();
+        header.mNumSurfs = headerBuffer.getInt();
+
+        if (header.mHeaderSize != PVR_HEADER_SIZE ||
+            header.mPVR != PVR_MAGIC_NUMBER) {
+            throw new RuntimeException("Invalid header data");
+        }
+
+        return header;
+    }
+
+    public static Texture loadTextureATC(Resources res, int id) {
+        Texture tex = new Texture(0, 0, 0, null, "Stub!");
+        return tex;
+    }
+
+    private static ETC1Util.ETC1Texture compressTexture(Buffer input,
+                                                        int width, int height,
+                                                        int pixelSize, int stride){
+        int encodedImageSize = ETC1.getEncodedDataSize(width, height);
+        ByteBuffer compressedImage = ByteBuffer.allocateDirect(encodedImageSize).
+            order(ByteOrder.nativeOrder());
+        ETC1.encodeImage(input, width, height, pixelSize, stride, compressedImage);
+        return new ETC1Util.ETC1Texture(width, height, compressedImage);
+    }
+
+    public static Texture createFromUncompressedETC1(Bitmap bitmap) {
+        int dataSize = bitmap.getRowBytes() * bitmap.getHeight();
+
+        ByteBuffer dataBuffer;
+        dataBuffer = ByteBuffer.allocateDirect(dataSize).order(ByteOrder.nativeOrder());
+        bitmap.copyPixelsToBuffer(dataBuffer);
+        dataBuffer.position(0);
+
+        int bytesPerPixel = bitmap.getRowBytes() / bitmap.getWidth();
+        ETC1Util.ETC1Texture compressed = compressTexture(dataBuffer,
+                                                          bitmap.getWidth(),
+                                                          bitmap.getHeight(),
+                                                          bytesPerPixel,
+                                                          bitmap.getRowBytes());
+
+        Texture tex = new Texture(compressed.getWidth(), compressed.getHeight(),
+                                  ETC1.ETC1_RGB8_OES, compressed.getData(), TEXTURE_ETC1);
+
+        return tex;
+    }
+
+    private static ByteBuffer read(InputStream is, int dataSize) {
+        ByteBuffer dataBuffer;
+        dataBuffer = ByteBuffer.allocateDirect(dataSize).order(ByteOrder.nativeOrder());
+        byte[] ioBuffer = new byte[4096];
+        for (int i = 0; i < dataSize; ) {
+            int chunkSize = Math.min(ioBuffer.length, dataSize - i);
+            try {
+                is.read(ioBuffer, 0, chunkSize);
+            } catch (Exception e) {
+                throw new RuntimeException("Unable to read data");
+            }
+            dataBuffer.put(ioBuffer, 0, chunkSize);
+            i += chunkSize;
+        }
+        dataBuffer.position(0);
+        return dataBuffer;
+    }
+
+    public static Texture loadTexturePVRTC(Resources res, int id) {
+        InputStream is = null;
+        try {
+            is = res.openRawResource(id);
+        } catch (Exception e) {
+            throw new RuntimeException("Unable to open resource " + id);
+        }
+
+        PVRHeader header = readPVRHeader(is);
+
+        int format = header.mpfFlags & 0xFF;
+        int internalFormat = 0;
+        if (format == PVR_2BPP && header.mAlphaBitMask == 1) {
+            internalFormat = GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;
+        } else if (format == PVR_2BPP && header.mAlphaBitMask == 0) {
+            internalFormat = GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG;
+        } else if (format == PVR_4BPP && header.mAlphaBitMask == 1) {
+            internalFormat = GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;
+        } else if (format == PVR_4BPP && header.mAlphaBitMask == 0) {
+            internalFormat = GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG;
+        }
+
+        // only load the first mip level for now
+        int dataSize = (header.mWidth * header.mHeight * header.mBitCount) >> 3;
+        ByteBuffer dataBuffer = read(is, dataSize);
+        Texture tex = new Texture(header.mWidth, header.mHeight,
+                                  internalFormat, dataBuffer,
+                                  TEXTURE_PVRTC);
+        try {
+            is.close();
+        } catch (Exception e) {
+            throw new RuntimeException("Unable to close resource stream " + id);
+        }
+        return tex;
+    }
+
+    /* DDS Header is described by the following structs
+       typedef struct {
+          DWORD           dwSize;
+          DWORD           dwFlags;
+          DWORD           dwHeight;
+          DWORD           dwWidth;
+          DWORD           dwPitchOrLinearSize;
+          DWORD           dwDepth;
+          DWORD           dwMipMapCount;
+          DWORD           dwReserved1[11];
+          DDS_PIXELFORMAT ddspf;
+          DWORD           dwCaps;
+          DWORD           dwCaps2;
+          DWORD           dwCaps3;
+          DWORD           dwCaps4;
+          DWORD           dwReserved2;
+        } DDS_HEADER;
+
+        struct DDS_PIXELFORMAT {
+          DWORD dwSize;
+          DWORD dwFlags;
+          DWORD dwFourCC;
+          DWORD dwRGBBitCount;
+          DWORD dwRBitMask;
+          DWORD dwGBitMask;
+          DWORD dwBBitMask;
+          DWORD dwABitMask;
+        };
+
+        In the file it looks like this
+        DWORD               dwMagic;
+        DDS_HEADER          header;
+        DDS_HEADER_DXT10    header10; // If the DDS_PIXELFORMAT dwFlags is set to DDPF_FOURCC
+                                      // and dwFourCC is DX10
+
+    */
+
+    static final int DDS_HEADER_STRUCT_SIZE = 124;
+    static final int DDS_PIXELFORMAT_STRUCT_SIZE = 32;
+    static final int DDS_HEADER_SIZE = 128;
+    static final int DDS_MAGIC_NUMBER = 0x20534444;
+    static final int DDS_DDPF_FOURCC = 0x4;
+    static final int DDS_DXT1 = 0x31545844;
+    static final int DDS_DXT5 = 0x35545844;
+
+    static final int COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0;
+    static final int COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1;
+    static final int COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3;
+
+    static class DDSHeader {
+        int mMagic;
+        int mSize;
+        int mFlags;
+        int mHeight;
+        int mWidth;
+        int mPitchOrLinearSize;
+        int mDepth;
+        int mMipMapCount;
+        int[] mReserved1;
+        // struct DDS_PIXELFORMAT {
+            int mPixelFormatSize;
+            int mPixelFormatFlags;
+            int mPixelFormatFourCC;
+            int mPixelFormatRGBBitCount;
+            int mPixelFormatRBitMask;
+            int mPixelFormatGBitMask;
+            int mPixelFormatBBitMask;
+            int mPixelFormatABitMask;
+        // };
+        int mCaps;
+        int mCaps2;
+        int mCaps3;
+        int mCaps4;
+        int mReserved2;
+
+        DDSHeader() {
+            mReserved1 = new int[11];
+        }
+    }
+
+    protected static DDSHeader readDDSHeader(InputStream is) {
+
+        byte[] headerData = new byte[DDS_HEADER_SIZE];
+        try {
+            is.read(headerData);
+        } catch (Exception e) {
+            throw new RuntimeException("Unable to read data");
+        }
+
+        ByteBuffer headerBuffer = ByteBuffer.allocateDirect(DDS_HEADER_SIZE)
+                .order(ByteOrder.nativeOrder());
+        headerBuffer.put(headerData, 0, DDS_HEADER_SIZE).position(0);
+
+        DDSHeader header = new DDSHeader();
+
+        header.mMagic = headerBuffer.getInt();
+        header.mSize = headerBuffer.getInt();
+        header.mFlags = headerBuffer.getInt();
+        header.mHeight = headerBuffer.getInt();
+        header.mWidth = headerBuffer.getInt();
+        header.mPitchOrLinearSize = headerBuffer.getInt();
+        header.mDepth = headerBuffer.getInt();
+        header.mMipMapCount = headerBuffer.getInt();
+        for (int i = 0; i < header.mReserved1.length; i ++) {
+            header.mReserved1[i] = headerBuffer.getInt();
+        }
+        // struct DDS_PIXELFORMAT {
+            header.mPixelFormatSize = headerBuffer.getInt();
+            header.mPixelFormatFlags = headerBuffer.getInt();
+            header.mPixelFormatFourCC = headerBuffer.getInt();
+            header.mPixelFormatRGBBitCount = headerBuffer.getInt();
+            header.mPixelFormatRBitMask = headerBuffer.getInt();
+            header.mPixelFormatGBitMask = headerBuffer.getInt();
+            header.mPixelFormatBBitMask = headerBuffer.getInt();
+            header.mPixelFormatABitMask = headerBuffer.getInt();
+        // };
+        header.mCaps = headerBuffer.getInt();
+        header.mCaps2 = headerBuffer.getInt();
+        header.mCaps3 = headerBuffer.getInt();
+        header.mCaps4 = headerBuffer.getInt();
+        header.mReserved2 = headerBuffer.getInt();
+
+        if (header.mSize != DDS_HEADER_STRUCT_SIZE ||
+            header.mPixelFormatSize != DDS_PIXELFORMAT_STRUCT_SIZE ||
+            header.mMagic != DDS_MAGIC_NUMBER) {
+            throw new RuntimeException("Invalid header data");
+        }
+
+        return header;
+    }
+
+    // Very simple loader that only reads in the header and a DXT1 mip level 0
+    public static Texture loadTextureDXT(Resources res, int id) {
+        InputStream is = null;
+        try {
+            is = res.openRawResource(id);
+        } catch (Exception e) {
+            throw new RuntimeException("Unable to open resource " + id);
+        }
+
+        DDSHeader header = readDDSHeader(is);
+
+        if (header.mPixelFormatFlags != DDS_DDPF_FOURCC) {
+            throw new RuntimeException("Unsupported DXT data");
+        }
+
+        int internalFormat = 0;
+        int bpp = 0;
+        switch (header.mPixelFormatFourCC) {
+        case DDS_DXT1:
+            internalFormat = COMPRESSED_RGB_S3TC_DXT1_EXT;
+            bpp = 4;
+            break;
+        case DDS_DXT5:
+            internalFormat = COMPRESSED_RGBA_S3TC_DXT5_EXT;
+            bpp = 8;
+            break;
+        default:
+            throw new RuntimeException("Unsupported DXT data");
+        }
+
+        // only load the first mip level for now
+        int dataSize = (header.mWidth * header.mHeight * bpp) >> 3;
+        if (dataSize != header.mPitchOrLinearSize) {
+            throw new RuntimeException("Expected data and header mismatch");
+        }
+        ByteBuffer dataBuffer = read(is, dataSize);
+
+        Texture tex = new Texture(header.mWidth, header.mHeight, internalFormat,
+                                  dataBuffer, TEXTURE_S3TC);
+        return tex;
+    }
+
+    static HashMap<String, Boolean> sExtensionMap;
+    static HashMap<String, Boolean> sFormatMap;
+
+    private static synchronized void updateSupportedFormats() {
+        if (sExtensionMap != null) {
+            return;
+        }
+
+        sExtensionMap = new HashMap<String, Boolean>();
+        sFormatMap = new HashMap<String, Boolean>();
+        String extensionList = GLES20.glGetString(GLES20.GL_EXTENSIONS);
+
+        for (String extension : extensionList.split(" ")) {
+            sExtensionMap.put(extension, true);
+        }
+
+        // Check ETC1
+        sFormatMap.put(TEXTURE_ETC1, ETC1Util.isETC1Supported());
+        // Check ATC
+        if (sExtensionMap.get("GL_AMD_compressed_ATC_texture") != null ||
+            sExtensionMap.get("GL_ATI_compressed_texture_atitc") != null ||
+            sExtensionMap.get("GL_ATI_texture_compression_atitc") != null) {
+            sFormatMap.put(TEXTURE_ATC, true);
+        }
+        // Check DXT
+        if (sExtensionMap.get("GL_EXT_texture_compression_dxt1") != null ||
+            sExtensionMap.get("GL_EXT_texture_compression_s3tc") != null ||
+            sExtensionMap.get("OES_texture_compression_S3TC") != null) {
+            sFormatMap.put(TEXTURE_S3TC, true);
+        }
+        // Check DXT
+        if (sExtensionMap.get("GL_IMG_texture_compression_pvrtc") != null) {
+            sFormatMap.put(TEXTURE_PVRTC, true);
+        }
+
+        /*Log.i(TAG, "mIsSupportedETC1 " + sFormatMap.get(TEXTURE_ETC1));
+        Log.i(TAG, "mIsSupportedATC " + sFormatMap.get(TEXTURE_ATC));
+        Log.i(TAG, "mIsSupportedDXT " + sFormatMap.get(TEXTURE_S3TC));
+        Log.i(TAG, "mIsSupportedPVRTC " + sFormatMap.get(TEXTURE_PVRTC));*/
+    }
+
+    private static boolean isFormatSupported(String format) {
+        updateSupportedFormats();
+        Boolean supported = sFormatMap.get(format);
+        return supported != null ? supported : false;
+    }
+}
diff --git a/tests/src/android/opengl/cts/CompressedTextureStubActivity.java b/tests/src/android/opengl/cts/CompressedTextureStubActivity.java
new file mode 100644
index 0000000..bf098eb
--- /dev/null
+++ b/tests/src/android/opengl/cts/CompressedTextureStubActivity.java
@@ -0,0 +1,75 @@
+/*
+ * 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.opengl.cts;
+
+import com.android.cts.stub.R;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.res.AssetFileDescriptor;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.Bitmap.Config;
+import android.graphics.BitmapFactory;
+import android.os.Bundle;
+import android.util.Log;
+
+
+public class CompressedTextureStubActivity extends Activity {
+
+    private static final String TAG = "CompressedTextureStubActivity";
+
+    protected Resources mResources;
+
+    private CompressedTextureSurfaceView mCompressedTextureView = null;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        Bundle extras = getIntent().getExtras();
+        String formatTest = extras.getString("TextureFormat", null);
+
+        Log.i(TAG, "Testing format " + formatTest);
+
+        mResources = getResources();
+
+        CompressedTextureLoader.Texture compressed = null;
+
+        BitmapFactory.Options optionsRGB = new BitmapFactory.Options();
+        optionsRGB.inPreferredConfig = Bitmap.Config.RGB_565;
+        Bitmap bitmap = BitmapFactory.decodeResource(mResources, R.raw.basetex, optionsRGB);
+
+        if (formatTest.equals(CompressedTextureLoader.TEXTURE_ETC1)) {
+            compressed = CompressedTextureLoader.createFromUncompressedETC1(bitmap);
+        } else if (formatTest.equals(CompressedTextureLoader.TEXTURE_S3TC)) {
+            compressed = CompressedTextureLoader.loadTextureDXT(mResources, R.raw.ddstex); //stub for now
+        } else if (formatTest.equals(CompressedTextureLoader.TEXTURE_ATC)) {
+            compressed = CompressedTextureLoader.loadTextureATC(mResources, 0); //stub for now
+        } else if (formatTest.equals(CompressedTextureLoader.TEXTURE_PVRTC)) {
+            compressed = CompressedTextureLoader.loadTexturePVRTC(mResources, R.raw.pvrtex);
+        }
+
+        mCompressedTextureView = new CompressedTextureSurfaceView(this, bitmap, compressed);
+        setContentView(mCompressedTextureView);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        mCompressedTextureView.onResume();
+    }
+}
diff --git a/tests/src/android/opengl/cts/CompressedTextureSurfaceView.java b/tests/src/android/opengl/cts/CompressedTextureSurfaceView.java
new file mode 100644
index 0000000..8d28efa
--- /dev/null
+++ b/tests/src/android/opengl/cts/CompressedTextureSurfaceView.java
@@ -0,0 +1,402 @@
+/*
+ * 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.opengl.cts;
+
+import java.io.IOException;
+import java.nio.Buffer;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import javax.microedition.khronos.egl.EGLConfig;
+import javax.microedition.khronos.opengles.GL10;
+
+import com.android.cts.stub.R;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.Bitmap.Config;
+import android.graphics.BitmapFactory;
+import android.graphics.Color;
+import android.graphics.SurfaceTexture;
+import android.opengl.ETC1;
+import android.opengl.ETC1Util;
+import android.opengl.GLES20;
+import android.opengl.GLSurfaceView;
+import android.opengl.GLUtils;
+import android.opengl.Matrix;
+import android.util.Log;
+import android.view.Surface;
+
+class CompressedTextureSurfaceView extends GLSurfaceView {
+    private static final String TAG = "CompressedTextureSurfaceView";
+    private static final int SLEEP_TIME_MS = 1000;
+
+    CompressedTextureRender mRenderer;
+
+    public CompressedTextureSurfaceView(Context context,
+                                        Bitmap base,
+                                        CompressedTextureLoader.Texture compressed) {
+        super(context);
+
+        setEGLContextClientVersion(2);
+        mRenderer = new CompressedTextureRender(context, base, compressed);
+        setRenderer(mRenderer);
+        setRenderMode(RENDERMODE_WHEN_DIRTY);
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+    }
+
+    private static class CompressedTextureRender implements GLSurfaceView.Renderer {
+        private static String TAG = "CompressedTextureRender";
+
+        private static final int ALLOWED_DELTA = 25;
+        private static final int FBO_PIXEL_SIZE_BYTES = 4;
+        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" +
+                "attribute vec4 aPosition;\n" +
+                "attribute vec4 aTextureCoord;\n" +
+                "varying vec2 vTextureCoord;\n" +
+                "void main() {\n" +
+                "  gl_Position = uMVPMatrix * aPosition;\n" +
+                "  vTextureCoord = aTextureCoord.xy;\n" +
+                "}\n";
+
+        private final String mFragmentShader =
+                "precision mediump float;\n" +
+                "varying vec2 vTextureCoord;\n" +
+                "uniform sampler2D sTexture;\n" +
+                "void main() {\n" +
+                "  gl_FragColor = texture2D(sTexture, vTextureCoord);\n" +
+                "}\n";
+
+        private float[] mMVPMatrix = new float[16];
+        private float[] mSTMatrix = new float[16];
+
+        private int mProgram;
+        private int mTextureID;
+        private int muMVPMatrixHandle;
+        private int maPositionHandle;
+        private int maTextureHandle;
+        private int msTextureHandle;
+
+        private int mColorTargetID;
+        private int mFrameBufferObjectID;
+
+        private boolean updateSurface = false;
+
+        Bitmap mBaseTexture;
+        CompressedTextureLoader.Texture mCompressedTexture;
+
+        int mWidth;
+        int mHeight;
+
+        ByteBuffer mReadBackBuffer;
+
+        public CompressedTextureRender(Context context,
+                                       Bitmap base,
+                                       CompressedTextureLoader.Texture compressed) {
+            mBaseTexture = base;
+            mCompressedTexture = compressed;
+            mTriangleVertices = ByteBuffer.allocateDirect(
+                mTriangleVerticesData.length * FLOAT_SIZE_BYTES)
+                    .order(ByteOrder.nativeOrder()).asFloatBuffer();
+            mTriangleVertices.put(mTriangleVerticesData).position(0);
+
+            Matrix.setIdentityM(mSTMatrix, 0);
+
+            int byteBufferSize = mBaseTexture.getWidth() *
+                                 mBaseTexture.getHeight() *
+                                 FBO_PIXEL_SIZE_BYTES;
+            mReadBackBuffer = ByteBuffer.allocateDirect(byteBufferSize);
+        }
+
+        private void renderQuad(int textureID) {
+            GLES20.glUseProgram(mProgram);
+            checkGlError("glUseProgram");
+
+            GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
+            GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureID);
+
+            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.setIdentityM(mMVPMatrix, 0);
+            GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0);
+
+            GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
+            checkGlError("glDrawArrays");
+        }
+
+        private int getUnsignedByte(byte val) {
+            return 0xFF & ((int)val);
+        }
+
+        private boolean comparePixel(int x, int y) {
+            int w = mBaseTexture.getWidth();
+            int sampleStart = (y * w + x) * FBO_PIXEL_SIZE_BYTES;
+
+            int R = getUnsignedByte(mReadBackBuffer.get(sampleStart));
+            int G = getUnsignedByte(mReadBackBuffer.get(sampleStart + 1));
+            int B = getUnsignedByte(mReadBackBuffer.get(sampleStart + 2));
+
+            int original = mBaseTexture.getPixel(x, y);
+
+            int deltaR = Math.abs(R - Color.red(original));
+            int deltaG = Math.abs(G - Color.green(original));
+            int deltaB = Math.abs(B - Color.blue(original));
+
+            if (deltaR <= ALLOWED_DELTA &&
+                deltaG <= ALLOWED_DELTA &&
+                deltaB <= ALLOWED_DELTA) {
+                return true;
+            }
+
+            Log.i("PIXEL DELTA", "R: " + deltaR + " G: " + deltaG + " B: " + deltaB);
+
+            return false;
+        }
+
+        private void comparePixels() {
+            int w = mBaseTexture.getWidth();
+            int h = mBaseTexture.getWidth();
+            int wOver4 = w / 4;
+            int hOver4 = h / 4;
+
+            // Sample 4 points in the image. Test is designed so that
+            // sample areas are low frequency and easy to compare
+            boolean sample1Matches = comparePixel(wOver4, hOver4);
+            boolean sample2Matches = comparePixel(wOver4 * 3, hOver4);
+            boolean sample3Matches = comparePixel(wOver4, hOver4 * 3);
+            boolean sample4Matches = comparePixel(wOver4 * 3, hOver4 * 3);
+
+            if (!sample1Matches || !sample2Matches || !sample3Matches || !sample4Matches) {
+                throw new RuntimeException("Compressed colors incorrect");
+            }
+        }
+
+        public void onDrawFrame(GL10 glUnused) {
+            if (mProgram == 0) {
+                return;
+            }
+
+            GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, mFrameBufferObjectID);
+            GLES20.glViewport(0, 0, mBaseTexture.getWidth(), mBaseTexture.getHeight());
+            GLES20.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
+            renderQuad(mTextureID);
+            GLES20.glReadPixels(0, 0, mBaseTexture.getWidth(), mBaseTexture.getHeight(),
+                                GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, mReadBackBuffer);
+            comparePixels();
+            GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
+
+            GLES20.glViewport(0, 0, mWidth, mHeight);
+            GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
+            GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+
+            renderQuad(mColorTargetID);
+
+            GLES20.glFinish();
+        }
+
+        public void onSurfaceChanged(GL10 glUnused, int width, int height) {
+            mWidth = width;
+            mHeight = height;
+        }
+
+        private void setupSamplers() {
+            GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,
+                    GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
+            GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,
+                    GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
+            GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
+                    GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
+            GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
+                    GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
+        }
+
+        private void initFBO() {
+            int[] textures = new int[1];
+            GLES20.glGenTextures(1, textures, 0);
+
+            mColorTargetID = textures[0];
+            GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mColorTargetID);
+            checkGlError("glBindTexture mColorTargetID");
+            setupSamplers();
+            GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA,
+                                mBaseTexture.getWidth(), mBaseTexture.getHeight(), 0,
+                                GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null);
+            checkGlError("glTexImage2D mColorTargetID");
+
+            GLES20.glGenFramebuffers(1, textures, 0);
+            mFrameBufferObjectID = textures[0];
+            GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, mFrameBufferObjectID);
+
+            GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0,
+                                          GLES20.GL_TEXTURE_2D, mColorTargetID, 0);
+
+            int status = GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER);
+            if(status != GLES20.GL_FRAMEBUFFER_COMPLETE) {
+                throw new RuntimeException("Failed to initialize framebuffer object");
+            }
+
+            GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
+        }
+
+        public void onSurfaceCreated(GL10 glUnused, EGLConfig config) {
+            if (mCompressedTexture != null && !mCompressedTexture.isSupported()) {
+                return;
+            }
+
+            initFBO();
+
+            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");
+            }
+
+            int[] textures = new int[1];
+            GLES20.glGenTextures(1, textures, 0);
+
+            mTextureID = textures[0];
+            GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureID);
+            checkGlError("glBindTexture mTextureID");
+            setupSamplers();
+
+            if (mCompressedTexture == null) {
+                GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, mBaseTexture, 0);
+                checkGlError("texImage2D mBaseTexture");
+            } else {
+                GLES20.glCompressedTexImage2D(GLES20.GL_TEXTURE_2D,
+                                              0,
+                                              mCompressedTexture.getFormat(),
+                                              mCompressedTexture.getWidth(),
+                                              mCompressedTexture.getHeight(),
+                                              0,
+                                              mCompressedTexture.getData().remaining(),
+                                              mCompressedTexture.getData());
+                checkGlError("glCompressedTexImage2D mTextureID");
+            }
+        }
+
+        synchronized public void onFrameAvailable(SurfaceTexture surface) {
+            updateSurface = true;
+        }
+
+        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);
+            }
+        }
+
+    }  // End of class CompressedTextureRender.
+
+}  // End of class CompressedTextureSurfaceView.
diff --git a/tests/src/android/os/cts/FileUtils.java b/tests/src/android/os/cts/FileUtils.java
index feaf7d7..6b71b86 100644
--- a/tests/src/android/os/cts/FileUtils.java
+++ b/tests/src/android/os/cts/FileUtils.java
@@ -16,6 +16,7 @@
 
 package android.os.cts;
 
+import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -119,4 +120,33 @@
             return false;
         }
     }
+
+    public static void createFile(File file, int numBytes) throws IOException {
+        File parentFile = file.getParentFile();
+        if (parentFile != null) {
+            parentFile.mkdirs();
+        }
+        byte[] buffer = new byte[numBytes];
+        FileOutputStream output = new FileOutputStream(file);
+        try {
+            output.write(buffer);
+        } finally {
+            output.close();
+        }
+    }
+
+    public static byte[] readInputStreamFully(InputStream is) {
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        byte[] buffer = new byte[32768];
+        int count;
+        try {
+            while ((count = is.read(buffer)) != -1) {
+                os.write(buffer, 0, count);
+            }
+            is.close();
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return os.toByteArray();
+    }
 }
diff --git a/tests/src/android/provider/cts/FileCopyHelper.java b/tests/src/android/provider/cts/FileCopyHelper.java
index 114c3ad..507eb06 100644
--- a/tests/src/android/provider/cts/FileCopyHelper.java
+++ b/tests/src/android/provider/cts/FileCopyHelper.java
@@ -19,7 +19,6 @@
 import android.content.Context;
 
 import java.io.File;
-import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -98,18 +97,4 @@
             mContext.deleteFile(path);
         }
     }
-
-    public static void createFile(File file, int numBytes) throws IOException {
-        File parentFile = file.getParentFile();
-        if (parentFile != null) {
-            parentFile.mkdirs();
-        }
-        byte[] buffer = new byte[numBytes];
-        FileOutputStream output = new FileOutputStream(file);
-        try {
-            output.write(buffer);
-        } finally {
-            output.close();
-        }
-    }
 }
diff --git a/tests/src/android/provider/cts/PhotoUtil.java b/tests/src/android/provider/cts/PhotoUtil.java
new file mode 100644
index 0000000..9c3047f
--- /dev/null
+++ b/tests/src/android/provider/cts/PhotoUtil.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.provider.cts;
+
+import com.android.cts.stub.R;
+
+import android.content.Context;
+import android.os.cts.FileUtils;
+
+import java.io.InputStream;
+
+public class PhotoUtil {
+
+    public static byte[] getTestPhotoData(Context context) {
+        InputStream input = context.getResources().openRawResource(R.drawable.testimage);
+        return FileUtils.readInputStreamFully(input);
+    }
+}
diff --git a/tests/src/android/renderscript/cts/array_init.rs b/tests/src/android/renderscript/cts/array_init.rs
new file mode 100644
index 0000000..842249a
--- /dev/null
+++ b/tests/src/android/renderscript/cts/array_init.rs
@@ -0,0 +1,58 @@
+#include "shared.rsh"
+
+// Testing constant array initialization
+float fa[4] = {1.0, 9.9999f};
+double da[2] = {7.0, 8.88888};
+char ca[4] = {'a', 7, 'b', 'c'};
+short sa[4] = {1, 1, 2, 3};
+int ia[4] = {5, 8};
+long la[2] = {13, 21};
+long long lla[4] = {34};
+bool ba[3] = {true, false};
+
+void array_init_test() {
+    bool failed = false;
+
+    _RS_ASSERT(fa[0] == 1.0);
+    _RS_ASSERT(fa[1] == 9.9999f);
+    _RS_ASSERT(fa[2] == 0);
+    _RS_ASSERT(fa[3] == 0);
+
+    _RS_ASSERT(da[0] == 7.0);
+    _RS_ASSERT(da[1] == 8.88888);
+
+    _RS_ASSERT(ca[0] == 'a');
+    _RS_ASSERT(ca[1] == 7);
+    _RS_ASSERT(ca[2] == 'b');
+    _RS_ASSERT(ca[3] == 'c');
+
+    _RS_ASSERT(sa[0] == 1);
+    _RS_ASSERT(sa[1] == 1);
+    _RS_ASSERT(sa[2] == 2);
+    _RS_ASSERT(sa[3] == 3);
+
+    _RS_ASSERT(ia[0] == 5);
+    _RS_ASSERT(ia[1] == 8);
+    _RS_ASSERT(ia[2] == 0);
+    _RS_ASSERT(ia[3] == 0);
+
+    _RS_ASSERT(la[0] == 13);
+    _RS_ASSERT(la[1] == 21);
+
+    _RS_ASSERT(lla[0] == 34);
+    _RS_ASSERT(lla[1] == 0);
+    _RS_ASSERT(lla[2] == 0);
+    _RS_ASSERT(lla[3] == 0);
+
+    _RS_ASSERT(ba[0] == true);
+    _RS_ASSERT(ba[1] == false);
+    _RS_ASSERT(ba[2] == false);
+
+    if (failed) {
+        rsSendToClientBlocking(RS_MSG_TEST_FAILED);
+    }
+    else {
+        rsSendToClientBlocking(RS_MSG_TEST_PASSED);
+    }
+}
+
diff --git a/tests/src/android/renderscript/cts/missing_link.rs b/tests/src/android/renderscript/cts/missing_link.rs
new file mode 100644
index 0000000..2b3eaee
--- /dev/null
+++ b/tests/src/android/renderscript/cts/missing_link.rs
@@ -0,0 +1,23 @@
+// Copyright (C) 2012 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+extern void i_do_not_exist(void);
+
+void foo() {
+    i_do_not_exist();
+}
+
diff --git a/tests/src/android/renderscript/cts/struct_array.rs b/tests/src/android/renderscript/cts/struct_array.rs
new file mode 100644
index 0000000..6f106f4
--- /dev/null
+++ b/tests/src/android/renderscript/cts/struct_array.rs
@@ -0,0 +1,20 @@
+#include "shared.rsh"
+
+typedef struct ArrayMe {
+    int i[5];
+} ArrayMe_t;
+
+ArrayMe_t *s;
+
+void verify() {
+    bool failed = false;
+    for (uint32_t index = 0; index < 5; index++) {
+        _RS_ASSERT(s->i[index] == index);
+    }
+
+    if (failed) {
+        rsSendToClientBlocking(RS_MSG_TEST_FAILED);
+    } else {
+        rsSendToClientBlocking(RS_MSG_TEST_PASSED);
+    }
+}
diff --git a/tests/src/android/renderscript/cts/struct_pad.rs b/tests/src/android/renderscript/cts/struct_pad.rs
index 0c013a3..6556eb1 100644
--- a/tests/src/android/renderscript/cts/struct_pad.rs
+++ b/tests/src/android/renderscript/cts/struct_pad.rs
@@ -6,3 +6,18 @@
     int j;
 } s;
 
+void verify() {
+    bool failed = false;
+    _RS_ASSERT(s.i == 7);
+    _RS_ASSERT(s.f4.x == 1.0f);
+    _RS_ASSERT(s.f4.y == 2.0f);
+    _RS_ASSERT(s.f4.z == 3.0f);
+    _RS_ASSERT(s.f4.w == 4.0f);
+    _RS_ASSERT(s.j == 9);
+
+    if (failed) {
+        rsSendToClientBlocking(RS_MSG_TEST_FAILED);
+    } else {
+        rsSendToClientBlocking(RS_MSG_TEST_PASSED);
+    }
+}
diff --git a/tests/src/android/view/animation/cts/AnimationTestUtils.java b/tests/src/android/view/animation/cts/AnimationTestUtils.java
index 3ee22c7..a2b786d 100644
--- a/tests/src/android/view/animation/cts/AnimationTestUtils.java
+++ b/tests/src/android/view/animation/cts/AnimationTestUtils.java
@@ -17,6 +17,7 @@
 package android.view.animation.cts;
 
 import android.app.Instrumentation;
+import android.cts.util.PollingCheck;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.animation.Animation;
@@ -66,7 +67,7 @@
         });
 
         // check whether it has started
-        new DelayedCheck() {
+        new PollingCheck() {
             @Override
             protected boolean check() {
                 return animation.hasStarted();
@@ -74,7 +75,7 @@
         }.run();
 
         // check whether it has ended after duration
-        new DelayedCheck(duration + TIMEOUT_DELTA) {
+        new PollingCheck(duration + TIMEOUT_DELTA) {
             @Override
             protected boolean check() {
                 return animation.hasEnded();
diff --git a/tests/src/android/view/animation/cts/DelayedCheck.java b/tests/src/android/view/animation/cts/DelayedCheck.java
deleted file mode 100644
index 7179426..0000000
--- a/tests/src/android/view/animation/cts/DelayedCheck.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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.view.animation.cts;
-
-import junit.framework.Assert;
-
-public abstract class DelayedCheck {
-    private static final long TIME_SLICE = 200;
-    private long mTimeout = 3000;
-
-    public DelayedCheck() {
-
-    }
-
-    public DelayedCheck(long timeout) {
-        mTimeout = timeout;
-    }
-
-    protected abstract boolean check();
-
-    public void run() {
-        long timeout = mTimeout;
-        while (timeout > 0) {
-            try {
-                Thread.sleep(TIME_SLICE);
-            } catch (InterruptedException e) {
-                Assert.fail("unexpected InterruptedException");
-            }
-
-            if (check()) {
-                return;
-            }
-
-            timeout -= TIME_SLICE;
-        }
-
-        Assert.fail("unexpected timeout");
-    }
-}
diff --git a/tests/src/android/webkit/cts/CtsTestServer.java b/tests/src/android/webkit/cts/CtsTestServer.java
index 6d3bfe6..b0d20ba 100755
--- a/tests/src/android/webkit/cts/CtsTestServer.java
+++ b/tests/src/android/webkit/cts/CtsTestServer.java
@@ -39,6 +39,7 @@
 
 import android.content.Context;
 import android.content.res.AssetManager;
+import android.content.res.Resources;
 import android.net.Uri;
 import android.os.Environment;
 import android.util.Log;
@@ -95,6 +96,7 @@
     private static final String NUM_BYTES_PARAMETER = "numBytes";
 
     public static final String ASSET_PREFIX = "/assets/";
+    public static final String RAW_PREFIX = "raw/";
     public static final String FAVICON_ASSET_PATH = ASSET_PREFIX + "webkit/favicon.png";
     public static final String APPCACHE_PATH = "/appcache.html";
     public static final String APPCACHE_MANIFEST_PATH = "/appcache.manifest";
@@ -124,6 +126,7 @@
     private String mServerUri;
     private AssetManager mAssets;
     private Context mContext;
+    private Resources mResources;
     private boolean mSsl;
     private MimeTypeMap mMap;
     private String mLastQuery;
@@ -166,6 +169,7 @@
         sInstance = this;
         mContext = context;
         mAssets = mContext.getAssets();
+        mResources = mContext.getResources();
         mSsl = ssl;
         if (mSsl) {
             mServerUri = "https://localhost:" + SSL_SERVER_PORT;
@@ -482,7 +486,18 @@
             path = path.substring(ASSET_PREFIX.length());
             // request for an asset file
             try {
-                InputStream in = mAssets.open(path);
+                InputStream in;
+                if (path.startsWith(RAW_PREFIX)) {
+                  String resourceName = path.substring(RAW_PREFIX.length());
+                  int id = mResources.getIdentifier(resourceName, "raw", mContext.getPackageName());
+                  if (id == 0) {
+                    Log.w(TAG, "Can't find raw resource " + resourceName);
+                    throw new IOException();
+                  }
+                  in = mResources.openRawResource(id);
+                } else {
+                  in = mAssets.open(path);
+                }
                 response = createResponse(HttpStatus.SC_OK);
                 InputStreamEntity entity = new InputStreamEntity(in, in.available());
                 String mimeType =
@@ -554,15 +569,20 @@
                     "  <head>" +
                     "    <title>Waiting</title>" +
                     "    <script>" +
-                    "      function updateTitle() { document.title = \"Done\"; }" +
-                    "      window.applicationCache.onnoupdate = updateTitle;" +
-                    "      window.applicationCache.oncached = updateTitle;" +
-                    "      window.applicationCache.onupdateready = updateTitle;" +
-                    "      window.applicationCache.onobsolete = updateTitle;" +
-                    "      window.applicationCache.onerror = updateTitle;" +
+                    "      function updateTitle(x) { document.title = x; }" +
+                    "      window.applicationCache.onnoupdate = " +
+                    "          function() { updateTitle(\"onnoupdate Callback\"); };" +
+                    "      window.applicationCache.oncached = " +
+                    "          function() { updateTitle(\"oncached Callback\"); };" +
+                    "      window.applicationCache.onupdateready = " +
+                    "          function() { updateTitle(\"onupdateready Callback\"); };" +
+                    "      window.applicationCache.onobsolete = " +
+                    "          function() { updateTitle(\"onobsolete Callback\"); };" +
+                    "      window.applicationCache.onerror = " +
+                    "          function() { updateTitle(\"onerror Callback\"); };" +
                     "    </script>" +
                     "  </head>" +
-                    "  <body>AppCache test</body>" +
+                    "  <body onload=\"updateTitle('Loaded');\">AppCache test</body>" +
                     "</html>"));
         } else if (path.equals(APPCACHE_MANIFEST_PATH)) {
             response = createResponse(HttpStatus.SC_OK);
@@ -675,6 +695,10 @@
         }
     }
 
+    protected DefaultHttpServerConnection createHttpServerConnection() {
+        return new DefaultHttpServerConnection();
+    }
+
     private static class ServerThread extends Thread {
         private CtsTestServer mServer;
         private ServerSocket mSocket;
@@ -767,7 +791,7 @@
                 try {
                     Socket socket = mSocket.accept();
 
-                    DefaultHttpServerConnection conn = new DefaultHttpServerConnection();
+                    DefaultHttpServerConnection conn = mServer.createHttpServerConnection();
                     HttpParams params = new BasicHttpParams();
                     params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_0);
                     conn.bind(socket, params);
diff --git a/tests/src/android/webkit/cts/WebViewOnUiThread.java b/tests/src/android/webkit/cts/WebViewOnUiThread.java
new file mode 100644
index 0000000..c9dc914
--- /dev/null
+++ b/tests/src/android/webkit/cts/WebViewOnUiThread.java
@@ -0,0 +1,784 @@
+/*
+ * 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.cts.util.PollingCheck;
+import android.graphics.Bitmap;
+import android.graphics.Picture;
+import android.graphics.Rect;
+import android.os.Bundle;
+import android.os.Looper;
+import android.os.Message;
+import android.os.SystemClock;
+import android.test.InstrumentationTestCase;
+import android.util.DisplayMetrics;
+import android.view.View;
+import android.webkit.DownloadListener;
+import android.webkit.WebBackForwardList;
+import android.webkit.WebChromeClient;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.webkit.WebView.HitTestResult;
+import android.webkit.WebView.PictureListener;
+import android.webkit.WebViewClient;
+
+import junit.framework.Assert;
+
+import java.io.File;
+
+
+/**
+ * Many tests need to run WebView code in the UI thread. This class
+ * wraps a WebView so that calls are ensured to arrive on the UI thread.
+ *
+ * All methods may be run on either the UI thread or test thread.
+ */
+public class WebViewOnUiThread {
+    /**
+     * The maximum time, in milliseconds (10 seconds) to wait for a load
+     * to be triggered.
+     */
+    private static final long LOAD_TIMEOUT = 10000;
+
+    /**
+     * Set to true after onPageFinished is called.
+     */
+    private boolean mLoaded;
+
+    /**
+     * Set to true after onNewPicture is called. Reset when onPageStarted
+     * is called.
+     */
+    private boolean mNewPicture;
+
+    /**
+     * The progress, in percentage, of the page load. Valid values are between
+     * 0 and 100.
+     */
+    private int mProgress;
+
+    /**
+     * The test that this class is being used in. Used for runTestOnUiThread.
+     */
+    private InstrumentationTestCase mTest;
+
+    /**
+     * The WebView that calls will be made on.
+     */
+    private WebView mWebView;
+
+    /**
+     * Initializes the webView with a WebViewClient, WebChromeClient,
+     * and PictureListener to prepare for loadUrlAndWaitForCompletion.
+     *
+     * A new WebViewOnUiThread should be called during setUp so as to
+     * reinitialize between calls.
+     *
+     * @param test The test in which this is being run.
+     * @param webView The webView that the methods should call.
+     * @see loadUrlAndWaitForCompletion
+     */
+    public WebViewOnUiThread(InstrumentationTestCase test, WebView webView) {
+        mTest = test;
+        mWebView = webView;
+        final WebViewClient webViewClient = new WaitForLoadedClient(this);
+        final WebChromeClient webChromeClient = new WaitForProgressClient(this);
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.setWebViewClient(webViewClient);
+                mWebView.setWebChromeClient(webChromeClient);
+                mWebView.setPictureListener(new WaitForNewPicture());
+            }
+        });
+    }
+
+    /**
+     * Called from WaitForNewPicture, this is used to indicate that
+     * the page has been drawn.
+     */
+    synchronized public void onNewPicture() {
+        mNewPicture = true;
+        this.notifyAll();
+    }
+
+    /**
+     * Called from WaitForLoadedClient, this is used to clear the picture
+     * draw state so that draws before the URL begins loading don't count.
+     */
+    synchronized public void onPageStarted() {
+        mNewPicture = false; // Earlier paints won't count.
+    }
+
+    /**
+     * Called from WaitForLoadedClient, this is used to indicate that
+     * the page is loaded, but not drawn yet.
+     */
+    synchronized public void onPageFinished() {
+        mLoaded = true;
+        this.notifyAll();
+    }
+
+    /**
+     * Called from the WebChrome client, this sets the current progress
+     * for a page.
+     * @param progress The progress made so far between 0 and 100.
+     */
+    synchronized public void onProgressChanged(int progress) {
+        mProgress = progress;
+        this.notifyAll();
+    }
+
+    public void setWebViewClient(final WebViewClient webViewClient) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.setWebViewClient(webViewClient);
+            }
+        });
+    }
+
+    public void setWebChromeClient(final WebChromeClient webChromeClient) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.setWebChromeClient(webChromeClient);
+            }
+        });
+    }
+
+    public void setPictureListener(final PictureListener pictureListener) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.setPictureListener(pictureListener);
+            }
+        });
+    }
+
+    public void setDownloadListener(final DownloadListener listener) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.setDownloadListener(listener);
+            }
+        });
+    }
+
+    public void setBackgroundColor(final int color) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.setBackgroundColor(color);
+            }
+        });
+    }
+
+    public void clearCache(final boolean includeDiskFiles) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.clearCache(includeDiskFiles);
+            }
+        });
+    }
+
+    public void clearHistory() {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.clearHistory();
+            }
+        });
+    }
+
+    public void requestFocus() {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.requestFocus();
+            }
+        });
+    }
+
+    public void zoomIn() {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.zoomIn();
+            }
+        });
+    }
+
+    public void removeJavascriptInterface(final String interfaceName) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.removeJavascriptInterface(interfaceName);
+            }
+        });
+    }
+
+    public void addJavascriptInterface(final Object object, final String name) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.addJavascriptInterface(object, name);
+            }
+        });
+    }
+
+    public void flingScroll(final int vx, final int vy) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.flingScroll(vx, vy);
+            }
+        });
+    }
+
+    public void requestFocusNodeHref(final Message hrefMsg) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.requestFocusNodeHref(hrefMsg);
+            }
+        });
+    }
+
+    public void requestImageRef(final Message msg) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.requestImageRef(msg);
+            }
+        });
+    }
+
+    public void setInitialScale(final int scaleInPercent) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.setInitialScale(scaleInPercent);
+            }
+        });
+    }
+
+    public void clearSslPreferences() {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.clearSslPreferences();
+            }
+        });
+    }
+
+    public void resumeTimers() {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.resumeTimers();
+            }
+        });
+    }
+
+    public void findNext(final boolean forward) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.findNext(forward);
+            }
+        });
+    }
+
+    public void clearMatches() {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.clearMatches();
+            }
+        });
+    }
+
+    /**
+     * Calls loadUrl on the WebView and then waits onPageFinished,
+     * onNewPicture and onProgressChange to reach 100.
+     * Test fails if the load timeout elapses.
+     * @param url The URL to load.
+     */
+    public void loadUrlAndWaitForCompletion(final String url) {
+        callAndWait(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.loadUrl(url);
+            }
+        });
+    }
+
+    public void loadDataAndWaitForCompletion(final String data,
+            final String mimeType, final String encoding) {
+        callAndWait(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.loadData(data, mimeType, encoding);
+            }
+        });
+    }
+
+    public void loadDataWithBaseURLAndWaitForCompletion(final String baseUrl,
+            final String data, final String mimeType, final String encoding,
+            final String historyUrl) {
+        callAndWait(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.loadDataWithBaseURL(baseUrl, data, mimeType, encoding,
+                        historyUrl);
+            }
+        });
+    }
+
+    /**
+     * Reloads a page and waits for it to complete reloading. Use reload
+     * if it is a form resubmission and the onFormResubmission responds
+     * by telling WebView not to resubmit it.
+     */
+    public void reloadAndWaitForCompletion() {
+        callAndWait(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.reload();
+            }
+        });
+    }
+
+    /**
+     * Reload the previous URL. Use reloadAndWaitForCompletion unless
+     * it is a form resubmission and the onFormResubmission responds
+     * by telling WebView not to resubmit it.
+     */
+    public void reload() {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.reload();
+            }
+        });
+    }
+
+    /**
+     * Use this only when JavaScript causes a page load to wait for the
+     * page load to complete. Otherwise use loadUrlAndWaitForCompletion or
+     * similar functions.
+     */
+    public void waitForLoadCompletion() {
+        if (isUiThread()) {
+            waitOnUiThread();
+        } else {
+            waitOnTestThread();
+        }
+        clearLoad();
+    }
+
+    public String getTitle() {
+        return getValue(new ValueGetter<String>() {
+            @Override
+            public String capture() {
+                return mWebView.getTitle();
+            }
+        });
+    }
+
+    public WebSettings getSettings() {
+        return getValue(new ValueGetter<WebSettings>() {
+            @Override
+            public WebSettings capture() {
+                return mWebView.getSettings();
+            }
+        });
+    }
+
+    public WebBackForwardList copyBackForwardList() {
+        return getValue(new ValueGetter<WebBackForwardList>() {
+            @Override
+            public WebBackForwardList capture() {
+                return mWebView.copyBackForwardList();
+            }
+        });
+    }
+
+    public Bitmap getFavicon() {
+        return getValue(new ValueGetter<Bitmap>() {
+            @Override
+            public Bitmap capture() {
+                return mWebView.getFavicon();
+            }
+        });
+    }
+
+    public String getUrl() {
+        return getValue(new ValueGetter<String>() {
+            @Override
+            public String capture() {
+                return mWebView.getUrl();
+            }
+        });
+    }
+
+    public int getProgress() {
+        return getValue(new ValueGetter<Integer>() {
+            @Override
+            public Integer capture() {
+                return mWebView.getProgress();
+            }
+        });
+    }
+
+    public int getHeight() {
+        return getValue(new ValueGetter<Integer>() {
+            @Override
+            public Integer capture() {
+                return mWebView.getHeight();
+            }
+        });
+    }
+
+    public int getContentHeight() {
+        return getValue(new ValueGetter<Integer>() {
+            @Override
+            public Integer capture() {
+                return mWebView.getContentHeight();
+            }
+        });
+    }
+
+    public boolean savePicture(final Bundle b, final File dest) {
+        return getValue(new ValueGetter<Boolean>() {
+            @Override
+            public Boolean capture() {
+                return mWebView.savePicture(b, dest);
+            }
+        });
+    }
+
+    public boolean pageUp(final boolean top) {
+        return getValue(new ValueGetter<Boolean>() {
+            @Override
+            public Boolean capture() {
+                return mWebView.pageUp(top);
+            }
+        });
+    }
+
+    public boolean pageDown(final boolean bottom) {
+        return getValue(new ValueGetter<Boolean>() {
+            @Override
+            public Boolean capture() {
+                return mWebView.pageDown(bottom);
+            }
+        });
+    }
+
+    public int[] getLocationOnScreen() {
+        final int[] location = new int[2];
+        return getValue(new ValueGetter<int[]>() {
+            @Override
+            public int[] capture() {
+                mWebView.getLocationOnScreen(location);
+                return location;
+            }
+        });
+    }
+
+    public float getScale() {
+        return getValue(new ValueGetter<Float>() {
+            @Override
+            public Float capture() {
+                return mWebView.getScale();
+            }
+        });
+    }
+
+    public boolean requestFocus(final int direction,
+            final Rect previouslyFocusedRect) {
+        return getValue(new ValueGetter<Boolean>() {
+            @Override
+            public Boolean capture() {
+                return mWebView.requestFocus(direction, previouslyFocusedRect);
+            }
+        });
+    }
+
+    public HitTestResult getHitTestResult() {
+        return getValue(new ValueGetter<HitTestResult>() {
+            @Override
+            public HitTestResult capture() {
+                return mWebView.getHitTestResult();
+            }
+        });
+    }
+
+    public int getScrollX() {
+        return getValue(new ValueGetter<Integer>() {
+            @Override
+            public Integer capture() {
+                return mWebView.getScrollX();
+            }
+        });
+    }
+
+    public int getScrollY() {
+        return getValue(new ValueGetter<Integer>() {
+            @Override
+            public Integer capture() {
+                return mWebView.getScrollY();
+            }
+        });
+    }
+
+    public final DisplayMetrics getDisplayMetrics() {
+        return getValue(new ValueGetter<DisplayMetrics>() {
+            @Override
+            public DisplayMetrics capture() {
+                return mWebView.getContext().getResources().getDisplayMetrics();
+            }
+        });
+    }
+
+    public boolean requestChildRectangleOnScreen(final View child,
+            final Rect rect,
+            final boolean immediate) {
+        return getValue(new ValueGetter<Boolean>() {
+            @Override
+            public Boolean capture() {
+                return mWebView.requestChildRectangleOnScreen(child, rect,
+                        immediate);
+            }
+        });
+    }
+
+    public int findAll(final String find) {
+        return getValue(new ValueGetter<Integer>() {
+            @Override
+            public Integer capture() {
+                return mWebView.findAll(find);
+            }
+        });
+    }
+
+    /**
+     * Helper for running code on the UI thread where an exception is
+     * a test failure. If this is already the UI thread then it runs
+     * the code immediately.
+     *
+     * @see runTestOnUiThread
+     * @param r The code to run in the UI thread
+     */
+    public void runOnUiThread(Runnable r) {
+        try {
+            if (isUiThread()) {
+                r.run();
+            } else {
+                mTest.runTestOnUiThread(r);
+            }
+        } catch (Throwable t) {
+            Assert.fail("Unexpected error while running on UI thread: "
+                    + t.getMessage());
+        }
+    }
+
+    /**
+     * Accessor for underlying WebView.
+     * @return The WebView being wrapped by this class.
+     */
+    public WebView getWebView() {
+        return mWebView;
+    }
+
+    private <T> T getValue(ValueGetter<T> getter) {
+        runOnUiThread(getter);
+        return getter.getValue();
+    }
+
+    private abstract class ValueGetter<T> implements Runnable {
+        private T mValue;
+
+        @Override
+        public void run() {
+            mValue = capture();
+        }
+
+        protected abstract T capture();
+
+        public T getValue() {
+           return mValue;
+        }
+    }
+
+    /**
+     * Returns true if the current thread is the UI thread based on the
+     * Looper.
+     */
+    private static boolean isUiThread() {
+        return (Looper.myLooper() == Looper.getMainLooper());
+    }
+
+    /**
+     * @return Whether or not the load has finished.
+     */
+    private synchronized boolean isLoaded() {
+        return mLoaded && mNewPicture && mProgress == 100;
+    }
+
+    /**
+     * Makes a WebView call, waits for completion and then resets the
+     * load state in preparation for the next load call.
+     * @param call The call to make on the UI thread prior to waiting.
+     */
+    private void callAndWait(Runnable call) {
+        Assert.assertTrue("WebViewOnUiThread.load*AndWaitForCompletion calls "
+                + "may not be mixed with load* calls directly on WebView "
+                + "without calling waitForLoadCompletion after the load",
+                !mLoaded);
+        runOnUiThread(call);
+        waitForLoadCompletion();
+    }
+
+    /**
+     * Called whenever a load has been completed so that a subsequent call to
+     * waitForLoadCompletion doesn't return immediately.
+     */
+    synchronized private void clearLoad() {
+        mLoaded = false;
+        mNewPicture = false;
+        mProgress = 0;
+    }
+
+    /**
+     * Uses a polling mechanism, while pumping messages to check when the
+     * load completes.
+     */
+    private void waitOnUiThread() {
+        new PollingCheck(LOAD_TIMEOUT) {
+            @Override
+            protected boolean check() {
+                pumpMessages();
+                return isLoaded();
+            }
+        }.run();
+    }
+
+    /**
+     * Uses a wait/notify to check when the load completes.
+     */
+    private synchronized void waitOnTestThread() {
+        try {
+            long waitEnd = SystemClock.uptimeMillis() + LOAD_TIMEOUT;
+            long timeRemaining = LOAD_TIMEOUT;
+            while (!isLoaded() && timeRemaining > 0) {
+                this.wait(timeRemaining);
+                timeRemaining = waitEnd - SystemClock.uptimeMillis();
+            }
+        } catch (InterruptedException e) {
+            // We'll just drop out of the loop and fail
+        }
+        Assert.assertTrue("Load failed to complete before timeout", isLoaded());
+    }
+
+    /**
+     * Pumps all currently-queued messages in the UI thread and then exits.
+     * This is useful to force processing while running tests in the UI thread.
+     */
+    private void pumpMessages() {
+        class ExitLoopException extends RuntimeException {
+        }
+
+        // Force loop to exit when processing this. Loop.quit() doesn't
+        // work because this is the main Loop.
+        mWebView.getHandler().post(new Runnable() {
+            @Override
+            public void run() {
+                throw new ExitLoopException(); // exit loop!
+            }
+        });
+        try {
+            // Pump messages until our message gets through.
+            Looper.loop();
+        } catch (ExitLoopException e) {
+        }
+    }
+
+    /**
+     * A WebChromeClient used to capture the onProgressChanged for use
+     * in waitFor functions. If a test must override the WebChromeClient,
+     * it can derive from this class or call onProgressChanged
+     * directly.
+     */
+    public static class WaitForProgressClient extends WebChromeClient {
+        private WebViewOnUiThread mOnUiThread;
+
+        public WaitForProgressClient(WebViewOnUiThread onUiThread) {
+            mOnUiThread = onUiThread;
+        }
+
+        @Override
+        public void onProgressChanged(WebView view, int newProgress) {
+            super.onProgressChanged(view, newProgress);
+            mOnUiThread.onProgressChanged(newProgress);
+        }
+    }
+
+    /**
+     * A WebViewClient that captures the onPageFinished for use in
+     * waitFor functions. Using initializeWebView sets the WaitForLoadedClient
+     * into the WebView. If a test needs to set a specific WebViewClient and
+     * needs the waitForCompletion capability then it should derive from
+     * WaitForLoadedClient or call WebViewOnUiThread.onPageFinished.
+     */
+    public static class WaitForLoadedClient extends WebViewClient {
+        private WebViewOnUiThread mOnUiThread;
+
+        public WaitForLoadedClient(WebViewOnUiThread onUiThread) {
+            mOnUiThread = onUiThread;
+        }
+
+        @Override
+        public void onPageFinished(WebView view, String url) {
+            super.onPageFinished(view, url);
+            mOnUiThread.onPageFinished();
+        }
+
+        @Override
+        public void onPageStarted(WebView view, String url, Bitmap favicon) {
+            super.onPageStarted(view, url, favicon);
+            mOnUiThread.onPageStarted();
+        }
+    }
+
+    /**
+     * A PictureListener that captures the onNewPicture for use in
+     * waitForLoadCompletion. Using initializeWebView sets the PictureListener
+     * into the WebView. If a test needs to set a specific PictureListener and
+     * needs the waitForCompletion capability then it should call
+     * WebViewOnUiThread.onNewPicture.
+     */
+    private class WaitForNewPicture implements PictureListener {
+        @Override
+        public void onNewPicture(WebView view, Picture picture) {
+            WebViewOnUiThread.this.onNewPicture();
+        }
+    }
+}
diff --git a/tests/tests/acceleration/Android.mk b/tests/tests/acceleration/Android.mk
index 3e2acac..93c4d51 100644
--- a/tests/tests/acceleration/Android.mk
+++ b/tests/tests/acceleration/Android.mk
@@ -30,4 +30,4 @@
 
 LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/accessibilityservice/Android.mk b/tests/tests/accessibilityservice/Android.mk
index 71b7537..4cac305 100644
--- a/tests/tests/accessibilityservice/Android.mk
+++ b/tests/tests/accessibilityservice/Android.mk
@@ -34,4 +34,4 @@
 
 #LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityWindowQueryActivityTest.java b/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityWindowQueryActivityTest.java
index 3b41b6c..c9daaab 100644
--- a/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityWindowQueryActivityTest.java
+++ b/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityWindowQueryActivityTest.java
@@ -20,6 +20,7 @@
 import static android.view.accessibility.AccessibilityNodeInfo.ACTION_SELECT;
 
 import android.accessibilityservice.AccessibilityService;
+import android.accessibilityservice.UiTestAutomationBridge;
 import android.content.Context;
 import android.graphics.Rect;
 import android.os.RemoteException;
@@ -102,7 +103,7 @@
     public void testTraverseWindow() throws Exception {
         // make list of expected nodes
         List<String> classNameAndTextList = new ArrayList<String>();
-        classNameAndTextList.add("com.android.internal.policy.impl.PhoneWindow$DecorView");
+        classNameAndTextList.add("android.widget.FrameLayout");
         classNameAndTextList.add("android.widget.LinearLayout");
         classNameAndTextList.add("android.widget.FrameLayout");
         classNameAndTextList.add("android.widget.LinearLayout");
@@ -484,6 +485,7 @@
             mWaitedFilter = filter;
             action.run();
             awaitOnBarrier();
+            mWaitedFilter = null;
         }
 
         /**
diff --git a/tests/tests/accounts/Android.mk b/tests/tests/accounts/Android.mk
index d9e142b..2806bbe 100644
--- a/tests/tests/accounts/Android.mk
+++ b/tests/tests/accounts/Android.mk
@@ -29,5 +29,4 @@
 
 LOCAL_PACKAGE_NAME := CtsAccountManagerTestCases
 
-include $(BUILD_PACKAGE)
-
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/admin/Android.mk b/tests/tests/admin/Android.mk
index 3228d85..8c71e0c 100644
--- a/tests/tests/admin/Android.mk
+++ b/tests/tests/admin/Android.mk
@@ -30,4 +30,4 @@
 
 LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/animation/Android.mk b/tests/tests/animation/Android.mk
index ed9874e..95cc614 100644
--- a/tests/tests/animation/Android.mk
+++ b/tests/tests/animation/Android.mk
@@ -30,5 +30,5 @@
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
 LOCAL_SDK_VERSION := current
-include $(BUILD_PACKAGE)
 
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/animation/AndroidManifest.xml b/tests/tests/animation/AndroidManifest.xml
index f3fd898..f18d416 100644
--- a/tests/tests/animation/AndroidManifest.xml
+++ b/tests/tests/animation/AndroidManifest.xml
@@ -16,10 +16,13 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.android.cts.animation">
-
+    <uses-sdk android:minSdkVersion="11" />
+    <uses-permission android:name="android.permission.INJECT_EVENTS"></uses-permission>
     <application>
         <activity android:name="android.animation.cts.AnimationActivity"
             android:label="AnimationActivity"/>
+        <activity
+           android:name="android.animation.cts.LayoutAnimationActivity" />
         <uses-library android:name="android.test.runner" />
     </application>
 
diff --git a/tests/tests/animation/res/layout/animation_main.xml b/tests/tests/animation/res/layout/animation_main.xml
index 81356a1..c1664f5 100644
--- a/tests/tests/animation/res/layout/animation_main.xml
+++ b/tests/tests/animation/res/layout/animation_main.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
+<!-- Copyright (C) 2012 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
diff --git a/tests/tests/animation/res/layout/animation_two.xml b/tests/tests/animation/res/layout/animation_two.xml
new file mode 100644
index 0000000..870cc6b
--- /dev/null
+++ b/tests/tests/animation/res/layout/animation_two.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical" >
+    <Button android:id="@+id/button1"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/add_button"/>
+    <LinearLayout android:id="@+id/container"
+        android:orientation="vertical"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"/>
+</LinearLayout>
diff --git a/tests/tests/animation/res/values/strings.xml b/tests/tests/animation/res/values/strings.xml
new file mode 100644
index 0000000..8d167fd
--- /dev/null
+++ b/tests/tests/animation/res/values/strings.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources>
+    <string name="add_button">Add Button</string>
+</resources>
diff --git a/tests/tests/animation/src/android/animation/cts/AnimationActivity.java b/tests/tests/animation/src/android/animation/cts/AnimationActivity.java
index 43679c8..555ab15 100644
--- a/tests/tests/animation/src/android/animation/cts/AnimationActivity.java
+++ b/tests/tests/animation/src/android/animation/cts/AnimationActivity.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 The Android Open Source Project
+ * Copyright (C) 2012 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -106,8 +106,8 @@
     }
 
     public ValueAnimator createAnimatorWithInterpolator(TimeInterpolator interpolator){
-        return createAnimator(view.newBall, "y", 1000, ValueAnimator.INFINITE, ValueAnimator.REVERSE,
-                interpolator, mStartY, mStartY + mDeltaY);
+        return createAnimator(view.newBall, "y", 1000, ValueAnimator.INFINITE,
+                ValueAnimator.REVERSE, interpolator, mStartY, mStartY + mDeltaY);
     }
 
     public ValueAnimator createObjectAnimatorForInt(Object object,String propertyName,
@@ -140,29 +140,40 @@
         bounceAnimator.setRepeatCount(ValueAnimator.INFINITE);
         bounceAnimator.setInterpolator(new AccelerateInterpolator());
         bounceAnimator.setRepeatMode(ValueAnimator.REVERSE);
-        view.bounceAnimator = bounceAnimator;
+        view.bounceYAnimator = bounceAnimator;
         view.startColorAnimator();
         view.animateBall();
     }
 
     public void startAnimation(ValueAnimator valueAnimator){
-        view.bounceAnimator = valueAnimator;
+        view.bounceYAnimator = valueAnimator;
+        view.startColorAnimator();
+        view.animateBall();
+    }
+
+    public void startAnimation(Animator animator){
+        view.bounceYAnimator = (ValueAnimator)animator;
         view.startColorAnimator();
         view.animateBall();
     }
 
     public void startAnimation(ObjectAnimator bounceAnimator) {
-        view.bounceAnimator = bounceAnimator;
+        view.bounceYAnimator = bounceAnimator;
         view.startColorAnimator();
         view.animateBall();
     }
 
     public void startAnimation(ObjectAnimator bounceAnimator, ObjectAnimator colorAnimator) {
-        view.bounceAnimator = bounceAnimator;
+        view.bounceYAnimator = bounceAnimator;
         view.startColorAnimator(colorAnimator);
         view.animateBall();
     }
 
+    public void startAnimatorSet(AnimatorSet set){
+        view.startColorAnimator();
+        view.animateBall(set);
+    }
+
     public void startColorAnimation(ValueAnimator colorAnimator){
         view.startColorAnimator(colorAnimator);
     }
@@ -173,7 +184,8 @@
         public ShapeHolder newBall = null;
         public final ArrayList<ShapeHolder> balls = new ArrayList<ShapeHolder>();
         AnimatorSet animation = null;
-        public ValueAnimator bounceAnimator;
+        public ValueAnimator bounceYAnimator;
+        public ValueAnimator bounceXAnimator;
         public ValueAnimator colorAnimator;
 
         public AnimationView(Context context) {
@@ -201,10 +213,8 @@
         }
 
         public void animateBall() {
-            float startY = mStartY;
-            float endY = startY + mDeltaY;
             AnimatorSet bouncer = new AnimatorSet();
-            bouncer.play(bounceAnimator);
+            bouncer.play(bounceYAnimator);
             // Fading animation - remove the ball when the animation is done
             ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);
             fadeAnim.setDuration(250);
@@ -221,6 +231,10 @@
             animatorSet.start();
         }
 
+        public void animateBall(AnimatorSet set) {
+            set.start();
+        }
+
         private ShapeHolder addBall(float x, float y) {
             OvalShape circle = new OvalShape();
             circle.resize(x, y);
@@ -254,3 +268,4 @@
         }
     }
 }
+
diff --git a/tests/tests/animation/src/android/animation/cts/AnimatorSetTest.java b/tests/tests/animation/src/android/animation/cts/AnimatorSetTest.java
new file mode 100644
index 0000000..35a0b4c
--- /dev/null
+++ b/tests/tests/animation/src/android/animation/cts/AnimatorSetTest.java
@@ -0,0 +1,161 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.animation.cts;
+
+import java.util.ArrayList;
+
+import android.animation.Animator;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
+import android.animation.TimeInterpolator;
+import android.animation.ValueAnimator;
+import android.test.ActivityInstrumentationTestCase2;
+import android.view.animation.AccelerateDecelerateInterpolator;
+import android.view.animation.AccelerateInterpolator;
+
+public class AnimatorSetTest extends
+        ActivityInstrumentationTestCase2<AnimationActivity> {
+    private AnimationActivity mActivity;
+    private AnimatorSet mAnimatorSet;
+    private long mDuration = 1000;
+    private Object object;
+    private ObjectAnimator yAnimator;
+    private ObjectAnimator xAnimator;
+
+    public AnimatorSetTest() {
+        super(AnimationActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        setActivityInitialTouchMode(false);
+        mActivity = getActivity();
+        object = mActivity.view.newBall;
+        yAnimator = getYAnimator(object);
+        xAnimator = getXAnimator(object);
+    }
+
+     public void testPlaySequentially() throws Throwable {
+         Animator[] animatorArray = {xAnimator, yAnimator};
+
+         mAnimatorSet = new AnimatorSet();
+         mAnimatorSet.playSequentially(animatorArray);
+
+         assertFalse(mAnimatorSet.isRunning());
+         startAnimation(mAnimatorSet);
+         Thread.sleep(100);
+         assertTrue(mAnimatorSet.isRunning());
+    }
+
+    public void testPlayTogether() throws Throwable {
+        xAnimator.setRepeatCount(ValueAnimator.INFINITE);
+        Animator[] animatorArray = {xAnimator, yAnimator};
+
+        mAnimatorSet = new AnimatorSet();
+        mAnimatorSet.playTogether(animatorArray);
+
+        assertFalse(mAnimatorSet.isRunning());
+        startAnimation(mAnimatorSet);
+        Thread.sleep(100);
+        assertTrue(mAnimatorSet.isRunning());
+   }
+
+    public void testDuration() throws Throwable {
+        xAnimator.setRepeatCount(ValueAnimator.INFINITE);
+        Animator[] animatorArray = { xAnimator, yAnimator };
+
+        mAnimatorSet = new AnimatorSet();
+        mAnimatorSet.playTogether(animatorArray);
+        mAnimatorSet.setDuration(1000);
+
+        startAnimation(mAnimatorSet);
+        Thread.sleep(100);
+        assertEquals(mAnimatorSet.getDuration(), 1000);
+    }
+
+    public void testStartDelay() throws Throwable {
+        xAnimator.setRepeatCount(ValueAnimator.INFINITE);
+        Animator[] animatorArray = { xAnimator, yAnimator };
+
+        mAnimatorSet = new AnimatorSet();
+        mAnimatorSet.playTogether(animatorArray);
+        mAnimatorSet.setStartDelay(10);
+
+        startAnimation(mAnimatorSet);
+        Thread.sleep(100);
+        assertEquals(mAnimatorSet.getStartDelay(), 10);
+    }
+
+    public void testgetChildAnimations() throws Throwable {
+        Animator[] animatorArray = { xAnimator, yAnimator };
+
+        mAnimatorSet = new AnimatorSet();
+        ArrayList<Animator> childAnimations = mAnimatorSet.getChildAnimations();
+        assertEquals(0, mAnimatorSet.getChildAnimations().size());
+        mAnimatorSet.playSequentially(animatorArray);
+        assertEquals(2, mAnimatorSet.getChildAnimations().size());
+    }
+
+    public void testSetInterpolator() throws Throwable {
+        xAnimator.setRepeatCount(ValueAnimator.INFINITE);
+        Animator[] animatorArray = {xAnimator, yAnimator};
+        TimeInterpolator interpolator = new AccelerateDecelerateInterpolator();
+        mAnimatorSet = new AnimatorSet();
+        mAnimatorSet.playTogether(animatorArray);
+        mAnimatorSet.setInterpolator(interpolator);
+
+        assertFalse(mAnimatorSet.isRunning());
+        startAnimation(mAnimatorSet);
+        Thread.sleep(100);
+
+        ArrayList<Animator> animatorList = mAnimatorSet.getChildAnimations();
+        assertEquals(interpolator, ((ObjectAnimator)animatorList.get(0)).getInterpolator());
+        assertEquals(interpolator, ((ObjectAnimator)animatorList.get(1)).getInterpolator());
+    }
+
+    public ObjectAnimator getXAnimator(Object object) {
+        String propertyX = "x";
+        float startX = mActivity.mStartX;
+        float endX = mActivity.mStartX + mActivity.mDeltaX;
+        ObjectAnimator xAnimator = ObjectAnimator.ofFloat(object, propertyX, startX, endX);
+        xAnimator.setDuration(mDuration);
+        xAnimator.setRepeatCount(ValueAnimator.INFINITE);
+        xAnimator.setInterpolator(new AccelerateInterpolator());
+        xAnimator.setRepeatMode(ValueAnimator.REVERSE);
+        return xAnimator;
+    }
+
+    public ObjectAnimator getYAnimator(Object object) {
+         String property = "y";
+         float startY = mActivity.mStartY;
+         float endY = mActivity.mStartY + mActivity.mDeltaY;
+         ObjectAnimator yAnimator = ObjectAnimator.ofFloat(object, property, startY, endY);
+         yAnimator.setDuration(mDuration);
+         yAnimator.setRepeatCount(2);
+         yAnimator.setInterpolator(new AccelerateInterpolator());
+         yAnimator.setRepeatMode(ValueAnimator.REVERSE);
+        return yAnimator;
+    }
+
+    private void startAnimation(final AnimatorSet animatorSet) throws Throwable {
+        this.runTestOnUiThread(new Runnable() {
+            public void run() {
+                mActivity.startAnimatorSet(animatorSet);
+            }
+        });
+    }
+}
diff --git a/tests/tests/animation/src/android/animation/cts/AnimatorTest.java b/tests/tests/animation/src/android/animation/cts/AnimatorTest.java
new file mode 100644
index 0000000..f460c14
--- /dev/null
+++ b/tests/tests/animation/src/android/animation/cts/AnimatorTest.java
@@ -0,0 +1,208 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.animation.cts;
+
+import android.animation.Animator;
+import android.animation.ObjectAnimator;
+import android.animation.ValueAnimator;
+import android.test.ActivityInstrumentationTestCase2;
+import android.view.animation.AccelerateInterpolator;
+
+import java.util.List;
+
+public class AnimatorTest extends ActivityInstrumentationTestCase2<AnimationActivity> {
+    private AnimationActivity mActivity;
+    private Animator mAnimator;
+    private long mDuration = 1000;
+    public AnimatorTest() {
+        super(AnimationActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        setActivityInitialTouchMode(false);
+        mActivity = getActivity();
+        mAnimator = mActivity.createAnimatorWithDuration(mDuration);
+    }
+
+    public void testConstructor() {
+        mAnimator = new ValueAnimator();
+        assertNotNull(mAnimator);
+    }
+
+    public void testClone() {
+        Animator animatorClone = mAnimator.clone();
+        assertEquals(mAnimator.getDuration(), animatorClone.getDuration());
+    }
+
+    public void testStartDelay() {
+        long startDelay = 1000;
+        mAnimator.setStartDelay(startDelay);
+        assertEquals(startDelay, mAnimator.getStartDelay());
+    }
+
+    public void testStart() {
+        mAnimator.start();
+        assertTrue(mAnimator.isRunning());
+        assertTrue(mAnimator.isStarted());
+    }
+
+    public void testGetDuration() throws Throwable {
+        final long duration = 2000;
+        Animator animatorLocal = mActivity.createAnimatorWithDuration(duration);
+        startAnimation(animatorLocal);
+        assertEquals(duration, animatorLocal.getDuration());
+    }
+
+    public void testIsRunning() throws Throwable {
+        assertFalse(mAnimator.isRunning());
+        startAnimation(mAnimator);
+        assertTrue(mAnimator.isRunning());
+    }
+
+    public void testIsStarted() throws Throwable {
+        assertFalse(mAnimator.isRunning());
+        assertFalse(mAnimator.isStarted());
+        long startDelay = 10000;
+        mAnimator.setStartDelay(startDelay);
+        startAnimation(mAnimator);
+        assertFalse(mAnimator.isRunning());
+        assertTrue(mAnimator.isStarted());
+    }
+
+    public void testSetInterpolator() throws Throwable {
+        AccelerateInterpolator interpolator = new AccelerateInterpolator();
+        ValueAnimator mValueAnimator = mActivity.createAnimatorWithInterpolator(interpolator);
+        startAnimation(mValueAnimator);
+        assertTrue(interpolator.equals(mValueAnimator.getInterpolator()));
+    }
+
+    public void testCancel() throws Throwable {
+        startAnimation(mAnimator);
+        Thread.sleep(100);
+        mAnimator.cancel();
+        assertFalse(mAnimator.isRunning());
+    }
+
+    public void testEnd() throws Throwable {
+        Object object = mActivity.view.newBall;
+        String property = "y";
+        float startY = mActivity.mStartY;
+        float endY = mActivity.mStartY + mActivity.mDeltaY;
+        Animator animator = ObjectAnimator.ofFloat(object, property, startY, endY);
+        animator.setDuration(mDuration);
+        ((ObjectAnimator)animator).setRepeatCount(ValueAnimator.INFINITE);
+        animator.setInterpolator(new AccelerateInterpolator());
+        ((ObjectAnimator)animator).setRepeatMode(ValueAnimator.REVERSE);
+        startAnimation(animator);
+        Thread.sleep(100);
+        endAnimation(animator);
+        float y = mActivity.view.newBall.getY();
+        assertEquals(y, endY);
+    }
+
+    public void testSetListener() throws Throwable {
+        List<Animator.AnimatorListener> listListeners = mAnimator.getListeners();
+        assertNull(listListeners);
+        MyListener listener = new MyListener();
+        assertFalse(listener.mStart);
+        assertFalse(listener.mEnd);
+        assertEquals(listener.mRepeat, 0);
+        mAnimator.addListener(listener);
+        mAnimator.setDuration(100l);
+        startAnimation(mAnimator);
+        Thread.sleep(200);
+
+        assertTrue(listener.mStart);
+        assertFalse(listener.mEnd);
+        assertTrue(listener.mRepeat >= 0);
+
+        mAnimator.cancel();
+        assertTrue(listener.mCancel);
+
+        mAnimator.end();
+        assertTrue(listener.mEnd);
+    }
+
+    public void testRemoveListener() throws Throwable {
+        List<Animator.AnimatorListener> listListenersOne = mAnimator.getListeners();
+        assertNull(listListenersOne);
+        MyListener listener = new MyListener();
+        mAnimator.addListener(listener);
+
+        List<Animator.AnimatorListener> listListenersTwo = mAnimator.getListeners();
+        assertEquals(listListenersTwo.size(), 1);
+        mAnimator.removeListener(listener);
+
+        List<Animator.AnimatorListener> listListenersThree = mAnimator.getListeners();
+        assertNull(listListenersThree);
+    }
+
+    public void testRemoveAllListenerers() throws Throwable {
+        MyListener listener1 = new MyListener();
+        MyListener listener2 = new MyListener();
+        mAnimator.addListener(listener1);
+        mAnimator.addListener(listener2);
+
+        List<Animator.AnimatorListener> listListenersOne = mAnimator.getListeners();
+        assertEquals(listListenersOne.size(), 2);
+        mAnimator.removeAllListeners();
+
+        List<Animator.AnimatorListener> listListenersTwo = mAnimator.getListeners();
+        assertNull(listListenersTwo);
+    }
+
+    class MyListener implements Animator.AnimatorListener{
+        boolean mStart = false;
+        boolean mEnd = false;
+        boolean mCancel = false;
+        int mRepeat = 0;
+
+        public void onAnimationCancel(Animator animation) {
+            mCancel = true;
+        }
+
+        public void onAnimationEnd(Animator animation) {
+            mEnd = true;
+        }
+
+        public void onAnimationRepeat(Animator animation) {
+            mRepeat++;
+        }
+
+        public void onAnimationStart(Animator animation) {
+            mStart = true;
+        }
+    }
+    private void startAnimation(final Animator animator) throws Throwable {
+        this.runTestOnUiThread(new Runnable() {
+            public void run() {
+                mActivity.startAnimation(animator);
+            }
+        });
+    }
+
+    private void endAnimation(final Animator animator) throws Throwable {
+        Thread animationRunnable = new Thread() {
+            public void run() {
+                animator.end();
+            }
+        };
+        this.runTestOnUiThread(animationRunnable);
+    }
+}
+
diff --git a/tests/tests/animation/src/android/animation/cts/ArgbEvaluatorTest.java b/tests/tests/animation/src/android/animation/cts/ArgbEvaluatorTest.java
index 33c3716..4fee87d 100644
--- a/tests/tests/animation/src/android/animation/cts/ArgbEvaluatorTest.java
+++ b/tests/tests/animation/src/android/animation/cts/ArgbEvaluatorTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 The Android Open Source Project
+ * Copyright (C) 2012 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/tests/tests/animation/src/android/animation/cts/FloatEvaluatorTest.java b/tests/tests/animation/src/android/animation/cts/FloatEvaluatorTest.java
index 8cc1ffe..ebc7f58 100644
--- a/tests/tests/animation/src/android/animation/cts/FloatEvaluatorTest.java
+++ b/tests/tests/animation/src/android/animation/cts/FloatEvaluatorTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 The Android Open Source Project
+ * Copyright (C) 2012 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/tests/tests/animation/src/android/animation/cts/IntEvaluatorTest.java b/tests/tests/animation/src/android/animation/cts/IntEvaluatorTest.java
index 11df20c..2b95993 100644
--- a/tests/tests/animation/src/android/animation/cts/IntEvaluatorTest.java
+++ b/tests/tests/animation/src/android/animation/cts/IntEvaluatorTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 The Android Open Source Project
+ * Copyright (C) 2012 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/tests/tests/animation/src/android/animation/cts/KeyframeTest.java b/tests/tests/animation/src/android/animation/cts/KeyframeTest.java
new file mode 100644
index 0000000..7366920
--- /dev/null
+++ b/tests/tests/animation/src/android/animation/cts/KeyframeTest.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.animation.cts;
+
+import android.animation.Keyframe;
+import android.animation.TimeInterpolator;
+import android.test.InstrumentationTestCase;
+import android.view.animation.AccelerateInterpolator;
+
+public class KeyframeTest extends InstrumentationTestCase {
+    public void testGetFraction() {
+        Keyframe keyFrame = Keyframe.ofInt(0.0f);
+        float fraction = keyFrame.getFraction();
+        assertTrue(fraction == 0.0f);
+    }
+
+    public void testSetFraction() {
+        Keyframe keyFrame = Keyframe.ofInt(0.0f);
+        keyFrame.setFraction(0.5f);
+        float fraction = keyFrame.getFraction();
+        assertTrue(fraction == 0.5f);
+    }
+
+    public void testOfFloat() {
+        Keyframe keyFrame = Keyframe.ofFloat(0.0f);
+        float fraction = keyFrame.getFraction();
+        assertEquals(fraction, 0.0f);
+    }
+
+    public void testOfIntValue() {
+        Keyframe keyFrame = Keyframe.ofInt(0.0f,10);
+        assertTrue(keyFrame.hasValue());
+        assertEquals(keyFrame.getValue(),10);
+    }
+
+    public void testOfFloatValue() {
+        Keyframe keyFrame = Keyframe.ofFloat(0.0f,9.0f);
+        assertTrue(keyFrame.hasValue());
+        assertEquals(keyFrame.getValue(),9.0f);
+    }
+
+    public void testOfObject() {
+        Keyframe keyFrame = Keyframe.ofObject(0.0f);
+        float fraction = keyFrame.getFraction();
+        assertEquals(fraction, 0.0f);
+    }
+
+    public void testOfObjectValue() {
+        String value = "test";
+        Keyframe keyFrame = Keyframe.ofObject(0.0f, value);
+        assertTrue(keyFrame.hasValue());
+        assertEquals(keyFrame.getValue(), value);
+    }
+
+    public void testGetType() {
+        Keyframe keyFrame = Keyframe.ofFloat(0.0f);
+        Class typeClass = keyFrame.getType();
+        String typeName = typeClass.getName();
+        assertEquals(typeName, "float");
+    }
+
+    public void testClone() {
+        Keyframe keyFrame = Keyframe.ofFloat(0.0f);
+        Keyframe clone = keyFrame.clone();
+        assertEquals(keyFrame.getFraction(), clone.getFraction());
+    }
+
+    public void testSetInterpolator() {
+        Keyframe keyFrame = Keyframe.ofFloat(0.0f);
+        TimeInterpolator interpolator = new AccelerateInterpolator();
+        keyFrame.setInterpolator(interpolator);
+        assertEquals(interpolator, keyFrame.getInterpolator());
+    }
+
+    public void testSetValue() {
+        Keyframe keyFrame = Keyframe.ofFloat(0.0f);
+        Float value = new Float(100.0f);
+        keyFrame.setValue(value);
+        Float actualValue = (Float)keyFrame.getValue();
+        assertEquals(value, actualValue);
+    }
+}
+
diff --git a/tests/tests/animation/src/android/animation/cts/LayoutAnimationActivity.java b/tests/tests/animation/src/android/animation/cts/LayoutAnimationActivity.java
new file mode 100644
index 0000000..9b2eaff
--- /dev/null
+++ b/tests/tests/animation/src/android/animation/cts/LayoutAnimationActivity.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.animation.cts;
+
+import com.android.cts.animation.R;
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.LinearLayout;
+
+public class LayoutAnimationActivity extends Activity {
+    private int mCount = 1;
+    Button mButton;
+    private Button mLastButton;
+    @Override
+    public void onCreate(Bundle bundle){
+        super.onCreate(bundle);
+        setContentView(R.layout.animation_two);
+        mButton = (Button) findViewById(R.id.button1);
+
+        mButton.setOnClickListener(new OnClickListener(){
+            public void onClick(View v) {
+                Button newButton = new Button(LayoutAnimationActivity.this);
+                newButton.setText("Button:" + LayoutAnimationActivity.this.mCount);
+                LinearLayout layout = (LinearLayout) findViewById(R.id.container);
+                layout.addView(newButton);
+                LayoutAnimationActivity.this.mCount++;
+                mLastButton = newButton;
+            }
+        });
+    }
+
+    public Button getLastButton() {
+        return mLastButton;
+    }
+}
diff --git a/tests/tests/animation/src/android/animation/cts/LayoutAnimationTest.java b/tests/tests/animation/src/android/animation/cts/LayoutAnimationTest.java
new file mode 100644
index 0000000..f9918a8
--- /dev/null
+++ b/tests/tests/animation/src/android/animation/cts/LayoutAnimationTest.java
@@ -0,0 +1,259 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.animation.cts;
+
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+import com.android.cts.animation.R;
+
+import android.animation.Animator;
+import android.animation.LayoutTransition;
+import android.animation.LayoutTransition.TransitionListener;
+import android.animation.ObjectAnimator;
+import android.animation.PropertyValuesHolder;
+import android.animation.TimeInterpolator;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.TouchUtils;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.animation.AccelerateInterpolator;
+import android.widget.Button;
+import android.widget.LinearLayout;
+
+public class LayoutAnimationTest extends
+        ActivityInstrumentationTestCase2<LayoutAnimationActivity> {
+    private LayoutAnimationActivity mActivity;
+    private MyLayoutTransition mLayoutTransition;
+    private LinearLayout mView;
+    private Button mButton;
+    public LayoutAnimationTest() {
+        super(LayoutAnimationActivity.class);
+    }
+
+    public void setUp() throws Exception {
+        super.setUp();
+        setActivityInitialTouchMode(true);
+        mActivity = getActivity();
+        mView = (LinearLayout) mActivity.findViewById(R.id.container);
+        mButton = (Button)mActivity.findViewById(R.id.button1);
+        mLayoutTransition = new MyLayoutTransition();
+    }
+
+    public void testAddTransitionListener() throws Throwable {
+        MyTransitionListener listener = new MyTransitionListener();
+        assertNull(mLayoutTransition.getTransitionListeners());
+        mLayoutTransition.addTransitionListener(listener);
+
+        List<TransitionListener> layoutTransitionList = mLayoutTransition.getTransitionListeners();
+        TransitionListener actualListener = layoutTransitionList.get(0);
+        assertEquals(1, layoutTransitionList.size());
+        assertEquals(listener, actualListener);
+    }
+
+    public void testIsRunning() {
+        setDefaultTransition();
+        assertFalse(mLayoutTransition.isRunning());
+        TouchUtils.clickView(this, mButton);
+        assertTrue(mLayoutTransition.isRunning());
+    }
+
+    public void testIsChangingLayout() {
+        long duration = 2000l;
+        mView.setLayoutTransition(mLayoutTransition);
+        mLayoutTransition.setDuration(duration);
+        mLayoutTransition.setInterpolator(LayoutTransition.CHANGE_APPEARING,
+                new AccelerateInterpolator());
+
+        assertFalse(mLayoutTransition.isChangingLayout());
+        TouchUtils.clickView(this, mButton);
+        assertTrue(mLayoutTransition.isChangingLayout());
+    }
+
+    public void testSetDuration() {
+        long duration = 1000l;
+        mLayoutTransition.setDuration(duration);
+
+        assertEquals(duration, mLayoutTransition.getDuration(LayoutTransition.APPEARING));
+        assertEquals(duration, mLayoutTransition.getDuration(LayoutTransition.CHANGE_APPEARING));
+        assertEquals(duration,
+                     mLayoutTransition.getDuration(LayoutTransition.CHANGE_DISAPPEARING));
+        assertEquals(duration, mLayoutTransition.getDuration(LayoutTransition.DISAPPEARING));
+    }
+
+    public void testSetDurationForTransitionType() {
+        long duration = 1000l;
+        mLayoutTransition.setDuration(LayoutTransition.APPEARING, duration);
+        assertEquals(duration, mLayoutTransition.getDuration(LayoutTransition.APPEARING));
+    }
+
+    public void testSetInterpolator() {
+        TimeInterpolator interpolator = new AccelerateInterpolator();
+        mLayoutTransition.setInterpolator(LayoutTransition.APPEARING, interpolator);
+        assertEquals(interpolator, mLayoutTransition.getInterpolator(
+                LayoutTransition.APPEARING));
+    }
+
+    public void testSetAnimator() {
+        float startAlpha = 0.0f;
+        float endAlpha = 0.5f;
+        PropertyValuesHolder pvhAlpha = PropertyValuesHolder.ofFloat("alpha", startAlpha,
+                endAlpha);
+        ObjectAnimator appearingAnimator =  (ObjectAnimator) ObjectAnimator.ofPropertyValuesHolder(
+                (Object)null, pvhAlpha);
+        appearingAnimator.setInterpolator(new AccelerateInterpolator());
+        mLayoutTransition.setAnimator(LayoutTransition.APPEARING, appearingAnimator);
+        assertEquals(appearingAnimator, mLayoutTransition.getAnimator(LayoutTransition.APPEARING));
+    }
+
+    public void testAnimationWithAnimator() throws Throwable {
+        MyTransitionListener listener = new MyTransitionListener();
+        mLayoutTransition.addTransitionListener(listener);
+        mLayoutTransition.setAnimateParentHierarchy(false);
+        long duration = 2000;
+        mView.setLayoutTransition(mLayoutTransition);
+        mLayoutTransition.setDuration(duration);
+        float startAlpha = 0.0f;
+        float endAlpha = 0.5f;
+        PropertyValuesHolder pvhAlpha = PropertyValuesHolder.ofFloat("alpha", startAlpha,
+                endAlpha);
+        ObjectAnimator appearingAnimator =  (ObjectAnimator) ObjectAnimator.ofPropertyValuesHolder(
+                (Object)null, pvhAlpha);
+        appearingAnimator.setInterpolator(new AccelerateInterpolator());
+
+        mLayoutTransition.setAnimator(LayoutTransition.APPEARING, appearingAnimator);
+
+        List<Float> alphaList = new LinkedList<Float>();
+        TouchUtils.clickView(this, mButton);
+        while(listener.mTransition) {
+            float alpha = mActivity.getLastButton().getAlpha();
+            alphaList.add(alpha);
+            Thread.sleep(200);
+        }
+        Iterator<Float> iterator = alphaList.iterator();
+        float lastValue = 0.0f;
+        while(iterator.hasNext()){
+            float alphaValue = iterator.next();
+            assertTrue(alphaValue >= lastValue);
+            assertTrue(alphaValue >= startAlpha);
+            assertTrue(alphaValue <= endAlpha);
+            lastValue = alphaValue;
+        }
+    }
+
+    public void testStartDelay() {
+        long delay = 100l;
+        int transitionType = LayoutTransition.APPEARING;
+        mLayoutTransition.setStartDelay(transitionType, delay);
+        assertEquals(delay, mLayoutTransition.getStartDelay(transitionType));
+    }
+
+    public void testSetStagger() {
+        long duration = 100;
+        int transitionType = LayoutTransition.CHANGE_APPEARING;
+        mLayoutTransition.setStagger(transitionType, duration);
+        assertEquals(duration, mLayoutTransition.getStagger(transitionType));
+    }
+
+    private void setDefaultTransition() {
+        long duration = 1000;
+        mView.setLayoutTransition(mLayoutTransition);
+        mLayoutTransition.setDuration(duration);
+        mLayoutTransition.setInterpolator(LayoutTransition.APPEARING,
+                new AccelerateInterpolator());
+    }
+
+    class MyTransitionListener implements LayoutTransition.TransitionListener {
+        ViewGroup mContainer;
+        View mView;
+        int mTransitionType;
+        boolean mTransition = false;
+        public void endTransition(LayoutTransition transition,
+                ViewGroup container, View view, int transitionType) {
+            this.mContainer = container;
+            this.mView = view;
+            this.mTransitionType = transitionType;
+            mTransition = false;
+        }
+
+        public void startTransition(LayoutTransition transition,
+                ViewGroup container, View view, int transitionType) {
+            this.mContainer = container;
+            this.mView = view;
+            this.mTransitionType = transitionType;
+            mTransition = true;
+        }
+    }
+
+    class MyLayoutTransition extends LayoutTransition {
+        boolean mAddChild = false;
+        boolean mHideChild = false;
+        boolean mRemoveChild = false;
+        boolean mShowChild = false;
+        boolean mSetAnimator = false;
+        boolean mRemoveListener = false;
+        boolean isChangingLayout = false;
+
+        @Override
+        public void addChild(ViewGroup parent, View child) {
+            super.addChild(parent, child);
+            mAddChild = true;
+        }
+
+        @Override
+        public void hideChild(ViewGroup parent, View child) {
+            super.hideChild(parent, child);
+            mHideChild = true;
+        }
+
+        @Override
+        public boolean isChangingLayout() {
+            return super.isChangingLayout();
+        }
+
+        @Override
+        public boolean isRunning() {
+            isChangingLayout =  true;
+            return super.isRunning();
+        }
+
+        @Override
+        public void removeChild(ViewGroup parent, View child) {
+            super.removeChild(parent, child);
+            mRemoveChild = true;
+        }
+
+        @Override
+        public void removeTransitionListener(TransitionListener listener) {
+            super.removeTransitionListener(listener);
+            mRemoveListener = true;
+        }
+
+        @Override
+        public void setAnimator(int transitionType, Animator animator) {
+            super.setAnimator(transitionType, animator);
+            mSetAnimator = true;
+        }
+
+        @Override
+        public void showChild(ViewGroup parent, View child) {
+            super.showChild(parent, child);
+            mShowChild = true;
+        }
+    }
+}
+
diff --git a/tests/tests/animation/src/android/animation/cts/ObjectAnimatorTest.java b/tests/tests/animation/src/android/animation/cts/ObjectAnimatorTest.java
index be5c1d4..c1cbfcc 100644
--- a/tests/tests/animation/src/android/animation/cts/ObjectAnimatorTest.java
+++ b/tests/tests/animation/src/android/animation/cts/ObjectAnimatorTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 The Android Open Source Project
+ * Copyright (C) 2012 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/tests/tests/animation/src/android/animation/cts/PropertyValuesHolderTest.java b/tests/tests/animation/src/android/animation/cts/PropertyValuesHolderTest.java
new file mode 100644
index 0000000..26db933
--- /dev/null
+++ b/tests/tests/animation/src/android/animation/cts/PropertyValuesHolderTest.java
@@ -0,0 +1,316 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.animation.cts;
+
+import android.animation.Animator;
+import android.animation.ArgbEvaluator;
+import android.animation.ObjectAnimator;
+import android.animation.PropertyValuesHolder;
+import android.animation.ValueAnimator;
+import android.test.ActivityInstrumentationTestCase2;
+import android.util.Property;
+import android.view.View;
+import android.view.animation.AccelerateInterpolator;
+
+public class PropertyValuesHolderTest extends
+        ActivityInstrumentationTestCase2<AnimationActivity> {
+    private AnimationActivity mActivity;
+    private Animator mAnimator;
+    private long mDuration = 1000;
+    private float mStartY;
+    private float mEndY;
+    private Object mObject;
+    private String mProperty;
+
+    public PropertyValuesHolderTest() {
+        super(AnimationActivity.class);
+    }
+
+    public void setUp() throws Exception {
+         super.setUp();
+         setActivityInitialTouchMode(false);
+         mActivity = getActivity();
+         mAnimator = mActivity.createAnimatorWithDuration(mDuration);
+         mProperty = "y";
+         mStartY = mActivity.mStartY;
+         mEndY = mActivity.mStartY + mActivity.mDeltaY;
+         mObject = mActivity.view.newBall;
+    }
+
+    public void testGetPropertyName() {
+        float[] values = {mStartY, mEndY};
+        PropertyValuesHolder pVHolder = PropertyValuesHolder.ofFloat(mProperty, values);
+        assertEquals(mProperty, pVHolder.getPropertyName());
+    }
+
+    public void testSetPropertyName() {
+        float[] values = {mStartY, mEndY};
+        PropertyValuesHolder pVHolder = PropertyValuesHolder.ofFloat("", values);
+        pVHolder.setPropertyName(mProperty);
+        assertEquals(mProperty, pVHolder.getPropertyName());
+    }
+
+    public void testClone() {
+        float[] values = {mStartY, mEndY};
+        PropertyValuesHolder pVHolder = PropertyValuesHolder.ofFloat(mProperty, values);
+        PropertyValuesHolder cloneHolder = pVHolder.clone();
+        assertEquals(pVHolder.getPropertyName(), cloneHolder.getPropertyName());
+    }
+
+    public void testSetValues() throws Throwable {
+        float[] dummyValues = {100, 150};
+        float[] values = {mStartY, mEndY};
+        PropertyValuesHolder pVHolder = PropertyValuesHolder.ofFloat(mProperty, dummyValues);
+        pVHolder.setFloatValues(values);
+
+        ObjectAnimator objAnimator = ObjectAnimator.ofPropertyValuesHolder(mObject,pVHolder);
+        assertTrue(objAnimator != null);
+        setAnimatorProperties(objAnimator);
+
+        startAnimation(objAnimator);
+        assertTrue(objAnimator != null);
+        float[] yArray = getYPosition();
+        assertResults(yArray, mStartY, mEndY);
+    }
+
+    public void testOffloat() throws Throwable {
+        float[] values = {mStartY, mEndY};
+        PropertyValuesHolder pVHolder = PropertyValuesHolder.ofFloat(mProperty, values);
+        assertNotNull(pVHolder);
+        ObjectAnimator objAnimator = ObjectAnimator.ofPropertyValuesHolder(mObject,pVHolder);
+        assertTrue(objAnimator != null);
+
+        setAnimatorProperties(objAnimator);
+        startAnimation(objAnimator);
+        assertTrue(objAnimator != null);
+        float[] yArray = getYPosition();
+        assertResults(yArray, mStartY, mEndY);
+    }
+
+    public void testOfFloat_Property() throws Throwable {
+        float[] values = {mStartY, mEndY};
+        ShapeHolderYProperty property=new ShapeHolderYProperty(ShapeHolder.class.getClass(),"y");
+        property.setObject(mObject);
+        PropertyValuesHolder pVHolder = PropertyValuesHolder.ofFloat(property, values);
+        assertNotNull(pVHolder);
+        ObjectAnimator objAnimator = ObjectAnimator.ofPropertyValuesHolder(mObject,pVHolder);
+        assertTrue(objAnimator != null);
+
+        setAnimatorProperties(objAnimator);
+        startAnimation(objAnimator);
+        assertTrue(objAnimator != null);
+        float[] yArray = getYPosition();
+        assertResults(yArray, mStartY, mEndY);
+    }
+
+    public void testOfInt() throws Throwable {
+        int start = 0;
+        int end = 10;
+        int[] values = {start, end};
+        PropertyValuesHolder pVHolder = PropertyValuesHolder.ofInt(mProperty, values);
+        assertNotNull(pVHolder);
+        final ObjectAnimator objAnimator = ObjectAnimator.ofPropertyValuesHolder(mObject,pVHolder);
+        assertTrue(objAnimator != null);
+        setAnimatorProperties(objAnimator);
+        this.runTestOnUiThread(new Runnable(){
+            public void run() {
+                objAnimator.start();
+            }
+        });
+        Thread.sleep(1000);
+        assertTrue(objAnimator.isRunning());
+        Integer animatedValue = (Integer) objAnimator.getAnimatedValue();
+        assertTrue(animatedValue >= start);
+        assertTrue(animatedValue <= end);
+    }
+
+    public void testOfInt_Property() throws Throwable{
+        Object object = mActivity.view;
+        String property = "backgroundColor";
+        int startColor = mActivity.view.RED;
+        int endColor = mActivity.view.BLUE;
+        int values[] = {startColor, endColor};
+
+        ViewColorProperty colorProperty=new ViewColorProperty(Integer.class.getClass(),property);
+        colorProperty.setObject(object);
+        PropertyValuesHolder pVHolder = PropertyValuesHolder.ofInt(colorProperty, values);
+        assertNotNull(pVHolder);
+
+        ObjectAnimator colorAnimator = ObjectAnimator.ofPropertyValuesHolder(object,pVHolder);
+        colorAnimator.setDuration(1000);
+        colorAnimator.setEvaluator(new ArgbEvaluator());
+        colorAnimator.setRepeatCount(ValueAnimator.INFINITE);
+        colorAnimator.setRepeatMode(ValueAnimator.REVERSE);
+
+        ObjectAnimator objectAnimator = (ObjectAnimator) mActivity.createAnimatorWithDuration(
+            mDuration);
+        startAnimation(objectAnimator, colorAnimator);
+        Thread.sleep(1000);
+        Integer i = (Integer) colorAnimator.getAnimatedValue();
+        //We are going from less negative value to a more negative value
+        assertTrue(i.intValue() <= startColor);
+        assertTrue(endColor <= i.intValue());
+    }
+
+    public void testSetProperty() throws Throwable {
+        float[] values = {mStartY, mEndY};
+        ShapeHolderYProperty property=new ShapeHolderYProperty(ShapeHolder.class.getClass(),"y");
+        property.setObject(mObject);
+        PropertyValuesHolder pVHolder = PropertyValuesHolder.ofFloat("", values);
+        pVHolder.setProperty(property);
+        ObjectAnimator objAnimator = ObjectAnimator.ofPropertyValuesHolder(mObject,pVHolder);
+        setAnimatorProperties(objAnimator);
+        startAnimation(objAnimator);
+        assertTrue(objAnimator != null);
+        float[] yArray = getYPosition();
+        assertResults(yArray, mStartY, mEndY);
+    }
+
+    class ShapeHolderYProperty extends Property {
+        private ShapeHolder shapeHolder ;
+        private Class type = Float.class.getClass();
+        private String name = "y";
+        @SuppressWarnings("unchecked")
+        public ShapeHolderYProperty(Class type, String name) throws Exception {
+            super(Float.class, name );
+            if(!( type.equals(this.type) || ( name.equals(this.name))) ){
+                throw new Exception("Type or name provided does not match with " +
+                        this.type.getName() + " or " + this.name);
+            }
+        }
+
+        public void setObject(Object object){
+            shapeHolder = (ShapeHolder) object;
+        }
+
+        @Override
+        public Object get(Object object) {
+            return shapeHolder;
+        }
+
+        @Override
+        public String getName() {
+            return "y";
+        }
+
+        @Override
+        public Class getType() {
+            return super.getType();
+        }
+
+        @Override
+        public boolean isReadOnly() {
+            return false;
+        }
+
+        @Override
+        public void set(Object object, Object value) {
+            shapeHolder.setY((Float)value);
+        }
+
+    }
+
+    class ViewColorProperty extends Property {
+        private View view ;
+        private Class type = Integer.class.getClass();
+        private String name = "backgroundColor";
+        @SuppressWarnings("unchecked")
+        public ViewColorProperty(Class type, String name) throws Exception {
+            super(Integer.class, name );
+            if(!( type.equals(this.type) || ( name.equals(this.name))) ){
+                throw new Exception("Type or name provided does not match with " +
+                        this.type.getName() + " or " + this.name);
+            }
+        }
+
+        public void setObject(Object object){
+            view = (View) object;
+        }
+
+        @Override
+        public Object get(Object object) {
+            return view;
+        }
+
+        @Override
+        public String getName() {
+            return name;
+        }
+
+        @Override
+        public Class getType() {
+            return super.getType();
+        }
+
+        @Override
+        public boolean isReadOnly() {
+            return false;
+        }
+
+        @Override
+        public void set(Object object, Object value) {
+            view.setBackgroundColor((Integer)value);
+        }
+    }
+
+    private void setAnimatorProperties(ObjectAnimator objAnimator) {
+        objAnimator.setDuration(mDuration);
+        objAnimator.setRepeatCount(ValueAnimator.INFINITE);
+        objAnimator.setInterpolator(new AccelerateInterpolator());
+        objAnimator.setRepeatMode(ValueAnimator.REVERSE);
+    }
+
+    public float[] getYPosition() throws Throwable{
+        float[] yArray = new float[3];
+        for(int i = 0; i < 3; i++) {
+            float y = mActivity.view.newBall.getY();
+            yArray[i] = y;
+            Thread.sleep(300);
+        }
+        return yArray;
+    }
+
+    public void assertResults(float[] yArray,float startY, float endY) {
+        for(int i = 0; i < 3; i++){
+            float y = yArray[i];
+            assertTrue(y >= startY);
+            assertTrue(y <= endY);
+            if(i < 2) {
+                float yNext = yArray[i+1];
+                assertTrue(y != yNext);
+            }
+        }
+    }
+
+    private void startAnimation(final Animator animator) throws Throwable {
+        this.runTestOnUiThread(new Runnable() {
+            public void run() {
+                mActivity.startAnimation(animator);
+            }
+        });
+    }
+
+    private void startAnimation(final ObjectAnimator mObjectAnimator,
+            final ObjectAnimator colorAnimator) throws Throwable {
+        Thread mAnimationRunnable = new Thread() {
+            public void run() {
+                mActivity.startAnimation(mObjectAnimator, colorAnimator);
+            }
+        };
+        this.runTestOnUiThread(mAnimationRunnable);
+    }
+}
+
diff --git a/tests/tests/animation/src/android/animation/cts/ShapeHolder.java b/tests/tests/animation/src/android/animation/cts/ShapeHolder.java
index f8d5fa6..4723c67 100644
--- a/tests/tests/animation/src/android/animation/cts/ShapeHolder.java
+++ b/tests/tests/animation/src/android/animation/cts/ShapeHolder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 The Android Open Source Project
+ * Copyright (C) 2012 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/tests/tests/animation/src/android/animation/cts/ValueAnimatorTest.java b/tests/tests/animation/src/android/animation/cts/ValueAnimatorTest.java
index a7626bc..1bfe737 100644
--- a/tests/tests/animation/src/android/animation/cts/ValueAnimatorTest.java
+++ b/tests/tests/animation/src/android/animation/cts/ValueAnimatorTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 The Android Open Source Project
+ * Copyright (C) 2012 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,9 +15,6 @@
  */
 package android.animation.cts;
 
-import android.animation.ArgbEvaluator;
-import android.animation.FloatEvaluator;
-import android.animation.IntEvaluator;
 import android.animation.ObjectAnimator;
 import android.animation.ValueAnimator;
 import android.test.ActivityInstrumentationTestCase2;
@@ -51,7 +48,7 @@
     public void testIsRunning() throws Throwable {
         assertFalse(mValueAnimator.isRunning());
         startAnimation(mValueAnimator);
-        ValueAnimator valueAnimatorReturned = mActivity.view.bounceAnimator;
+        ValueAnimator valueAnimatorReturned = mActivity.view.bounceYAnimator;
         assertTrue(valueAnimatorReturned.isRunning());
     }
 
@@ -66,7 +63,8 @@
     }
 
     public void testRepeatMode() throws Throwable {
-        ValueAnimator mValueAnimator = mActivity.createAnimatorWithRepeatMode(ValueAnimator.RESTART);
+        ValueAnimator mValueAnimator = mActivity.createAnimatorWithRepeatMode(
+            ValueAnimator.RESTART);
         startAnimation(mValueAnimator);
         assertEquals(ValueAnimator.RESTART, mValueAnimator.getRepeatMode());
     }
diff --git a/tests/tests/app/Android.mk b/tests/tests/app/Android.mk
index a9b75df..b3aae14 100644
--- a/tests/tests/app/Android.mk
+++ b/tests/tests/app/Android.mk
@@ -29,4 +29,4 @@
 
 LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/app/src/android/app/cts/ActivityGroupTest.java b/tests/tests/app/src/android/app/cts/ActivityGroupTest.java
index 0cf7998..f5fc0bd 100644
--- a/tests/tests/app/src/android/app/cts/ActivityGroupTest.java
+++ b/tests/tests/app/src/android/app/cts/ActivityGroupTest.java
@@ -16,17 +16,12 @@
 
 package android.app.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.app.ActivityGroup;
 import android.content.ComponentName;
 import android.content.Intent;
 import android.os.Bundle;
 
-@TestTargetClass(ActivityGroup.class)
 public class ActivityGroupTest extends ActivityTestsBase {
     private Intent mTabIntent;
 
@@ -37,202 +32,16 @@
         mTabIntent.putExtra("tab", new ComponentName(mContext, LaunchpadActivity.class));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "ActivityGroup",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "ActivityGroup",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onResume",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onSaveInstanceState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onPause",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onStop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onDestroy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "getCurrentActivity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "getLocalActivityManager",
-            args = {}
-        )
-    })
     public void testTabBasic() throws Exception {
         mIntent = mTabIntent;
         runLaunchpad(LaunchpadActivity.LIFECYCLE_BASIC);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "ActivityGroup",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "ActivityGroup",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onResume",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onSaveInstanceState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onPause",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onStop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onDestroy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "getCurrentActivity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "getLocalActivityManager",
-            args = {}
-        )
-    })
     public void testTabScreen() throws Exception {
         mIntent = mTabIntent;
         runLaunchpad(LaunchpadActivity.LIFECYCLE_SCREEN);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "ActivityGroup",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "ActivityGroup",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onResume",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onSaveInstanceState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onPause",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onStop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onDestroy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "getCurrentActivity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "getLocalActivityManager",
-            args = {}
-        )
-    })
     public void testTabDialog() throws Exception {
         mIntent = mTabIntent;
         runLaunchpad(LaunchpadActivity.LIFECYCLE_DIALOG);
diff --git a/tests/tests/app/src/android/app/cts/ActivityManagerMemoryInfoTest.java b/tests/tests/app/src/android/app/cts/ActivityManagerMemoryInfoTest.java
index 36b3af4..3248caa 100644
--- a/tests/tests/app/src/android/app/cts/ActivityManagerMemoryInfoTest.java
+++ b/tests/tests/app/src/android/app/cts/ActivityManagerMemoryInfoTest.java
@@ -19,12 +19,7 @@
 import android.os.Parcel;
 import android.os.Process;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(ActivityManager.MemoryInfo.class)
 public class ActivityManagerMemoryInfoTest extends AndroidTestCase {
     protected ActivityManager.MemoryInfo mMemory;
 
@@ -34,27 +29,10 @@
         mMemory = new ActivityManager.MemoryInfo();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "describeContents",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ActivityManager.MemoryInfo",
-            args = {}
-        )
-    })
     public void testDescribeContents() {
         assertEquals(0, mMemory.describeContents());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {android.os.Parcel.class, int.class}
-    )
     public void testWriteToParcel() throws Exception {
         final long AVAILMEM = Process.getFreeMemory();
         mMemory.availMem = AVAILMEM;
@@ -80,11 +58,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "readFromParcel",
-        args = {android.os.Parcel.class}
-    )
     public void testReadFromParcel() throws Exception {
         final long AVAILMEM = Process.getFreeMemory();
         mMemory.availMem = AVAILMEM;
diff --git a/tests/tests/app/src/android/app/cts/ActivityManagerProcessErrorStateInfoTest.java b/tests/tests/app/src/android/app/cts/ActivityManagerProcessErrorStateInfoTest.java
index a4a001b..dd72792 100644
--- a/tests/tests/app/src/android/app/cts/ActivityManagerProcessErrorStateInfoTest.java
+++ b/tests/tests/app/src/android/app/cts/ActivityManagerProcessErrorStateInfoTest.java
@@ -18,11 +18,7 @@
 import android.app.ActivityManager;
 import android.os.Parcel;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(ActivityManager.ProcessErrorStateInfo.class)
 public class ActivityManagerProcessErrorStateInfoTest extends AndroidTestCase {
     protected ActivityManager.ProcessErrorStateInfo mErrorStateInfo;
 
@@ -32,30 +28,14 @@
         mErrorStateInfo = new ActivityManager.ProcessErrorStateInfo();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor",
-        method = "ActivityManager.ProcessErrorStateInfo",
-        args = {}
-    )
     public void testConstructor() {
         new ActivityManager.ProcessErrorStateInfo();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
         assertEquals(0, mErrorStateInfo.describeContents());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {android.os.Parcel.class, int.class}
-    )
     public void testWriteToParcel() throws Exception {
         int condition = 1;
         String processName = "processName";
@@ -90,12 +70,6 @@
         assertNull(values.crashData);  // Deprecated field: always null
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test readFromParcel method",
-        method = "readFromParcel",
-        args = {android.os.Parcel.class}
-    )
     public void testReadFromParcel() throws Exception {
         int condition = 1;
         String processName = "processName";
diff --git a/tests/tests/app/src/android/app/cts/ActivityManagerRecentTaskInfoTest.java b/tests/tests/app/src/android/app/cts/ActivityManagerRecentTaskInfoTest.java
index f961c5a..652dd40 100644
--- a/tests/tests/app/src/android/app/cts/ActivityManagerRecentTaskInfoTest.java
+++ b/tests/tests/app/src/android/app/cts/ActivityManagerRecentTaskInfoTest.java
@@ -20,11 +20,7 @@
 import android.content.Intent;
 import android.os.Parcel;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(ActivityManager.RecentTaskInfo.class)
 public class ActivityManagerRecentTaskInfoTest extends AndroidTestCase {
     protected ActivityManager.RecentTaskInfo mRecentTaskInfo;
 
@@ -34,30 +30,14 @@
         mRecentTaskInfo = new ActivityManager.RecentTaskInfo();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor",
-        method = "ActivityManager.RecentTaskInfo",
-        args = {}
-    )
     public void testConstructor() {
         new ActivityManager.RecentTaskInfo();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
         assertEquals(0, mRecentTaskInfo.describeContents());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {android.os.Parcel.class, int.class}
-    )
     public void testWriteToParcel() throws Exception {
         int id = 1;
         Intent baseIntent = null;
@@ -92,11 +72,6 @@
         assertEquals(origActivity, values.origActivity);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "readFromParcel",
-        args = {android.os.Parcel.class}
-    )
     public void testReadFromParcel() throws Exception {
         int id = 1;
         Intent baseIntent = null;
diff --git a/tests/tests/app/src/android/app/cts/ActivityManagerRunningTaskInfoTest.java b/tests/tests/app/src/android/app/cts/ActivityManagerRunningTaskInfoTest.java
index 9cebaab..4857c03 100644
--- a/tests/tests/app/src/android/app/cts/ActivityManagerRunningTaskInfoTest.java
+++ b/tests/tests/app/src/android/app/cts/ActivityManagerRunningTaskInfoTest.java
@@ -19,11 +19,7 @@
 import android.graphics.Bitmap;
 import android.os.Parcel;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(ActivityManager.RunningTaskInfo.class)
 public class ActivityManagerRunningTaskInfoTest extends AndroidTestCase {
     protected ActivityManager.RunningTaskInfo mRunningTaskInfo;
 
@@ -41,30 +37,14 @@
         mRunningTaskInfo.description = null;
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor",
-        method = "ActivityManager.RunningTaskInfo",
-        args = {}
-    )
     public void testConstructor() {
         new ActivityManager.RunningTaskInfo();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
         assertEquals(0, mRunningTaskInfo.describeContents());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {android.os.Parcel.class, int.class}
-    )
     public void testWriteToParcel() throws Exception {
 
         Parcel parcel = Parcel.obtain();
@@ -93,11 +73,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "readFromParcel",
-        args = {android.os.Parcel.class}
-    )
     public void testReadFromParcel() throws Exception {
 
         Parcel parcel = Parcel.obtain();
diff --git a/tests/tests/app/src/android/app/cts/ActivityManagerTest.java b/tests/tests/app/src/android/app/cts/ActivityManagerTest.java
index 217a17c..8b1a153 100644
--- a/tests/tests/app/src/android/app/cts/ActivityManagerTest.java
+++ b/tests/tests/app/src/android/app/cts/ActivityManagerTest.java
@@ -33,12 +33,7 @@
 import android.content.Intent;
 import android.content.pm.ConfigurationInfo;
 import android.test.InstrumentationTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
-@TestTargetClass(ActivityManager.class)
 public class ActivityManagerTest extends InstrumentationTestCase {
     private static final String STUB_PACKAGE_NAME = "com.android.cts.stub";
     private static final int WAITFOR_MSEC = 5000;
@@ -75,11 +70,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getRecentTasks",
-        args = {int.class, int.class}
-    )
     public void testGetRecentTasks() throws Exception {
         int maxNum = 0;
         int flags = 0;
@@ -137,11 +127,6 @@
         mStartedActivityList.add(monitor.waitForActivity());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getRunningTasks",
-        args = {int.class}
-    )
     public void testGetRunningTasks() {
         // Test illegal parameter
         List<RunningTaskInfo> runningTaskList;
@@ -183,11 +168,6 @@
         assertTrue(indexRecentTwo < indexRecentOne);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getRunningServices",
-        args = {int.class}
-    )
     public void testGetRunningServices() throws Exception {
         // Test illegal parameter
         List<RunningServiceInfo> runningServiceInfo;
@@ -218,22 +198,12 @@
         Thread.sleep(WAIT_TIME);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getMemoryInfo",
-        args = {android.app.ActivityManager.MemoryInfo.class}
-    )
     public void testGetMemoryInfo() {
         ActivityManager.MemoryInfo outInfo = new ActivityManager.MemoryInfo();
         mActivityManager.getMemoryInfo(outInfo);
         assertTrue(outInfo.lowMemory == (outInfo.availMem <= outInfo.threshold));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getRunningAppProcesses",
-        args = {}
-    )
     public void testGetRunningAppProcesses() throws Exception {
         List<RunningAppProcessInfo> list = mActivityManager.getRunningAppProcesses();
         assertNotNull(list);
@@ -272,35 +242,14 @@
         fail("com.android.cts.stub:remote process should be available");
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL_COMPLETE,
-        method = "getProcessesInErrorState",
-        notes="No known way to force activity into error state",
-        args = {}
-    )
     public void testGetProcessInErrorState() throws Exception {
         List<ActivityManager.ProcessErrorStateInfo> errList = null;
         errList = mActivityManager.getProcessesInErrorState();
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        notes = "Test restartPackage function of ActivityManager.It is  not supported that"
-                + "running more than 2 apks at the same time by CTS framework.Howerver,the purpuse"
-                + "of this method is to restart a package located in another apk.",
-        method = "restartPackage",
-        args = {}
-    )
     public void testRestartPackage() {
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL_COMPLETE,
-        notes = "Test getDeviceConfigurationInfo function of ActivityManager",
-        method = "getDeviceConfigurationInfo",
-        args = {}
-    )
-    @ToBeFixed(bug="1713051", explanation="no other way to get the device configuration info")
     public void testGetDeviceConfigurationInfo() {
         ConfigurationInfo conInf = mActivityManager.getDeviceConfigurationInfo();
         assertNotNull(conInf);
diff --git a/tests/tests/app/src/android/app/cts/ActivityManager_RunningAppProcessInfoTest.java b/tests/tests/app/src/android/app/cts/ActivityManager_RunningAppProcessInfoTest.java
index 1e1b117..3c1b3da 100644
--- a/tests/tests/app/src/android/app/cts/ActivityManager_RunningAppProcessInfoTest.java
+++ b/tests/tests/app/src/android/app/cts/ActivityManager_RunningAppProcessInfoTest.java
@@ -23,41 +23,9 @@
 import android.os.Parcel;
 import android.test.AndroidTestCase;
 
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(ActivityManager.RunningAppProcessInfo.class)
 public class ActivityManager_RunningAppProcessInfoTest extends AndroidTestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "describeContents",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readFromParcel",
-            args = {android.os.Parcel.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ActivityManager.RunningAppProcessInfo",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ActivityManager.RunningAppProcessInfo",
-            args = {java.lang.String.class, int.class, java.lang.String[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeToParcel",
-            args = {android.os.Parcel.class, int.class}
-        )
-    })
     public void testRunningAppProcessInfo() {
         // test constructor
         new RunningAppProcessInfo();
diff --git a/tests/tests/app/src/android/app/cts/ActivityManager_RunningServiceInfoTest.java b/tests/tests/app/src/android/app/cts/ActivityManager_RunningServiceInfoTest.java
index a784668..a6a38ae 100644
--- a/tests/tests/app/src/android/app/cts/ActivityManager_RunningServiceInfoTest.java
+++ b/tests/tests/app/src/android/app/cts/ActivityManager_RunningServiceInfoTest.java
@@ -19,11 +19,7 @@
 import android.content.ComponentName;
 import android.os.Parcel;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(ActivityManager.RunningServiceInfo.class)
 public class ActivityManager_RunningServiceInfoTest extends AndroidTestCase {
     private ActivityManager.RunningServiceInfo mRunningServiceInfo;
     private ComponentName mService;
@@ -47,29 +43,14 @@
         mRunningServiceInfo.restarting = 1l;
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "ActivityManager.RunningServiceInfo",
-        args = {}
-    )
     public void testConstructor() {
         new ActivityManager.RunningServiceInfo();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
         assertEquals(0, mRunningServiceInfo.describeContents());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {android.os.Parcel.class, int.class}
-    )
     public void testWriteToParcel() throws Exception {
 
         Parcel parcel = Parcel.obtain();
@@ -89,11 +70,6 @@
         assertEquals(1l, values.restarting);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "readFromParcel",
-        args = {android.os.Parcel.class}
-    )
     public void testReadFromParcel() throws Exception {
 
         Parcel parcel = Parcel.obtain();
diff --git a/tests/tests/app/src/android/app/cts/AlarmManagerTest.java b/tests/tests/app/src/android/app/cts/AlarmManagerTest.java
index 7c03a75..e448a9d 100644
--- a/tests/tests/app/src/android/app/cts/AlarmManagerTest.java
+++ b/tests/tests/app/src/android/app/cts/AlarmManagerTest.java
@@ -16,10 +16,6 @@
 
 package android.app.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
 import android.app.AlarmManager;
 import android.app.PendingIntent;
@@ -29,7 +25,6 @@
 import android.os.SystemClock;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(AlarmManager.class)
 public class AlarmManagerTest extends AndroidTestCase {
     private AlarmManager mAlarmManager;
     private Intent mIntent;
@@ -70,13 +65,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        method = "set",
-        args = {int.class, long.class, android.app.PendingIntent.class}
-    )
-    @ToBeFixed(bug = "1475410", explanation = "currently if make a device sleep android"
-            + "framework will throw out exception")
     public void testSetTypes() throws Exception {
         // TODO: try to find a way to make device sleep then test whether
         // AlarmManager perform the expected way
@@ -114,13 +102,6 @@
         assertEquals(mMockAlarmReceiver.elapsedTime, mWakeupTime, TIME_DELTA);
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        method = "set",
-        args = {int.class, long.class, android.app.PendingIntent.class}
-    )
-    @ToBeFixed(bug = "1475410", explanation = "currently if make a device sleep android"
-            + "framework will throw out exception")
     public void testAlarmTriggersImmediatelyIfSetTimeIsNegative() throws Exception {
         // An alarm with a negative wakeup time should be triggered immediately.
         // This exercises a workaround for a limitation of the /dev/alarm driver
@@ -132,13 +113,6 @@
         assertTrue(mMockAlarmReceiver.alarmed);
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        method = "setRepeating",
-        args = {int.class, long.class, long.class, android.app.PendingIntent.class}
-    )
-    @ToBeFixed(bug = "1475410", explanation = "currently if make a device sleep android"
-            + "framework will throw out exception")
     public void testSetRepeating() throws Exception {
         mMockAlarmReceiver.setAlarmedFalse();
         mWakeupTime = System.currentTimeMillis() + SNOOZE_DELAY;
@@ -151,11 +125,6 @@
         mAlarmManager.cancel(mSender);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "cancel",
-        args = {android.app.PendingIntent.class}
-    )
     public void testCancel() throws Exception {
         mMockAlarmReceiver.setAlarmedFalse();
         mWakeupTime = System.currentTimeMillis() + SNOOZE_DELAY;
@@ -172,12 +141,6 @@
         assertFalse(mMockAlarmReceiver.alarmed);
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        method = "setInexactRepeating",
-        args = {int.class, long.class, long.class, android.app.PendingIntent.class}
-    )
-    @ToBeFixed(bug="1556930", explanation="no way to set the system clock")
     public void testSetInexactRepeating() throws Exception {
 
         mAlarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),
diff --git a/tests/tests/app/src/android/app/cts/AlertDialogTest.java b/tests/tests/app/src/android/app/cts/AlertDialogTest.java
index b5711ed..d2edbeb 100644
--- a/tests/tests/app/src/android/app/cts/AlertDialogTest.java
+++ b/tests/tests/app/src/android/app/cts/AlertDialogTest.java
@@ -16,10 +16,6 @@
 
 package android.app.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.app.AlertDialog;
 import android.app.Instrumentation;
@@ -38,7 +34,6 @@
 /*
  * Test AlertDialog
  */
-@TestTargetClass(AlertDialog.class)
 public class AlertDialogTest extends ActivityInstrumentationTestCase2<DialogStubActivity> {
     private static final String ALERTDIALOG_CUSTOM_TITLE = "Hello, World!";
 
@@ -62,56 +57,6 @@
         mActivity = DialogStubActivity.startDialogActivity(this, dialogNumber);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "AlertDialog",
-            args = {Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "getButton",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setButton",
-            args = {int.class, CharSequence.class, OnClickListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setIcon",
-            args = {Drawable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setIcon",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setMessage",
-            args = {CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setTitle",
-            args = {CharSequence.class}
-        )
-    })
     public void testAlertDialog() throws Throwable {
         doTestAlertDialog(DialogStubActivity.TEST_ALERTDIALOG);
     }
@@ -149,146 +94,10 @@
         assertTrue(mActivity.isNeutralButtonClicked);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "AlertDialog",
-            args = {Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "getButton",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "getListView",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setButton",
-            args = {CharSequence.class, OnClickListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setButton",
-            args = {int.class, CharSequence.class, Message.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setButton2",
-            args = {CharSequence.class, OnClickListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setButton3",
-            method = "setButton3",
-            args = {CharSequence.class, OnClickListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setIcon",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setInverseBackgroundForced",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setMessage",
-            args = {CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setTitle",
-            args = {CharSequence.class}
-        )
-    })
     public void testAlertDialogDeprecatedAPI() throws Throwable {
         doTestAlertDialog(DialogStubActivity.TEST_ALERTDIALOG_DEPRECATED);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "AlertDialog",
-            args = {Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "getButton",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "getListView",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setButton",
-            args = {CharSequence.class, Message.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setButton",
-            args = {int.class, CharSequence.class, Message.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setButton2",
-            args = {CharSequence.class, Message.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setButton3",
-            args = {CharSequence.class, Message.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setIcon",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setInverseBackgroundForced",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setMessage",
-            args = {CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setTitle",
-            args = {CharSequence.class}
-        )
-    })
     public void testAlertDialogDeprecatedAPIWithMessage() throws Throwable {
         startDialogActivity(DialogStubActivity.TEST_ALERTDIALOG_DEPRECATED_WITH_MESSAGE);
         assertTrue(mActivity.getDialog().isShowing());
@@ -331,107 +140,17 @@
         mInstrumentation.waitForIdleSync();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "AlertDialog",
-            args = {Context.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "AlertDialog",
-            args = {Context.class, boolean.class, OnCancelListener.class}
-         ),
-        @TestTargetNew(
-           level = TestLevel.COMPLETE,
-           notes = "",
-           method = "setCustomTitle",
-           args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setMessage",
-            args = {CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setView",
-            args = {View.class}
-        )
-    })
     public void testCustomAlertDialog() {
         startDialogActivity(DialogStubActivity.TEST_CUSTOM_ALERTDIALOG);
         assertTrue(mActivity.getDialog().isShowing());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "AlertDialog",
-            args = {Context.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "AlertDialog",
-            args = {Context.class, boolean.class, OnCancelListener.class}
-         ),
-        @TestTargetNew(
-           level = TestLevel.COMPLETE,
-           notes = "",
-           method = "setCustomTitle",
-           args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setMessage",
-            args = {CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setView",
-            args = {View.class, int.class, int.class, int.class, int.class}
-        )
-    })
     public void testCustomAlertDialogView() {
         startDialogActivity(DialogStubActivity.TEST_CUSTOM_ALERTDIALOG_VIEW);
         assertTrue(mActivity.getDialog().isShowing());
     }
 
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "AlertDialog",
-            args = {Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onKeyDown",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onKeyUp",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onCreate",
-            args = {Bundle.class}
-        )
-    })
     public void testCallback() {
         startDialogActivity(DialogStubActivity.TEST_ALERTDIALOG_CALLBACK);
         assertTrue(mActivity.onCreateCalled);
@@ -442,23 +161,11 @@
         assertTrue(mActivity.onKeyUpCalled);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "",
-        method = "AlertDialog",
-        args = {Context.class, int.class}
-    )
     public void testAlertDialogTheme() throws Exception {
         startDialogActivity(DialogStubActivity.TEST_ALERTDIALOG_THEME);
         assertTrue(mActivity.getDialog().isShowing());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "",
-        method = "AlertDialog",
-        args = {Context.class, boolean.class, OnCancelListener.class}
-    )
     public void testAlertDialogCancelable() throws Exception {
         startDialogActivity(DialogStubActivity.TEST_ALERTDIALOG_CANCELABLE);
         assertTrue(mActivity.getDialog().isShowing());
@@ -468,12 +175,6 @@
         assertTrue(mActivity.onCancelCalled);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "",
-        method = "AlertDialog",
-        args = {Context.class, boolean.class, OnCancelListener.class}
-    )
     public void testAlertDialogNotCancelable() throws Exception {
         startDialogActivity(DialogStubActivity.TEST_ALERTDIALOG_NOT_CANCELABLE);
         assertTrue(mActivity.getDialog().isShowing());
diff --git a/tests/tests/app/src/android/app/cts/AlertDialog_BuilderTest.java b/tests/tests/app/src/android/app/cts/AlertDialog_BuilderTest.java
index c56dc28..4c40a62 100644
--- a/tests/tests/app/src/android/app/cts/AlertDialog_BuilderTest.java
+++ b/tests/tests/app/src/android/app/cts/AlertDialog_BuilderTest.java
@@ -44,11 +44,7 @@
 import android.widget.ListView;
 import android.widget.AdapterView.OnItemSelectedListener;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(Builder.class)
 public class AlertDialog_BuilderTest extends ActivityInstrumentationTestCase2<DialogStubActivity> {
     private Builder mBuilder;
     private Context mContext;
@@ -125,20 +121,10 @@
         super("com.android.cts.stub", DialogStubActivity.class);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "AlertDialog.Builder",
-        args = {Context.class}
-    )
     public void testConstructor() {
         new AlertDialog.Builder(mContext);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setIcon",
-        args = {int.class}
-    )
     public void testSetIconWithParamInt() throws Throwable {
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -151,11 +137,6 @@
         mInstrumentation.waitForIdleSync();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setIcon",
-        args = {Drawable.class}
-    )
     public void testSetIconWithParamDrawable() throws Throwable {
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -168,11 +149,6 @@
         mInstrumentation.waitForIdleSync();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setPositiveButton",
-        args = {int.class, OnClickListener.class}
-    )
     public void testSetPositiveButtonWithParamInt() throws Throwable {
        runTestOnUiThread(new Runnable() {
             public void run() {
@@ -189,11 +165,6 @@
         assertTrue(mResult);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setPositiveButton",
-        args = {CharSequence.class, OnClickListener.class}
-    )
     public void testSetPositiveButtonWithParamCharSequence() throws Throwable {
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -209,11 +180,6 @@
         assertTrue(mResult);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setNegativeButton",
-        args = {CharSequence.class, OnClickListener.class}
-    )
     public void testSetNegativeButtonWithParamCharSequence() throws Throwable {
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -229,11 +195,6 @@
         assertTrue(mResult);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setNegativeButton",
-        args = {int.class, OnClickListener.class}
-    )
     public void testSetNegativeButtonWithParamInt() throws Throwable {
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -249,11 +210,6 @@
         assertTrue(mResult);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setNeutralButton",
-        args = {int.class, OnClickListener.class}
-    )
     public void testSetNeutralButtonWithParamInt() throws Throwable {
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -269,11 +225,6 @@
         assertTrue(mResult);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setNeutralButton",
-        args = {CharSequence.class, OnClickListener.class}
-    )
     public void testSetNeutralButtonWithParamCharSequence() throws Throwable {
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -300,33 +251,18 @@
         mInstrumentation.waitForIdleSync();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setCancelable",
-        args = {boolean.class}
-    )
     public void testSetCancelable() throws Throwable {
         setCancelable(true);
         mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
         assertFalse(mDialog.isShowing());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setCancelable",
-        args = {boolean.class}
-    )
     public void testDisableCancelable() throws Throwable {
         setCancelable(false);
         mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
         assertTrue(mDialog.isShowing());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setOnCancelListener",
-        args = {OnCancelListener.class}
-    )
     public void testSetOnCancelListener() throws Throwable {
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -340,11 +276,6 @@
         assertTrue(mResult);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setOnKeyListener",
-        args = {OnKeyListener.class}
-    )
     public void testSetOnKeyListener() throws Throwable {
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -358,11 +289,6 @@
         assertTrue(mResult);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setItems",
-        args = {int.class, OnClickListener.class}
-    )
     public void testSetItemsWithParamInt() throws Throwable {
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -379,11 +305,6 @@
         assertEquals(levels[0], mListView.getItemAtPosition(0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setItems",
-        args = {CharSequence[].class, OnClickListener.class}
-    )
     public void testSetItemsWithParamCharSequence() throws Throwable {
         final CharSequence[] expect = mContext.getResources().getTextArray(
                 com.android.cts.stub.R.array.difficultyLevel);
@@ -400,11 +321,6 @@
         assertEquals(expect[0], mListView.getItemAtPosition(0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setAdapter",
-        args = {ListAdapter.class, OnClickListener.class}
-    )
     public void testSetAdapter() throws Throwable {
         final ListAdapter adapter = new AdapterTest();
         runTestOnUiThread(new Runnable() {
@@ -419,11 +335,6 @@
         assertEquals(adapter, mListView.getAdapter());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setCursor",
-        args = {Cursor.class, OnClickListener.class, String.class}
-    )
     public void testSetCursor() throws Throwable {
         preparePeople();
         final Cursor c = mContext.getContentResolver().query(People.CONTENT_URI, mPROJECTION, null,
@@ -444,11 +355,6 @@
         assertTrue(mResult);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setMultiChoiceItems",
-        args = {int.class, boolean[].class, OnMultiChoiceClickListener.class}
-    )
     public void testSetMultiChoiceItemsWithParamInt() throws Throwable {
 
         final CharSequence[] items = mContext.getResources().getTextArray(
@@ -473,11 +379,6 @@
         assertTrue(mResult);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setMultiChoiceItems",
-        args = {CharSequence[].class, boolean[].class, OnMultiChoiceClickListener.class}
-    )
     public void testSetMultiChoiceItemsWithParamCharSequence() throws Throwable {
         final CharSequence[] items = mContext.getResources().getTextArray(
                 com.android.cts.stub.R.array.difficultyLevel);
@@ -500,11 +401,6 @@
         assertTrue(mResult);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setMultiChoiceItems",
-        args = {Cursor.class, String.class, String.class, OnMultiChoiceClickListener.class}
-    )
     public void testSetMultiChoiceItemsWithParamCursor() throws Throwable {
         preparePeople();
         final Cursor c = mContext.getContentResolver().query(People.CONTENT_URI, mPROJECTION, null,
@@ -528,11 +424,6 @@
         assertTrue(mResult);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setSingleChoiceItems",
-        args = {int.class, int.class, OnClickListener.class}
-    )
     public void testSetSingleChoiceItemsWithParamInt() throws Throwable {
         final CharSequence[] items = mContext.getResources().getTextArray(
                 com.android.cts.stub.R.array.difficultyLevel);
@@ -563,11 +454,6 @@
         mResolver.insert(People.CONTENT_URI, valuse);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setSingleChoiceItems",
-        args = {Cursor.class, int.class, String.class, OnClickListener.class}
-    )
     public void testSetSingleChoiceItemsWithParamCursor() throws Throwable {
         final String[] PROJECTION = new String[] {
                 People._ID, People.NAME
@@ -591,11 +477,6 @@
         assertTrue(mResult);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setSingleChoiceItems",
-        args = {CharSequence[].class, int.class, OnClickListener.class}
-    )
     public void testSetSingleChoiceItemsWithParamCharSequence() throws Throwable {
         final CharSequence[] items = mContext.getResources().getTextArray(
                 com.android.cts.stub.R.array.difficultyLevel);
@@ -616,11 +497,6 @@
         assertTrue(mResult);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setSingleChoiceItems",
-        args = {ListAdapter.class, int.class, OnClickListener.class}
-    )
     public void testSetSingleChoiceItems() throws Throwable {
         final CharSequence[] items = mContext.getResources().getTextArray(
                 com.android.cts.stub.R.array.difficultyLevel);
@@ -643,11 +519,6 @@
         assertTrue(mResult);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setOnItemSelectedListener",
-        args = {AdapterView.OnItemSelectedListener.class}
-    )
     public void testSetOnItemSelectedListener() throws Throwable {
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -663,11 +534,6 @@
         assertTrue(mItemSelected);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setView",
-        args = {View.class}
-    )
     public void testSetView() throws Throwable {
         final View view = new View(mContext);
         view.setId(100);
@@ -683,11 +549,6 @@
         assertEquals(view, mView);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setView",
-        args = {View.class, int.class, int.class, int.class, int.class}
-    )
     public void testSetViewCustom() throws Throwable {
         final int viewSpacingLeft = 10;
         final int viewSpacingTop = 20;
@@ -708,11 +569,6 @@
         assertEquals(view, mView);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setInverseBackgroundForced",
-        args = {boolean.class}
-    )
     public void testSetInverseBackgroundForced() throws Throwable {
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -725,11 +581,6 @@
         mInstrumentation.waitForIdleSync();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "create",
-        args = {}
-    )
     public void testCreate() throws Throwable {
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -743,11 +594,6 @@
         assertTrue(mDialog.isShowing());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "show",
-        args = {}
-    )
     public void testShow() throws Throwable {
         runTestOnUiThread(new Runnable() {
             public void run() {
diff --git a/tests/tests/app/src/android/app/cts/AliasActivityTest.java b/tests/tests/app/src/android/app/cts/AliasActivityTest.java
index a5ab4f3..e668496 100644
--- a/tests/tests/app/src/android/app/cts/AliasActivityTest.java
+++ b/tests/tests/app/src/android/app/cts/AliasActivityTest.java
@@ -19,28 +19,11 @@
 import android.app.AliasActivity;
 import android.content.Intent;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(AliasActivity.class)
 public class AliasActivityTest extends AndroidTestCase {
 
     private static final long SLEEP_TIME = 1000;
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreate",
-            args = {android.os.Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AliasActivity",
-            args = {}
-        )
-    })
     public void testAliasActivity() throws InterruptedException {
         new AliasActivity();
 
diff --git a/tests/tests/app/src/android/app/cts/ApplicationTest.java b/tests/tests/app/src/android/app/cts/ApplicationTest.java
index 2dfb97d..d48d53a 100644
--- a/tests/tests/app/src/android/app/cts/ApplicationTest.java
+++ b/tests/tests/app/src/android/app/cts/ApplicationTest.java
@@ -16,10 +16,6 @@
 
 package android.app.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.app.Activity;
 import android.app.Application;
@@ -31,39 +27,8 @@
 /**
  * Test {@link Application}.
  */
-@TestTargetClass(Application.class)
 public class ApplicationTest extends InstrumentationTestCase {
 
-    @TestTargets({
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "Application",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onConfigurationChanged",
-        args = {android.content.res.Configuration.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onCreate",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        notes = "According to issue 1653192, a Java app can't allocate memory without" +
-                " restriction, thus it's hard to test this callback.",
-        method = "onLowMemory",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        notes = "The documentation states that one cannot rely on this method being called.",
-        method = "onTerminate",
-        args = {}
-      )
-    })
     public void testApplication() throws Throwable {
         final Instrumentation instrumentation = getInstrumentation();
         final Context targetContext = instrumentation.getTargetContext();
diff --git a/tests/tests/app/src/android/app/cts/DialogTest.java b/tests/tests/app/src/android/app/cts/DialogTest.java
index 37ded56..57ae218 100644
--- a/tests/tests/app/src/android/app/cts/DialogTest.java
+++ b/tests/tests/app/src/android/app/cts/DialogTest.java
@@ -17,11 +17,6 @@
 
 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 android.app.Dialog;
 import android.app.Instrumentation;
@@ -32,6 +27,7 @@
 import android.content.DialogInterface.OnKeyListener;
 import android.content.res.Resources;
 import android.content.res.TypedArray;
+import android.cts.util.PollingCheck;
 import android.graphics.Canvas;
 import android.graphics.ColorFilter;
 import android.graphics.drawable.Drawable;
@@ -42,7 +38,6 @@
 import android.os.Message;
 import android.os.SystemClock;
 import android.test.ActivityInstrumentationTestCase2;
-import android.view.animation.cts.DelayedCheck;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.MotionEvent;
@@ -54,7 +49,6 @@
 
 import java.lang.ref.WeakReference;
 
-@TestTargetClass(Dialog.class)
 public class DialogTest extends ActivityInstrumentationTestCase2<DialogStubActivity> {
 
     protected static final long SLEEP_TIME = 200;
@@ -92,35 +86,6 @@
         mActivity = DialogStubActivity.startDialogActivity(this, dialogNumber);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Dialog",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Dialog",
-            args = {android.content.Context.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test Dialog protected Constructors through mock dialog",
-            method = "Dialog",
-            args = {android.content.Context.class, boolean.class,
-                    android.content.DialogInterface.OnCancelListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getContext",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWindow",
-            args = {}
-        )
-    })
     public void testConstructor(){
         new Dialog(mContext);
         Dialog d = new Dialog(mContext, 0);
@@ -174,23 +139,6 @@
                 ta.getInt(R.styleable.TextAppearance_textStyle, defValue));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreate",
-            args = {android.os.Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStop",
-            args = {}
-        )
-    })
     public void testOnStartCreateStop(){
         startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
         final TestDialog d = (TestDialog) mActivity.getDialog();
@@ -203,28 +151,6 @@
         assertTrue(d.isOnStopCalled);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOwnerActivity",
-            args = {android.app.Activity.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getOwnerActivity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVolumeControlStream",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getVolumeControlStream",
-            args = {}
-        )
-    })
     public void testAccessOwnerActivity() {
         startDialogActivity(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
         Dialog d = mActivity.getDialog();
@@ -244,28 +170,6 @@
         assertNull(d.getOwnerActivity());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "show",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hide",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isShowing",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dismiss",
-            args = {}
-        )
-    })
     public void testShow() throws Throwable {
         startDialogActivity(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
         final Dialog d = mActivity.getDialog();
@@ -294,18 +198,6 @@
         assertFalse(d.isShowing());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestoreInstanceState",
-            args = {android.os.Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSaveInstanceState",
-            args = {}
-        )
-    })
     public void testOnSaveInstanceState() {
         startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
         final TestDialog d = (TestDialog) mActivity.getDialog();
@@ -319,11 +211,6 @@
         assertTrue(TestDialog.isOnRestoreInstanceStateCalled);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getCurrentFocus",
-        args = {}
-    )
     public void testGetCurrentFocus() throws Throwable {
         startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
         final TestDialog d = (TestDialog) mActivity.getDialog();
@@ -341,33 +228,6 @@
         assertEquals(d.getWindow().getCurrentFocus(), d.getCurrentFocus());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {android.view.View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {android.view.View.class, android.view.ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "findViewById",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addContentView",
-            args = {android.view.View.class, android.view.ViewGroup.LayoutParams.class}
-        )
-    })
     public void testSetContentView() throws Throwable {
         startDialogActivity(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
         final Dialog d = mActivity.getDialog();
@@ -441,18 +301,6 @@
         assertNotNull(d.findViewById(R.id.password_edit));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitle",
-            args = {java.lang.CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitle",
-            args = {int.class}
-        )
-    })
     public void testSetTitle() {
         final String expectedTitle = "Test Dialog Without theme";
         startDialogActivity(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
@@ -470,18 +318,6 @@
                 (String) d.getWindow().getAttributes().getTitle());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyDown",
-            args = {int.class, android.view.KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyUp",
-            args = {int.class, android.view.KeyEvent.class}
-        )
-    })
     public void testOnKeyDownKeyUp() {
         startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
         final TestDialog d = (TestDialog) mActivity.getDialog();
@@ -501,11 +337,6 @@
         assertTrue(d.onKeyDownReturn);
     }
 
-     @TestTargetNew(
-         level = TestLevel.COMPLETE,
-         method = "onKeyMultiple",
-         args = {int.class, int.class, android.view.KeyEvent.class}
-     )
      public void testOnKeyMultiple() {
          startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
          final TestDialog d = (TestDialog) mActivity.getDialog();
@@ -518,23 +349,6 @@
          assertEquals(KeyEvent.ACTION_MULTIPLE, d.keyMultipleEvent.getAction());
      }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTouchEvent",
-            args = {android.view.MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setCanceledOnTouchOutside",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchTouchEvent",
-            args = {android.view.MotionEvent.class}
-        )
-    })
     public void testTouchEvent() {
         startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
         final TestDialog d = (TestDialog) mActivity.getDialog();
@@ -576,18 +390,6 @@
         assertFalse(d.isShowing());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTrackballEvent",
-            args = {android.view.MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchTrackballEvent",
-            args = {android.view.MotionEvent.class}
-        )
-    })
     public void testTrackballEvent() {
         startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
         final TestDialog d = (TestDialog) mActivity.getDialog();
@@ -617,11 +419,6 @@
         // so we won't assert them here.
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onWindowAttributesChanged",
-        args = {android.view.WindowManager.LayoutParams.class}
-    )
     public void testOnWindowAttributesChanged() throws Throwable {
         startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
         final TestDialog d = (TestDialog) mActivity.getDialog();
@@ -642,11 +439,6 @@
         assertSame(lp, d.getWindow().getAttributes());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onContentChanged",
-        args = {}
-    )
     public void testOnContentChanged() throws Throwable {
         startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
         final TestDialog d = (TestDialog) mActivity.getDialog();
@@ -664,11 +456,6 @@
         assertTrue(d.isOnContentChangedCalled);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onWindowFocusChanged",
-        args = {boolean.class}
-    )
     public void testOnWindowFocusChanged() throws Throwable {
         startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
         final TestDialog d = (TestDialog) mActivity.getDialog();
@@ -684,25 +471,13 @@
         mInstrumentation.waitForIdleSync();
 
         // Wait until TestDialog#OnWindowFocusChanged() is called
-        new DelayedCheck(TEST_TIMEOUT) {
+        new PollingCheck(TEST_TIMEOUT) {
             protected boolean check() {
                 return d.isOnWindowFocusChangedCalled;
             }
         }.run();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchKeyEvent",
-            args = {android.view.KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOnKeyListener",
-            args = {android.content.DialogInterface.OnKeyListener.class}
-        )
-    })
     public void testDispatchKeyEvent() {
         startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
         final TestDialog d = (TestDialog) mActivity.getDialog();
@@ -751,46 +526,6 @@
      * 5. onContextMenuClosed is called whenever the context menu is being closed (either by
      * the user canceling the menu with the back/menu button, or when an item is selected).
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "registerForContextMenu",
-            args = {android.view.View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unregisterForContextMenu",
-            args = {android.view.View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateContextMenu",
-            args = {android.view.ContextMenu.class, android.view.View.class,
-                    android.view.ContextMenu.ContextMenuInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openContextMenu",
-            args = {android.view.View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            notes = "test method: onContextItemSelected",
-            method = "onContextItemSelected",
-            args = {android.view.MenuItem.class}
-         ),
-         @TestTargetNew(
-             level = TestLevel.COMPLETE,
-             notes = "test method: onContextMenuClosed",
-             method = "onContextMenuClosed",
-             args = {android.view.Menu.class}
-         )
-    })
-    @ToBeFixed(bug = "1716918", explanation = "As Javadoc of onMenuItemSelected() and "
-            + "onPanelClosed(), onOptionsItemSelected() and onContextItemSelected() should be "
-            + "called in onMenuItemSelected() source code, onOptionMenuClosed() and "
-            + "onContextMenuClosed() should be called in onPanelClosed() source code, "
-            + "but now onMenuItemSelected() and onPanelClosed() method are empty, is this a bug?")
     public void testContextMenu() throws Throwable {
         startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
         final TestDialog d = (TestDialog) mActivity.getDialog();
@@ -864,25 +599,9 @@
         assertFalse(d.isOnContextMenuClosedCalled);
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        method = "onSearchRequested",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "From the javadoc of onSearchRequested,"
-            + "we see it will be called when the user signals the desire to start a search."
-            + "But there is a comment in it source code says \"not during dialogs, no.\","
-            + "But onSearchRequested() didn't be called after start search.")
     public void testOnSearchRequested() {
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        method = "takeKeyEvents",
-        args = {boolean.class}
-    )
-    @ToBeFixed(bug = "1695243",
-            explanation = "It still get KeyEvent while set takeKeyEvents to false")
     public void testTakeKeyEvents() throws Throwable {
         startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
         final TestDialog d = (TestDialog) mActivity.getDialog();
@@ -910,24 +629,12 @@
         mInstrumentation.waitForIdleSync();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "requestWindowFeature",
-        args = {int.class}
-    )
     public void testRequestWindowFeature() {
         startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
         // called requestWindowFeature at TestDialog onCreate method
         assertTrue(((TestDialog) mActivity.getDialog()).isRequestWindowFeature);
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        notes = "There is no way to assert whether the drawable resource is properly shown."
-            + "So we only call setFeatureDrawableResource once, with no asserts.",
-        method = "setFeatureDrawableResource",
-        args = {int.class, int.class}
-    )
     public void testSetFeatureDrawableResource() throws Throwable {
         startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
         runTestOnUiThread(new Runnable() {
@@ -939,58 +646,27 @@
         mInstrumentation.waitForIdleSync();
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        notes = "There is no way to assert whether the drawable resource is properly shown."
-            + "So we only call setFeatureDrawableUri once, with no asserts.",
-        method = "setFeatureDrawableUri",
-        args = {int.class, android.net.Uri.class}
-    )
     public void testSetFeatureDrawableUri() {
         startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
         mActivity.getDialog().setFeatureDrawableUri(0, Uri.parse("http://www.google.com"));
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        notes = "There is no way to assert whether the drawable resource is properly shown."
-            + "So we only call setFeatureDrawable once, with no asserts.",
-        method = "setFeatureDrawable",
-        args = {int.class, android.graphics.drawable.Drawable.class}
-    )
     public void testSetFeatureDrawable() {
         startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
         mActivity.getDialog().setFeatureDrawable(0, new MockDrawable());
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        notes = "There is no way to assert whether the drawable resource is properly shown."
-            + "So we only call setFeatureDrawableAlpha once, with no asserts.",
-        method = "setFeatureDrawableAlpha",
-        args = {int.class, int.class}
-    )
     public void testSetFeatureDrawableAlpha() {
         startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
         mActivity.getDialog().setFeatureDrawableAlpha(0, 0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLayoutInflater",
-        args = {}
-    )
     public void testGetLayoutInflater() {
         startDialogActivity(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
         final Dialog d = mActivity.getDialog();
         assertEquals(d.getWindow().getLayoutInflater(), d.getLayoutInflater());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setCancelable",
-        args = {boolean.class}
-    )
     public void testSetCancelable_true() {
         startDialogActivity(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
         final Dialog d = mActivity.getDialog();
@@ -1016,18 +692,6 @@
      * 1. Cancel the dialog.
      * 2. Set a listener to be invoked when the dialog is canceled.
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "cancel",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOnCancelListener",
-            args = {android.content.DialogInterface.OnCancelListener.class}
-        )
-    })
     public void testCancel_listener() throws Throwable {
         startDialogActivity(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
         final Dialog d = mActivity.getDialog();
@@ -1058,12 +722,6 @@
         assertFalse(mOnCancelListenerCalled);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test method: setCancelMessage",
-        method = "setCancelMessage",
-        args = {android.os.Message.class}
-    )
     public void testSetCancelMessage() throws Exception {
         mCalledCallback = false;
         startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
@@ -1091,11 +749,6 @@
      * 1. Set a listener to be invoked when the dialog is dismissed.
      * 2. set onDismissListener to null, it will not changed flag after dialog dismissed.
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setOnDismissListener",
-        args = {android.content.DialogInterface.OnDismissListener.class}
-    )
     public void testSetOnDismissListener_listener() throws Throwable {
         mCalledCallback = false;
         startDialogActivity(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
@@ -1125,11 +778,6 @@
         assertFalse(d.isShowing());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setDismissMessage",
-        args = {android.os.Message.class}
-    )
     public void testSetDismissMessage() throws Throwable {
         mCalledCallback = false;
         startDialogActivity(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
diff --git a/tests/tests/app/src/android/app/cts/DownloadManagerTest.java b/tests/tests/app/src/android/app/cts/DownloadManagerTest.java
index a225749..1da6af9 100644
--- a/tests/tests/app/src/android/app/cts/DownloadManagerTest.java
+++ b/tests/tests/app/src/android/app/cts/DownloadManagerTest.java
@@ -22,12 +22,12 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.cts.util.PollingCheck;
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.Environment;
 import android.os.ParcelFileDescriptor;
 import android.test.AndroidTestCase;
-import android.view.animation.cts.DelayedCheck;
 import android.webkit.cts.CtsTestServer;
 
 import java.io.File;
@@ -314,7 +314,7 @@
     }
 
     private void assertDownloadQueryableByStatus(final int status) {
-        new DelayedCheck() {
+        new PollingCheck() {
             @Override
             protected boolean check() {
                 Cursor cursor= null;
diff --git a/tests/tests/app/src/android/app/cts/ExpandableListActivityTest.java b/tests/tests/app/src/android/app/cts/ExpandableListActivityTest.java
index 0d91df0..9d97296 100644
--- a/tests/tests/app/src/android/app/cts/ExpandableListActivityTest.java
+++ b/tests/tests/app/src/android/app/cts/ExpandableListActivityTest.java
@@ -18,12 +18,7 @@
 
 import android.app.ExpandableListActivity;
 import android.content.ComponentName;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(ExpandableListActivity.class)
 public class ExpandableListActivityTest extends ActivityTestsBase {
 
     @Override
@@ -33,142 +28,14 @@
                 ExpandableListTestActivity.class));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getExpandableListView",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setListAdapter",
-            args = {android.widget.ExpandableListAdapter.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSelectedPosition",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onGroupExpand",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onGroupCollapse",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSelectedChild",
-            args = {int.class, int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSelectedGroup",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSelectedId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ExpandableListActivity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getExpandableListAdapter",
-            args = {}
-        )
-    })
     public void testSelect() {
         runLaunchpad(LaunchpadActivity.EXPANDLIST_SELECT);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setListAdapter",
-            args = {android.widget.ExpandableListAdapter.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onGroupExpand",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onGroupCollapse",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ExpandableListActivity",
-            args = {}
-        )
-    })
     public void testView() {
         runLaunchpad(LaunchpadActivity.EXPANDLIST_VIEW);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setListAdapter",
-            args = {android.widget.ExpandableListAdapter.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onGroupExpand",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onGroupCollapse",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateContextMenu",
-            args = {android.view.ContextMenu.class, android.view.View.class,
-                    android.view.ContextMenu.ContextMenuInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getExpandableListView",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ExpandableListActivity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onChildClick",
-            args = {android.widget.ExpandableListView.class, android.view.View.class,
-                    int.class, int.class, long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContentChanged",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestoreInstanceState",
-            args = {android.os.Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getExpandableListAdapter",
-            args = {}
-        )
-    })
     public void testCallback() {
         runLaunchpad(LaunchpadActivity.EXPANDLIST_CALLBACK);
     }
diff --git a/tests/tests/app/src/android/app/cts/InstrumentationTest.java b/tests/tests/app/src/android/app/cts/InstrumentationTest.java
index d911517..30cdd5f 100644
--- a/tests/tests/app/src/android/app/cts/InstrumentationTest.java
+++ b/tests/tests/app/src/android/app/cts/InstrumentationTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.app.Activity;
 import android.app.Application;
@@ -54,7 +50,6 @@
 
 import java.util.List;
 
-@TestTargetClass(Instrumentation.class)
 public class InstrumentationTest extends InstrumentationTestCase {
 
     private static final int WAIT_TIME = 1000;
@@ -84,57 +79,10 @@
         super.tearDown();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "Instrumentation",
-        args = {}
-    )
     public void testConstructor() throws Exception {
         new Instrumentation();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addMonitor",
-            args = {ActivityMonitor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addMonitor",
-            args = {IntentFilter.class, ActivityResult.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addMonitor",
-            args = {String.class, ActivityResult.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "checkMonitorHit",
-            args = {ActivityMonitor.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "waitForMonitor",
-            args = {ActivityMonitor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "waitForMonitorWithTimeout",
-            args = {ActivityMonitor.class, long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeMonitor",
-            args = {ActivityMonitor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivitySync",
-            args = {Intent.class}
-        )
-    })
     public void testMonitor() throws Exception {
         if (mActivity != null)
             mActivity.finish();
@@ -175,18 +123,6 @@
         mInstrumentation.removeMonitor(am);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "callActivityOnCreate",
-            args = {Activity.class, Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "waitForIdleSync",
-            args = {}
-        )
-    })
     public void testCallActivityOnCreate() throws Throwable {
         mActivity.setOnCreateCalled(false);
         runTestOnUiThread(new Runnable() {
@@ -198,28 +134,6 @@
         assertTrue(mActivity.isOnCreateCalled());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stopAllocCounting",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startAllocCounting",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAllocCounts",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBinderCounts",
-            args = {}
-        )
-    })
     public void testAllocCounting() throws Exception {
         mInstrumentation.startAllocCounting();
 
@@ -254,11 +168,6 @@
         assertEquals(threadAllocCount, Debug.getThreadAllocCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "sendTrackballEventSync",
-        args = {MotionEvent.class}
-    )
     public void testSendTrackballEventSync() throws Exception {
         long now = SystemClock.uptimeMillis();
         MotionEvent orig = MotionEvent.obtain(now, now, MotionEvent.ACTION_DOWN,
@@ -272,40 +181,18 @@
         assertEquals(orig.getDownTime(), motionEvent.getDownTime());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "callApplicationOnCreate",
-        args = {Application.class}
-    )
     public void testCallApplicationOnCreate() throws Exception {
         InstrumentationTestStub ca = new InstrumentationTestStub();
         mInstrumentation.callApplicationOnCreate(ca);
         assertTrue(ca.mIsOnCreateCalled);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getContext",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTargetContext",
-            args = {}
-        )
-    })
     public void testContext() throws Exception {
         Context c1 = mInstrumentation.getContext();
         Context c2 = mInstrumentation.getTargetContext();
         assertNotSame(c1.getPackageName(), c2.getPackageName());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "invokeMenuActionSync",
-        args = {Activity.class, int.class, int.class}
-    )
     public void testInvokeMenuActionSync() throws Exception {
         final int resId = R.id.goto_menu_id;
         mInstrumentation.invokeMenuActionSync(mActivity, resId, 0);
@@ -314,11 +201,6 @@
         assertEquals(resId, mActivity.getMenuID());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "callActivityOnPostCreate",
-        args = {Activity.class, Bundle.class}
-    )
     public void testCallActivityOnPostCreate() throws Throwable {
         mActivity.setOnPostCreate(false);
         runTestOnUiThread(new Runnable() {
@@ -330,11 +212,6 @@
         assertTrue(mActivity.isOnPostCreate());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "callActivityOnNewIntent",
-        args = {Activity.class, Intent.class}
-    )
     public void testCallActivityOnNewIntent() throws Throwable {
         mActivity.setOnNewIntentCalled(false);
         runTestOnUiThread(new Runnable() {
@@ -347,11 +224,6 @@
         assertTrue(mActivity.isOnNewIntentCalled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "callActivityOnResume",
-        args = {Activity.class}
-    )
     public void testCallActivityOnResume() throws Throwable {
         mActivity.setOnResume(false);
         runTestOnUiThread(new Runnable() {
@@ -363,91 +235,15 @@
         assertTrue(mActivity.isOnResume());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            notes = "can't start a Instrumentation to test this method",
-            method = "onCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            notes = "can't start a Instrumentation to test this method",
-            method = "onDestroy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            notes = "call this method will crash the process",
-            method = "finish",
-            args = {int.class, Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            notes = "can't start a Instrumentation to test this method",
-            method = "onStart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            notes = "can't start a Instrumentation to test this method",
-            method = "onException",
-            args = {Object.class, Throwable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "start",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "sendStatus",
-            args = {int.class, Bundle.class}
-        )
-    })
     public void testMisc() throws Exception {
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAutomaticPerformanceSnapshots",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startPerformanceSnapshot",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "endPerformanceSnapshot",
-            args = {}
-        )
-    })
     public void testPerformanceSnapshot() throws Exception {
         mInstrumentation.setAutomaticPerformanceSnapshots();
         mInstrumentation.startPerformanceSnapshot();
         mInstrumentation.endPerformanceSnapshot();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "isProfiling",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startProfiling",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stopProfiling",
-            args = {}
-        )
-    })
     public void testProfiling() throws Exception {
         // by default, profiling was disabled. but after set the handleProfiling attribute in the
         // manifest file for this Instrumentation to true, the profiling was also disabled.
@@ -457,11 +253,6 @@
         mInstrumentation.stopProfiling();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "invokeContextMenuAction",
-        args = {Activity.class, int.class, int.class}
-    )
     public void testInvokeContextMenuAction() throws Exception {
         MockActivity activity = new MockActivity();
         final int id = 1;
@@ -473,11 +264,6 @@
         assertEquals(flag, activity.mWindow.mFlags);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "sendStringSync",
-        args = {String.class}
-    )
     public void testSendStringSync() {
         final String text = "abcd";
         mInstrumentation.sendStringSync(text);
@@ -498,11 +284,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "callActivityOnSaveInstanceState",
-        args = {Activity.class, Bundle.class}
-    )
     public void testCallActivityOnSaveInstanceState() throws Throwable {
         final Bundle bundle = new Bundle();
         mActivity.setOnSaveInstanceState(false);
@@ -517,18 +298,6 @@
         assertSame(bundle, mActivity.getBundle());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "setInTouchMode",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "sendPointerSync",
-            args = {MotionEvent.class}
-        )
-    })
     public void testSendPointerSync() throws Exception {
         mInstrumentation.waitForIdleSync();
         mInstrumentation.setInTouchMode(true);
@@ -551,11 +320,6 @@
         mActivity.setOnTouchEventCalled(false);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getComponentName",
-        args = {}
-    )
     public void testGetComponentName() throws Exception {
         ComponentName com = getInstrumentation().getComponentName();
         assertNotNull(com.getPackageName());
@@ -563,18 +327,6 @@
         assertNotNull(com.getShortClassName());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "newApplication",
-            args = {Class.class, Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "newApplication",
-            args = {ClassLoader.class, String.class, Context.class}
-        )
-    })
     public void testNewApplication() throws Exception {
         final String className = "android.app.cts.MockApplication";
         ClassLoader cl = getClass().getClassLoader();
@@ -586,11 +338,6 @@
         assertEquals(className, app.getClass().getName());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "runOnMainSync",
-        args = {Runnable.class}
-    )
     public void testRunOnMainSync() throws Exception {
         mRunOnMainSyncResult = false;
         mInstrumentation.runOnMainSync(new Runnable() {
@@ -602,11 +349,6 @@
         assertTrue(mRunOnMainSyncResult);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "callActivityOnPause",
-        args = {Activity.class}
-    )
     public void testCallActivityOnPause() throws Exception {
         mActivity.setOnPauseCalled(false);
         mInstrumentation.callActivityOnPause(mActivity);
@@ -614,11 +356,6 @@
         assertTrue(mActivity.isOnPauseCalled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "sendKeyDownUpSync",
-        args = {int.class}
-    )
     public void testSendKeyDownUpSync() throws Exception {
         mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_0);
         mInstrumentation.waitForIdleSync();
@@ -628,20 +365,6 @@
         assertEquals(KeyEvent.KEYCODE_0, mActivity.getKeyDownList().get(0).getKeyCode());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "newActivity",
-            args = {ClassLoader.class, String.class, Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "newActivity",
-            args = {Class.class, Context.class, IBinder.class, Application.class, Intent.class,
-                    ActivityInfo.class, CharSequence.class, Activity.class, String.class,
-                    Object.class}
-        )
-    })
     public void testNewActivity() throws Exception {
         Intent intent = new Intent();
         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -668,11 +391,6 @@
         activity.finish();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "callActivityOnStart",
-        args = {Activity.class}
-    )
     public void testCallActivityOnStart() throws Exception {
         mActivity.setOnStart(false);
         mInstrumentation.callActivityOnStart(mActivity);
@@ -680,11 +398,6 @@
         assertTrue(mActivity.isOnStart());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "waitForIdle",
-        args = {Runnable.class}
-    )
     public void testWaitForIdle() throws Exception {
         MockRunnable mr = new MockRunnable();
         assertFalse(mr.isRunCalled());
@@ -693,11 +406,6 @@
         assertTrue(mr.isRunCalled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "sendCharacterSync",
-        args = {int.class}
-    )
     public void testSendCharacterSync() throws Exception {
         mInstrumentation.sendCharacterSync(KeyEvent.KEYCODE_0);
         mInstrumentation.waitForIdleSync();
@@ -705,11 +413,6 @@
         assertEquals(KeyEvent.KEYCODE_0, mActivity.getKeyUpCode());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "callActivityOnRestart",
-        args = {Activity.class}
-    )
     public void testCallActivityOnRestart() throws Exception {
         mActivity.setOnRestart(false);
         mInstrumentation.callActivityOnRestart(mActivity);
@@ -717,11 +420,6 @@
         assertTrue(mActivity.isOnRestart());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "callActivityOnStop",
-        args = {Activity.class}
-    )
     public void testCallActivityOnStop() throws Exception {
         mActivity.setOnStop(false);
         mInstrumentation.callActivityOnStop(mActivity);
@@ -729,11 +427,6 @@
         assertTrue(mActivity.isOnStop());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "callActivityOnUserLeaving",
-        args = {Activity.class}
-    )
     public void testCallActivityOnUserLeaving() throws Exception {
         assertFalse(mActivity.isOnLeave());
         mInstrumentation.callActivityOnUserLeaving(mActivity);
@@ -741,11 +434,6 @@
         assertTrue(mActivity.isOnLeave());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "callActivityOnRestoreInstanceState",
-        args = {Activity.class, Bundle.class}
-    )
     public void testCallActivityOnRestoreInstanceState() throws Exception {
         mActivity.setOnRestoreInstanceState(false);
         mInstrumentation.callActivityOnRestoreInstanceState(mActivity, new Bundle());
@@ -753,11 +441,6 @@
         assertTrue(mActivity.isOnRestoreInstanceState());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "sendKeySync",
-        args = {KeyEvent.class}
-    )
     public void testSendKeySync() throws Exception {
         KeyEvent key = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_0);
         mInstrumentation.sendKeySync(key);
diff --git a/tests/tests/app/src/android/app/cts/Instrumentation_ActivityMonitorTest.java b/tests/tests/app/src/android/app/cts/Instrumentation_ActivityMonitorTest.java
index a4fc8cb..767142c 100644
--- a/tests/tests/app/src/android/app/cts/Instrumentation_ActivityMonitorTest.java
+++ b/tests/tests/app/src/android/app/cts/Instrumentation_ActivityMonitorTest.java
@@ -24,12 +24,7 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.test.InstrumentationTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(Instrumentation.ActivityMonitor.class)
 public class Instrumentation_ActivityMonitorTest extends InstrumentationTestCase {
 
     private static final long WAIT_TIMEOUT = 100;
@@ -40,53 +35,6 @@
      * 2 waitForActivity with timeout and no timeout
      * 3 get info about ActivityMonitor
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Instrumentation.ActivityMonitor",
-            args = {IntentFilter.class, ActivityResult.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Instrumentation.ActivityMonitor",
-            args = {String.class, ActivityResult.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFilter",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getResult",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isBlocking",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "waitForActivity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getHits",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLastActivity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "waitForActivityWithTimeout",
-            args = {long.class}
-        )
-    })
     public void testActivityMonitor() throws Exception {
         ActivityResult result = new ActivityResult(Activity.RESULT_OK, new Intent());
         Instrumentation instrumentation = getInstrumentation();
diff --git a/tests/tests/app/src/android/app/cts/Instrumentation_ActivityResultTest.java b/tests/tests/app/src/android/app/cts/Instrumentation_ActivityResultTest.java
index 50f7468..ce25157 100644
--- a/tests/tests/app/src/android/app/cts/Instrumentation_ActivityResultTest.java
+++ b/tests/tests/app/src/android/app/cts/Instrumentation_ActivityResultTest.java
@@ -21,31 +21,9 @@
 import android.app.Instrumentation.ActivityResult;
 import android.content.Intent;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(Instrumentation.ActivityResult.class)
 public class Instrumentation_ActivityResultTest extends AndroidTestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Instrumentation.ActivityResult",
-            args = {int.class, Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getResultCode",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getResultData",
-            args = {}
-        )
-    })
     public void testActivityResultOp() {
         Intent intent = new Intent();
         ActivityResult result = new ActivityResult(Activity.RESULT_OK, intent);
diff --git a/tests/tests/app/src/android/app/cts/IntentServiceTest.java b/tests/tests/app/src/android/app/cts/IntentServiceTest.java
index d844aa9..f175258 100644
--- a/tests/tests/app/src/android/app/cts/IntentServiceTest.java
+++ b/tests/tests/app/src/android/app/cts/IntentServiceTest.java
@@ -21,15 +21,10 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.ServiceConnection;
+import android.cts.util.PollingCheck;
 import android.os.IBinder;
-import android.view.animation.cts.DelayedCheck;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(IntentService.class)
 public class IntentServiceTest extends ActivityTestsBase {
 
     private Intent mIntent;
@@ -71,42 +66,10 @@
 
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStart",
-            args = {android.content.Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onDestroy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onHandleIntent",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onBind",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreate",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "IntentService",
-            args = {String.class}
-        )
-    })
     public void testIntentServiceLifeCycle() throws Throwable {
         // start service
         mContext.startService(mIntent);
-        new DelayedCheck(TIMEOUT_MSEC) {
+        new PollingCheck(TIMEOUT_MSEC) {
             protected boolean check() {
                 return IntentServiceStub.onHandleIntentCalled > 0;
             }
@@ -117,7 +80,7 @@
         // bind service
         ServiceConnection conn = new TestConnection();
         mContext.bindService(mIntent, conn, Context.BIND_AUTO_CREATE);
-        new DelayedCheck(TIMEOUT_MSEC) {
+        new PollingCheck(TIMEOUT_MSEC) {
             protected boolean check() {
                 return mConnected;
             }
diff --git a/tests/tests/app/src/android/app/cts/KeyguardManagerKeyguardLockTest.java b/tests/tests/app/src/android/app/cts/KeyguardManagerKeyguardLockTest.java
index aaad237..7a9f534 100644
--- a/tests/tests/app/src/android/app/cts/KeyguardManagerKeyguardLockTest.java
+++ b/tests/tests/app/src/android/app/cts/KeyguardManagerKeyguardLockTest.java
@@ -16,31 +16,15 @@
 
 package android.app.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.app.KeyguardManager;
 import android.test.InstrumentationTestCase;
 
-@TestTargetClass(KeyguardManager.KeyguardLock.class)
 public class KeyguardManagerKeyguardLockTest extends InstrumentationTestCase {
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        notes = "There is no method to enable the key guard in the emulator",
-        method = "disableKeyguard",
-        args = {}
-    )
     public void testDisableKeyguard() {
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        notes = "There is no method to enable the key guard in the emulator",
-        method = "reenableKeyguard",
-        args = {}
-    )
     public void testReenableKeyguard() {
     }
 }
diff --git a/tests/tests/app/src/android/app/cts/KeyguardManagerTest.java b/tests/tests/app/src/android/app/cts/KeyguardManagerTest.java
index 9e0b958..13264ac 100644
--- a/tests/tests/app/src/android/app/cts/KeyguardManagerTest.java
+++ b/tests/tests/app/src/android/app/cts/KeyguardManagerTest.java
@@ -16,15 +16,11 @@
 
 package android.app.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.app.KeyguardManager;
 import android.content.Context;
 import android.test.ActivityInstrumentationTestCase2;
 
-@TestTargetClass(KeyguardManager.class)
 public class KeyguardManagerTest
         extends ActivityInstrumentationTestCase2<KeyguardManagerActivity> {
 
@@ -34,12 +30,6 @@
         super("com.android.cts.stub", KeyguardManagerActivity.class);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test newKeyguardLock",
-        method = "newKeyguardLock",
-        args = {java.lang.String.class}
-    )
     public void testNewKeyguardLock() {
         final Context c = getInstrumentation().getContext();
         final KeyguardManager keyguardManager = (KeyguardManager) c.getSystemService(
@@ -48,21 +38,9 @@
         assertNotNull(keyLock);
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        notes = "There is no method to enable the key guard in the emulator",
-        method = "inKeyguardRestrictedInputMode",
-        args = {}
-    )
     public void testInKeyguardRestrictedInputMode() {
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        notes = "There is no method to enable the key guard in the emulator",
-        method = "exitKeyguardSecurely",
-        args = {android.app.KeyguardManager.OnKeyguardExitResult.class}
-    )
     public void testExitKeyguardSecurely() {
     }
 }
diff --git a/tests/tests/app/src/android/app/cts/LaunchTest.java b/tests/tests/app/src/android/app/cts/LaunchTest.java
index 4c2f3f4..26cdc20 100644
--- a/tests/tests/app/src/android/app/cts/LaunchTest.java
+++ b/tests/tests/app/src/android/app/cts/LaunchTest.java
@@ -38,4783 +38,39 @@
 import android.view.ViewGroup;
 import android.view.ContextMenu.ContextMenuInfo;
 import android.view.WindowManager.LayoutParams;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(Activity.class)
 public class LaunchTest extends ActivityTestsBase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Activity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUserInteraction",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUserLeaveHint",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVisible",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "closeContextMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finalize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInstanceCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIntent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getApplication",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setIntent",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isChild",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getParent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWindowManager",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWindow",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrentFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWallpaperDesiredMinimumWidth",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWallpaperDesiredMinimumHeight",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestoreInstanceState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPostCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onResume",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPostResume",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onNewIntent",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSaveInstanceState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPause",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateThumbnail",
-            args = {Bitmap.class, Canvas.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateDescription",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onDestroy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onConfigurationChanged",
-            args = {android.content.res.Configuration.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getChangingConfigurations",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLastNonConfigurationInstance",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRetainNonConfigurationInstance",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onLowMemory",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedQuery",
-            args = {Uri.class, String[].class, String.class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedQuery",
-            args = {Uri.class, String[].class, String.class, String[].class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedCommitUpdates",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startManagingCursor",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stopManagingCursor",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPersistent",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "findViewById",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {View.class, ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addContentView",
-            args = {View.class, ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDefaultKeyMode",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyDown",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyUp",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyMultiple",
-            args = {int.class, int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTouchEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTrackballEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onWindowAttributesChanged",
-            args = {LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContentChanged",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onWindowFocusChanged",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasWindowFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchKeyEvent",
-            args = {KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchTouchEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchTrackballEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreatePanelView",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreatePanelMenu",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPreparePanel",
-            args = {int.class, View.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onMenuOpened",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onMenuItemSelected",
-            args = {int.class, MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPanelClosed",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateOptionsMenu",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPrepareOptionsMenu",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onOptionsItemSelected",
-            args = {MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onOptionsMenuClosed",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openOptionsMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "closeOptionsMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateContextMenu",
-            args = {ContextMenu.class, View.class, ContextMenuInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "registerForContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unregisterForContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContextItemSelected",
-            args = {MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContextMenuClosed",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPrepareDialog",
-            args = {int.class, Dialog.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "showDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dismissDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSearchRequested",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startSearch",
-            args = {String.class, boolean.class, Bundle.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "takeKeyEvents",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requestWindowFeature",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableResource",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableUri",
-            args = {int.class, Uri.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawable",
-            args = {int.class, Drawable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableAlpha",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLayoutInflater",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMenuInflater",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onApplyThemeResource",
-            args = {Theme.class, int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityForResult",
-            args = {Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivity",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityIfNeeded",
-            args = {Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startNextMatchingActivity",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityFromChild",
-            args = {Activity.class, Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResult",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResult",
-            args = {int.class, Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCallingPackage",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCallingActivity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isFinishing",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finish",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishFromChild",
-            args = {Activity.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishActivity",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishActivityFromChild",
-            args = {Activity.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onActivityResult",
-            args = {int.class, int.class, Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createPendingResult",
-            args = {int.class, Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRequestedOrientation",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRequestedOrientation",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTaskId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isTaskRoot",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "moveTaskToBack",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLocalClassName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getComponentName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPreferences",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSystemService",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitle",
-            args = {CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitle",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitleColor",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitle",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitleColor",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTitleChanged",
-            args = {CharSequence.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onChildTitleChanged",
-            args = {Activity.class, CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarVisibility",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarIndeterminateVisibility",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarIndeterminate",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgress",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSecondaryProgress",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVolumeControlStream",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getVolumeControlStream",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "runOnUiThread",
-            args = {Runnable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateView",
-            args = {String.class, Context.class, AttributeSet.class}
-        )
-    })
     public void testClearTopWhilResumed() {
         mIntent.putExtra("component", new ComponentName(getContext(), ClearTop.class));
         mIntent.putExtra(ClearTop.WAIT_CLEAR_TASK, true);
         runLaunchpad(LaunchpadActivity.LAUNCH);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Activity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUserInteraction",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUserLeaveHint",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVisible",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "closeContextMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finalize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInstanceCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIntent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setIntent",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getApplication",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isChild",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getParent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWindowManager",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWindow",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrentFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWallpaperDesiredMinimumWidth",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWallpaperDesiredMinimumHeight",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestoreInstanceState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPostCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onResume",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPostResume",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onNewIntent",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSaveInstanceState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPause",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateThumbnail",
-            args = {Bitmap.class, Canvas.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateDescription",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onDestroy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onConfigurationChanged",
-            args = {android.content.res.Configuration.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getChangingConfigurations",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLastNonConfigurationInstance",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRetainNonConfigurationInstance",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onLowMemory",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedQuery",
-            args = {Uri.class, String[].class, String.class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedQuery",
-            args = {Uri.class, String[].class, String.class, String[].class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedCommitUpdates",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startManagingCursor",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stopManagingCursor",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPersistent",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "findViewById",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {View.class, ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addContentView",
-            args = {View.class, ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDefaultKeyMode",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyDown",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyUp",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyMultiple",
-            args = {int.class, int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTouchEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTrackballEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onWindowAttributesChanged",
-            args = {LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContentChanged",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onWindowFocusChanged",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasWindowFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchKeyEvent",
-            args = {KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchTouchEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchTrackballEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreatePanelView",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreatePanelMenu",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPreparePanel",
-            args = {int.class, View.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onMenuOpened",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onMenuItemSelected",
-            args = {int.class, MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPanelClosed",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateOptionsMenu",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPrepareOptionsMenu",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onOptionsItemSelected",
-            args = {MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onOptionsMenuClosed",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openOptionsMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "closeOptionsMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateContextMenu",
-            args = {ContextMenu.class, View.class, ContextMenuInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "registerForContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unregisterForContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContextItemSelected",
-            args = {MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContextMenuClosed",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPrepareDialog",
-            args = {int.class, Dialog.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "showDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dismissDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSearchRequested",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startSearch",
-            args = {String.class, boolean.class, Bundle.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "takeKeyEvents",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requestWindowFeature",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableResource",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableUri",
-            args = {int.class, Uri.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawable",
-            args = {int.class, Drawable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableAlpha",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLayoutInflater",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMenuInflater",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onApplyThemeResource",
-            args = {Theme.class, int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityForResult",
-            args = {Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivity",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityIfNeeded",
-            args = {Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startNextMatchingActivity",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityFromChild",
-            args = {Activity.class, Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResult",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResult",
-            args = {int.class, Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCallingPackage",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCallingActivity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isFinishing",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finish",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishFromChild",
-            args = {Activity.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishActivity",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishActivityFromChild",
-            args = {Activity.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onActivityResult",
-            args = {int.class, int.class, Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createPendingResult",
-            args = {int.class, Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRequestedOrientation",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRequestedOrientation",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTaskId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isTaskRoot",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "moveTaskToBack",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLocalClassName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getComponentName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPreferences",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSystemService",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitle",
-            args = {CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitle",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitleColor",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitle",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitleColor",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTitleChanged",
-            args = {CharSequence.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onChildTitleChanged",
-            args = {Activity.class, CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarVisibility",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarIndeterminateVisibility",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarIndeterminate",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgress",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSecondaryProgress",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVolumeControlStream",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getVolumeControlStream",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "runOnUiThread",
-            args = {Runnable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateView",
-            args = {String.class, Context.class, AttributeSet.class}
-        )
-    })
     public void testClearTopInCreate() throws Exception {
         mIntent.putExtra("component", new ComponentName(getContext(), ClearTop.class));
         runLaunchpad(LaunchpadActivity.LAUNCH);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Activity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUserInteraction",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUserLeaveHint",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVisible",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "closeContextMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finalize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInstanceCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIntent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setIntent",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getApplication",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isChild",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getParent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWindowManager",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWindow",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrentFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWallpaperDesiredMinimumWidth",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWallpaperDesiredMinimumHeight",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestoreInstanceState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPostCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onResume",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPostResume",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onNewIntent",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSaveInstanceState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPause",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateThumbnail",
-            args = {Bitmap.class, Canvas.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateDescription",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onDestroy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onConfigurationChanged",
-            args = {android.content.res.Configuration.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getChangingConfigurations",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLastNonConfigurationInstance",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRetainNonConfigurationInstance",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onLowMemory",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedQuery",
-            args = {Uri.class, String[].class, String.class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedQuery",
-            args = {Uri.class, String[].class, String.class, String[].class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedCommitUpdates",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startManagingCursor",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stopManagingCursor",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPersistent",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "findViewById",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {View.class, ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addContentView",
-            args = {View.class, ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDefaultKeyMode",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyDown",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyUp",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyMultiple",
-            args = {int.class, int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTouchEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTrackballEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onWindowAttributesChanged",
-            args = {LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContentChanged",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onWindowFocusChanged",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasWindowFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchKeyEvent",
-            args = {KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchTouchEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchTrackballEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreatePanelView",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreatePanelMenu",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPreparePanel",
-            args = {int.class, View.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onMenuOpened",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onMenuItemSelected",
-            args = {int.class, MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPanelClosed",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateOptionsMenu",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPrepareOptionsMenu",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onOptionsItemSelected",
-            args = {MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onOptionsMenuClosed",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openOptionsMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "closeOptionsMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateContextMenu",
-            args = {ContextMenu.class, View.class, ContextMenuInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "registerForContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unregisterForContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContextItemSelected",
-            args = {MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContextMenuClosed",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPrepareDialog",
-            args = {int.class, Dialog.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "showDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dismissDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSearchRequested",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startSearch",
-            args = {String.class, boolean.class, Bundle.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "takeKeyEvents",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requestWindowFeature",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableResource",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableUri",
-            args = {int.class, Uri.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawable",
-            args = {int.class, Drawable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableAlpha",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLayoutInflater",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMenuInflater",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onApplyThemeResource",
-            args = {Theme.class, int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityForResult",
-            args = {Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivity",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityIfNeeded",
-            args = {Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startNextMatchingActivity",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityFromChild",
-            args = {Activity.class, Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResult",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResult",
-            args = {int.class, Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCallingPackage",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCallingActivity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isFinishing",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finish",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishFromChild",
-            args = {Activity.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishActivity",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishActivityFromChild",
-            args = {Activity.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onActivityResult",
-            args = {int.class, int.class, Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createPendingResult",
-            args = {int.class, Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRequestedOrientation",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRequestedOrientation",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTaskId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isTaskRoot",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "moveTaskToBack",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLocalClassName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getComponentName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPreferences",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSystemService",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitle",
-            args = {CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitle",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitleColor",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitle",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitleColor",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTitleChanged",
-            args = {CharSequence.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onChildTitleChanged",
-            args = {Activity.class, CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarVisibility",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarIndeterminateVisibility",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarIndeterminate",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgress",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSecondaryProgress",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVolumeControlStream",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getVolumeControlStream",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "runOnUiThread",
-            args = {Runnable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateView",
-            args = {String.class, Context.class, AttributeSet.class}
-        )
-    })
     public void testForwardResult() {
         runLaunchpad(LaunchpadActivity.FORWARD_RESULT);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Activity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUserInteraction",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUserLeaveHint",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVisible",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "closeContextMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finalize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInstanceCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIntent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setIntent",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getApplication",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isChild",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getParent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWindowManager",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWindow",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrentFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWallpaperDesiredMinimumWidth",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWallpaperDesiredMinimumHeight",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestoreInstanceState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPostCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onResume",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPostResume",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onNewIntent",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSaveInstanceState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPause",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateThumbnail",
-            args = {Bitmap.class, Canvas.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateDescription",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onDestroy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onConfigurationChanged",
-            args = {android.content.res.Configuration.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getChangingConfigurations",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLastNonConfigurationInstance",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRetainNonConfigurationInstance",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onLowMemory",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedQuery",
-            args = {Uri.class, String[].class, String.class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedQuery",
-            args = {Uri.class, String[].class, String.class, String[].class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedCommitUpdates",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startManagingCursor",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stopManagingCursor",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPersistent",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "findViewById",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {View.class, ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addContentView",
-            args = {View.class, ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDefaultKeyMode",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyDown",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyUp",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyMultiple",
-            args = {int.class, int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTouchEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTrackballEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onWindowAttributesChanged",
-            args = {LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContentChanged",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onWindowFocusChanged",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasWindowFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchKeyEvent",
-            args = {KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchTouchEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchTrackballEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreatePanelView",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreatePanelMenu",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPreparePanel",
-            args = {int.class, View.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onMenuOpened",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onMenuItemSelected",
-            args = {int.class, MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPanelClosed",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateOptionsMenu",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPrepareOptionsMenu",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onOptionsItemSelected",
-            args = {MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onOptionsMenuClosed",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openOptionsMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "closeOptionsMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateContextMenu",
-            args = {ContextMenu.class, View.class, ContextMenuInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "registerForContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unregisterForContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContextItemSelected",
-            args = {MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContextMenuClosed",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPrepareDialog",
-            args = {int.class, Dialog.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "showDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dismissDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSearchRequested",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startSearch",
-            args = {String.class, boolean.class, Bundle.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "takeKeyEvents",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requestWindowFeature",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableResource",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableUri",
-            args = {int.class, Uri.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawable",
-            args = {int.class, Drawable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableAlpha",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLayoutInflater",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMenuInflater",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onApplyThemeResource",
-            args = {Theme.class, int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityForResult",
-            args = {Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivity",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityIfNeeded",
-            args = {Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startNextMatchingActivity",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityFromChild",
-            args = {Activity.class, Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResult",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResult",
-            args = {int.class, Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCallingPackage",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCallingActivity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isFinishing",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finish",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishFromChild",
-            args = {Activity.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishActivity",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishActivityFromChild",
-            args = {Activity.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onActivityResult",
-            args = {int.class, int.class, Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createPendingResult",
-            args = {int.class, Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRequestedOrientation",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRequestedOrientation",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTaskId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isTaskRoot",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "moveTaskToBack",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLocalClassName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getComponentName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPreferences",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSystemService",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitle",
-            args = {CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitle",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitleColor",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitle",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitleColor",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTitleChanged",
-            args = {CharSequence.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onChildTitleChanged",
-            args = {Activity.class, CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarVisibility",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarIndeterminateVisibility",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarIndeterminate",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgress",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSecondaryProgress",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVolumeControlStream",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getVolumeControlStream",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "runOnUiThread",
-            args = {Runnable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateView",
-            args = {String.class, Context.class, AttributeSet.class}
-        )
-    })
     public void testLocalScreen() {
         mIntent.putExtra("component", new ComponentName(getContext(), LocalScreen.class));
         runLaunchpad(LaunchpadActivity.LAUNCH);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Activity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUserInteraction",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUserLeaveHint",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVisible",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "closeContextMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finalize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInstanceCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIntent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setIntent",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getApplication",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isChild",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getParent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWindowManager",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWindow",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrentFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWallpaperDesiredMinimumWidth",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWallpaperDesiredMinimumHeight",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestoreInstanceState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPostCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onResume",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPostResume",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onNewIntent",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSaveInstanceState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPause",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateThumbnail",
-            args = {Bitmap.class, Canvas.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateDescription",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onDestroy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onConfigurationChanged",
-            args = {android.content.res.Configuration.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getChangingConfigurations",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLastNonConfigurationInstance",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRetainNonConfigurationInstance",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onLowMemory",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedQuery",
-            args = {Uri.class, String[].class, String.class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedQuery",
-            args = {Uri.class, String[].class, String.class, String[].class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedCommitUpdates",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startManagingCursor",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stopManagingCursor",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPersistent",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "findViewById",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {View.class, ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addContentView",
-            args = {View.class, ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDefaultKeyMode",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyDown",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyUp",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyMultiple",
-            args = {int.class, int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTouchEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTrackballEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onWindowAttributesChanged",
-            args = {LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContentChanged",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onWindowFocusChanged",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasWindowFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchKeyEvent",
-            args = {KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchTouchEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchTrackballEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreatePanelView",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreatePanelMenu",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPreparePanel",
-            args = {int.class, View.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onMenuOpened",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onMenuItemSelected",
-            args = {int.class, MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPanelClosed",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateOptionsMenu",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPrepareOptionsMenu",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onOptionsItemSelected",
-            args = {MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onOptionsMenuClosed",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openOptionsMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "closeOptionsMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateContextMenu",
-            args = {ContextMenu.class, View.class, ContextMenuInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "registerForContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unregisterForContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContextItemSelected",
-            args = {MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContextMenuClosed",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPrepareDialog",
-            args = {int.class, Dialog.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "showDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dismissDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSearchRequested",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startSearch",
-            args = {String.class, boolean.class, Bundle.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "takeKeyEvents",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requestWindowFeature",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableResource",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableUri",
-            args = {int.class, Uri.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawable",
-            args = {int.class, Drawable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableAlpha",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLayoutInflater",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMenuInflater",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onApplyThemeResource",
-            args = {Theme.class, int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityForResult",
-            args = {Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivity",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityIfNeeded",
-            args = {Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startNextMatchingActivity",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityFromChild",
-            args = {Activity.class, Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResult",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResult",
-            args = {int.class, Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCallingPackage",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCallingActivity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isFinishing",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finish",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishFromChild",
-            args = {Activity.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishActivity",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishActivityFromChild",
-            args = {Activity.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onActivityResult",
-            args = {int.class, int.class, Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createPendingResult",
-            args = {int.class, Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRequestedOrientation",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRequestedOrientation",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTaskId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isTaskRoot",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "moveTaskToBack",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLocalClassName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getComponentName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPreferences",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSystemService",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitle",
-            args = {CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitle",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitleColor",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitle",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitleColor",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTitleChanged",
-            args = {CharSequence.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onChildTitleChanged",
-            args = {Activity.class, CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarVisibility",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarIndeterminateVisibility",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarIndeterminate",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgress",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSecondaryProgress",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVolumeControlStream",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getVolumeControlStream",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "runOnUiThread",
-            args = {Runnable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateView",
-            args = {String.class, Context.class, AttributeSet.class}
-        )
-    })
     public void testColdScreen() {
         mIntent.putExtra("component", new ComponentName(getContext(), TestedScreen.class));
         runLaunchpad(LaunchpadActivity.LAUNCH);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Activity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUserInteraction",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUserLeaveHint",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVisible",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "closeContextMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finalize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInstanceCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIntent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setIntent",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getApplication",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isChild",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getParent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWindowManager",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWindow",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrentFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWallpaperDesiredMinimumWidth",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWallpaperDesiredMinimumHeight",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestoreInstanceState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPostCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onResume",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPostResume",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onNewIntent",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSaveInstanceState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPause",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateThumbnail",
-            args = {Bitmap.class, Canvas.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateDescription",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onDestroy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onConfigurationChanged",
-            args = {android.content.res.Configuration.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getChangingConfigurations",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLastNonConfigurationInstance",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRetainNonConfigurationInstance",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onLowMemory",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedQuery",
-            args = {Uri.class, String[].class, String.class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedQuery",
-            args = {Uri.class, String[].class, String.class, String[].class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedCommitUpdates",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startManagingCursor",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stopManagingCursor",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPersistent",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "findViewById",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {View.class, ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addContentView",
-            args = {View.class, ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDefaultKeyMode",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyDown",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyUp",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyMultiple",
-            args = {int.class, int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTouchEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTrackballEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onWindowAttributesChanged",
-            args = {LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContentChanged",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onWindowFocusChanged",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasWindowFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchKeyEvent",
-            args = {KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchTouchEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchTrackballEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreatePanelView",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreatePanelMenu",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPreparePanel",
-            args = {int.class, View.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onMenuOpened",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onMenuItemSelected",
-            args = {int.class, MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPanelClosed",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateOptionsMenu",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPrepareOptionsMenu",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onOptionsItemSelected",
-            args = {MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onOptionsMenuClosed",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openOptionsMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "closeOptionsMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateContextMenu",
-            args = {ContextMenu.class, View.class, ContextMenuInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "registerForContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unregisterForContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContextItemSelected",
-            args = {MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContextMenuClosed",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPrepareDialog",
-            args = {int.class, Dialog.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "showDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dismissDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSearchRequested",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startSearch",
-            args = {String.class, boolean.class, Bundle.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "takeKeyEvents",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requestWindowFeature",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableResource",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableUri",
-            args = {int.class, Uri.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawable",
-            args = {int.class, Drawable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableAlpha",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLayoutInflater",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMenuInflater",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onApplyThemeResource",
-            args = {Theme.class, int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityForResult",
-            args = {Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivity",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityIfNeeded",
-            args = {Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startNextMatchingActivity",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityFromChild",
-            args = {Activity.class, Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResult",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResult",
-            args = {int.class, Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCallingPackage",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCallingActivity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isFinishing",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finish",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishFromChild",
-            args = {Activity.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishActivity",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishActivityFromChild",
-            args = {Activity.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onActivityResult",
-            args = {int.class, int.class, Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createPendingResult",
-            args = {int.class, Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRequestedOrientation",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRequestedOrientation",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTaskId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isTaskRoot",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "moveTaskToBack",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLocalClassName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getComponentName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPreferences",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSystemService",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitle",
-            args = {CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitle",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitleColor",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitle",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitleColor",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTitleChanged",
-            args = {CharSequence.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onChildTitleChanged",
-            args = {Activity.class, CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarVisibility",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarIndeterminateVisibility",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarIndeterminate",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgress",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSecondaryProgress",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVolumeControlStream",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getVolumeControlStream",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "runOnUiThread",
-            args = {Runnable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateView",
-            args = {String.class, Context.class, AttributeSet.class}
-        )
-    })
     public void testLocalActivity() {
         mIntent.putExtra("component", new ComponentName(getContext(), LocalActivity.class));
         runLaunchpad(LaunchpadActivity.LAUNCH);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Activity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUserInteraction",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUserLeaveHint",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVisible",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "closeContextMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finalize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInstanceCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIntent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setIntent",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getApplication",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isChild",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getParent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWindowManager",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWindow",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrentFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWallpaperDesiredMinimumWidth",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWallpaperDesiredMinimumHeight",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestoreInstanceState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPostCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onResume",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPostResume",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onNewIntent",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSaveInstanceState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPause",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateThumbnail",
-            args = {Bitmap.class, Canvas.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateDescription",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onDestroy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onConfigurationChanged",
-            args = {android.content.res.Configuration.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getChangingConfigurations",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLastNonConfigurationInstance",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRetainNonConfigurationInstance",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onLowMemory",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedQuery",
-            args = {Uri.class, String[].class, String.class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedQuery",
-            args = {Uri.class, String[].class, String.class, String[].class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedCommitUpdates",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startManagingCursor",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stopManagingCursor",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPersistent",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "findViewById",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {View.class, ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addContentView",
-            args = {View.class, ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDefaultKeyMode",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyDown",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyUp",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyMultiple",
-            args = {int.class, int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTouchEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTrackballEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onWindowAttributesChanged",
-            args = {LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContentChanged",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onWindowFocusChanged",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasWindowFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchKeyEvent",
-            args = {KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchTouchEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchTrackballEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreatePanelView",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreatePanelMenu",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPreparePanel",
-            args = {int.class, View.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onMenuOpened",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onMenuItemSelected",
-            args = {int.class, MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPanelClosed",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateOptionsMenu",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPrepareOptionsMenu",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onOptionsItemSelected",
-            args = {MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onOptionsMenuClosed",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openOptionsMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "closeOptionsMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateContextMenu",
-            args = {ContextMenu.class, View.class, ContextMenuInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "registerForContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unregisterForContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContextItemSelected",
-            args = {MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContextMenuClosed",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPrepareDialog",
-            args = {int.class, Dialog.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "showDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dismissDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSearchRequested",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startSearch",
-            args = {String.class, boolean.class, Bundle.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "takeKeyEvents",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requestWindowFeature",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableResource",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableUri",
-            args = {int.class, Uri.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawable",
-            args = {int.class, Drawable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableAlpha",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLayoutInflater",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMenuInflater",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onApplyThemeResource",
-            args = {Theme.class, int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityForResult",
-            args = {Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivity",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityIfNeeded",
-            args = {Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startNextMatchingActivity",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityFromChild",
-            args = {Activity.class, Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResult",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResult",
-            args = {int.class, Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCallingPackage",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCallingActivity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isFinishing",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finish",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishFromChild",
-            args = {Activity.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishActivity",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishActivityFromChild",
-            args = {Activity.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onActivityResult",
-            args = {int.class, int.class, Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createPendingResult",
-            args = {int.class, Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRequestedOrientation",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRequestedOrientation",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTaskId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isTaskRoot",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "moveTaskToBack",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLocalClassName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getComponentName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPreferences",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSystemService",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitle",
-            args = {CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitle",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitleColor",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitle",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitleColor",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTitleChanged",
-            args = {CharSequence.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onChildTitleChanged",
-            args = {Activity.class, CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarVisibility",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarIndeterminateVisibility",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarIndeterminate",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgress",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSecondaryProgress",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVolumeControlStream",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getVolumeControlStream",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "runOnUiThread",
-            args = {Runnable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateView",
-            args = {String.class, Context.class, AttributeSet.class}
-        )
-    })
     public void testColdActivity() {
         mIntent.putExtra("component", new ComponentName(getContext(), TestedActivity.class));
         runLaunchpad(LaunchpadActivity.LAUNCH);
diff --git a/tests/tests/app/src/android/app/cts/LauncherActivityTest.java b/tests/tests/app/src/android/app/cts/LauncherActivityTest.java
index 4e5e7d4..a7e0481 100644
--- a/tests/tests/app/src/android/app/cts/LauncherActivityTest.java
+++ b/tests/tests/app/src/android/app/cts/LauncherActivityTest.java
@@ -16,10 +16,6 @@
 
 package android.app.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.app.Instrumentation;
 import android.app.LauncherActivity;
@@ -30,7 +26,6 @@
 
 import java.util.List;
 
-@TestTargetClass(LauncherActivity.class)
 public class LauncherActivityTest extends InstrumentationTestCase {
     private Instrumentation mInstrumentation;
     private LauncherActivityStub mActivity;
@@ -51,38 +46,6 @@
         super.tearDown();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "LauncherActivity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTargetIntent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "makeListItems",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreate",
-            args = {android.os.Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onListItemClick",
-            args = {android.widget.ListView.class, android.view.View.class, int.class, long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "intentForPosition",
-            args = {int.class}
-        )
-    })
     public void testLaunchActivity() {
         // Constructor of LaunchActivity can't be invoked directly.
         new LauncherActivityStub();
diff --git a/tests/tests/app/src/android/app/cts/LauncherActivity_IconResizerTest.java b/tests/tests/app/src/android/app/cts/LauncherActivity_IconResizerTest.java
index 196d2d4..695050a 100644
--- a/tests/tests/app/src/android/app/cts/LauncherActivity_IconResizerTest.java
+++ b/tests/tests/app/src/android/app/cts/LauncherActivity_IconResizerTest.java
@@ -18,17 +18,12 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.app.LauncherActivity;
 import android.app.LauncherActivity.IconResizer;
 import android.graphics.drawable.Drawable;
 import android.test.ActivityInstrumentationTestCase2;
 
-@TestTargetClass(LauncherActivity.IconResizer.class)
 public class LauncherActivity_IconResizerTest extends
         ActivityInstrumentationTestCase2<LauncherActivityStub> {
 
@@ -45,18 +40,6 @@
         mActivity = getActivity();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createIconThumbnail",
-            args = {Drawable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "LauncherActivity.IconResizer",
-            args = {}
-        )
-    })
     public void testIconResizer() throws Throwable {
         final IconResizer ir = mActivity.new IconResizer();
         final Drawable d = mActivity.getResources().getDrawable(R.drawable.pass);
diff --git a/tests/tests/app/src/android/app/cts/LauncherActivity_ListItemTest.java b/tests/tests/app/src/android/app/cts/LauncherActivity_ListItemTest.java
index 784071f..14ef831 100644
--- a/tests/tests/app/src/android/app/cts/LauncherActivity_ListItemTest.java
+++ b/tests/tests/app/src/android/app/cts/LauncherActivity_ListItemTest.java
@@ -16,21 +16,11 @@
 
 package android.app.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.app.LauncherActivity;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(LauncherActivity.ListItem.class)
 public class LauncherActivity_ListItemTest extends AndroidTestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test ListItem",
-        method = "LauncherActivity.ListItem",
-        args = {}
-    )
     public void testConstructor() {
         // Test public constructor
         new LauncherActivity.ListItem();
diff --git a/tests/tests/app/src/android/app/cts/LifecycleTest.java b/tests/tests/app/src/android/app/cts/LifecycleTest.java
index aa28628..5d2ded7 100644
--- a/tests/tests/app/src/android/app/cts/LifecycleTest.java
+++ b/tests/tests/app/src/android/app/cts/LifecycleTest.java
@@ -17,10 +17,6 @@
 
 package android.app.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.app.Activity;
 import android.app.Dialog;
@@ -46,7 +42,6 @@
 import android.view.ContextMenu.ContextMenuInfo;
 import android.view.WindowManager.LayoutParams;
 
-@TestTargetClass(Activity.class)
 public class LifecycleTest extends ActivityTestsBase {
     private Intent mTopIntent;
     private Intent mTabIntent;
@@ -59,4094 +54,31 @@
         mTabIntent.putExtra("tab", new ComponentName(mContext, LaunchpadActivity.class));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Activity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUserInteraction",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUserLeaveHint",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVisible",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "closeContextMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finalize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInstanceCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIntent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setIntent",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getApplication",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isChild",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getParent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWindowManager",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWindow",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrentFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWallpaperDesiredMinimumWidth",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWallpaperDesiredMinimumHeight",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestoreInstanceState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPostCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onResume",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPostResume",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onNewIntent",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSaveInstanceState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPause",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateThumbnail",
-            args = {Bitmap.class, Canvas.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateDescription",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onDestroy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onConfigurationChanged",
-            args = {Configuration.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getChangingConfigurations",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLastNonConfigurationInstance",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRetainNonConfigurationInstance",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onLowMemory",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedQuery",
-            args = {Uri.class, String[].class, String.class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedQuery",
-            args = {Uri.class, String[].class, String.class, String[].class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedCommitUpdates",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startManagingCursor",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stopManagingCursor",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPersistent",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "findViewById",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {View.class, ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addContentView",
-            args = {View.class, ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDefaultKeyMode",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyDown",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyUp",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyMultiple",
-            args = {int.class, int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTouchEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTrackballEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onWindowAttributesChanged",
-            args = {LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContentChanged",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onWindowFocusChanged",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasWindowFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchKeyEvent",
-            args = {KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchTouchEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchTrackballEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreatePanelView",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreatePanelMenu",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPreparePanel",
-            args = {int.class, View.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onMenuOpened",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onMenuItemSelected",
-            args = {int.class, MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPanelClosed",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateOptionsMenu",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPrepareOptionsMenu",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onOptionsItemSelected",
-            args = {MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onOptionsMenuClosed",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openOptionsMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "closeOptionsMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateContextMenu",
-            args = {ContextMenu.class, View.class, ContextMenuInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "registerForContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unregisterForContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContextItemSelected",
-            args = {MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContextMenuClosed",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPrepareDialog",
-            args = {int.class, Dialog.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "showDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dismissDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSearchRequested",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startSearch",
-            args = {String.class, boolean.class, Bundle.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "takeKeyEvents",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requestWindowFeature",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableResource",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableUri",
-            args = {int.class, Uri.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawable",
-            args = {int.class, Drawable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableAlpha",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLayoutInflater",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMenuInflater",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onApplyThemeResource",
-            args = {Theme.class, int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityForResult",
-            args = {Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivity",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityIfNeeded",
-            args = {Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startNextMatchingActivity",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityFromChild",
-            args = {Activity.class, Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResult",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResult",
-            args = {int.class, Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCallingPackage",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCallingActivity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isFinishing",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finish",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishFromChild",
-            args = {Activity.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishActivity",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishActivityFromChild",
-            args = {Activity.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onActivityResult",
-            args = {int.class, int.class, Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createPendingResult",
-            args = {int.class, Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRequestedOrientation",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRequestedOrientation",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTaskId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isTaskRoot",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "moveTaskToBack",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLocalClassName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getComponentName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPreferences",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSystemService",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitle",
-            args = {CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitle",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitleColor",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitle",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitleColor",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTitleChanged",
-            args = {CharSequence.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onChildTitleChanged",
-            args = {Activity.class, CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarVisibility",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarIndeterminateVisibility",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarIndeterminate",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgress",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSecondaryProgress",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVolumeControlStream",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getVolumeControlStream",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "runOnUiThread",
-            args = {Runnable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateView",
-            args = {String.class, Context.class, AttributeSet.class}
-        )
-    })
     public void testTabDialog() {
         mIntent = mTabIntent;
         runLaunchpad(LaunchpadActivity.LIFECYCLE_DIALOG);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Activity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUserInteraction",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUserLeaveHint",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVisible",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "closeContextMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finalize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInstanceCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIntent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setIntent",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getApplication",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isChild",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getParent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWindowManager",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWindow",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrentFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWallpaperDesiredMinimumWidth",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWallpaperDesiredMinimumHeight",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestoreInstanceState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPostCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onResume",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPostResume",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onNewIntent",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSaveInstanceState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPause",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateThumbnail",
-            args = {Bitmap.class, Canvas.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateDescription",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onDestroy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onConfigurationChanged",
-            args = {Configuration.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getChangingConfigurations",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLastNonConfigurationInstance",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRetainNonConfigurationInstance",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onLowMemory",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedQuery",
-            args = {Uri.class, String[].class, String.class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedQuery",
-            args = {Uri.class, String[].class, String.class, String[].class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedCommitUpdates",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startManagingCursor",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stopManagingCursor",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPersistent",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "findViewById",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {View.class, ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addContentView",
-            args = {View.class, ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDefaultKeyMode",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyDown",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyUp",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyMultiple",
-            args = {int.class, int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTouchEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTrackballEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onWindowAttributesChanged",
-            args = {LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContentChanged",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onWindowFocusChanged",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasWindowFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchKeyEvent",
-            args = {KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchTouchEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchTrackballEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreatePanelView",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreatePanelMenu",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPreparePanel",
-            args = {int.class, View.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onMenuOpened",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onMenuItemSelected",
-            args = {int.class, MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPanelClosed",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateOptionsMenu",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPrepareOptionsMenu",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onOptionsItemSelected",
-            args = {MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onOptionsMenuClosed",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openOptionsMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "closeOptionsMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateContextMenu",
-            args = {ContextMenu.class, View.class, ContextMenuInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "registerForContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unregisterForContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContextItemSelected",
-            args = {MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContextMenuClosed",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPrepareDialog",
-            args = {int.class, Dialog.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "showDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dismissDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSearchRequested",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startSearch",
-            args = {String.class, boolean.class, Bundle.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "takeKeyEvents",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requestWindowFeature",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableResource",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableUri",
-            args = {int.class, Uri.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawable",
-            args = {int.class, Drawable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableAlpha",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLayoutInflater",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMenuInflater",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onApplyThemeResource",
-            args = {Theme.class, int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityForResult",
-            args = {Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivity",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityIfNeeded",
-            args = {Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startNextMatchingActivity",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityFromChild",
-            args = {Activity.class, Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResult",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResult",
-            args = {int.class, Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCallingPackage",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCallingActivity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isFinishing",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finish",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishFromChild",
-            args = {Activity.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishActivity",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishActivityFromChild",
-            args = {Activity.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onActivityResult",
-            args = {int.class, int.class, Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createPendingResult",
-            args = {int.class, Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRequestedOrientation",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRequestedOrientation",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTaskId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isTaskRoot",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "moveTaskToBack",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLocalClassName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getComponentName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPreferences",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSystemService",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitle",
-            args = {CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitle",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitleColor",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitle",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitleColor",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTitleChanged",
-            args = {CharSequence.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onChildTitleChanged",
-            args = {Activity.class, CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarVisibility",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarIndeterminateVisibility",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarIndeterminate",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgress",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSecondaryProgress",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVolumeControlStream",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getVolumeControlStream",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "runOnUiThread",
-            args = {Runnable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateView",
-            args = {String.class, Context.class, AttributeSet.class}
-        )
-    })
     public void testDialog() {
         mIntent = mTopIntent;
         runLaunchpad(LaunchpadActivity.LIFECYCLE_DIALOG);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Activity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUserInteraction",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUserLeaveHint",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVisible",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finalize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "closeContextMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInstanceCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIntent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setIntent",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getApplication",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isChild",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getParent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWindowManager",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWindow",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrentFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWallpaperDesiredMinimumWidth",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWallpaperDesiredMinimumHeight",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestoreInstanceState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPostCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onResume",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPostResume",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onNewIntent",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSaveInstanceState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPause",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateThumbnail",
-            args = {Bitmap.class, Canvas.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateDescription",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onDestroy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onConfigurationChanged",
-            args = {Configuration.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getChangingConfigurations",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLastNonConfigurationInstance",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRetainNonConfigurationInstance",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onLowMemory",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedQuery",
-            args = {Uri.class, String[].class, String.class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedQuery",
-            args = {Uri.class, String[].class, String.class, String[].class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedCommitUpdates",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startManagingCursor",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stopManagingCursor",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPersistent",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "findViewById",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {View.class, ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addContentView",
-            args = {View.class, ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDefaultKeyMode",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyDown",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyUp",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyMultiple",
-            args = {int.class, int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTouchEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTrackballEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onWindowAttributesChanged",
-            args = {LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContentChanged",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onWindowFocusChanged",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasWindowFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchKeyEvent",
-            args = {KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchTouchEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchTrackballEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreatePanelView",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreatePanelMenu",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPreparePanel",
-            args = {int.class, View.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onMenuOpened",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onMenuItemSelected",
-            args = {int.class, MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPanelClosed",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateOptionsMenu",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPrepareOptionsMenu",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onOptionsItemSelected",
-            args = {MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onOptionsMenuClosed",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openOptionsMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "closeOptionsMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateContextMenu",
-            args = {ContextMenu.class, View.class, ContextMenuInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "registerForContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unregisterForContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContextItemSelected",
-            args = {MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContextMenuClosed",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPrepareDialog",
-            args = {int.class, Dialog.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "showDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dismissDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSearchRequested",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startSearch",
-            args = {String.class, boolean.class, Bundle.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "takeKeyEvents",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requestWindowFeature",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableResource",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableUri",
-            args = {int.class, Uri.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawable",
-            args = {int.class, Drawable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableAlpha",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLayoutInflater",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMenuInflater",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onApplyThemeResource",
-            args = {Theme.class, int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityForResult",
-            args = {Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivity",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityIfNeeded",
-            args = {Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startNextMatchingActivity",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityFromChild",
-            args = {Activity.class, Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResult",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResult",
-            args = {int.class, Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCallingPackage",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCallingActivity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isFinishing",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finish",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishFromChild",
-            args = {Activity.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishActivity",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishActivityFromChild",
-            args = {Activity.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onActivityResult",
-            args = {int.class, int.class, Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createPendingResult",
-            args = {int.class, Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRequestedOrientation",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRequestedOrientation",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTaskId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isTaskRoot",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "moveTaskToBack",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLocalClassName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getComponentName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPreferences",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSystemService",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitle",
-            args = {CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitle",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitleColor",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitle",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitleColor",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTitleChanged",
-            args = {CharSequence.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onChildTitleChanged",
-            args = {Activity.class, CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarVisibility",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarIndeterminateVisibility",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarIndeterminate",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgress",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSecondaryProgress",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVolumeControlStream",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getVolumeControlStream",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "runOnUiThread",
-            args = {Runnable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateView",
-            args = {String.class, Context.class, AttributeSet.class}
-        )
-    })
     public void testTabScreen() {
         mIntent = mTabIntent;
         runLaunchpad(LaunchpadActivity.LIFECYCLE_SCREEN);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Activity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUserInteraction",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUserLeaveHint",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVisible",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "closeContextMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finalize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInstanceCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIntent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setIntent",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getApplication",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isChild",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getParent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWindowManager",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWindow",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrentFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWallpaperDesiredMinimumWidth",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWallpaperDesiredMinimumHeight",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestoreInstanceState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPostCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onResume",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPostResume",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onNewIntent",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSaveInstanceState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPause",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateThumbnail",
-            args = {Bitmap.class, Canvas.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateDescription",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onDestroy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onConfigurationChanged",
-            args = {Configuration.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getChangingConfigurations",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLastNonConfigurationInstance",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-
-            method = "onRetainNonConfigurationInstance",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onLowMemory",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedQuery",
-            args = {Uri.class, String[].class, String.class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedQuery",
-            args = {Uri.class, String[].class, String.class, String[].class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedCommitUpdates",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startManagingCursor",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stopManagingCursor",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPersistent",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "findViewById",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {View.class, ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addContentView",
-            args = {View.class, ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDefaultKeyMode",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyDown",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyUp",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyMultiple",
-            args = {int.class, int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTouchEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTrackballEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onWindowAttributesChanged",
-            args = {LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContentChanged",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onWindowFocusChanged",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasWindowFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchKeyEvent",
-            args = {KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchTouchEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchTrackballEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreatePanelView",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreatePanelMenu",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPreparePanel",
-            args = {int.class, View.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onMenuOpened",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onMenuItemSelected",
-            args = {int.class, MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPanelClosed",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateOptionsMenu",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPrepareOptionsMenu",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onOptionsItemSelected",
-            args = {MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onOptionsMenuClosed",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openOptionsMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "closeOptionsMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateContextMenu",
-            args = {ContextMenu.class, View.class, ContextMenuInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "registerForContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unregisterForContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContextItemSelected",
-            args = {MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContextMenuClosed",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPrepareDialog",
-            args = {int.class, Dialog.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "showDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dismissDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSearchRequested",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startSearch",
-            args = {String.class, boolean.class, Bundle.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "takeKeyEvents",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requestWindowFeature",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableResource",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableUri",
-            args = {int.class, Uri.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawable",
-            args = {int.class, Drawable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableAlpha",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLayoutInflater",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMenuInflater",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onApplyThemeResource",
-            args = {Theme.class, int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityForResult",
-            args = {Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivity",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityIfNeeded",
-            args = {Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startNextMatchingActivity",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityFromChild",
-            args = {Activity.class, Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResult",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResult",
-            args = {int.class, Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCallingPackage",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCallingActivity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isFinishing",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finish",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishFromChild",
-            args = {Activity.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishActivity",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishActivityFromChild",
-            args = {Activity.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onActivityResult",
-            args = {int.class, int.class, Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createPendingResult",
-            args = {int.class, Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRequestedOrientation",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRequestedOrientation",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTaskId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isTaskRoot",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "moveTaskToBack",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLocalClassName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getComponentName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPreferences",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSystemService",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitle",
-            args = {CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitle",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitleColor",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitle",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitleColor",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTitleChanged",
-            args = {CharSequence.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onChildTitleChanged",
-            args = {Activity.class, CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarVisibility",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarIndeterminateVisibility",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarIndeterminate",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgress",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSecondaryProgress",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVolumeControlStream",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getVolumeControlStream",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "runOnUiThread",
-            args = {Runnable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateView",
-            args = {String.class, Context.class, AttributeSet.class}
-        )
-    })
     public void testScreen() {
         mIntent = mTopIntent;
         runLaunchpad(LaunchpadActivity.LIFECYCLE_SCREEN);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Activity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUserInteraction",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUserLeaveHint",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVisible",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finalize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "closeContextMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInstanceCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIntent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setIntent",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getApplication",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isChild",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getParent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWindowManager",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWindow",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrentFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWallpaperDesiredMinimumWidth",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWallpaperDesiredMinimumHeight",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestoreInstanceState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPostCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onResume",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPostResume",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onNewIntent",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSaveInstanceState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPause",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateThumbnail",
-            args = {Bitmap.class, Canvas.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateDescription",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onDestroy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onConfigurationChanged",
-            args = {Configuration.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getChangingConfigurations",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLastNonConfigurationInstance",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRetainNonConfigurationInstance",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onLowMemory",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedQuery",
-            args = {Uri.class, String[].class, String.class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedQuery",
-            args = {Uri.class, String[].class, String.class, String[].class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedCommitUpdates",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startManagingCursor",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stopManagingCursor",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPersistent",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "findViewById",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {View.class, ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addContentView",
-            args = {View.class, ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDefaultKeyMode",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyDown",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyUp",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyMultiple",
-            args = {int.class, int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTouchEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTrackballEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onWindowAttributesChanged",
-            args = {LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContentChanged",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onWindowFocusChanged",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasWindowFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchKeyEvent",
-            args = {KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchTouchEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchTrackballEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreatePanelView",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreatePanelMenu",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPreparePanel",
-            args = {int.class, View.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onMenuOpened",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onMenuItemSelected",
-            args = {int.class, MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPanelClosed",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateOptionsMenu",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPrepareOptionsMenu",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onOptionsItemSelected",
-            args = {MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onOptionsMenuClosed",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openOptionsMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "closeOptionsMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateContextMenu",
-            args = {ContextMenu.class, View.class, ContextMenuInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "registerForContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unregisterForContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContextItemSelected",
-            args = {MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContextMenuClosed",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPrepareDialog",
-            args = {int.class, Dialog.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "showDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dismissDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSearchRequested",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startSearch",
-            args = {String.class, boolean.class, Bundle.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "takeKeyEvents",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requestWindowFeature",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableResource",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableUri",
-            args = {int.class, Uri.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawable",
-            args = {int.class, Drawable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableAlpha",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLayoutInflater",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMenuInflater",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onApplyThemeResource",
-            args = {Theme.class, int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityForResult",
-            args = {Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivity",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityIfNeeded",
-            args = {Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startNextMatchingActivity",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityFromChild",
-            args = {Activity.class, Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResult",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResult",
-            args = {int.class, Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCallingPackage",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCallingActivity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isFinishing",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finish",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishFromChild",
-            args = {Activity.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishActivity",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishActivityFromChild",
-            args = {Activity.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onActivityResult",
-            args = {int.class, int.class, Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createPendingResult",
-            args = {int.class, Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRequestedOrientation",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRequestedOrientation",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTaskId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isTaskRoot",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "moveTaskToBack",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLocalClassName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getComponentName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPreferences",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSystemService",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitle",
-            args = {CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitle",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitleColor",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitle",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitleColor",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTitleChanged",
-            args = {CharSequence.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onChildTitleChanged",
-            args = {Activity.class, CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarVisibility",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarIndeterminateVisibility",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarIndeterminate",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgress",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSecondaryProgress",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVolumeControlStream",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getVolumeControlStream",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "runOnUiThread",
-            args = {Runnable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateView",
-            args = {String.class, Context.class, AttributeSet.class}
-        )
-    })
     public void testTabBasic() {
         mIntent = mTabIntent;
         runLaunchpad(LaunchpadActivity.LIFECYCLE_BASIC);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Activity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUserInteraction",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUserLeaveHint",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVisible",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "closeContextMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finalize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInstanceCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIntent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setIntent",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getApplication",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isChild",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getParent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWindowManager",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWindow",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrentFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWallpaperDesiredMinimumWidth",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWallpaperDesiredMinimumHeight",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestoreInstanceState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPostCreate",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onResume",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPostResume",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onNewIntent",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSaveInstanceState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPause",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateThumbnail",
-            args = {Bitmap.class, Canvas.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateDescription",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onDestroy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onConfigurationChanged",
-            args = {Configuration.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getChangingConfigurations",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLastNonConfigurationInstance",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRetainNonConfigurationInstance",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onLowMemory",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedQuery",
-            args = {Uri.class, String[].class, String.class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedQuery",
-            args = {Uri.class, String[].class, String.class, String[].class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "managedCommitUpdates",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startManagingCursor",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stopManagingCursor",
-            args = {Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPersistent",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "findViewById",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {View.class, ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addContentView",
-            args = {View.class, ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDefaultKeyMode",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyDown",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyUp",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-             method = "onKeyMultiple",
-            args = {int.class, int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTouchEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTrackballEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onWindowAttributesChanged",
-            args = {LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContentChanged",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onWindowFocusChanged",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasWindowFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchKeyEvent",
-            args = {KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchTouchEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchTrackballEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreatePanelView",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreatePanelMenu",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPreparePanel",
-            args = {int.class, View.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onMenuOpened",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onMenuItemSelected",
-            args = {int.class, MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPanelClosed",
-            args = {int.class, Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateOptionsMenu",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPrepareOptionsMenu",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onOptionsItemSelected",
-            args = {MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onOptionsMenuClosed",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openOptionsMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "closeOptionsMenu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateContextMenu",
-            args = {ContextMenu.class, View.class, ContextMenuInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "registerForContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unregisterForContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openContextMenu",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContextItemSelected",
-            args = {MenuItem.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContextMenuClosed",
-            args = {Menu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPrepareDialog",
-            args = {int.class, Dialog.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "showDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dismissDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeDialog",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSearchRequested",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startSearch",
-            args = {String.class, boolean.class, Bundle.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "takeKeyEvents",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requestWindowFeature",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableResource",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableUri",
-            args = {int.class, Uri.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawable",
-            args = {int.class, Drawable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFeatureDrawableAlpha",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLayoutInflater",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMenuInflater",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onApplyThemeResource",
-            args = {Theme.class, int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityForResult",
-            args = {Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivity",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityIfNeeded",
-            args = {Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startNextMatchingActivity",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivityFromChild",
-            args = {Activity.class, Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResult",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResult",
-            args = {int.class, Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCallingPackage",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCallingActivity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isFinishing",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finish",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishFromChild",
-            args = {Activity.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishActivity",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishActivityFromChild",
-            args = {Activity.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onActivityResult",
-            args = {int.class, int.class, Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createPendingResult",
-            args = {int.class, Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRequestedOrientation",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRequestedOrientation",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTaskId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isTaskRoot",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "moveTaskToBack",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLocalClassName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getComponentName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPreferences",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSystemService",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitle",
-            args = {CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitle",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitleColor",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitle",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitleColor",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTitleChanged",
-            args = {CharSequence.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onChildTitleChanged",
-            args = {Activity.class, CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarVisibility",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarIndeterminateVisibility",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressBarIndeterminate",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgress",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSecondaryProgress",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVolumeControlStream",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getVolumeControlStream",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "runOnUiThread",
-            args = {Runnable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateView",
-            args = {String.class, Context.class, AttributeSet.class}
-        )
-    })
     public void testBasic() {
         mIntent = mTopIntent;
         runLaunchpad(LaunchpadActivity.LIFECYCLE_BASIC);
diff --git a/tests/tests/app/src/android/app/cts/LocalActivityManagerTest.java b/tests/tests/app/src/android/app/cts/LocalActivityManagerTest.java
index 189a83f..237a198 100644
--- a/tests/tests/app/src/android/app/cts/LocalActivityManagerTest.java
+++ b/tests/tests/app/src/android/app/cts/LocalActivityManagerTest.java
@@ -21,12 +21,7 @@
 import android.app.LocalActivityManager;
 import android.content.Intent;
 import android.test.InstrumentationTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(LocalActivityManager.class)
 public class LocalActivityManagerTest extends InstrumentationTestCase implements CTSResult {
 
     private Instrumentation mInstrumentation;
@@ -51,12 +46,6 @@
         mInstrumentation.getTargetContext().startActivity(intent);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor of LocalActivityManager",
-        method = "LocalActivityManager",
-        args = {android.app.Activity.class, boolean.class}
-    )
     public void testConstructor() {
         new LocalActivityManager(new Activity(), true);
         new LocalActivityManager(new Activity(), false);
@@ -64,11 +53,6 @@
         new LocalActivityManager(null, true);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dispatchResume",
-        args = {}
-    )
     public void testDispatchResume() throws InterruptedException {
         LocalActivityManagerTestHelper.setResult(this);
         setupActivity(LocalActivityManagerTestHelper.ACTION_DISPATCH_RESUME);
@@ -83,117 +67,48 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startActivity",
-            args = {java.lang.String.class, android.content.Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrentId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getActivity",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrentActivity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "destroyActivity",
-            args = {java.lang.String.class, boolean.class}
-        )
-    })
     public void testStartActivity() throws InterruptedException {
         LocalActivityManagerTestHelper.setResult(this);
         setupActivity(LocalActivityManagerTestHelper.ACTION_START_ACTIVITY);
         waitForResult();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchCreate",
-            args = {android.os.Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "saveInstanceState",
-            args = {}
-        )
-    })
     public void testDispatchCreate() throws InterruptedException {
         LocalActivityManagerTestHelper.setResult(this);
         setupActivity(LocalActivityManagerTestHelper.ACTION_DISPATCH_CREATE);
         waitForResult();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dispatchStop",
-        args = {}
-    )
     public void testDispatchStop() throws InterruptedException {
         LocalActivityManagerTestHelper.setResult(this);
         setupActivity(LocalActivityManagerTestHelper.ACTION_DISPATCH_STOP);
         waitForResult();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dispatchPause",
-        args = {boolean.class}
-    )
     public void testDispatchPauseTrue() throws InterruptedException {
         LocalActivityManagerTestHelper.setResult(this);
         setupActivity(LocalActivityManagerTestHelper.ACTION_DISPATCH_PAUSE_TRUE);
         waitForResult();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dispatchPause",
-        args = {boolean.class}
-    )
     public void testDispatchPauseFalse() throws InterruptedException {
         LocalActivityManagerTestHelper.setResult(this);
         setupActivity(LocalActivityManagerTestHelper.ACTION_DISPATCH_PAUSE_FALSE);
         waitForResult();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "saveInstanceState",
-        args = {}
-    )
     public void testSaveInstanceState() throws InterruptedException {
         LocalActivityManagerTestHelper.setResult(this);
         setupActivity(LocalActivityManagerTestHelper.ACTION_SAVE_INSTANCE_STATE);
         waitForResult();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dispatchDestroy",
-        args = {boolean.class}
-    )
     public void testDispatchDestroy() throws InterruptedException {
         LocalActivityManagerTestHelper.setResult(this);
         setupActivity(LocalActivityManagerTestHelper.ACTION_DISPATCH_DESTROY);
         waitForResult();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "removeAllActivities",
-        args = {}
-    )
     public void testRemoveAllActivities() throws InterruptedException {
         LocalActivityManagerTestHelper.setResult(this);
         setupActivity(LocalActivityManagerTestHelper.ACTION_REMOVE_ALL_ACTIVITY);
diff --git a/tests/tests/app/src/android/app/cts/NotificationManagerTest.java b/tests/tests/app/src/android/app/cts/NotificationManagerTest.java
index b84d3e2..4add582 100644
--- a/tests/tests/app/src/android/app/cts/NotificationManagerTest.java
+++ b/tests/tests/app/src/android/app/cts/NotificationManagerTest.java
@@ -26,13 +26,7 @@
 
 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;
 
-@TestTargetClass(NotificationManager.class)
 public class NotificationManagerTest extends AndroidTestCase {
 
     private NotificationManager mNotificationManager;
@@ -50,59 +44,17 @@
         mNotificationManager.cancelAll();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "notify",
-            args = {int.class, android.app.Notification.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "cancel",
-            args = {int.class}
-        )
-    })
-    @ToBeFixed(bug = "1716929", explanation = "NotificationManager#notify(int, Notification) "
-            + "find a way to get ticker from status bar")
     public void testNotify() {
         final int id = 1;
         sendNotification(id, R.drawable.black);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "notify",
-            args = {int.class, android.app.Notification.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "cancel",
-            args = {int.class}
-        )
-    })
-    @ToBeFixed(bug = "1716929", explanation = "NotificationManager#cancel(int) find a way "
-            + "to get ticker from status bar")
     public void testCancel() {
         final int id = 9;
         sendNotification(id, R.drawable.black);
         mNotificationManager.cancel(id);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "notify",
-            args = {int.class, android.app.Notification.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "cancelAll",
-            args = {}
-        )
-    })
-    @ToBeFixed(bug = "1716929", explanation = "NotificationManager#cancelAll() find a way to "
-            + "get ticker from status bar")
     public void testCancelAll() {
         sendNotification(1, R.drawable.black);
         sendNotification(2, R.drawable.blue);
diff --git a/tests/tests/app/src/android/app/cts/NotificationTest.java b/tests/tests/app/src/android/app/cts/NotificationTest.java
index 6587a10..c2f62c3 100644
--- a/tests/tests/app/src/android/app/cts/NotificationTest.java
+++ b/tests/tests/app/src/android/app/cts/NotificationTest.java
@@ -24,13 +24,7 @@
 import android.os.Parcel;
 import android.test.AndroidTestCase;
 import android.widget.RemoteViews;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
-@TestTargetClass(Notification.class)
 public class NotificationTest extends AndroidTestCase {
 
     private Notification mNotification;
@@ -49,20 +43,6 @@
         mNotification = new Notification();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Notification",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Notification",
-            args = {int.class, java.lang.CharSequence.class, long.class}
-        )
-    })
-    @ToBeFixed(bug="1682756", explanation="Javadoc says this constructor sets 'everything to 0'."
-            + " However, the 'when' field is set to currentTimeMillis()")
     public void testConstructor() {
         mNotification = null;
         mNotification = new Notification();
@@ -77,29 +57,12 @@
         assertEquals(TICKER_TEXT, mNotification.tickerText);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
         final int expected = 0;
         mNotification = new Notification();
         assertEquals(expected, mNotification.describeContents());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeToParcel",
-            args = {android.os.Parcel.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Notification",
-            args = {android.os.Parcel.class}
-        )
-    })
     public void testWriteToParcel() {
         mNotification = new Notification();
         mNotification.icon = 0;
@@ -187,12 +150,6 @@
         assertNull(result.sound);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setLatestEventInfo",
-        args = {android.content.Context.class, java.lang.CharSequence.class,
-                java.lang.CharSequence.class, android.app.PendingIntent.class}
-    )
     public void testSetLatestEventInfo() {
         mNotification = new Notification();
         mNotification.icon = 1;
@@ -203,11 +160,6 @@
         assertNotNull(mNotification.contentView);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "toString",
-        args = {}
-    )
     public void testToString() {
         mNotification = new Notification();
         assertNotNull(mNotification.toString());
diff --git a/tests/tests/app/src/android/app/cts/PendingIntentTest.java b/tests/tests/app/src/android/app/cts/PendingIntentTest.java
index a6b9a03..d2c1b31 100644
--- a/tests/tests/app/src/android/app/cts/PendingIntentTest.java
+++ b/tests/tests/app/src/android/app/cts/PendingIntentTest.java
@@ -26,12 +26,7 @@
 import android.os.Message;
 import android.os.Parcel;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(PendingIntent.class)
 public class PendingIntentTest extends AndroidTestCase {
 
     private static final int WAIT_TIME = 5000;
@@ -99,11 +94,6 @@
         mLooper.quit();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getActivity",
-        args = {android.content.Context.class, int.class, android.content.Intent.class, int.class}
-    )
     public void testGetActivity() throws InterruptedException, CanceledException {
         PendingIntentStubActivity.status = PendingIntentStubActivity.INVALIDATE;
         mPendingIntent = null;
@@ -146,11 +136,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getBroadcast",
-        args = {android.content.Context.class, int.class, android.content.Intent.class, int.class}
-    )
     public void testGetBroadcast() throws InterruptedException, CanceledException {
         MockReceiver.sAction = null;
         mIntent = new Intent(MockReceiver.MOCKACTION);
@@ -175,11 +160,6 @@
         pendingIntentSendError(mPendingIntent);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getService",
-        args = {android.content.Context.class, int.class, android.content.Intent.class, int.class}
-    )
     public void testGetService() throws InterruptedException, CanceledException {
         MockService.result = false;
         mIntent = new Intent();
@@ -204,11 +184,6 @@
         pendingIntentSendError(mPendingIntent);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "cancel",
-        args = {}
-    )
     public void testCancel() throws CanceledException {
         mIntent = new Intent();
         mIntent.setClass(mContext, MockService.class);
@@ -230,11 +205,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "send",
-        args = {}
-    )
     public void testSend() throws InterruptedException, CanceledException {
         MockReceiver.sAction = null;
         MockReceiver.sResultCode = -1;
@@ -256,11 +226,6 @@
         pendingIntentSendShouldFail(mPendingIntent);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "send",
-        args = {int.class}
-    )
     public void testSendWithParamInt() throws InterruptedException, CanceledException {
         mIntent = new Intent(MockReceiver.MOCKACTION);
         mIntent.setClass(mContext, MockReceiver.class);
@@ -293,11 +258,6 @@
         pendingIntentSendShouldFail(mPendingIntent);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "send",
-        args = {android.content.Context.class, int.class, android.content.Intent.class}
-    )
     public void testSendWithParamContextIntIntent() throws InterruptedException, CanceledException {
         mIntent = new Intent(MockReceiver.MOCKACTION);
         mIntent.setClass(mContext, MockReceiver.class);
@@ -325,11 +285,6 @@
         mPendingIntent.cancel();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "send",
-        args = {int.class, android.app.PendingIntent.OnFinished.class, android.os.Handler.class}
-    )
     public void testSendWithParamIntOnFinishedHandler() throws InterruptedException,
             CanceledException {
         mIntent = new Intent(MockReceiver.MOCKACTION);
@@ -382,12 +337,6 @@
         mPendingIntent.cancel();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "send",
-        args = {Context.class, int.class, Intent.class,
-                PendingIntent.OnFinished.class, Handler.class}
-    )
     public void testSendWithParamContextIntIntentOnFinishedHandler() throws InterruptedException,
             CanceledException {
         mIntent = new Intent(MockReceiver.MOCKACTION);
@@ -427,11 +376,6 @@
         mPendingIntent.cancel();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getTargetPackage",
-        args = {}
-    )
     public void testGetTargetPackage() {
         mIntent = new Intent();
         mPendingIntent = PendingIntent.getActivity(mContext, 1, mIntent,
@@ -439,18 +383,6 @@
         assertEquals(mContext.getPackageName(), mPendingIntent.getTargetPackage());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "equals",
-            args = {java.lang.Object.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hashCode",
-           args = {}
-        )
-    })
     public void testEquals() {
         mIntent = new Intent();
         mPendingIntent = PendingIntent.getActivity(mContext, 1, mIntent,
@@ -478,11 +410,6 @@
         assertEquals(mPendingIntent.hashCode(), target.hashCode());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
         mIntent = new Intent();
         mPendingIntent = PendingIntent.getActivity(mContext, 1, mIntent,
@@ -491,11 +418,6 @@
         assertEquals(expected, mPendingIntent.describeContents());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {android.os.Parcel.class, int.class}
-    )
     public void testWriteToParcel() {
         mIntent = new Intent();
         mPendingIntent = PendingIntent.getActivity(mContext, 1, mIntent,
@@ -508,23 +430,6 @@
         assertTrue(mPendingIntent.equals(pendingIntent));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writePendingIntentOrNullToParcel",
-            args = {android.app.PendingIntent.class, android.os.Parcel.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readPendingIntentOrNullFromParcel",
-            args = {android.os.Parcel.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "toString",
-            args = {}
-        )
-    })
     public void testReadAndWritePendingIntentOrNullToParcel() {
         mIntent = new Intent();
         mPendingIntent = PendingIntent.getActivity(mContext, 1, mIntent,
diff --git a/tests/tests/app/src/android/app/cts/PendingIntent_CanceledExceptionTest.java b/tests/tests/app/src/android/app/cts/PendingIntent_CanceledExceptionTest.java
index 8e67b7d..0d809de 100644
--- a/tests/tests/app/src/android/app/cts/PendingIntent_CanceledExceptionTest.java
+++ b/tests/tests/app/src/android/app/cts/PendingIntent_CanceledExceptionTest.java
@@ -19,31 +19,9 @@
 import android.app.PendingIntent;
 import android.app.PendingIntent.CanceledException;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
 
-@TestTargetClass(PendingIntent.CanceledException.class)
 public class PendingIntent_CanceledExceptionTest extends AndroidTestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "PendingIntent.CanceledException",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "PendingIntent.CanceledException",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "PendingIntent.CanceledException",
-            args = {Exception.class}
-        )
-    })
     public void testConstructor() {
         PendingIntent.CanceledException canceledException = new PendingIntent.CanceledException();
         try {
diff --git a/tests/tests/app/src/android/app/cts/ProgressDialogTest.java b/tests/tests/app/src/android/app/cts/ProgressDialogTest.java
index 85a714c..1d08d30 100644
--- a/tests/tests/app/src/android/app/cts/ProgressDialogTest.java
+++ b/tests/tests/app/src/android/app/cts/ProgressDialogTest.java
@@ -16,10 +16,6 @@
 
 package android.app.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.app.Instrumentation;
 import android.app.ProgressDialog;
@@ -37,7 +33,6 @@
 /**
  * Test {@link ProgressDialog}.
  */
-@TestTargetClass(ProgressDialog.class)
 public class ProgressDialogTest extends ActivityInstrumentationTestCase2<MockActivity> {
     private final CharSequence TITLE = "title";
     private final CharSequence MESSAGE = "message";
@@ -72,41 +67,14 @@
                 com.android.cts.stub.R.drawable.yellow);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "ProgressDialog",
-        args = {android.content.Context.class}
-    )
     public void testProgressDialog1(){
         new ProgressDialog(mContext);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "ProgressDialog",
-        args = {android.content.Context.class, int.class}
-    )
     public void testProgressDialog2(){
         new ProgressDialog(mContext, com.android.cts.stub.R.style.Theme_AlertDialog);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreate",
-            args = {android.os.Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStop",
-            args = {}
-        )
-    })
     public void testOnStartCreateStop() {
         MockProgressDialog pd = new MockProgressDialog(mContext);
 
@@ -121,23 +89,11 @@
         assertTrue(pd.mIsOnStopCalled);
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        method = "show",
-        args = {android.content.Context.class, java.lang.CharSequence.class,
-                java.lang.CharSequence.class}
-    )
     @UiThreadTest
     public void testShow1() {
         mProgressDialog = ProgressDialog.show(mContext, TITLE, MESSAGE);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "show",
-        args = {android.content.Context.class, java.lang.CharSequence.class,
-                java.lang.CharSequence.class, boolean.class}
-    )
     @UiThreadTest
     public void testShow2() {
         mProgressDialog = ProgressDialog.show(mContext, TITLE, MESSAGE, false);
@@ -152,12 +108,6 @@
         assertTrue(mProgressDialog.isIndeterminate());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "show",
-        args = {android.content.Context.class, java.lang.CharSequence.class,
-                java.lang.CharSequence.class, boolean.class, boolean.class}
-    )
     public void testShow3() throws Throwable {
         final OnCancelListener cL = new OnCancelListener(){
             public void onCancel(DialogInterface dialog) {
@@ -193,13 +143,6 @@
         assertTrue(mCanceled);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "show",
-        args = {android.content.Context.class, java.lang.CharSequence.class,
-                java.lang.CharSequence.class, boolean.class, boolean.class,
-                android.content.DialogInterface.OnCancelListener.class}
-    )
     public void testShow4() throws Throwable {
         final OnCancelListener cL = new OnCancelListener(){
             public void onCancel(DialogInterface dialog) {
@@ -233,18 +176,6 @@
         assertTrue(mCanceled);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setMax",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMax",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testAccessMax() {
         // mProgress is null
@@ -257,18 +188,6 @@
         assertEquals(2009, mProgressDialog.getMax());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgress",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getProgress",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testAccessProgress() {
         // mProgress is null
@@ -284,18 +203,6 @@
         assertEquals(0, mProgressDialog.getProgress());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSecondaryProgress",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSecondaryProgress",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testAccessSecondaryProgress() {
         // mProgress is null
@@ -311,18 +218,6 @@
         assertEquals(0, mProgressDialog.getSecondaryProgress());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setIndeterminate",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isIndeterminate",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testSetIndeterminate() {
         // mProgress is null
@@ -342,11 +237,6 @@
         assertTrue(mProgressDialog.isIndeterminate());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "incrementProgressBy",
-        args = {int.class}
-    )
     public void testIncrementProgressBy() throws Throwable {
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -366,11 +256,6 @@
         assertEquals(70, mProgress2);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "incrementSecondaryProgressBy",
-        args = {int.class}
-    )
     public void testIncrementSecondaryProgressBy() throws Throwable {
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -389,11 +274,6 @@
         assertEquals(70, mProgress2);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setProgressDrawable",
-        args = {android.graphics.drawable.Drawable.class}
-    )
     public void testSetProgressDrawable() throws Throwable {
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -413,11 +293,6 @@
         assertEquals(null, mActualDrawableNull);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setIndeterminateDrawable",
-        args = {android.graphics.drawable.Drawable.class}
-    )
     public void testSetIndeterminateDrawable() throws Throwable {
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -437,12 +312,6 @@
         mInstrumentation.waitForIdleSync();
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        method = "setMessage",
-        args = {java.lang.CharSequence.class},
-        notes= "no way to verify dialog contents"
-    )
     public void testSetMessage() throws Throwable {
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -464,12 +333,6 @@
         mInstrumentation.waitForIdleSync();
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        method = "setProgressStyle",
-        args = {int.class},
-        notes="no way to verify dialog conteents"
-    )
     public void testSetProgressStyle() throws Throwable {
         setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
 
diff --git a/tests/tests/app/src/android/app/cts/ServiceTest.java b/tests/tests/app/src/android/app/cts/ServiceTest.java
index 0b2b767..f9a81e6 100644
--- a/tests/tests/app/src/android/app/cts/ServiceTest.java
+++ b/tests/tests/app/src/android/app/cts/ServiceTest.java
@@ -16,10 +16,6 @@
 
 package android.app.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.app.Service;
 import android.content.ComponentName;
@@ -33,7 +29,6 @@
 import android.os.RemoteException;
 import android.test.suitebuilder.annotation.MediumTest;
 
-@TestTargetClass(Service.class)
 public class ServiceTest extends ActivityTestsBase {
     private static final int STATE_START_1 = 0;
     private static final int STATE_START_2 = 1;
@@ -392,444 +387,67 @@
         mContext.stopService(mLocalService_ApplicationHasPermission);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStart",
-            args = {android.content.Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onDestroy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getApplication",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Service",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onConfigurationChanged",
-            args = {android.content.res.Configuration.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onLowMemory",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stopSelf",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stopSelf",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stopSelfResult",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setForeground",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dump",
-            args = {java.io.FileDescriptor.class, java.io.PrintWriter.class,
-                    java.lang.String[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finalize",
-            args = {}
-        )
-    })
     public void testLocalStartClass() throws Exception {
         startExpectResult(mLocalService);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStart",
-            args = {android.content.Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onDestroy",
-            args = {}
-        )
-    })
     public void testLocalStartAction() throws Exception {
         startExpectResult(new Intent(LocalService.SERVICE_LOCAL));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStart",
-            args = {android.content.Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onDestroy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onBind",
-            args = {android.content.Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRebind",
-            args = {android.content.Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUnbind",
-            args = {android.content.Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreate",
-            args = {}
-        )
-    })
     public void testLocalBindClass() throws Exception {
         bindExpectResult(mLocalService);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStart",
-            args = {android.content.Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onDestroy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onBind",
-            args = {android.content.Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRebind",
-            args = {android.content.Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUnbind",
-            args = {android.content.Intent.class}
-        )
-    })
     @MediumTest
     public void testLocalBindAction() throws Exception {
         bindExpectResult(new Intent(LocalService.SERVICE_LOCAL));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStart",
-            args = {android.content.Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onDestroy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onBind",
-            args = {android.content.Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRebind",
-            args = {android.content.Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUnbind",
-            args = {android.content.Intent.class}
-        )
-    })
     @MediumTest
     public void testLocalBindAutoClass() throws Exception {
         bindAutoExpectResult(mLocalService);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStart",
-            args = {android.content.Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onDestroy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onBind",
-            args = {android.content.Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRebind",
-            args = {android.content.Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUnbind",
-            args = {android.content.Intent.class}
-        )
-    })
     @MediumTest
     public void testLocalBindAutoAction() throws Exception {
         bindAutoExpectResult(new Intent(LocalService.SERVICE_LOCAL));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStart",
-            args = {android.content.Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onDestroy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onBind",
-            args = {android.content.Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRebind",
-            args = {android.content.Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUnbind",
-            args = {android.content.Intent.class}
-        )
-    })
     @MediumTest
     public void testLocalStartClassPermissions() throws Exception {
         startExpectResult(mLocalGrantedService);
         startExpectResult(mLocalDeniedService);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStart",
-            args = {android.content.Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onDestroy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onBind",
-            args = {android.content.Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRebind",
-            args = {android.content.Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUnbind",
-            args = {android.content.Intent.class}
-        )
-    })
     @MediumTest
     public void testLocalStartActionPermissions() throws Exception {
         startExpectResult(mLocalService_ApplicationHasPermission);
         startExpectResult(mLocalService_ApplicationDoesNotHavePermission);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStart",
-            args = {android.content.Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onDestroy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onBind",
-            args = {android.content.Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRebind",
-            args = {android.content.Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUnbind",
-            args = {android.content.Intent.class}
-        )
-    })
     @MediumTest
     public void testLocalBindClassPermissions() throws Exception {
         bindExpectResult(mLocalGrantedService);
         bindExpectResult(mLocalDeniedService);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStart",
-            args = {android.content.Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onDestroy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onBind",
-            args = {android.content.Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRebind",
-            args = {android.content.Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUnbind",
-            args = {android.content.Intent.class}
-        )
-    })
     @MediumTest
     public void testLocalBindActionPermissions() throws Exception {
         bindExpectResult(mLocalService_ApplicationHasPermission);
         bindExpectResult(mLocalService_ApplicationDoesNotHavePermission);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStart",
-            args = {android.content.Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onDestroy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onBind",
-            args = {android.content.Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRebind",
-            args = {android.content.Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUnbind",
-            args = {android.content.Intent.class}
-        )
-    })
     @MediumTest
     public void testLocalBindAutoClassPermissionGranted() throws Exception {
         bindAutoExpectResult(mLocalGrantedService);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStart",
-            args = {android.content.Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onDestroy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onBind",
-            args = {android.content.Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRebind",
-            args = {android.content.Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUnbind",
-            args = {android.content.Intent.class}
-        )
-    })
     @MediumTest
     public void testLocalBindAutoActionPermissionGranted() throws Exception {
         bindAutoExpectResult(mLocalService_ApplicationHasPermission);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStart",
-            args = {android.content.Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onDestroy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onBind",
-            args = {android.content.Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRebind",
-            args = {android.content.Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUnbind",
-            args = {android.content.Intent.class}
-        )
-    })
     @MediumTest
     public void testLocalUnbindTwice() throws Exception {
         EmptyConnection conn = new EmptyConnection();
diff --git a/tests/tests/app/src/android/app/cts/TabActivityTest.java b/tests/tests/app/src/android/app/cts/TabActivityTest.java
index 920ec11..04741b7 100644
--- a/tests/tests/app/src/android/app/cts/TabActivityTest.java
+++ b/tests/tests/app/src/android/app/cts/TabActivityTest.java
@@ -16,11 +16,6 @@
 
 package android.app.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.app.Activity;
 import android.app.Instrumentation;
@@ -32,7 +27,6 @@
 import android.test.InstrumentationTestCase;
 import android.widget.TabHost;
 
-@TestTargetClass(TabActivity.class)
 public class TabActivityTest extends InstrumentationTestCase {
     private Instrumentation mInstrumentation;
     private MockTabActivity mActivity;
@@ -58,56 +52,6 @@
         super.tearDown();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "TabActivity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDefaultTab",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDefaultTab",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onContentChanged",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTabHost",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTabWidget",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPostCreate",
-            args = {android.os.Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestoreInstanceState",
-            args = {android.os.Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSaveInstanceState",
-            args = {android.os.Bundle.class}
-        )
-    })
-    @ToBeFixed(bug = "1701364", explanation = "When testing TabActivity#setDefaultTab(int index),"
-            + " setDefaultTab(String tag), we find that the set values are hard to get, there"
-            + " is no proper method or other way to obtain these two default values.")
     public void testTabActivity() throws Throwable {
         // Test constructor
         new TabActivity();
@@ -133,11 +77,6 @@
         assertNotNull(tabHost.getTabWidget());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onChildTitleChanged",
-        args = {android.app.Activity.class, java.lang.CharSequence.class}
-    )
     public void testChildTitleCallback() throws Exception {
         final Context context = mInstrumentation.getTargetContext();
         final Intent intent = new Intent(context, MockTabActivity.class);
diff --git a/tests/tests/app/src/android/app/cts/TimePickerDialogTest.java b/tests/tests/app/src/android/app/cts/TimePickerDialogTest.java
index 417d046..01073f7 100644
--- a/tests/tests/app/src/android/app/cts/TimePickerDialogTest.java
+++ b/tests/tests/app/src/android/app/cts/TimePickerDialogTest.java
@@ -16,10 +16,6 @@
 
 package android.app.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.app.TimePickerDialog;
 import android.app.TimePickerDialog.OnTimeSetListener;
@@ -31,7 +27,6 @@
 /**
  * Test {@link TimePickerDialog}.
  */
-@TestTargetClass(TimePickerDialog.class)
 public class TimePickerDialogTest extends ActivityInstrumentationTestCase2<DialogStubActivity> {
     private static final String HOUR = "hour";
     private static final String MINUTE = "minute";
@@ -68,27 +63,6 @@
                 TARGET_MINUTE, true);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "TimePickerDialog",
-            args = {android.content.Context.class,
-                    android.app.TimePickerDialog.OnTimeSetListener.class, int.class, int.class,
-                    boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "TimePickerDialog",
-            args = {android.content.Context.class,
-                    int.class, android.app.TimePickerDialog.OnTimeSetListener.class,
-                    int.class, int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSaveInstanceState",
-            args = {}
-        )
-    })
     public void testSaveInstanceState(){
         TimePickerDialog tD = new TimePickerDialog( mContext, mOnTimeSetListener, TARGET_HOUR,
                 TARGET_MINUTE, true);
@@ -110,11 +84,6 @@
         assertFalse(b.getBoolean(IS_24_HOUR));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onClick",
-        args = {android.content.DialogInterface.class, int.class}
-    )
     public void testOnClick(){
         mTimePickerDialog.onClick(null, 0);
 
@@ -122,11 +91,6 @@
         assertEquals(TARGET_MINUTE, mCallbackMinute);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onTimeChanged",
-        args = {android.widget.TimePicker.class, int.class, int.class}
-    )
     public void testOnTimeChanged() throws Throwable {
         final int minute = 34;
         startDialogActivity(DialogStubActivity.TEST_TIMEPICKERDIALOG);
@@ -141,11 +105,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "updateTime",
-        args = {int.class, int.class}
-    )
     public void testUpdateTime(){
         int minute = 18;
         mTimePickerDialog.updateTime(TARGET_HOUR, minute);
@@ -157,11 +116,6 @@
         assertEquals(minute, b.getInt(MINUTE));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onRestoreInstanceState",
-        args = {android.os.Bundle.class}
-    )
     public void testOnRestoreInstanceState(){
         int minute = 27;
         Bundle b1 = new Bundle();
diff --git a/tests/tests/bluetooth/Android.mk b/tests/tests/bluetooth/Android.mk
index d1bb4ec..94c6c19 100644
--- a/tests/tests/bluetooth/Android.mk
+++ b/tests/tests/bluetooth/Android.mk
@@ -32,4 +32,4 @@
 
 LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/bluetooth/src/android/bluetooth/cts/BasicAdapterTest.java b/tests/tests/bluetooth/src/android/bluetooth/cts/BasicAdapterTest.java
index 8afebc3..e64da89 100644
--- a/tests/tests/bluetooth/src/android/bluetooth/cts/BasicAdapterTest.java
+++ b/tests/tests/bluetooth/src/android/bluetooth/cts/BasicAdapterTest.java
@@ -177,18 +177,30 @@
 
         // test bad addresses
         try {
-            adapter.getRemoteDevice(null);
+            adapter.getRemoteDevice((String)null);
             fail("IllegalArgumentException not thrown");
         } catch (IllegalArgumentException e) {}
         try {
             adapter.getRemoteDevice("00:00:00:00:00:00:00:00");
             fail("IllegalArgumentException not thrown");
         } catch (IllegalArgumentException e) {}
+        try {
+            adapter.getRemoteDevice((byte[])null);
+            fail("IllegalArgumentException not thrown");
+        } catch (IllegalArgumentException e) {}
+        try {
+            adapter.getRemoteDevice(new byte[] {0x00, 0x00, 0x00, 0x00, 0x00});
+            fail("IllegalArgumentException not thrown");
+        } catch (IllegalArgumentException e) {}
 
         // test success
         BluetoothDevice device = adapter.getRemoteDevice("00:11:22:AA:BB:CC");
         assertNotNull(device);
         assertEquals("00:11:22:AA:BB:CC", device.getAddress());
+        device = adapter.getRemoteDevice(
+                new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06});
+        assertNotNull(device);
+        assertEquals("01:02:03:04:05:06", device.getAddress());
     }
 
     public void test_listenUsingRfcommWithServiceRecord() throws IOException {
diff --git a/tests/tests/content/Android.mk b/tests/tests/content/Android.mk
index a2f0e0f..ae2aee8 100644
--- a/tests/tests/content/Android.mk
+++ b/tests/tests/content/Android.mk
@@ -29,5 +29,4 @@
 
 LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
 
-include $(BUILD_PACKAGE)
-
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/content/src/android/content/cts/ActivityNotFoundExceptionTest.java b/tests/tests/content/src/android/content/cts/ActivityNotFoundExceptionTest.java
index 6dd6698..a871fa9 100644
--- a/tests/tests/content/src/android/content/cts/ActivityNotFoundExceptionTest.java
+++ b/tests/tests/content/src/android/content/cts/ActivityNotFoundExceptionTest.java
@@ -18,27 +18,8 @@
 
 import android.content.ActivityNotFoundException;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(android.content.ActivityNotFoundException.class)
 public class ActivityNotFoundExceptionTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors of ActivityNotFoundException.",
-            method = "ActivityNotFoundException",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors of ActivityNotFoundException.",
-            method = "ActivityNotFoundException",
-            args = {java.lang.String.class}
-        )
-    })
     public void testConstructors() {
         new ActivityNotFoundException();
 
diff --git a/tests/tests/content/src/android/content/cts/AsyncQueryHandlerTest.java b/tests/tests/content/src/android/content/cts/AsyncQueryHandlerTest.java
index 0d15f56..18e0b2e 100644
--- a/tests/tests/content/src/android/content/cts/AsyncQueryHandlerTest.java
+++ b/tests/tests/content/src/android/content/cts/AsyncQueryHandlerTest.java
@@ -16,11 +16,6 @@
 
 package android.content.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.content.AsyncQueryHandler;
 import android.content.ContentResolver;
@@ -37,7 +32,6 @@
  *
  * @see DummyProvider
  */
-@TestTargetClass(AsyncQueryHandler.class)
 public class AsyncQueryHandlerTest extends AndroidTestCase {
     private static final long TEST_TIME_OUT = DummyProvider.MOCK_OPERATION_SLEEP_TIME + 5000;
 
@@ -102,40 +96,12 @@
         super.tearDown();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "AsyncQueryHandler",
-        args = {android.content.ContentResolver.class}
-    )
     public void testConstructor() {
         new AsyncQueryHandler(mResolver) {};
 
         new AsyncQueryHandler(null) {};
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startInsert",
-            args = {int.class, java.lang.Object.class, android.net.Uri.class,
-                    android.content.ContentValues.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onInsertComplete",
-            args = {int.class, java.lang.Object.class, android.net.Uri.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "cancelOperation",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "handleMessage",
-            args = {android.os.Message.class}
-        )
-    })
     public void testStartInsert() throws InterruptedException {
         final ContentValues values1 = new ContentValues();
         values1.put(DummyProvider.NAME, NAME3);
@@ -173,30 +139,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startQuery",
-            args = {int.class, java.lang.Object.class, android.net.Uri.class,
-                    java.lang.String[].class, java.lang.String.class, java.lang.String[].class,
-                    java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onQueryComplete",
-            args = {int.class, java.lang.Object.class, android.database.Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "cancelOperation",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "handleMessage",
-            args = {android.os.Message.class}
-        )
-    })
     public void testStartQuery() throws InterruptedException {
         mAsyncHandler = createAsyncQueryHandlerSync();
         assertFalse(mAsyncHandler.hadQueried(0));
@@ -233,30 +175,6 @@
         assertFalse(mAsyncHandler.hadQueried(TEST_TIME_OUT));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startUpdate",
-            args = {int.class, java.lang.Object.class, android.net.Uri.class,
-                    android.content.ContentValues.class, java.lang.String.class,
-                    java.lang.String[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onUpdateComplete",
-            args = {int.class, java.lang.Object.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "cancelOperation",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "handleMessage",
-            args = {android.os.Message.class}
-        )
-    })
     public void testStartUpdate() throws InterruptedException {
         final ContentValues values1 = new ContentValues();
         values1.put(DummyProvider.NAME, NAME3);
@@ -302,29 +220,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startDelete",
-            args = {int.class, java.lang.Object.class, android.net.Uri.class,
-                    java.lang.String.class, java.lang.String[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onDeleteComplete",
-            args = {int.class, java.lang.Object.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "cancelOperation",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "handleMessage",
-            args = {android.os.Message.class}
-        )
-    })
     public void testStartDelete() throws InterruptedException {
         mAsyncHandler = createAsyncQueryHandlerSync();
         assertFalse(mAsyncHandler.hadDeleted(0));
@@ -362,13 +257,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "createHandler",
-        args = {android.os.Looper.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of "
-            + "AsyncQueryHandlerWrapper#createHandler(Looper) when param looper is null")
     public void testCreateHandler() {
         MockAsyncQueryHandler wrapper = new MockAsyncQueryHandler(mResolver);
         Handler result = wrapper.createHandler(Looper.myLooper());
diff --git a/tests/tests/content/src/android/content/cts/BroadcastReceiverTest.java b/tests/tests/content/src/android/content/cts/BroadcastReceiverTest.java
index 62d8724..2865f9e 100644
--- a/tests/tests/content/src/android/content/cts/BroadcastReceiverTest.java
+++ b/tests/tests/content/src/android/content/cts/BroadcastReceiverTest.java
@@ -16,10 +16,6 @@
 
 package android.content.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.app.Service;
 import android.app.cts.MockActivity;
@@ -38,7 +34,6 @@
  * Test {@link BroadcastReceiver}.
  * TODO:  integrate the existing tests.
  */
-@TestTargetClass(BroadcastReceiver.class)
 public class BroadcastReceiverTest extends ActivityInstrumentationTestCase2<MockActivity> {
     private static final int RESULT_INITIAL_CODE = 1;
     private static final String RESULT_INITIAL_DATA = "initial data";
@@ -65,27 +60,10 @@
         super.setUp();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "BroadcastReceiver",
-        args = {}
-    )
     public void testConstructor() {
         new MockReceiverInternal();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDebugUnregister",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDebugUnregister",
-            args = {boolean.class}
-        )
-    })
     public void testAccessDebugUnregister() {
         MockReceiverInternal mockReceiver = new MockReceiverInternal();
         assertFalse(mockReceiver.getDebugUnregister());
@@ -97,11 +75,6 @@
         assertFalse(mockReceiver.getDebugUnregister());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setOrderedHint",
-        args = {boolean.class}
-    )
     public void testSetOrderedHint() {
         MockReceiverInternal mockReceiver = new MockReceiverInternal();
 
@@ -156,18 +129,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onReceive",
-            args = {android.content.Context.class, android.content.Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getResultCode",
-            args = {}
-        )
-    })
     public void testOnReceive () throws InterruptedException {
         final MockActivity activity = getActivity();
 
@@ -186,48 +147,6 @@
         activity.unregisterReceiver(internalReceiver);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getResultCode",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getResultData",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getResultExtras",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResultCode",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResultData",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResultExtras",
-            args = {android.os.Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResult",
-            args = {int.class, java.lang.String.class, android.os.Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onReceive",
-            args = {android.content.Context.class, android.content.Intent.class}
-        )
-    })
     public void testOnReceiverOrdered() throws InterruptedException {
         MockReceiverInternalOrder internalOrderReceiver = new MockReceiverInternalOrder();
 
@@ -252,38 +171,6 @@
         assertNull(resultExtras.getString(MockReceiver.RESULT_EXTRAS_REMOVE_KEY));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "abortBroadcast",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setResult",
-            args = {int.class, java.lang.String.class, android.os.Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onReceive",
-            args = {android.content.Context.class, android.content.Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getResultCode",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getResultData",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getResultExtras",
-            args = {boolean.class}
-        )
-    })
     public void testAbortBroadcast() throws InterruptedException {
         MockReceiverInternalOrder internalOrderReceiver = new MockReceiverInternalOrder();
 
@@ -317,11 +204,6 @@
                 resultExtras.getString(MockReceiverAbort.RESULT_EXTRAS_ABORT_KEY));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "peekService",
-        args = {android.content.Context.class, android.content.Intent.class}
-    )
     public void testPeekService() throws InterruptedException {
         final MockActivity activity = getActivity();
 
diff --git a/tests/tests/content/src/android/content/cts/ClipboardManagerListenerTest.java b/tests/tests/content/src/android/content/cts/ClipboardManagerListenerTest.java
index ae02e0a..ca6bba7 100644
--- a/tests/tests/content/src/android/content/cts/ClipboardManagerListenerTest.java
+++ b/tests/tests/content/src/android/content/cts/ClipboardManagerListenerTest.java
@@ -18,9 +18,9 @@
 
 import android.content.ClipData;
 import android.content.ClipboardManager.OnPrimaryClipChangedListener;
+import android.cts.util.PollingCheck;
 import android.net.Uri;
 import android.test.ActivityInstrumentationTestCase2;
-import android.view.animation.cts.DelayedCheck;
 
 
 public class ClipboardManagerListenerTest
@@ -57,7 +57,7 @@
     }
 
     private void assertClipChangedCount(final int expectedCount) {
-        new DelayedCheck() {
+        new PollingCheck() {
             @Override
             protected boolean check() {
                 return expectedCount == mListener.getCount();
diff --git a/tests/tests/content/src/android/content/cts/ComponentNameTest.java b/tests/tests/content/src/android/content/cts/ComponentNameTest.java
index 4ad2fda..d14a95b 100644
--- a/tests/tests/content/src/android/content/cts/ComponentNameTest.java
+++ b/tests/tests/content/src/android/content/cts/ComponentNameTest.java
@@ -20,40 +20,11 @@
 import android.content.Context;
 import android.os.Parcel;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
 /**
  * Test {@link ComponentName}.
  */
-@TestTargetClass(ComponentName.class)
 public class ComponentNameTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ComponentName",
-            args = {android.content.Context.class, java.lang.Class.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ComponentName",
-            args = {java.lang.String.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ComponentName",
-            args = {android.content.Context.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ComponentName",
-            args = {android.os.Parcel.class}
-        )
-    })
-    @ToBeFixed(bug = "1417734", explanation = "NullPointerException is not expected.")
     public void testConstructor() {
         // new the ComponentName instance
         new ComponentName("com.android.app", "com.android.app.InstrumentationTestActivity");
@@ -113,21 +84,11 @@
         new ComponentName(parcel);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "flattenToString",
-        args = {}
-    )
     public void testFlattenToString() {
         assertEquals("com.android.cts.stub/android.content.cts.ComponentNameTest",
                 getComponentName().flattenToString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getShortClassName",
-        args = {}
-    )
     public void testGetShortClassName() {
         // set the expected value, test normal value
         String actual = getComponentName().getShortClassName();
@@ -144,18 +105,6 @@
         assertEquals(".View", actual);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readFromParcel",
-            args = {android.os.Parcel.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeToParcel",
-            args = {android.os.Parcel.class, int.class}
-        )
-    })
     public void testReadFromParcel() {
         ComponentName expected = getComponentName();
         final Parcel parcel1 = Parcel.obtain();
@@ -170,21 +119,11 @@
         assertNull(expected);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getPackageName",
-        args = {}
-    )
     public void testGetPackageName() {
         final String actual = getComponentName().getPackageName();
         assertEquals("com.android.cts.stub", actual);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "unflattenFromString",
-        args = {java.lang.String.class}
-    )
     public void testUnflattenFromString() {
         final ComponentName componentName = getComponentName();
         final String flattenString = getComponentName().flattenToString();
@@ -193,11 +132,6 @@
         assertEquals(componentName, actual);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "flattenToShortString",
-        args = {}
-    )
     public void testFlattenToShortString() {
         // Test normal
         String actual = getComponentName().flattenToShortString();
@@ -214,11 +148,6 @@
         assertEquals("com.android.view/.View", actual);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "equals",
-        args = {java.lang.Object.class}
-    )
     public void testEquals() {
         // new the ComponentName instances, both are the same.
         final ComponentName componentName1 = getComponentName();
@@ -232,42 +161,22 @@
         assertFalse(componentName1.equals(componentName2));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "toString",
-        args = {}
-    )
     public void testToString() {
         assertNotNull(getComponentName().toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "toShortString",
-        args = {}
-    )
     public void testToShortString() {
         // Test normal string
         final String shortString = getComponentName().toShortString();
         assertEquals("{com.android.cts.stub/android.content.cts.ComponentNameTest}", shortString);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getClassName",
-        args = {}
-    )
     public void testGetClassName() {
         // set the expected value
         final String className = getComponentName().getClassName();
         assertEquals("android.content.cts.ComponentNameTest", className);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "hashCode",
-        args = {}
-    )
     public void testHashCode() {
         final ComponentName componentName = getComponentName();
 
@@ -280,11 +189,6 @@
         assertEquals(hashCode1, hashCode2);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {android.content.ComponentName.class, android.os.Parcel.class}
-    )
     public void testWriteToParcel() {
         // Test normal status
         final ComponentName componentName = getComponentName();
@@ -301,11 +205,6 @@
         assertEquals(0, parcel.dataAvail());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
         assertEquals(0, getComponentName().describeContents());
     }
diff --git a/tests/tests/content/src/android/content/cts/ContentProviderTest.java b/tests/tests/content/src/android/content/cts/ContentProviderTest.java
index ed44b56..39b7185 100644
--- a/tests/tests/content/src/android/content/cts/ContentProviderTest.java
+++ b/tests/tests/content/src/android/content/cts/ContentProviderTest.java
@@ -18,15 +18,12 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.ContentProvider;
 import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.content.Context;
+import android.content.ICancellationSignal;
 import android.content.IContentProvider;
 import android.content.ContentProviderResult;
 import android.content.ContentProviderOperation;
@@ -50,7 +47,6 @@
 /**
  * Test {@link ContentProvider}.
  */
-@TestTargetClass(ContentProvider.class)
 public class ContentProviderTest extends AndroidTestCase {
     private static final String TEST_PACKAGE_NAME = "com.android.cts.stub";
     private static final String TEST_FILE_NAME = "testFile.tmp";
@@ -63,11 +59,6 @@
         super.tearDown();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "openAssetFile",
-        args = {android.net.Uri.class, java.lang.String.class}
-    )
     public void testOpenAssetFile() throws IOException {
         MockContentProvider mockContentProvider = new MockContentProvider();
         Uri uri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE +
@@ -86,11 +77,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "attachInfo",
-        args = {android.content.Context.class, android.content.pm.ProviderInfo.class}
-    )
     public void testAttachInfo() {
         MockContentProvider mockContentProvider = new MockContentProvider();
 
@@ -127,11 +113,6 @@
         assertEquals(info1.writePermission, mockContentProvider.getWritePermission());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "bulkInsert",
-        args = {android.net.Uri.class, android.content.ContentValues[].class}
-    )
     public void testBulkInsert() {
         MockContentProvider mockContentProvider = new MockContentProvider();
 
@@ -152,11 +133,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getContext",
-        args = {}
-    )
     public void testGetContext() {
         MockContentProvider mockContentProvider = new MockContentProvider();
         assertNull(mockContentProvider.getContext());
@@ -167,18 +143,6 @@
         assertSame(getContext(), mockContentProvider.getContext());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getReadPermission",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setReadPermission",
-            args = {java.lang.String.class}
-        )
-    })
     public void testAccessReadPermission() {
         MockContentProvider mockContentProvider = new MockContentProvider();
         assertNull(mockContentProvider.getReadPermission());
@@ -195,18 +159,6 @@
         assertNull(mockContentProvider.getReadPermission());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWritePermission",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setWritePermission",
-            args = {java.lang.String.class}
-        )
-    })
     public void testAccessWritePermission() {
         MockContentProvider mockContentProvider = new MockContentProvider();
         assertNull(mockContentProvider.getWritePermission());
@@ -223,21 +175,11 @@
         assertNull(mockContentProvider.getWritePermission());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isTemporary",
-        args = {}
-    )
     public void testIsTemporary() {
         MockContentProvider mockContentProvider = new MockContentProvider();
         assertFalse(mockContentProvider.isTemporary());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "openFile",
-        args = {android.net.Uri.class, java.lang.String.class}
-    )
     public void testOpenFile() {
         MockContentProvider mockContentProvider = new MockContentProvider();
 
@@ -255,11 +197,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "openFileHelper",
-        args = {android.net.Uri.class, java.lang.String.class}
-    )
     public void testOpenFileHelper() throws IOException {
 
         // create a temporary File
@@ -296,29 +233,14 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        method = "onConfigurationChanged",
-        args = {android.content.res.Configuration.class}
-    )
     public void testOnConfigurationChanged() {
         // cannot trigger this callback reliably
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        method = "onLowMemory",
-        args = {}
-    )
     public void testOnLowMemory() {
         // cannot trigger this callback reliably
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "coerceToLocalContentProvider",
-        args = {android.content.IContentProvider.class}
-    )
     public void testCoerceToLocalContentProvider() {
         MockContentProvider mockContentProvider = new MockContentProvider();
 
@@ -365,7 +287,8 @@
 
             @Override
             public Cursor query(Uri url, String[] projection, String selection,
-                    String[] selectionArgs, String sortOrder) {
+                    String[] selectionArgs, String sortOrder,
+                    ICancellationSignal cancellationSignal) {
                 return null;
             }
 
@@ -395,16 +318,15 @@
                     throws RemoteException, FileNotFoundException {
                 return null;
             }
+
+            @Override
+            public ICancellationSignal createCancellationSignal() throws RemoteException {
+                return null;
+            }
         };
         assertNull(ContentProvider.coerceToLocalContentProvider(iContentProvider));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getIContentProvider()",
-        method = "getIContentProvider",
-        args = {}
-    )
     public void testGetIContentProvider() {
         MockContentProvider mockContentProvider = new MockContentProvider();
 
diff --git a/tests/tests/content/src/android/content/cts/ContentQueryMapTest.java b/tests/tests/content/src/android/content/cts/ContentQueryMapTest.java
index ecb1c05..ac23a5b 100644
--- a/tests/tests/content/src/android/content/cts/ContentQueryMapTest.java
+++ b/tests/tests/content/src/android/content/cts/ContentQueryMapTest.java
@@ -16,11 +16,6 @@
 
 package android.content.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.content.ContentQueryMap;
 import android.content.ContentResolver;
@@ -38,7 +33,6 @@
 /**
  * Test {@link ContentQueryMap}.
  */
-@TestTargetClass(ContentQueryMap.class)
 public class ContentQueryMapTest extends AndroidTestCase {
     private static final int TEST_TIME_OUT = 5000;
 
@@ -94,14 +88,6 @@
         super.tearDown();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "ContentQueryMap",
-        args = {android.database.Cursor.class, java.lang.String.class, boolean.class,
-        android.os.Handler.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of "
-            + "constructor when param cursor or columnNameOfKey is null")
     public void testConstructor() {
         new ContentQueryMap(mCursor, DummyProvider.NAME, true, null);
 
@@ -120,18 +106,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRows",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "close",
-            args = {}
-        )
-    })
     public void testGetRows() {
         // handler can be null
         mContentQueryMap = new ContentQueryMap(mCursor, DummyProvider.NAME, true, null);
@@ -152,18 +126,6 @@
         assertFalse(rows.containsKey(NAME0));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requery",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getValues",
-            args = {java.lang.String.class}
-        )
-    })
     public void testRequery() {
         // Disable the keepUpdated to make sure requery() will not be called
         // from somewhere else
@@ -199,23 +161,6 @@
         assertEquals(VALUE2, contentValues.getAsString(DummyProvider.VALUE));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setKeepUpdated",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getValues",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requery",
-            args = {}
-        )
-    })
     public void testSetKeepUpdated() throws InterruptedException {
         MockObserver observer = new MockObserver();
 
@@ -316,18 +261,6 @@
         assertEquals(VALUE3, contentValues.getAsString(DummyProvider.VALUE));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setKeepUpdated",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getValues",
-            args = {java.lang.String.class}
-        )
-    })
     public void testSetKeepUpdatedWithHandler() throws InterruptedException {
         MockObserver observer = new MockObserver();
         HandlerThread thread = new HandlerThread("testSetKeepUpdatedWithHandler");
@@ -404,11 +337,6 @@
         assertEquals(VALUE3, contentValues.getAsString(DummyProvider.VALUE));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getValues",
-        args = {java.lang.String.class}
-    )
     public void testGetValuesBoundary() {
         mContentQueryMap = new ContentQueryMap(mCursor, DummyProvider.NAME, false, null);
         assertNull(mContentQueryMap.getValues(null));
diff --git a/tests/tests/content/src/android/content/cts/ContentResolverTest.java b/tests/tests/content/src/android/content/cts/ContentResolverTest.java
index b866375..7042140 100644
--- a/tests/tests/content/src/android/content/cts/ContentResolverTest.java
+++ b/tests/tests/content/src/android/content/cts/ContentResolverTest.java
@@ -18,31 +18,28 @@
 
 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 android.accounts.Account;
+import android.content.CancellationSignal;
 import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.content.Context;
+import android.content.OperationCanceledException;
 import android.content.res.AssetFileDescriptor;
+import android.cts.util.PollingCheck;
 import android.database.ContentObserver;
 import android.database.Cursor;
+import android.database.sqlite.SQLiteQueryBuilder;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.ParcelFileDescriptor;
 import android.test.AndroidTestCase;
-import android.view.animation.cts.DelayedCheck;
 
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 
-@TestTargetClass(ContentResolver.class)
 public class ContentResolverTest extends AndroidTestCase {
     private final static String COLUMN_ID_NAME = "_id";
     private final static String COLUMN_KEY_NAME = "key";
@@ -50,6 +47,8 @@
 
     private static final String AUTHORITY = "ctstest";
     private static final Uri TABLE1_URI = Uri.parse("content://" + AUTHORITY + "/testtable1/");
+    private static final Uri TABLE1_CROSS_URI =
+            Uri.parse("content://" + AUTHORITY + "/testtable1/cross");
     private static final Uri TABLE2_URI = Uri.parse("content://" + AUTHORITY + "/testtable2/");
 
     private static final Account ACCOUNT = new Account("cts", "cts");
@@ -99,23 +98,10 @@
         super.tearDown();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "ContentResolver",
-        args = {android.content.Context.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testConstructor() {
         assertNotNull(mContentResolver);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getType",
-        args = {android.net.Uri.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of " +
-            "ContentResolver#getType(Uri) when the input Uri is null")
     public void testGetType() {
         String type1 = mContentResolver.getType(TABLE1_URI);
         assertTrue(type1.startsWith(ContentResolver.CURSOR_DIR_BASE_TYPE, 0));
@@ -134,15 +120,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "query",
-        args = {android.net.Uri.class, java.lang.String[].class, java.lang.String.class,
-                java.lang.String[].class, java.lang.String.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of " +
-            "ContentResolver#query(Uri, String[], String, String[], String) when the input " +
-            "param Uri is null")
     public void testQuery() {
         mCursor = mContentResolver.query(TABLE1_URI, null, null, null, null);
 
@@ -193,11 +170,85 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "openInputStream",
-        args = {android.net.Uri.class}
-    )
+    public void testCancelableQuery_WhenNotCanceled_ReturnsResultSet() {
+        CancellationSignal cancellationSignal = new CancellationSignal();
+
+        Cursor cursor = mContentResolver.query(TABLE1_URI, null, null, null, null,
+                cancellationSignal);
+        assertEquals(3, cursor.getCount());
+        cursor.close();
+    }
+
+    public void testCancelableQuery_WhenCanceledBeforeQuery_ThrowsImmediately() {
+        CancellationSignal cancellationSignal = new CancellationSignal();
+        cancellationSignal.cancel();
+
+        try {
+            mContentResolver.query(TABLE1_URI, null, null, null, null, cancellationSignal);
+            fail("Expected OperationCanceledException");
+        } catch (OperationCanceledException ex) {
+            // expected
+        }
+    }
+
+    public void testCancelableQuery_WhenCanceledDuringLongRunningQuery_CancelsQueryAndThrows() {
+        // Populate a table with a bunch of integers.
+        mContentResolver.delete(TABLE1_URI, null, null);
+        ContentValues values = new ContentValues();
+        for (int i = 0; i < 100; i++) {
+            values.put(COLUMN_KEY_NAME, i);
+            values.put(COLUMN_VALUE_NAME, i);
+            mContentResolver.insert(TABLE1_URI, values);
+        }
+
+        for (int i = 0; i < 5; i++) {
+            final CancellationSignal cancellationSignal = new CancellationSignal();
+            Thread cancellationThread = new Thread() {
+                @Override
+                public void run() {
+                    try {
+                        Thread.sleep(300);
+                    } catch (InterruptedException ex) {
+                    }
+                    cancellationSignal.cancel();
+                }
+            };
+            try {
+                // Build an unsatisfiable 5-way cross-product query over 100 values but
+                // produces no output.  This should force SQLite to loop for a long time
+                // as it tests 10^10 combinations.
+                cancellationThread.start();
+
+                final long startTime = System.nanoTime();
+                try {
+                    mContentResolver.query(TABLE1_CROSS_URI, null,
+                            "a.value + b.value + c.value + d.value + e.value > 1000000",
+                            null, null, cancellationSignal);
+                    fail("Expected OperationCanceledException");
+                } catch (OperationCanceledException ex) {
+                    // expected
+                }
+
+                // We want to confirm that the query really was running and then got
+                // canceled midway.
+                final long waitTime = System.nanoTime() - startTime;
+                if (waitTime > 150 * 1000000L && waitTime < 600 * 1000000L) {
+                    return; // success!
+                }
+            } finally {
+                try {
+                    cancellationThread.join();
+                } catch (InterruptedException e) {
+                }
+            }
+        }
+
+        // Occasionally we might miss the timing deadline due to factors in the
+        // environment, but if after several trials we still couldn't demonstrate
+        // that the query was canceled, then the test must be broken.
+        fail("Could not prove that the query actually canceled midway during execution.");
+    }
+
     public void testOpenInputStream() throws IOException {
         final Uri uri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE +
                 "://" + TEST_PACKAGE_NAME + "/" + R.drawable.pass);
@@ -215,18 +266,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openOutputStream",
-            args = {android.net.Uri.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openOutputStream",
-            args = {android.net.Uri.class, java.lang.String.class}
-        )
-    })
     public void testOpenOutputStream() throws IOException {
         Uri uri = Uri.parse(ContentResolver.SCHEME_FILE + "://" +
                 getContext().getCacheDir().getAbsolutePath() +
@@ -271,11 +310,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "openAssetFileDescriptor",
-        args = {android.net.Uri.class, java.lang.String.class}
-    )
     public void testOpenAssetFileDescriptor() throws IOException {
         Uri uri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE +
                 "://" + TEST_PACKAGE_NAME + "/" + R.raw.testimage);
@@ -300,11 +334,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "openFileDescriptor",
-        args = {android.net.Uri.class, java.lang.String.class}
-    )
     public void testOpenFileDescriptor() throws IOException {
         Uri uri = Uri.parse(ContentResolver.SCHEME_FILE + "://" +
                 getContext().getCacheDir().getAbsolutePath() +
@@ -338,13 +367,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "insert",
-        args = {android.net.Uri.class, android.content.ContentValues.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of " +
-            "ContentResolver#insert(Uri, ContentValues) when the input Uri are null")
     public void testInsert() {
         String key4 = "key4";
         String key5 = "key5";
@@ -396,13 +418,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "bulkInsert",
-        args = {android.net.Uri.class, android.content.ContentValues[].class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of " +
-            "ContentResolver#bulkInsert(Uri, ContentValues[]) when the input Uri are null")
     public void testBulkInsert() {
         String key4 = "key4";
         String key5 = "key5";
@@ -447,13 +462,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "delete",
-        args = {android.net.Uri.class, java.lang.String.class, java.lang.String[].class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of " +
-            "ContentResolver#delete(Uri, String, String[]) when the input Uri are null")
     public void testDelete() {
         mCursor = mContentResolver.query(TABLE1_URI, null, null, null, null);
         assertNotNull(mCursor);
@@ -528,14 +536,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "update",
-        args = {android.net.Uri.class, android.content.ContentValues.class,
-                java.lang.String.class, java.lang.String[].class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "The javadoc says \"return the URL of the " +
-            "newly created row\", but actually it return an integer.")
     public void testUpdate() {
         ContentValues values = new ContentValues();
         String key10 = "key10";
@@ -611,22 +611,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "registerContentObserver",
-            args = {android.net.Uri.class, boolean.class, android.database.ContentObserver.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unregisterContentObserver",
-            args = {android.database.ContentObserver.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of " +
-            "ContentResolver#registerContentObserver(Uri, boolean, ContentObserver) and " +
-            "ContentResolver#unregisterContentObserver(ContentObserver) when the input " +
-            "params are null")
     public void testRegisterContentObserver() {
         final MockContentObserver mco = new MockContentObserver();
 
@@ -637,7 +621,7 @@
         values.put(COLUMN_KEY_NAME, "key10");
         values.put(COLUMN_VALUE_NAME, 10);
         mContentResolver.update(TABLE1_URI, values, null, null);
-        new DelayedCheck() {
+        new PollingCheck() {
             @Override
             protected boolean check() {
                 return mco.hadOnChanged();
@@ -675,13 +659,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "notifyChange",
-        args = {android.net.Uri.class, android.database.ContentObserver.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of " +
-            "ContentResolver#notifyChange(Uri, ContentObserver) when uri is null")
     public void testNotifyChange1() {
         final MockContentObserver mco = new MockContentObserver();
 
@@ -689,7 +666,7 @@
         assertFalse(mco.hadOnChanged());
 
         mContentResolver.notifyChange(TABLE1_URI, mco);
-        new DelayedCheck() {
+        new PollingCheck() {
             @Override
             protected boolean check() {
                 return mco.hadOnChanged();
@@ -699,13 +676,6 @@
         mContentResolver.unregisterContentObserver(mco);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "notifyChange",
-        args = {android.net.Uri.class, android.database.ContentObserver.class, boolean.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of " +
-            "ContentResolver#notifyChange(Uri, ContentObserver, boolean) when uri is null ")
     public void testNotifyChange2() {
         final MockContentObserver mco = new MockContentObserver();
 
@@ -713,7 +683,7 @@
         assertFalse(mco.hadOnChanged());
 
         mContentResolver.notifyChange(TABLE1_URI, mco, false);
-        new DelayedCheck() {
+        new PollingCheck() {
             @Override
             protected boolean check() {
                 return mco.hadOnChanged();
@@ -723,20 +693,6 @@
         mContentResolver.unregisterContentObserver(mco);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "startSync",
-            args = {android.net.Uri.class, android.os.Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "cancelSync",
-            args = {android.net.Uri.class}
-        )
-    })
-    @ToBeFixed(bug = "1400231", explanation = "the key is SyncObserver class is deleted" +
-            " under currently enviroment(but still exists in doc)")
     public void testStartCancelSync() {
         Bundle extras = new Bundle();
 
@@ -749,13 +705,6 @@
         //FIXME: how to assert.
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "startSync",
-        args = {android.net.Uri.class, android.os.Bundle.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of " +
-            "ContentResolver#startSync(Uri, Bundle) when extras is null")
     public void testStartSyncFailure() {
         try {
             ContentResolver.requestSync(null, null, null);
@@ -765,11 +714,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "validateSyncExtrasBundle",
-        args = {android.os.Bundle.class}
-    )
     public void testValidateSyncExtrasBundle() {
         Bundle extras = new Bundle();
         extras.putInt("Integer", 20);
diff --git a/tests/tests/content/src/android/content/cts/ContentUrisTest.java b/tests/tests/content/src/android/content/cts/ContentUrisTest.java
index 369e7fe..7bd0084 100644
--- a/tests/tests/content/src/android/content/cts/ContentUrisTest.java
+++ b/tests/tests/content/src/android/content/cts/ContentUrisTest.java
@@ -20,13 +20,7 @@
 import android.net.Uri;
 import android.net.Uri.Builder;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
-@TestTargetClass(ContentUris.class)
 public class ContentUrisTest extends AndroidTestCase {
     private static final String AUTHORITY = "ctstest";
     private static final String PATH1 = "testPath1";
@@ -38,22 +32,10 @@
     private Uri uri1 = Uri.parse("content://" + AUTHORITY + "/" + PATH1);
     private Uri uri2 = Uri.parse("content://" + AUTHORITY + "/" + PATH2);
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor(s) of ContentUris.",
-        method = "ContentUris",
-        args = {}
-    )
     public void testConstructor() {
         new ContentUris();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test parseId(Uri contentUri).",
-        method = "parseId",
-        args = {android.net.Uri.class}
-    )
     public void testParseId() {
         Uri result = ContentUris.withAppendedId(uri1, CODE1);
         assertEquals(CODE1, ContentUris.parseId(result));
@@ -65,15 +47,6 @@
         assertEquals(-1, ContentUris.parseId(Uri.parse("")));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test parseId(Uri contentUri).",
-        method = "parseId",
-        args = {android.net.Uri.class}
-    )
-    @ToBeFixed(bug = "", explanation =
-        "There should not be a NullPointerException thrown out," +
-        "and should be an UnsupportedOperationException thrown out.")
     public void testParseIdFailure() {
         try {
             ContentUris.parseId(uri1);
@@ -93,12 +66,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test withAppendedId(Uri contentUri, long id).",
-        method = "withAppendedId",
-        args = {android.net.Uri.class, long.class}
-    )
     public void testWithAppendedId() {
         String expected = "content://" + AUTHORITY + "/" + PATH1 + "/" + CODE1;
         Uri actually;
@@ -111,13 +78,6 @@
         assertEquals(expected, actually.toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test withAppendedId(Uri contentUri, long id).",
-        method = "withAppendedId",
-        args = {android.net.Uri.class, long.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "Unexpected NullPointerException")
     public void testWithAppendedIdFailure() {
         try {
             ContentUris.withAppendedId(null, -1);
@@ -127,12 +87,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test appendId(Builder builder, long id).",
-        method = "appendId",
-        args = {android.net.Uri.Builder.class, long.class}
-    )
     public void testAppendId() {
         String expected = "content://" + AUTHORITY + "/" + PATH1 + "/" + CODE1;
         Builder actually;
@@ -148,13 +102,6 @@
         assertEquals(expected, actually.toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test appendId(Builder builder, long id).",
-        method = "appendId",
-        args = {android.net.Uri.Builder.class, long.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "Unexpected NullPointerException")
     public void testAppendIdFailure() {
         try {
             ContentUris.appendId(null, -1);
diff --git a/tests/tests/content/src/android/content/cts/ContentValuesTest.java b/tests/tests/content/src/android/content/cts/ContentValuesTest.java
index 335b836..24a6e36 100644
--- a/tests/tests/content/src/android/content/cts/ContentValuesTest.java
+++ b/tests/tests/content/src/android/content/cts/ContentValuesTest.java
@@ -24,13 +24,7 @@
 import android.content.ContentValues;
 import android.os.Parcel;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
-@TestTargetClass(ContentValues.class)
 public class ContentValuesTest extends AndroidTestCase {
     ContentValues mContentValues;
 
@@ -40,28 +34,6 @@
         mContentValues = new ContentValues();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of ContentValues.",
-            method = "ContentValues",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of ContentValues.",
-            method = "ContentValues",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of ContentValues.",
-            method = "ContentValues",
-            args = {android.content.ContentValues.class}
-        )
-    })
-    @ToBeFixed(bug = "1417734", explanation = "Unexpected NullPointerException and" +
-            " IllegalArgumentException")
     public void testConstructor() {
         new ContentValues();
         new ContentValues(5);
@@ -82,12 +54,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test valueSet().",
-        method = "valueSet",
-        args = {}
-    )
     public void testValueSet() {
         Set<Map.Entry<String, Object>> map;
         assertNotNull(map = mContentValues.valueSet());
@@ -101,12 +67,6 @@
         assertEquals(2, map.size());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test putNull(String key).",
-        method = "putNull",
-        args = {java.lang.String.class}
-    )
     public void testPutNull() {
         mContentValues.putNull("key");
         assertNull(mContentValues.get("key"));
@@ -121,12 +81,6 @@
         mContentValues.putNull(null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getAsLong(String key).",
-        method = "getAsLong",
-        args = {java.lang.String.class}
-    )
     public void testGetAsLong() {
         Long expected = 10L;
         mContentValues.put("Long", expected);
@@ -140,12 +94,6 @@
         assertNull(mContentValues.getAsLong(null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getAsByte(String key).",
-        method = "getAsByte",
-        args = {java.lang.String.class}
-    )
     public void testGetAsByte() {
         Byte expected = 'a';
         mContentValues.put("Byte", expected);
@@ -159,12 +107,6 @@
         assertNull(mContentValues.getAsByte(null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getAsInteger(String key).",
-        method = "getAsInteger",
-        args = {java.lang.String.class}
-    )
     public void testGetAsInteger() {
         Integer expected = 20;
         mContentValues.put("Integer", expected);
@@ -178,12 +120,6 @@
         assertNull(mContentValues.getAsInteger(null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test size().",
-        method = "size",
-        args = {}
-    )
     public void testSize() {
         assertEquals(0, mContentValues.size());
 
@@ -199,12 +135,6 @@
         assertEquals(0, mContentValues.size());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getAsShort(String key).",
-        method = "getAsShort",
-        args = {java.lang.String.class}
-    )
     public void testGetAsShort() {
         Short expected = 20;
         mContentValues.put("Short", expected);
@@ -218,12 +148,6 @@
         assertNull(mContentValues.getAsShort(null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test hashCode().",
-        method = "hashCode",
-        args = {}
-    )
     public void testHashCode() {
         assertEquals(0, mContentValues.hashCode());
 
@@ -242,12 +166,6 @@
         assertEquals(0, mContentValues.hashCode());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getAsFloat(String key).",
-        method = "getAsFloat",
-        args = {java.lang.String.class}
-    )
     public void testGetAsFloat() {
         Float expected = 1.0F;
         mContentValues.put("Float", expected);
@@ -261,12 +179,6 @@
         assertNull(mContentValues.getAsFloat(null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getAsBoolean(String key).",
-        method = "getAsBoolean",
-        args = {java.lang.String.class}
-    )
     public void testGetAsBoolean() {
         mContentValues.put("Boolean", true);
         assertTrue(mContentValues.getAsBoolean("Boolean"));
@@ -278,12 +190,6 @@
         assertNull(mContentValues.getAsBoolean(null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test toString().",
-        method = "toString",
-        args = {}
-    )
     public void testToString() {
         assertNotNull(mContentValues.toString());
 
@@ -292,12 +198,6 @@
         assertTrue(mContentValues.toString().length() > 0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test get(String key).",
-        method = "get",
-        args = {java.lang.String.class}
-    )
     public void testGet() {
         Object expected = "android";
         mContentValues.put("Object", "android");
@@ -311,12 +211,6 @@
         assertNull(mContentValues.get(null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test equals(Object object).",
-        method = "equals",
-        args = {java.lang.Object.class}
-    )
     public void testEquals() {
         mContentValues.put("Boolean", false);
         mContentValues.put("String", "string");
@@ -328,12 +222,6 @@
         assertTrue(mContentValues.equals(cv));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test equals(Object object).",
-        method = "equals",
-        args = {java.lang.Object.class}
-    )
     public void testEqualsFailure() {
         // the target object is not an instance of ContentValues.
         assertFalse(mContentValues.equals(new String()));
@@ -349,12 +237,6 @@
         assertFalse(mContentValues.equals(cv));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getAsDouble(String key).",
-        method = "getAsDouble",
-        args = {java.lang.String.class}
-    )
     public void testGetAsDouble() {
         Double expected = 10.2;
         mContentValues.put("Double", expected);
@@ -368,12 +250,6 @@
         assertNull(mContentValues.getAsDouble(null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test put(String key, String value).",
-        method = "put",
-        args = {java.lang.String.class, java.lang.String.class}
-    )
     public void testPutString() {
         String expected = "cts";
         mContentValues.put("String", expected);
@@ -387,12 +263,6 @@
         mContentValues.put(null, (String)null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test put(String key, Byte value).",
-        method = "put",
-        args = {java.lang.String.class, java.lang.Byte.class}
-    )
     public void testPutByte() {
         Byte expected = 'a';
         mContentValues.put("Byte", expected);
@@ -406,12 +276,6 @@
         mContentValues.put(null, (Byte)null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test put(String key, Short value).",
-        method = "put",
-        args = {java.lang.String.class, java.lang.Short.class}
-    )
     public void testPutShort() {
         Short expected = 20;
         mContentValues.put("Short", expected);
@@ -425,12 +289,6 @@
         mContentValues.put(null, (Short)null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test put(String key, Integer value).",
-        method = "put",
-        args = {java.lang.String.class, java.lang.Integer.class}
-    )
     public void testPutInteger() {
         Integer expected = 20;
         mContentValues.put("Integer", expected);
@@ -444,12 +302,6 @@
         mContentValues.put(null, (Integer)null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test put(String key, Long value).",
-        method = "put",
-        args = {java.lang.String.class, java.lang.Long.class}
-    )
     public void testPutLong() {
         Long expected = 10L;
         mContentValues.put("Long", expected);
@@ -463,12 +315,6 @@
         mContentValues.put(null, (Long)null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test put(String key, Float value).",
-        method = "put",
-        args = {java.lang.String.class, java.lang.Float.class}
-    )
     public void testPutFloat() {
         Float expected = 1.0F;
         mContentValues.put("Float", expected);
@@ -482,12 +328,6 @@
         mContentValues.put(null, (Float)null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test put(String key, Double value).",
-        method = "put",
-        args = {java.lang.String.class, java.lang.Double.class}
-    )
     public void testPutDouble() {
         Double expected = 10.2;
         mContentValues.put("Double", expected);
@@ -501,12 +341,6 @@
         mContentValues.put(null, (Double)null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test put(String key, Boolean value).",
-        method = "put",
-        args = {java.lang.String.class, java.lang.Boolean.class}
-    )
     public void testPutBoolean() {
         // set the expected value
         mContentValues.put("Boolean", true);
@@ -519,12 +353,6 @@
         mContentValues.put(null, (Boolean)null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test put(String key, byte[] value).",
-        method = "put",
-        args = {java.lang.String.class, byte[].class}
-    )
     public void testPutByteArray() {
         byte[] expected = new byte[] {'1', '2', '3', '4'};
         mContentValues.put("byte[]", expected);
@@ -534,12 +362,6 @@
         mContentValues.put(null, (byte[])null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test containsKey(String key).",
-        method = "containsKey",
-        args = {java.lang.String.class}
-    )
     public void testContainsKey() {
         mContentValues.put("Double", 10.2);
         mContentValues.put("Float", 1.0F);
@@ -554,12 +376,6 @@
         assertFalse(mContentValues.containsKey(null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test clear().",
-        method = "clear",
-        args = {}
-    )
     public void testClear() {
         assertEquals(0, mContentValues.size());
 
@@ -571,22 +387,6 @@
         assertEquals(0, mContentValues.size());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test putStringArrayList(String key, ArrayList<String> value) and "
-                    + "getStringArrayList(String key).",
-            method = "putStringArrayList",
-            args = {java.lang.String.class, java.util.ArrayList.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test putStringArrayList(String key, ArrayList<String> value) and "
-                    + "getStringArrayList(String key).",
-            method = "getStringArrayList",
-            args = {java.lang.String.class}
-        )
-    })
     @SuppressWarnings("deprecation")
     public void testAccessStringArrayList() {
         // set the expected value
@@ -602,12 +402,6 @@
         assertNull(mContentValues.getStringArrayList(null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test remove(String key).",
-        method = "remove",
-        args = {java.lang.String.class}
-    )
     public void testRemove() {
         assertEquals(0, mContentValues.size());
 
@@ -633,12 +427,6 @@
         mContentValues.remove(null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getAsString(String key).",
-        method = "getAsString",
-        args = {java.lang.String.class}
-    )
     public void testGetAsString() {
         String expected = "cts";
         mContentValues.put("String", expected);
@@ -652,12 +440,6 @@
         assertNull(mContentValues.getAsString(null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getAsByteArray(String key).",
-        method = "getAsByteArray",
-        args = {java.lang.String.class}
-    )
     public void testGetAsByteArray() {
         byte[] expected = new byte[] {'1', '2', '3', '4'};
         mContentValues.put("byte[]", expected);
@@ -667,12 +449,6 @@
         assertNull(mContentValues.getAsByteArray(null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test writeToParcel(Parcel parcel, int flags).",
-        method = "writeToParcel",
-        args = {android.os.Parcel.class, int.class}
-    )
     @SuppressWarnings({ "unchecked" })
     public void testWriteToParcel() {
         Parcel p = Parcel.obtain();
@@ -693,13 +469,6 @@
         assertEquals(false, values.get("Boolean"));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test writeToParcel(Parcel parcel, int flags).",
-        method = "writeToParcel",
-        args = {android.os.Parcel.class, int.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "Unexpected NullPointerException")
     public void testWriteToParcelFailure() {
         try {
             mContentValues.writeToParcel(null, -1);
@@ -709,22 +478,10 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test describeContents(). This method does nothing, and always return 0",
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
         assertEquals(0, mContentValues.describeContents());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test putAll(ContentValues other).",
-        method = "putAll",
-        args = {android.content.ContentValues.class}
-    )
     public void testPutAll() {
         assertEquals(0, mContentValues.size());
 
@@ -740,13 +497,6 @@
         assertEquals(3, mContentValues.size());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test putAll(ContentValues other).",
-        method = "putAll",
-        args = {android.content.ContentValues.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "Unexpected NullPointerException")
     public void testPutAllFailure() {
         try {
             mContentValues.putAll(null);
diff --git a/tests/tests/content/src/android/content/cts/ContextTest.java b/tests/tests/content/src/android/content/cts/ContextTest.java
index 9661a1d..70abe1f 100644
--- a/tests/tests/content/src/android/content/cts/ContextTest.java
+++ b/tests/tests/content/src/android/content/cts/ContextTest.java
@@ -19,11 +19,6 @@
 import com.android.cts.stub.R;
 import com.android.internal.util.XmlUtils;
 
-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;
 
@@ -38,7 +33,6 @@
 
 import java.io.IOException;
 
-@TestTargetClass(Context.class)
 public class ContextTest extends AndroidTestCase {
     private Context mContext;
 
@@ -49,21 +43,6 @@
         mContext.setTheme(R.style.Test_Theme);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getString(int, Object...) and getString(int).",
-            method = "getString",
-            args = {int.class, java.lang.Object[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getString(int, Object...) and getString(int).",
-            method = "getString",
-            args = {int.class}
-        )
-    })
-    @ToBeFixed(bug = "1417734", explanation = "Unexpected NotFoundException")
     public void testGetString() {
         String testString = mContext.getString(R.string.context_test_string1);
         assertEquals("This is %s string.", testString);
@@ -89,13 +68,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getText(int).",
-        method = "getText",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "Unexpected NotFoundException")
     public void testGetText() {
         CharSequence testCharSequence = mContext.getText(R.string.context_test_string2);
         assertEquals("This is test string.", testCharSequence.toString());
@@ -108,18 +80,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTheme",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTheme",
-            args = {int.class}
-        )
-    })
     public void testAccessTheme() {
         mContext.setTheme(R.style.Test_Theme);
         final Theme testTheme = mContext.getTheme();
@@ -148,32 +108,6 @@
         assertSame(testTheme, mContext.getTheme());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "obtainStyledAttributes",
-            args = {int[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "obtainStyledAttributes",
-            args = {int.class, int[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "obtainStyledAttributes",
-            args = {android.util.AttributeSet.class, int[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "obtainStyledAttributes",
-            args = {android.util.AttributeSet.class, int[].class}
-        )
-    })
     public void testObtainStyledAttributes() {
         // Test obtainStyledAttributes(int[])
         TypedArray testTypedArray = mContext
diff --git a/tests/tests/content/src/android/content/cts/ContextWrapperTest.java b/tests/tests/content/src/android/content/cts/ContextWrapperTest.java
index 6ad14e0..ec17147 100644
--- a/tests/tests/content/src/android/content/cts/ContextWrapperTest.java
+++ b/tests/tests/content/src/android/content/cts/ContextWrapperTest.java
@@ -18,11 +18,6 @@
 
 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 android.content.ActivityNotFoundException;
 import android.content.BroadcastReceiver;
@@ -35,6 +30,7 @@
 import android.content.SharedPreferences;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
+import android.cts.util.PollingCheck;
 import android.database.Cursor;
 import android.database.sqlite.SQLiteCursorDriver;
 import android.database.sqlite.SQLiteDatabase;
@@ -48,7 +44,6 @@
 import android.os.IBinder;
 import android.preference.PreferenceManager;
 import android.test.AndroidTestCase;
-import android.view.animation.cts.DelayedCheck;
 
 import java.io.File;
 import java.io.IOException;
@@ -59,7 +54,6 @@
 /**
  * Test {@link ContextWrapper}.
  */
-@TestTargetClass(ContextWrapper.class)
 public class ContextWrapperTest extends AndroidTestCase {
     private static final String PERMISSION_HARDWARE_TEST = "android.permission.HARDWARE_TEST";
 
@@ -131,11 +125,6 @@
         mRegisteredReceiverList.add(receiver);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "ContextWrapper",
-        args = {android.content.Context.class}
-    )
     public void testConstructor() {
         new ContextWrapper(mContext);
 
@@ -143,11 +132,6 @@
         new ContextWrapper(null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "enforceCallingPermission",
-        args = {String.class, String.class}
-    )
     public void testEnforceCallingPermission() {
         try {
             mContextWrapper.enforceCallingPermission(
@@ -159,11 +143,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "sendOrderedBroadcast",
-        args = {android.content.Intent.class, java.lang.String.class}
-    )
     public void testSendOrderedBroadcast1() throws InterruptedException {
         final HighPriorityBroadcastReceiver highPriorityReceiver =
                 new HighPriorityBroadcastReceiver();
@@ -176,7 +155,7 @@
 
         final Intent broadcastIntent = new Intent(ResultReceiver.MOCK_ACTION);
         mContextWrapper.sendOrderedBroadcast(broadcastIntent, null);
-        new DelayedCheck(BROADCAST_TIMEOUT) {
+        new PollingCheck(BROADCAST_TIMEOUT) {
             @Override
             protected boolean check() {
                 return highPriorityReceiver.hasReceivedBroadCast()
@@ -188,7 +167,7 @@
             highPriorityReceiver.notify();
         }
 
-        new DelayedCheck(BROADCAST_TIMEOUT) {
+        new PollingCheck(BROADCAST_TIMEOUT) {
             @Override
             protected boolean check() {
                 return highPriorityReceiver.hasReceivedBroadCast()
@@ -197,13 +176,6 @@
         }.run();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "sendOrderedBroadcast",
-        args = {android.content.Intent.class, java.lang.String.class,
-                android.content.BroadcastReceiver.class, android.os.Handler.class, int.class,
-                java.lang.String.class, android.os.Bundle.class}
-    )
     public void testSendOrderedBroadcast2() throws InterruptedException {
         final TestBroadcastReceiver broadcastReceiver = new TestBroadcastReceiver();
         broadcastReceiver.mIsOrderedBroadcasts = true;
@@ -232,18 +204,6 @@
         assertNull(resultExtras.getString(KEY_REMOVED));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "registerReceiver",
-            args = {BroadcastReceiver.class, IntentFilter.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unregisterReceiver",
-            args = {BroadcastReceiver.class}
-        )
-    })
     public void testRegisterReceiver1() throws InterruptedException {
         final FilteredReceiver broadcastReceiver = new FilteredReceiver();
         final IntentFilter filter = new IntentFilter(MOCK_ACTION1);
@@ -283,12 +243,6 @@
         assertFalse(broadcastReceiver2.hadReceivedBroadCast2());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "registerReceiver",
-        args = {android.content.BroadcastReceiver.class, android.content.IntentFilter.class,
-                java.lang.String.class, android.os.Handler.class}
-    )
     public void testRegisterReceiver2() throws InterruptedException {
         FilteredReceiver broadcastReceiver = new FilteredReceiver();
         IntentFilter filter = new IntentFilter();
@@ -312,11 +266,6 @@
         mContextWrapper.unregisterReceiver(broadcastReceiver);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "enforceCallingOrSelfPermission",
-        args = {String.class, String.class}
-    )
     public void testEnforceCallingOrSelfPermission() {
         try {
             mContextWrapper.enforceCallingOrSelfPermission(PERMISSION_HARDWARE_TEST,
@@ -328,33 +277,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setWallpaper",
-            args = {Bitmap.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setWallpaper",
-            args = {InputStream.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "clearWallpaper",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWallpaper",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "peekWallpaper",
-            args = {}
-        )
-    })
     public void testAccessWallpaper() throws IOException, InterruptedException {
         // set Wallpaper by contextWrapper#setWallpaper(Bitmap)
         Bitmap bitmap = Bitmap.createBitmap(20, 30, Bitmap.Config.RGB_565);
@@ -388,35 +310,6 @@
         assertNotSame(testDrawable, mContextWrapper.peekWallpaper());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openOrCreateDatabase",
-            args = {java.lang.String.class, int.class,
-                    android.database.sqlite.SQLiteDatabase.CursorFactory.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDatabasePath",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openOrCreateDatabase",
-            args = {String.class, int.class,
-                    android.database.sqlite.SQLiteDatabase.CursorFactory.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "databaseList",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "deleteDatabase",
-            args = {String.class}
-        )
-    })
     public void testAccessDatabase() {
         String DATABASE_NAME = "databasetest";
         String DATABASE_NAME1 = DATABASE_NAME + "1";
@@ -476,11 +369,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "enforceUriPermission",
-        args = {Uri.class, int.class, int.class, int.class, String.class}
-    )
     public void testEnforceUriPermission1() {
         try {
             Uri uri = Uri.parse("content://ctstest");
@@ -494,12 +382,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "enforceUriPermission",
-        args = {android.net.Uri.class, java.lang.String.class, java.lang.String.class, int.class,
-                int.class, int.class, java.lang.String.class}
-    )
     public void testEnforceUriPermission2() {
         Uri uri = Uri.parse("content://ctstest");
         try {
@@ -514,20 +396,10 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getPackageResourcePath",
-        args = {}
-    )
     public void testGetPackageResourcePath() {
         assertNotNull(mContextWrapper.getPackageResourcePath());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "startActivity",
-        args = {Intent.class}
-    )
     public void testStartActivity() {
         Intent intent = new Intent(mContext, ContextWrapperStubActivity.class);
         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -541,11 +413,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "createPackageContext",
-        args = {String.class, int.class}
-    )
     public void testCreatePackageContext() throws PackageManager.NameNotFoundException {
         Context actualContext = mContextWrapper.createPackageContext(getValidPackageName(),
                 Context.CONTEXT_IGNORE_SECURITY);
@@ -563,29 +430,14 @@
         return packages.get(0).packageName;
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getMainLooper",
-        args = {}
-    )
     public void testGetMainLooper() {
         assertNotNull(mContextWrapper.getMainLooper());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getApplicationContext",
-        args = {}
-    )
     public void testGetApplicationContext() {
         assertSame(mContext.getApplicationContext(), mContextWrapper.getApplicationContext());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSharedPreferences",
-        args = {String.class, int.class}
-    )
     public void testGetSharedPreferences() {
         SharedPreferences sp;
         SharedPreferences localSP;
@@ -597,41 +449,11 @@
         assertSame(sp, localSP);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "revokeUriPermission",
-        args = {Uri.class, int.class}
-    )
-    @ToBeFixed(bug = "1400249", explanation = "Can't test the effect of this function, should be"
-        + "tested by functional test.")
     public void testRevokeUriPermission() {
         Uri uri = Uri.parse("contents://ctstest");
         mContextWrapper.revokeUriPermission(uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startService",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "bindService",
-            args = {android.content.Intent.class, android.content.ServiceConnection.class,
-                    int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stopService",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unbindService",
-            args = {ServiceConnection.class}
-        )
-    })
     public void testAccessService() throws InterruptedException {
         MockContextWrapperService.reset();
         bindExpectResult(mContextWrapper, new Intent(mContext, MockContextWrapperService.class));
@@ -646,54 +468,22 @@
         assertTrue(MockContextWrapperService.hadCalledOnUnbind());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getPackageCodePath",
-        args = {}
-    )
     public void testGetPackageCodePath() {
         assertNotNull(mContextWrapper.getPackageCodePath());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getPackageName",
-        args = {}
-    )
     public void testGetPackageName() {
         assertEquals("com.android.cts.stub", mContextWrapper.getPackageName());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getCacheDir",
-        args = {}
-    )
     public void testGetCacheDir() {
         assertNotNull(mContextWrapper.getCacheDir());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getContentResolver",
-        args = {}
-    )
     public void testGetContentResolver() {
         assertSame(mContext.getContentResolver(), mContextWrapper.getContentResolver());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "attachBaseContext",
-            args = {Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBaseContext",
-            args = {}
-        )
-    })
     public void testAccessBaseContext() throws PackageManager.NameNotFoundException {
         MockContextWrapper testContextWrapper = new MockContextWrapper(mContext);
 
@@ -712,11 +502,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getFileStreamPath",
-        args = {String.class}
-    )
     public void testGetFileStreamPath() {
         String TEST_FILENAME = "TestGetFileStreamPath";
 
@@ -725,27 +510,10 @@
         assertTrue(fileStreamPath.indexOf(TEST_FILENAME) >= 0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getClassLoader",
-        args = {}
-    )
     public void testGetClassLoader() {
         assertSame(mContext.getClassLoader(), mContextWrapper.getClassLoader());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWallpaperDesiredMinimumHeight",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWallpaperDesiredMinimumWidth",
-            args = {}
-        )
-    })
     public void testGetWallpaperDesiredMinimumHeightAndWidth() {
         int height = mContextWrapper.getWallpaperDesiredMinimumHeight();
         int width = mContextWrapper.getWallpaperDesiredMinimumWidth();
@@ -757,18 +525,6 @@
         assertTrue((height > 0 && width > 0) || (height <= 0 && width <= 0));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "sendStickyBroadcast",
-            args = {Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeStickyBroadcast",
-            args = {Intent.class}
-        )
-    })
     public void testAccessStickyBroadcast() throws InterruptedException {
         ResultReceiver resultReceiver = new ResultReceiver();
 
@@ -796,11 +552,6 @@
         mContextWrapper.unregisterReceiver(stickyReceiver);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "checkCallingOrSelfUriPermission",
-        args = {Uri.class, int.class}
-    )
     public void testCheckCallingOrSelfUriPermission() {
         Uri uri = Uri.parse("content://ctstest");
 
@@ -809,23 +560,11 @@
         assertEquals(PackageManager.PERMISSION_DENIED, retValue);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "grantUriPermission",
-        args = {String.class, Uri.class, int.class}
-    )
-    @ToBeFixed(bug = "1400249", explanation = "Can't test the effect of this function,"
-            + " should be tested by functional test.")
     public void testGrantUriPermission() {
         mContextWrapper.grantUriPermission("com.android.mms", Uri.parse("contents://ctstest"),
                 Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "enforcePermission",
-        args = {String.class, int.class, int.class, String.class}
-    )
     public void testEnforcePermission() {
         try {
             mContextWrapper.enforcePermission(
@@ -839,11 +578,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "checkUriPermission",
-        args = {Uri.class, int.class, int.class, int.class}
-    )
     public void testCheckUriPermission1() {
         Uri uri = Uri.parse("content://ctstest");
 
@@ -856,11 +590,6 @@
         assertEquals(PackageManager.PERMISSION_DENIED, retValue);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "checkUriPermission",
-        args = {Uri.class, String.class, String.class, int.class, int.class, int.class}
-    )
     public void testCheckUriPermission2() {
         Uri uri = Uri.parse("content://ctstest");
 
@@ -875,21 +604,11 @@
         assertEquals(PackageManager.PERMISSION_DENIED, retValue);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "checkCallingPermission",
-        args = {java.lang.String.class}
-    )
     public void testCheckCallingPermission() {
         int retValue = mContextWrapper.checkCallingPermission(PERMISSION_HARDWARE_TEST);
         assertEquals(PackageManager.PERMISSION_DENIED, retValue);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "checkCallingUriPermission",
-        args = {Uri.class, int.class}
-    )
     public void testCheckCallingUriPermission() {
         Uri uri = Uri.parse("content://ctstest");
 
@@ -898,11 +617,6 @@
         assertEquals(PackageManager.PERMISSION_DENIED, retValue);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "enforceCallingUriPermission",
-        args = {Uri.class, int.class, String.class}
-    )
     public void testEnforceCallingUriPermission() {
         try {
             Uri uri = Uri.parse("content://ctstest");
@@ -915,41 +629,21 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getDir",
-        args = {String.class, int.class}
-    )
     public void testGetDir() {
         File dir = mContextWrapper.getDir("testpath", Context.MODE_WORLD_WRITEABLE);
         assertNotNull(dir);
         dir.delete();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getPackageManager",
-        args = {}
-    )
     public void testGetPackageManager() {
         assertSame(mContext.getPackageManager(), mContextWrapper.getPackageManager());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "checkCallingOrSelfPermission",
-        args = {String.class}
-    )
     public void testCheckCallingOrSelfPermission() {
         int retValue = mContextWrapper.checkCallingOrSelfPermission("android.permission.GET_TASKS");
         assertEquals(PackageManager.PERMISSION_GRANTED, retValue);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "sendBroadcast",
-        args = {Intent.class}
-    )
     public void testSendBroadcast1() throws InterruptedException {
         final ResultReceiver receiver = new ResultReceiver();
 
@@ -957,7 +651,7 @@
 
         mContextWrapper.sendBroadcast(new Intent(ResultReceiver.MOCK_ACTION));
 
-        new DelayedCheck(BROADCAST_TIMEOUT){
+        new PollingCheck(BROADCAST_TIMEOUT){
             @Override
             protected boolean check() {
                 return receiver.hasReceivedBroadCast();
@@ -965,11 +659,6 @@
         }.run();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "sendBroadcast",
-        args = {Intent.class, String.class}
-    )
     public void testSendBroadcast2() throws InterruptedException {
         final ResultReceiver receiver = new ResultReceiver();
 
@@ -977,7 +666,7 @@
 
         mContextWrapper.sendBroadcast(new Intent(ResultReceiver.MOCK_ACTION), null);
 
-        new DelayedCheck(BROADCAST_TIMEOUT){
+        new PollingCheck(BROADCAST_TIMEOUT){
             @Override
             protected boolean check() {
                 return receiver.hasReceivedBroadCast();
@@ -985,11 +674,6 @@
         }.run();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "enforceCallingOrSelfUriPermission",
-        args = {Uri.class, int.class, String.class}
-    )
     public void testEnforceCallingOrSelfUriPermission() {
         try {
             Uri uri = Uri.parse("content://ctstest");
@@ -1003,11 +687,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "checkPermission",
-        args = {String.class, int.class, int.class}
-    )
     public void testCheckPermission() {
         // Test with root user, everything will be granted.
         int returnValue = mContextWrapper.checkPermission(PERMISSION_HARDWARE_TEST, 1, 0);
@@ -1029,11 +708,6 @@
         assertEquals(PackageManager.PERMISSION_DENIED, returnValue);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSystemService",
-        args = {String.class}
-    )
     public void testGetSystemService() {
         // Test invalid service name
         assertNull(mContextWrapper.getSystemService("invalid"));
@@ -1042,30 +716,14 @@
         assertNotNull(mContextWrapper.getSystemService(Context.WINDOW_SERVICE));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getAssets",
-        args = {}
-    )
     public void testGetAssets() {
         assertSame(mContext.getAssets(), mContextWrapper.getAssets());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getResources",
-        args = {}
-    )
     public void testGetResources() {
         assertSame(mContext.getResources(), mContextWrapper.getResources());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "startInstrumentation",
-        args = {android.content.ComponentName.class, java.lang.String.class,
-                android.os.Bundle.class}
-    )
     public void testStartInstrumentation() {
         // Use wrong name
         ComponentName cn = new ComponentName("com.android",
diff --git a/tests/tests/content/src/android/content/cts/IntentFilterTest.java b/tests/tests/content/src/android/content/cts/IntentFilterTest.java
index 4c050e3..87a1834 100644
--- a/tests/tests/content/src/android/content/cts/IntentFilterTest.java
+++ b/tests/tests/content/src/android/content/cts/IntentFilterTest.java
@@ -53,13 +53,7 @@
 
 import com.android.internal.util.FastXmlSerializer;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
-@TestTargetClass(IntentFilter.class)
 public class IntentFilterTest extends AndroidTestCase {
 
     private IntentFilter mIntentFilter;
@@ -78,28 +72,6 @@
         mIntentFilter = new IntentFilter();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "IntentFilter",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "IntentFilter",
-            args = {android.content.IntentFilter.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "IntentFilter",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "IntentFilter",
-            args = {java.lang.String.class, java.lang.String.class}
-        )
-    })
     public void testConstructor() throws MalformedMimeTypeException {
 
         IntentFilter filter = new IntentFilter();
@@ -143,33 +115,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "categoriesIterator",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addCategory",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCategory",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasCategory",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "countCategories",
-            args = {}
-        )
-    })
     public void testCategories() {
         for (int i = 0; i < 10; i++) {
             mIntentFilter.addCategory(CATEGORY + i);
@@ -211,20 +156,6 @@
                         "category1", "category2", "category3" }, null, null), });
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "match",
-            args = {android.content.ContentResolver.class, android.content.Intent.class,
-                    boolean.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "match",
-            args = {java.lang.String.class, java.lang.String.class, java.lang.String.class,
-                    android.net.Uri.class, java.util.Set.class, java.lang.String.class}
-        )
-    })
     public void testMimeTypes() throws Exception {
         IntentFilter filter = new Match(null, null, new String[] { "which1/what1" }, null, null,
                 null);
@@ -284,51 +215,12 @@
                         null), });
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPriority",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPriority",
-            args = {}
-        )
-    })
     public void testAccessPriority() {
         final int expected = 1;
         mIntentFilter.setPriority(expected);
         assertEquals(expected, mIntentFilter.getPriority());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "schemesIterator",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDataScheme",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addDataScheme",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "countDataSchemes",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasDataScheme",
-            args = {java.lang.String.class}
-        )
-    })
     public void testDataSchemes() {
         for (int i = 0; i < 10; i++) {
             mIntentFilter.addDataScheme(DATA_SCHEME + i);
@@ -362,44 +254,12 @@
                 new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, "scheme3:foo"), });
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "create",
-        args = {java.lang.String.class, java.lang.String.class}
-    )
     public void testCreate() {
         IntentFilter filter = IntentFilter.create(ACTION, DATA_TYPE);
         assertNotNull(filter);
         verifyContent(filter, ACTION, DATA_TYPE);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "authoritiesIterator",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "countDataAuthorities",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasDataAuthority",
-            args = {android.net.Uri.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addDataAuthority",
-            args = {java.lang.String.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDataAuthority",
-            args = {int.class}
-        )
-    })
     public void testAuthorities() {
         for (int i = 0; i < 10; i++) {
             mIntentFilter.addDataAuthority(HOST + i, String.valueOf(PORT + i));
@@ -463,33 +323,6 @@
                         "scheme1://authority1:200/"), });
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasDataType",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addDataType",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDataType",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "typesIterator",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "countDataTypes",
-            args = {}
-        )
-    })
     public void testDataTypes() throws MalformedMimeTypeException {
         for (int i = 0; i < 10; i++) {
             mIntentFilter.addDataType(DATA_TYPE + i);
@@ -508,11 +341,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "matchData",
-        args = {java.lang.String.class, java.lang.String.class, android.net.Uri.class}
-    )
     public void testMatchData() throws MalformedMimeTypeException {
         int expected = IntentFilter.MATCH_CATEGORY_EMPTY + IntentFilter.MATCH_ADJUSTMENT_NORMAL;
         assertEquals(expected, mIntentFilter.matchData(null, null, null));
@@ -544,38 +372,6 @@
         assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.matchData(null, DATA_SCHEME, uri));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "countActions",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addAction",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "actionsIterator",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasAction",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "matchAction",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAction",
-            args = {int.class}
-        )
-    })
     public void testActions() {
         for (int i = 0; i < 10; i++) {
             mIntentFilter.addAction(ACTION + i);
@@ -608,18 +404,6 @@
                 new MatchCondition(IntentFilter.NO_MATCH_ACTION, "action3", null, null, null), });
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeToXml",
-            args = {org.xmlpull.v1.XmlSerializer.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readFromXml",
-            args = {org.xmlpull.v1.XmlPullParser.class}
-        )
-    })
     public void testWriteToXml() throws IllegalArgumentException, IllegalStateException,
             IOException, MalformedMimeTypeException, XmlPullParserException {
         XmlSerializer xml;
@@ -651,11 +435,6 @@
         out.close();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "matchCategories",
-        args = {java.util.Set.class}
-    )
     public void testMatchCategories() {
         assertNull(mIntentFilter.matchCategories(null));
         Set<String> cat = new HashSet<String>();
@@ -673,11 +452,6 @@
         assertEquals(expected, mIntentFilter.matchCategories(cat));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "matchDataAuthority",
-        args = {android.net.Uri.class}
-    )
     public void testMatchDataAuthority() {
         assertEquals(IntentFilter.NO_MATCH_DATA, mIntentFilter.matchDataAuthority(null));
         mIntentFilter.addDataAuthority(HOST, String.valueOf(PORT));
@@ -685,27 +459,10 @@
         assertEquals(IntentFilter.MATCH_CATEGORY_PORT, mIntentFilter.matchDataAuthority(uri));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
         assertEquals(0, mIntentFilter.describeContents());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readFromXml",
-            args = {org.xmlpull.v1.XmlPullParser.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDataScheme",
-            args = {int.class}
-        )
-    })
     public void testReadFromXml() throws NameNotFoundException, XmlPullParserException, IOException {
         XmlPullParser parser = null;
         ActivityInfo ai = null;
@@ -741,38 +498,6 @@
         assertEquals("test", mIntentFilter.getDataPath(2).getPath());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "pathsIterator",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addDataPath",
-            args = {java.lang.String.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasDataPath",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDataPath",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addDataPath",
-            args = {java.lang.String.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "countDataPaths",
-            args = {}
-        )
-    })
     public void testDataPaths() {
         for (int i = 0; i < 10; i++) {
             mIntentFilter.addDataPath(DATA_PATH + i, PatternMatcher.PATTERN_PREFIX);
@@ -874,12 +599,6 @@
                         "scheme1://authority1:200/"), });
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "match",
-        args = {android.content.ContentResolver.class, android.content.Intent.class, boolean.class,
-                java.lang.String.class}
-    )
     public void testMatchWithIntent() throws MalformedMimeTypeException {
         final ContentResolver resolver = mContext.getContentResolver();
 
@@ -916,12 +635,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "match",
-        args = {java.lang.String.class, java.lang.String.class, java.lang.String.class,
-                android.net.Uri.class, java.util.Set.class, java.lang.String.class}
-    )
     public void testMatchWithIntentData() throws MalformedMimeTypeException {
         Set<String> cat = new HashSet<String>();
         assertEquals(IntentFilter.NO_MATCH_ACTION, mIntentFilter.match(ACTION, null, null, null,
@@ -981,11 +694,6 @@
                 DATA_SCHEME, URI, cat, null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {android.os.Parcel.class, int.class}
-    )
     public void testWriteToParcel() throws MalformedMimeTypeException {
         mIntentFilter.addAction(ACTION);
         mIntentFilter.addCategory(CATEGORY);
@@ -1007,11 +715,6 @@
         assertEquals(mIntentFilter.getDataScheme(0), target.getDataScheme(0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addDataType",
-        args = {java.lang.String.class}
-    )
     public void testAddDataType() throws MalformedMimeTypeException {
         try {
             mIntentFilter.addDataType("test");
@@ -1128,28 +831,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addDataPath",
-            args = {java.lang.String.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "countDataPaths",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDataPath",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasDataPath",
-            args = {java.lang.String.class}
-        )
-    })
     public void testPaths() throws Exception {
         IntentFilter filter = new Match(null, null, null,
                 new String[]{"scheme"}, new String[]{"authority"}, null,
@@ -1317,12 +998,6 @@
                         "scheme://authority/a1b"), });
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dump",
-        args = {Printer.class, String.class}
-    )
-    @ToBeFixed(explanation = "new IntentFilter().dump(...) does not print anything at all")
     public void testDump() throws MalformedMimeTypeException {
         TestPrinter printer = new TestPrinter();
         String prefix = "TestIntentFilter";
diff --git a/tests/tests/content/src/android/content/cts/IntentFilter_AuthorityEntryTest.java b/tests/tests/content/src/android/content/cts/IntentFilter_AuthorityEntryTest.java
index b831861..11fec09 100644
--- a/tests/tests/content/src/android/content/cts/IntentFilter_AuthorityEntryTest.java
+++ b/tests/tests/content/src/android/content/cts/IntentFilter_AuthorityEntryTest.java
@@ -20,12 +20,7 @@
 import android.content.IntentFilter.AuthorityEntry;
 import android.net.Uri;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(IntentFilter.AuthorityEntry.class)
 public class IntentFilter_AuthorityEntryTest extends AndroidTestCase {
 
     private AuthorityEntry mAuthorityEntry;
@@ -39,11 +34,6 @@
         mAuthorityEntry = new AuthorityEntry(mHost, String.valueOf(mPort));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "IntentFilter.AuthorityEntry",
-        args = {java.lang.String.class, java.lang.String.class}
-    )
     public void testConstructor() {
         mAuthorityEntry = new AuthorityEntry(mHost, String.valueOf(mPort));
         assertNotNull(mAuthorityEntry);
@@ -56,28 +46,11 @@
         assertEquals(Integer.valueOf(mPort).intValue(), mAuthorityEntry.getPort());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPort",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getHost",
-            args = {}
-        )
-    })
     public void testAuthorityEntryProperties() {
         assertEquals(Integer.valueOf(mPort).intValue(), mAuthorityEntry.getPort());
         assertEquals(mHost, mAuthorityEntry.getHost());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "match",
-        args = {android.net.Uri.class}
-    )
     public void testMatch() {
         Uri uri = Uri.parse("testUri");
         assertEquals(IntentFilter.NO_MATCH_DATA, mAuthorityEntry.match(uri));
diff --git a/tests/tests/content/src/android/content/cts/IntentFilter_MalformedMimeTypeExceptionTest.java b/tests/tests/content/src/android/content/cts/IntentFilter_MalformedMimeTypeExceptionTest.java
index efe4fb2..cc988fb 100644
--- a/tests/tests/content/src/android/content/cts/IntentFilter_MalformedMimeTypeExceptionTest.java
+++ b/tests/tests/content/src/android/content/cts/IntentFilter_MalformedMimeTypeExceptionTest.java
@@ -19,12 +19,7 @@
 import android.content.IntentFilter;
 import android.content.IntentFilter.MalformedMimeTypeException;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(MalformedMimeTypeException.class)
 public class IntentFilter_MalformedMimeTypeExceptionTest extends
         AndroidTestCase {
 
@@ -36,18 +31,6 @@
         mMalformedMimeTypeException = null;
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "IntentFilter.MalformedMimeTypeException",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "IntentFilter.MalformedMimeTypeException",
-            args = {java.lang.String.class}
-        )
-    })
     public void testMalformedMimeTypeException() {
         mMalformedMimeTypeException = new IntentFilter.MalformedMimeTypeException();
         assertNotNull(mMalformedMimeTypeException);
diff --git a/tests/tests/content/src/android/content/cts/IntentTest.java b/tests/tests/content/src/android/content/cts/IntentTest.java
index 995c668..a88fdf2 100644
--- a/tests/tests/content/src/android/content/cts/IntentTest.java
+++ b/tests/tests/content/src/android/content/cts/IntentTest.java
@@ -19,10 +19,6 @@
 import com.android.internal.app.ResolverActivity;
 import com.android.internal.util.XmlUtils;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
@@ -53,7 +49,6 @@
 import java.util.ArrayList;
 import java.util.Set;
 
-@TestTargetClass(Intent.class)
 public class IntentTest extends AndroidTestCase {
 
     private Intent mIntent;
@@ -80,39 +75,6 @@
         mAnotherComponentName = new ComponentName(mContext, "tmp");
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Intent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Intent",
-            args = {android.content.Context.class, java.lang.Class.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Intent",
-            args = {android.content.Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Intent",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Intent",
-            args = {java.lang.String.class, android.net.Uri.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Intent",
-            args = {java.lang.String.class, android.net.Uri.class,
-                    android.content.Context.class, java.lang.Class.class}
-        )
-    })
     public void testConstructor() {
         mIntent = new Intent();
         assertNotNull(mIntent);
@@ -144,18 +106,6 @@
         assertEquals(mComponentName, mIntent.getComponent());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeExtra",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putExtra",
-            args = {java.lang.String.class, java.lang.String.class}
-        )
-    })
     public void testRemoveExtra() {
         mIntent = new Intent();
         mIntent.putExtra(TEST_EXTRA_NAME, "testvalue");
@@ -164,67 +114,12 @@
         assertNull(mIntent.getStringExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCharSequenceExtra",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putExtra",
-            args = {java.lang.String.class, java.lang.CharSequence.class}
-        )
-    })
     public void testGetCharSequenceExtra() {
         final CharSequence expected = "CharSequencetest";
         mIntent.putExtra(TEST_EXTRA_NAME, expected);
         assertEquals(expected, mIntent.getCharSequenceExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readFromParcel",
-            args = {android.os.Parcel.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAction",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setData",
-            args = {android.net.Uri.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setType",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-
-            method = "setFlags",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setComponent",
-            args = {android.content.ComponentName.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addCategory",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeToParcel",
-            args = {android.os.Parcel.class, int.class}
-        )
-    })
     public void testReadFromParcel() {
         mIntent.setAction(TEST_ACTION);
         mIntent.setData(TEST_URI);
@@ -245,18 +140,6 @@
         assertEquals(mIntent.toURI(), target.toURI());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putParcelableArrayListExtra",
-            args = {java.lang.String.class, java.util.ArrayList.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getParcelableArrayListExtra",
-            args = {java.lang.String.class}
-        )
-    })
     public void testGetParcelableArrayListExtra() {
         final ArrayList<Intent> expected = new ArrayList<Intent>();
         Intent intent = new Intent(TEST_ACTION);
@@ -268,63 +151,22 @@
         assertEquals(expected, target);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "filterHashCode",
-        args = {}
-    )
     public void testFilterHashCode() {
         mIntent.filterHashCode();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCategories",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addCategory",
-            args = {java.lang.String.class}
-        )
-    })
     public void testGetCategories() {
         mIntent.addCategory(TEST_CATEGORY);
         final Set<String> target = mIntent.getCategories();
         assertEquals(TEST_CATEGORY, target.toArray()[0]);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setData",
-            args = {android.net.Uri.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getScheme",
-            args = {}
-        )
-    })
     public void testGetScheme() {
         assertNull(mIntent.getScheme());
         mIntent.setData(TEST_URI);
         assertEquals(TEST_URI.getScheme(), mIntent.getScheme());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putIntegerArrayListExtra",
-            args = {java.lang.String.class, java.util.ArrayList.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIntegerArrayListExtra",
-            args = {java.lang.String.class}
-        )
-    })
     public void testGetIntegerArrayListExtra() {
         final ArrayList<Integer> expected = new ArrayList<Integer>();
         expected.add(0);
@@ -332,18 +174,6 @@
         assertEquals(expected, mIntent.getIntegerArrayListExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putExtra",
-            args = {java.lang.String.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasExtra",
-            args = {java.lang.String.class}
-        )
-    })
     public void testHasExtra() {
         mIntent = new Intent();
         assertFalse(mIntent.hasExtra(TEST_EXTRA_NAME));
@@ -351,11 +181,6 @@
         assertTrue(mIntent.hasExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getIntArrayExtra",
-        args = {java.lang.String.class}
-    )
     public void testGetIntArrayExtra() {
         final int[] expected = { 1, 2, 3 };
         assertNull(mIntent.getIntArrayExtra(TEST_EXTRA_NAME));
@@ -363,53 +188,17 @@
         assertEquals(expected, mIntent.getIntArrayExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setClassName",
-            args = {android.content.Context.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getComponent",
-            args = {}
-        )
-    })
     public void testSetClassName1() {
         final Intent intent = mIntent.setClassName(mContext, MockActivity.class.getName());
         assertEquals(mComponentName, mIntent.getComponent());
         assertSame(mIntent, intent);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setClassName",
-            args = {java.lang.String.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getComponent",
-            args = {}
-        )
-    })
     public void testSetClassName2() {
         mIntent.setClassName(mContext.getPackageName(), MockActivity.class.getName());
         assertEquals(mComponentName, mIntent.getComponent());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIntExtra",
-            args = {java.lang.String.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putExtra",
-            args = {java.lang.String.class, int.class}
-        )
-    })
     public void testGetIntExtra() {
         final int expected = 0;
         mIntent = new Intent();
@@ -419,18 +208,6 @@
 
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putIntegerArrayListExtra",
-            args = {java.lang.String.class, java.util.ArrayList.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIntegerArrayListExtra",
-            args = {java.lang.String.class}
-        )
-    })
     public void testPutIntegerArrayListExtra() {
         final ArrayList<Integer> expected = new ArrayList<Integer>();
         expected.add(0);
@@ -439,35 +216,11 @@
         assertEquals(expected, mIntent.getIntegerArrayListExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setType",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getType",
-            args = {}
-        )
-    })
     public void testAccessType() {
         mIntent.setType(TEST_TYPE);
         assertEquals(TEST_TYPE, mIntent.getType());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putExtras",
-            args = {android.os.Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBundleExtra",
-            args = {java.lang.String.class}
-        )
-    })
     public void testGetBundleExtra() {
         final Bundle expected = new Bundle();
         expected.putBoolean("testTrue", true);
@@ -477,18 +230,6 @@
         assertEquals(expected, mIntent.getBundleExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putExtra",
-            args = {java.lang.String.class, char[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCharArrayExtra",
-            args = {java.lang.String.class}
-        )
-    })
     public void testGetCharArrayExtra() {
         final char[] expected = { 'a', 'b', 'c' };
         mIntent.putExtra(TEST_EXTRA_NAME, expected);
@@ -499,36 +240,12 @@
         assertEquals(expected[2], actual[2]);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putExtra",
-            args = {java.lang.String.class, double[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDoubleArrayExtra",
-            args = {java.lang.String.class}
-        )
-    })
     public void testGetDoubleArrayExtra() {
         final double[] expected = { 1d, 2d };
         mIntent.putExtra(TEST_EXTRA_NAME, expected);
         assertEquals(expected, mIntent.getDoubleArrayExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putStringArrayListExtra",
-            args = {java.lang.String.class, java.util.ArrayList.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStringArrayListExtra",
-            args = {java.lang.String.class}
-        )
-    })
     public void testPutStringArrayListExtra() {
         final ArrayList<String> expected = new ArrayList<String>();
         expected.add("testString");
@@ -536,23 +253,6 @@
         assertEquals(expected, mIntent.getStringArrayListExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "resolveType",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setType",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setData",
-            args = {android.net.Uri.class}
-        )
-    })
     public void testResolveType1() {
         final ContentResolver contentResolver = mContext.getContentResolver();
         assertNull(mIntent.resolveType(mContext));
@@ -565,23 +265,6 @@
         assertNull(mIntent.resolveType(mContext));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "resolveType",
-            args = {android.content.ContentResolver.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setType",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setData",
-            args = {android.net.Uri.class}
-        )
-    })
     public void testResolveType2() {
         final ContentResolver contentResolver = mContext.getContentResolver();
         assertNull(mIntent.resolveType(contentResolver));
@@ -594,76 +277,29 @@
         assertNull(mIntent.resolveType(contentResolver));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setComponent",
-            args = {android.content.ComponentName.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getComponent",
-            args = {}
-        )
-    })
     public void testAccessComponent() {
         mIntent.setComponent(mComponentName);
         assertEquals(mComponentName, mIntent.getComponent());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setData",
-            args = {android.net.Uri.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDataString",
-            args = {}
-        )
-    })
     public void testGetDataString() {
         assertNull(mIntent.getDataString());
         mIntent.setData(TEST_URI);
         assertEquals(TEST_URI.toString(), mIntent.getDataString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "hasCategory",
-        args = {java.lang.String.class}
-    )
     public void testHasCategory() {
         assertFalse(mIntent.hasCategory(TEST_CATEGORY));
         mIntent.addCategory(TEST_CATEGORY);
         assertTrue(mIntent.hasCategory(TEST_CATEGORY));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLongArrayExtra",
-        args = {java.lang.String.class}
-    )
     public void testGetLongArrayExtra() {
         final long[] expected = { 1l, 2l, 3l };
         mIntent.putExtra(TEST_EXTRA_NAME, expected);
         assertEquals(expected, mIntent.getLongArrayExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "parseIntent",
-            args = {android.content.res.Resources.class, org.xmlpull.v1.XmlPullParser.class,
-                    android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIBinderExtra",
-            args = {java.lang.String.class}
-        )
-    })
     public void testParseIntent() throws XmlPullParserException, IOException,
         NameNotFoundException {
         mIntent = null;
@@ -712,22 +348,12 @@
         assertEquals(Uri.parse("http://www.google.com/"), mIntent.getData());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setClass",
-        args = {android.content.Context.class, java.lang.Class.class}
-    )
     public void testSetClass() {
         assertNull(mIntent.getComponent());
         mIntent.setClass(mContext, MockActivity.class);
         assertEquals(mComponentName, mIntent.getComponent());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "resolveTypeIfNeeded",
-        args = {android.content.ContentResolver.class}
-    )
     public void testResolveTypeIfNeeded() {
         ContentResolver contentResolver = mContext.getContentResolver();
         assertNull(mIntent.resolveTypeIfNeeded(contentResolver));
@@ -747,11 +373,6 @@
         assertNull(mIntent.resolveTypeIfNeeded(contentResolver));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "putExtra",
-        args = {java.lang.String.class, boolean.class}
-    )
     public void testPutExtra1() {
         assertFalse(mIntent.getBooleanExtra(TEST_EXTRA_NAME, false));
         mIntent.putExtra(TEST_EXTRA_NAME, true);
@@ -760,22 +381,12 @@
         assertFalse(mIntent.getBooleanExtra(TEST_EXTRA_NAME, false));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "putExtra",
-        args = {java.lang.String.class, byte.class}
-    )
     public void testPutExtra2() {
         final byte expected = Byte.valueOf("1");
         mIntent.putExtra(TEST_EXTRA_NAME, expected);
         assertEquals(expected, mIntent.getByteExtra(TEST_EXTRA_NAME, Byte.valueOf("1")));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "putExtra",
-        args = {java.lang.String.class, char.class}
-    )
     public void testPutExtra3() {
         assertEquals('a', mIntent.getCharExtra(TEST_EXTRA_NAME, 'a'));
         final char expected = 'a';
@@ -783,11 +394,6 @@
         assertEquals(expected, mIntent.getCharExtra(TEST_EXTRA_NAME, 'a'));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "putExtra",
-        args = {java.lang.String.class, short.class}
-    )
     public void testPutExtra4() {
         final Short expected = Short.valueOf("2");
         assertEquals(Short.valueOf("1").shortValue(), mIntent.getShortExtra(
@@ -796,11 +402,6 @@
         assertEquals(expected.shortValue(), mIntent.getShortExtra(TEST_EXTRA_NAME, Short.valueOf("1")));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "putExtra",
-        args = {java.lang.String.class, int.class}
-    )
     public void testPutExtra5() {
         final int expected = 2;
         assertEquals(1, mIntent.getIntExtra(TEST_EXTRA_NAME, 1));
@@ -808,11 +409,6 @@
         assertEquals(expected, mIntent.getIntExtra(TEST_EXTRA_NAME, 1));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "putExtra",
-        args = {java.lang.String.class, long.class}
-    )
     public void testPutExtra6() {
         final long expected = 2l;
         assertEquals(1l, mIntent.getLongExtra(TEST_EXTRA_NAME, 1l));
@@ -820,11 +416,6 @@
         assertEquals(expected, mIntent.getLongExtra(TEST_EXTRA_NAME, 1l));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "putExtra",
-        args = {java.lang.String.class, float.class}
-    )
     public void testPutExtra7() {
         final float expected = 2f;
         assertEquals(1f, mIntent.getFloatExtra(TEST_EXTRA_NAME, 1f));
@@ -832,11 +423,6 @@
         assertEquals(expected, mIntent.getFloatExtra(TEST_EXTRA_NAME, 1f));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "putExtra",
-        args = {java.lang.String.class, double.class}
-    )
     public void testPutExtra8() {
         final double expected = 2d;
         assertEquals(1d, mIntent.getDoubleExtra(TEST_EXTRA_NAME, 1d));
@@ -844,11 +430,6 @@
         assertEquals(expected, mIntent.getDoubleExtra(TEST_EXTRA_NAME, 1d));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "putExtra",
-        args = {java.lang.String.class, java.lang.String.class}
-    )
     public void testPutExtra9() {
         final String expected = "testString";
         assertNull(mIntent.getStringExtra(TEST_EXTRA_NAME));
@@ -856,11 +437,6 @@
         assertEquals(expected, mIntent.getStringExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "putExtra",
-        args = {java.lang.String.class, java.lang.CharSequence.class}
-    )
     public void testPutExtra10() {
         final CharSequence expected = "testString";
         assertNull(mIntent.getCharSequenceExtra(TEST_EXTRA_NAME));
@@ -868,40 +444,18 @@
         assertEquals(expected, mIntent.getCharSequenceExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putExtra",
-            args = {java.lang.String.class, android.os.Parcelable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getParcelableExtra",
-            args = {java.lang.String.class}
-        )
-    })
     public void testPutExtra11() {
         final Intent expected = new Intent(TEST_ACTION);
         mIntent.putExtra(TEST_EXTRA_NAME, expected);
         assertEquals(expected, mIntent.getParcelableExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "putExtra",
-        args = {java.lang.String.class, android.os.Parcelable[].class}
-    )
     public void testPutExtra12() {
         final Intent[] expected = { new Intent(TEST_ACTION), new Intent(mContext, MockActivity.class) };
         mIntent.putExtra(TEST_EXTRA_NAME, expected);
         assertEquals(expected, mIntent.getParcelableArrayExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "putExtra",
-        args = {java.lang.String.class, java.io.Serializable.class}
-    )
     public void testPutExtra13() {
         final TestSerializable expected = new TestSerializable();
         expected.Name = "testName";
@@ -911,110 +465,60 @@
         assertEquals(expected.Name, target.Name);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "putExtra",
-        args = {java.lang.String.class, boolean[].class}
-    )
     public void testPutExtra14() {
         final boolean[] expected = { true, true, false };
         mIntent.putExtra(TEST_EXTRA_NAME, expected);
         assertEquals(expected, mIntent.getBooleanArrayExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "putExtra",
-        args = {java.lang.String.class, byte[].class}
-    )
     public void testPutExtra15() {
         final byte[] expected = TEST_ACTION.getBytes();
         mIntent.putExtra(TEST_EXTRA_NAME, expected);
         assertEquals(expected, mIntent.getByteArrayExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "putExtra",
-        args = {java.lang.String.class, short[].class}
-    )
     public void testPutExtra16() {
         final short[] expected = { 1, 2, 3 };
         mIntent.putExtra(TEST_EXTRA_NAME, expected);
         assertEquals(expected, mIntent.getShortArrayExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "putExtra",
-        args = {java.lang.String.class, char[].class}
-    )
     public void testPutExtra17() {
         final char[] expected = { '1', '2', '3' };
         mIntent.putExtra(TEST_EXTRA_NAME, expected);
         assertEquals(expected, mIntent.getCharArrayExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "putExtra",
-        args = {java.lang.String.class, int[].class}
-    )
     public void testPutExtra18() {
         final int[] expected = { 1, 2, 3 };
         mIntent.putExtra(TEST_EXTRA_NAME, expected);
         assertEquals(expected, mIntent.getIntArrayExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "putExtra",
-        args = {java.lang.String.class, long[].class}
-    )
     public void testPutExtra19() {
         final long[] expected = { 1l, 2l, 3l };
         mIntent.putExtra(TEST_EXTRA_NAME, expected);
         assertEquals(expected, mIntent.getLongArrayExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "putExtra",
-        args = {java.lang.String.class, float[].class}
-    )
     public void testPutExtra20() {
         final float[] expected = { 1f, 2f, 3f };
         mIntent.putExtra(TEST_EXTRA_NAME, expected);
         assertEquals(expected, mIntent.getFloatArrayExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "putExtra",
-        args = {java.lang.String.class, double[].class}
-    )
     public void testPutExtra21() {
         final double[] expected = { 1d, 2d, 3d };
         mIntent.putExtra(TEST_EXTRA_NAME, expected);
         assertEquals(expected, mIntent.getDoubleArrayExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "putExtra",
-        args = {java.lang.String.class, java.lang.String[].class}
-    )
     public void testPutExtra22() {
         final String[] expected = { "1d", "2d", "3d" };
         mIntent.putExtra(TEST_EXTRA_NAME, expected);
         assertEquals(expected, mIntent.getStringArrayExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "putExtras",
-        args = {android.os.Bundle.class}
-    )
     public void testPutExtra23() {
         final Bundle expected = new Bundle();
         expected.putString("key", "value");
@@ -1022,11 +526,6 @@
         assertEquals(expected, mIntent.getBundleExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "putExtra",
-        args = {java.lang.String.class, android.os.IBinder.class}
-    )
     @SuppressWarnings("deprecation")
     public void testPutExtra24() {
         final IBinder expected = ServiceManager.getService("activity");
@@ -1034,67 +533,30 @@
         assertEquals(expected, mIntent.getIBinderExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addCategory",
-        args = {java.lang.String.class}
-    )
     public void testAddCategory() {
         assertFalse(mIntent.hasCategory(TEST_CATEGORY));
         mIntent.addCategory(TEST_CATEGORY);
         assertTrue(mIntent.hasCategory(TEST_CATEGORY));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "putParcelableArrayListExtra",
-        args = {java.lang.String.class, java.util.ArrayList.class}
-    )
     public void testPutParcelableArrayListExtra() {
         ArrayList<Intent> expected = new ArrayList<Intent>();
         mIntent.putExtra(TEST_EXTRA_NAME, expected);
         assertEquals(expected, mIntent.getParcelableArrayListExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "toString",
-        args = {}
-    )
     public void testToString() {
         assertNotNull(mIntent.toString());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setData",
-            args = {android.net.Uri.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getData",
-            args = {}
-        )
-    })
     public void testAccessData() {
         mIntent.setData(TEST_URI);
         assertEquals(TEST_URI, mIntent.getData());
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        method = "setExtrasClassLoader",
-        args = {java.lang.ClassLoader.class}
-    )
     public void testSetExtrasClassLoader() {
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getStringArrayListExtra",
-        args = {java.lang.String.class}
-    )
     public void testGetStringArrayListExtra() {
         final ArrayList<String> expected = new ArrayList<String>();
         expected.add("testString");
@@ -1102,11 +564,6 @@
         assertEquals(expected, mIntent.getStringArrayListExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getCharSequenceArrayListExtra",
-        args = {java.lang.String.class}
-    )
     public void testGetCharSequenceArrayListExtra() {
         final ArrayList<CharSequence> expected = new ArrayList<CharSequence>();
         expected.add("testCharSequence");
@@ -1114,11 +571,6 @@
         assertEquals(expected, mIntent.getCharSequenceArrayListExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "resolveActivityInfo",
-        args = {android.content.pm.PackageManager.class, int.class}
-    )
     public void testResolveActivityInfo() throws NameNotFoundException {
         final PackageManager pm = mContext.getPackageManager();
         assertEquals(null, mIntent.resolveActivityInfo(pm, 1));
@@ -1129,46 +581,17 @@
         assertEquals(target.targetActivity, mIntent.resolveActivityInfo(pm, 1).targetActivity);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getParcelableArrayExtra",
-        args = {java.lang.String.class}
-    )
     public void testGetParcelableExtra() {
         final Intent expected = new Intent(TEST_ACTION);
         mIntent.putExtra(TEST_EXTRA_NAME, expected);
         assertEquals(expected, mIntent.getParcelableExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAction",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAction",
-            args = {}
-        )
-    })
     public void testAccessAction() {
         mIntent.setAction(TEST_ACTION);
         assertEquals(TEST_ACTION, mIntent.getAction());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addFlags",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFlags",
-            args = {}
-        )
-    })
     public void testAddFlags() {
         final int flag = 1;
         int expected = 0;
@@ -1177,13 +600,6 @@
         assertEquals(expected, mIntent.getFlags());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "describeContents",
-            args = {}
-        )
-    })
     public void testDescribeContents() {
         final int expected = 0;
         assertEquals(expected, mIntent.describeContents());
@@ -1191,11 +607,6 @@
         assertEquals(mIntent.getExtras().describeContents(), mIntent.describeContents());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getShortExtra",
-        args = {java.lang.String.class, short.class}
-    )
     public void testGetShortExtra() {
 
         final Short expected = Short.valueOf("2");
@@ -1205,11 +616,6 @@
         assertEquals(expected.shortValue(), mIntent.getShortExtra(TEST_EXTRA_NAME, Short.valueOf("1")));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clone",
-        args = {}
-    )
     public void testClone() {
         mIntent.setAction(TEST_ACTION);
         mIntent.setClass(mContext, MockActivity.class);
@@ -1229,11 +635,6 @@
         assertEquals(excepted, actual.getStringExtra(key));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getDoubleExtra",
-        args = {java.lang.String.class, double.class}
-    )
     public void testGetDoubleExtra() {
         final double expected = 2d;
         assertEquals(1d, mIntent.getDoubleExtra(TEST_EXTRA_NAME, 1d));
@@ -1241,11 +642,6 @@
         assertEquals(expected, mIntent.getDoubleExtra(TEST_EXTRA_NAME, 1d));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "cloneFilter",
-        args = {}
-    )
     public void testCloneFilter() {
         mIntent.setAction(TEST_ACTION);
         mIntent.setClass(mContext, MockActivity.class);
@@ -1264,18 +660,6 @@
         assertNull(actual.getStringExtra(key));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIntentOld",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBooleanExtra",
-            args = {java.lang.String.class, boolean.class}
-        )
-    })
     public void testGetIntentOld() throws URISyntaxException {
         String uri = "test";
         mIntent = Intent.getIntentOld(uri);
@@ -1323,22 +707,12 @@
         assertEquals(1, mIntent.getIntExtra("testint", 2));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getParcelableArrayExtra",
-        args = {java.lang.String.class}
-    )
     public void testGetParcelableArrayExtra() {
         final Intent[] expected = { new Intent(TEST_ACTION), new Intent(mContext, MockActivity.class) };
         mIntent.putExtra(TEST_EXTRA_NAME, expected);
         assertEquals(expected, mIntent.getParcelableArrayExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "resolveActivity",
-        args = {android.content.pm.PackageManager.class}
-    )
     public void testResolveActivity() {
         final PackageManager pm = mContext.getPackageManager();
 
@@ -1361,11 +735,6 @@
         assertNull(target);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getCharExtra",
-        args = {java.lang.String.class, char.class}
-    )
     public void testGetCharExtra() {
         assertEquals('a', mIntent.getCharExtra(TEST_EXTRA_NAME, 'a'));
         final char expected = 'b';
@@ -1373,11 +742,6 @@
         assertEquals(expected, mIntent.getCharExtra(TEST_EXTRA_NAME, 'a'));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getIntent",
-        args = {java.lang.String.class}
-    )
     public void testGetIntent() throws URISyntaxException {
         mIntent = Intent.getIntent("test#");
         assertEquals(Intent.ACTION_VIEW, mIntent.getAction());
@@ -1479,11 +843,6 @@
         assertEquals(testShort, target.getShortExtra(TEST_EXTRA_NAME, defaultShort));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "toURI",
-        args = {}
-    )
     public void testToURI() {
         mIntent.setFlags(0);
         assertEquals("#Intent;end", mIntent.toURI());
@@ -1553,29 +912,12 @@
         return uri.toString();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFlags",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFlags",
-            args = {}
-        )
-    })
     public void testAccessFlags() {
         int expected = 1;
         mIntent.setFlags(expected);
         assertEquals(expected, mIntent.getFlags());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "createChooser",
-        args = {android.content.Intent.class, java.lang.CharSequence.class}
-    )
     public void testCreateChooser() {
         Intent target = Intent.createChooser(mIntent, null);
         assertEquals(Intent.ACTION_CHOOSER, target.getAction());
@@ -1588,33 +930,18 @@
         assertEquals(title, target.getStringExtra(Intent.EXTRA_TITLE));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getFloatArrayExtra",
-        args = {java.lang.String.class}
-    )
     public void testGetFloatArrayExtra() {
         final float[] expected = { 1f, 2f, 3f };
         mIntent.putExtra(TEST_EXTRA_NAME, expected);
         assertEquals(expected, mIntent.getFloatArrayExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setDataAndType",
-        args = {android.net.Uri.class, java.lang.String.class}
-    )
     public void testSetDataAndType() {
         mIntent.setDataAndType(TEST_URI, TEST_TYPE);
         assertEquals(TEST_URI, mIntent.getData());
         assertEquals(TEST_TYPE, mIntent.getType());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setData",
-        args = {android.net.Uri.class}
-    )
     public void testSetData() {
         mIntent.setData(TEST_URI);
         assertEquals(TEST_URI, mIntent.getData());
@@ -1626,11 +953,6 @@
         assertNull(mIntent.getType());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setType",
-        args = {java.lang.String.class}
-    )
     public void testSetType() {
         mIntent.setType(TEST_TYPE);
         assertEquals(TEST_TYPE, mIntent.getType());
@@ -1642,11 +964,6 @@
         assertNull(mIntent.getData());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getStringExtra",
-        args = {java.lang.String.class}
-    )
     public void testGetStringExtra() {
         final String expected = "testString";
         assertNull(mIntent.getStringExtra(TEST_EXTRA_NAME));
@@ -1654,11 +971,6 @@
         assertEquals(expected, mIntent.getStringExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "fillIn",
-        args = {android.content.Intent.class, int.class}
-    )
     /**
      * Test that fillIn has no effect when no fields are set.
      */
@@ -1902,11 +1214,6 @@
         assertTrue(destIntent.getExtras().getBoolean(TEST_EXTRA_NAME));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getExtras",
-        args = {}
-    )
     public void testGetExtras() {
         assertNull(mIntent.getExtras());
         final String expected = "testString";
@@ -1915,11 +1222,6 @@
         assertEquals(expected, mIntent.getExtras().getString(TEST_EXTRA_NAME));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getBooleanExtra",
-        args = {java.lang.String.class, boolean.class}
-    )
     public void testGetBooleanExtra() {
         assertFalse(mIntent.getBooleanExtra(TEST_EXTRA_NAME, false));
         mIntent.putExtra(TEST_EXTRA_NAME, true);
@@ -1928,11 +1230,6 @@
         assertFalse(mIntent.getBooleanExtra(TEST_EXTRA_NAME, false));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getFloatExtra",
-        args = {java.lang.String.class, float.class}
-    )
     public void testGetFloatExtra() {
         float expected = 2f;
         assertEquals(1f, mIntent.getFloatExtra(TEST_EXTRA_NAME, 1f));
@@ -1940,55 +1237,30 @@
         assertEquals(expected, mIntent.getFloatExtra(TEST_EXTRA_NAME, 1f));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getShortArrayExtra",
-        args = {java.lang.String.class}
-    )
     public void testGetShortArrayExtra() {
         final short[] expected = { 1, 2, 3 };
         mIntent.putExtra(TEST_EXTRA_NAME, expected);
         assertEquals(expected, mIntent.getShortArrayExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getStringArrayExtra",
-        args = {java.lang.String.class}
-    )
     public void testGetStringArrayExtra() {
         final String[] expected = { "1d", "2d", "3d" };
         mIntent.putExtra(TEST_EXTRA_NAME, expected);
         assertEquals(expected, mIntent.getStringArrayExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getCharSequenceArrayExtra",
-        args = {java.lang.String.class}
-    )
     public void testGetCharSequenceArrayExtra() {
         final String[] expected = { "1d", "2d", "3d" };
         mIntent.putExtra(TEST_EXTRA_NAME, expected);
         assertEquals(expected, mIntent.getCharSequenceArrayExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getByteArrayExtra",
-        args = {java.lang.String.class}
-    )
     public void testGetByteArrayExtra() {
         final byte[] expected = TEST_ACTION.getBytes();
         mIntent.putExtra(TEST_EXTRA_NAME, expected);
         assertEquals(expected, mIntent.getByteArrayExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "hasFileDescriptors",
-        args = {}
-    )
     public void testHasFileDescriptors() {
         Bundle bundle = mIntent.getExtras();
         assertEquals(bundle != null && bundle.hasFileDescriptors(), mIntent.hasFileDescriptors());
@@ -1998,22 +1270,12 @@
         assertEquals(bundle != null && bundle.hasFileDescriptors(), mIntent.hasFileDescriptors());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getBooleanArrayExtra",
-        args = {java.lang.String.class}
-    )
     public void testGetBooleanArrayExtra() {
         final boolean[] expected = { true, true, false };
         mIntent.putExtra(TEST_EXTRA_NAME, expected);
         assertEquals(expected, mIntent.getBooleanArrayExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLongExtra",
-        args = {java.lang.String.class, long.class}
-    )
     public void testGetLongExtra() {
         final long expected = 2l;
         assertEquals(1l, mIntent.getLongExtra(TEST_EXTRA_NAME, 1l));
@@ -2021,11 +1283,6 @@
         assertEquals(expected, mIntent.getLongExtra(TEST_EXTRA_NAME, 1l));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "removeCategory",
-        args = {java.lang.String.class}
-    )
     public void testRemoveCategory() {
         assertNull(mIntent.getCategories());
         mIntent.addCategory(TEST_CATEGORY);
@@ -2036,11 +1293,6 @@
         assertFalse(mIntent.hasCategory(TEST_CATEGORY));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "filterEquals",
-        args = {android.content.Intent.class}
-    )
     public void testFilterEquals() {
         assertFalse(mIntent.filterEquals(null));
 
@@ -2091,11 +1343,6 @@
         assertFalse(mIntent.filterEquals(target));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "putExtras",
-        args = {android.content.Intent.class}
-    )
     public void testPutExtras1() {
         final Intent intent = new Intent();
         mIntent.putExtras(intent);
@@ -2105,18 +1352,6 @@
         assertEquals(intent.getExtras().toString(), mIntent.getExtras().toString());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putExtras",
-            args = {android.os.Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putExtra",
-            args = {java.lang.String.class, android.os.Bundle.class}
-        )
-    })
     public void testPutExtras2() {
         final Bundle bundle = new Bundle();
         mIntent.putExtras(bundle);
@@ -2130,22 +1365,12 @@
         assertEquals(bundle, mIntent.getBundleExtra(TEST_EXTRA_NAME));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getByteExtra",
-        args = {java.lang.String.class, byte.class}
-    )
     public void testGetByteExtra() {
         final byte expected = Byte.valueOf("1");
         mIntent.putExtra(TEST_EXTRA_NAME, expected);
         assertEquals(expected, mIntent.getByteExtra(TEST_EXTRA_NAME, Byte.valueOf("1")));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSerializableExtra",
-        args = {java.lang.String.class}
-    )
     public void testGetSerializableExtra() {
         TestSerializable expected = new TestSerializable();
         expected.Name = "testName";
@@ -2155,18 +1380,6 @@
         assertEquals(expected.Name, target.Name);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "replaceExtras",
-            args = {android.os.Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "replaceExtras",
-            args = {android.content.Intent.class}
-        )
-    })
     public void testReplaceExtras() {
         Bundle extras = new Bundle();
         String bundleKey = "testKey";
@@ -2189,6 +1402,13 @@
         assertEquals(intentValue, actualValue);
     }
 
+    public void testNormalizeMimeType() {
+        assertEquals(null, Intent.normalizeMimeType(null));
+        assertEquals("text/plain", Intent.normalizeMimeType("text/plain; charset=UTF-8"));
+        assertEquals("text/x-vcard", Intent.normalizeMimeType("text/x-vCard"));
+        assertEquals("foo/bar", Intent.normalizeMimeType("   foo/bar    "));
+    }
+
     private static class TestSerializable implements Serializable {
         static final long serialVersionUID = 1l;
         public String Name;
diff --git a/tests/tests/content/src/android/content/cts/Intent_FilterComparisonTest.java b/tests/tests/content/src/android/content/cts/Intent_FilterComparisonTest.java
index 6435ec6..d759b87 100644
--- a/tests/tests/content/src/android/content/cts/Intent_FilterComparisonTest.java
+++ b/tests/tests/content/src/android/content/cts/Intent_FilterComparisonTest.java
@@ -19,11 +19,7 @@
 import android.content.Intent;
 import android.content.Intent.FilterComparison;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(Intent.FilterComparison.class)
 public class Intent_FilterComparisonTest extends AndroidTestCase {
 
     FilterComparison mFilterComparison;
@@ -36,11 +32,6 @@
         mIntent = new Intent();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "Intent.FilterComparison",
-        args = {android.content.Intent.class}
-    )
     public void testConstructor() {
         mFilterComparison = null;
         // new the FilterComparison instance
@@ -49,22 +40,12 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "hashCode",
-        args = {}
-    )
     public void testHashCode() {
         mFilterComparison = new Intent.FilterComparison(mIntent);
         assertNotNull(mFilterComparison);
         assertEquals(mIntent.filterHashCode(), mFilterComparison.hashCode());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "equals",
-        args = {java.lang.Object.class}
-    )
     public void testEquals() {
         mFilterComparison = new Intent.FilterComparison(mIntent);
         assertNotNull(mFilterComparison);
@@ -75,11 +56,6 @@
         assertFalse(mFilterComparison.equals(target));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getIntent",
-        args = {}
-    )
     public void testGetIntent() {
         mFilterComparison = new Intent.FilterComparison(mIntent);
         assertNotNull(mFilterComparison);
diff --git a/tests/tests/content/src/android/content/cts/Intent_ShortcutIconResourceTest.java b/tests/tests/content/src/android/content/cts/Intent_ShortcutIconResourceTest.java
index e168776..b38f3fc 100644
--- a/tests/tests/content/src/android/content/cts/Intent_ShortcutIconResourceTest.java
+++ b/tests/tests/content/src/android/content/cts/Intent_ShortcutIconResourceTest.java
@@ -21,14 +21,10 @@
 import android.content.Intent.ShortcutIconResource;
 import android.os.Parcel;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 /**
  * Test {@link ShortcutIconResource}.
  */
-@TestTargetClass(ShortcutIconResource.class)
 public class Intent_ShortcutIconResourceTest extends AndroidTestCase {
 
     ShortcutIconResource mShortcutIconResource;
@@ -42,11 +38,6 @@
         mContext = getContext();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "toString",
-        args = {}
-    )
     public void testToString() {
         String resourceName = mContext.getResources().getResourceName(
                 resourceId);
@@ -56,11 +47,6 @@
         assertNotNull(mShortcutIconResource.toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "fromContext",
-        args = {android.content.Context.class, int.class}
-    )
     public void testFromContext() {
 
         String resourceName = mContext.getResources().getResourceName(
@@ -74,11 +60,6 @@
                 mShortcutIconResource.packageName);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {android.os.Parcel.class, int.class}
-    )
     public void testWriteToParcel() {
 
         mShortcutIconResource = ShortcutIconResource.fromContext(mContext,
@@ -93,11 +74,6 @@
         assertEquals(mShortcutIconResource.resourceName, target.resourceName);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
         int expected = 0;
         mShortcutIconResource = new Intent.ShortcutIconResource();
diff --git a/tests/tests/content/src/android/content/cts/MutableContextWrapperTest.java b/tests/tests/content/src/android/content/cts/MutableContextWrapperTest.java
index e4df48d..b81ca71 100644
--- a/tests/tests/content/src/android/content/cts/MutableContextWrapperTest.java
+++ b/tests/tests/content/src/android/content/cts/MutableContextWrapperTest.java
@@ -20,11 +20,7 @@
 import android.content.Context;
 import android.content.MutableContextWrapper;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(MutableContextWrapper.class)
 public class MutableContextWrapperTest extends AndroidTestCase {
 
     MutableContextWrapper mMutableContextWrapper;
@@ -37,22 +33,12 @@
         mContext = getContext();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "MutableContextWrapper",
-        args = {android.content.Context.class}
-    )
     public void testConstructor() {
 
         mMutableContextWrapper = new MutableContextWrapper(mContext);
         assertNotNull(mMutableContextWrapper);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setBaseContext",
-        args = {android.content.Context.class}
-    )
     public void testSetBaseContext() {
         mMutableContextWrapper = new MutableContextWrapper(mContext);
         assertTrue(mContext.equals(mMutableContextWrapper.getBaseContext()));
diff --git a/tests/tests/content/src/android/content/cts/ReceiverCallNotAllowedExceptionTest.java b/tests/tests/content/src/android/content/cts/ReceiverCallNotAllowedExceptionTest.java
index e0591ca..191881d 100644
--- a/tests/tests/content/src/android/content/cts/ReceiverCallNotAllowedExceptionTest.java
+++ b/tests/tests/content/src/android/content/cts/ReceiverCallNotAllowedExceptionTest.java
@@ -18,19 +18,8 @@
 
 import android.content.ReceiverCallNotAllowedException;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(android.content.ReceiverCallNotAllowedException.class)
 public class ReceiverCallNotAllowedExceptionTest extends AndroidTestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor of ReceiverCallNotAllowedException.",
-        method = "ReceiverCallNotAllowedException",
-        args = {java.lang.String.class}
-    )
     public void testConstructor() {
         new ReceiverCallNotAllowedException("TEST_STRING");
     }
diff --git a/tests/tests/content/src/android/content/cts/SearchRecentSuggestionsProviderTest.java b/tests/tests/content/src/android/content/cts/SearchRecentSuggestionsProviderTest.java
index b152990..4830122 100644
--- a/tests/tests/content/src/android/content/cts/SearchRecentSuggestionsProviderTest.java
+++ b/tests/tests/content/src/android/content/cts/SearchRecentSuggestionsProviderTest.java
@@ -25,12 +25,7 @@
 import android.test.RenamingDelegatingContext;
 import android.test.mock.MockContentResolver;
 import android.test.mock.MockContext;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(SearchRecentSuggestionsProvider.class)
 public class SearchRecentSuggestionsProviderTest extends AndroidTestCase {
     private final static String AUTHORITY_HEAD = "content://" + MockSRSProvider.AUTHORITY;
     private final static Uri TEST_URI = Uri.parse(AUTHORITY_HEAD  + "/suggestions");
@@ -47,48 +42,6 @@
         mProviderContext = new IsolatedContext(new MockContentResolver(), targetContextWrapper);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "SearchRecentSuggestionsProvider",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setupSuggestions",
-            args = {String.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreate",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getType",
-            args = {Uri.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "update",
-            args = {Uri.class, ContentValues.class, String.class, String[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "query",
-            args = {Uri.class, String[].class, String.class, String[].class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "insert",
-            args = {Uri.class, ContentValues.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "delete",
-            args = {Uri.class, String.class, String[].class}
-        )
-    })
     public void testSearchRecentSuggestionsProvider() {
         assertFalse(MockSRSProvider.setupSuggestCalled);
         final MockSRSProvider s = new MockSRSProvider();
diff --git a/tests/tests/content/src/android/content/cts/SharedPreferencesTest.java b/tests/tests/content/src/android/content/cts/SharedPreferencesTest.java
index 004fa9e..35584bb 100644
--- a/tests/tests/content/src/android/content/cts/SharedPreferencesTest.java
+++ b/tests/tests/content/src/android/content/cts/SharedPreferencesTest.java
@@ -19,11 +19,6 @@
 import com.android.cts.stub.R;
 
 import dalvik.annotation.BrokenTest;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.app.QueuedWork;
 import android.content.Context;
@@ -45,7 +40,6 @@
 /**
  * Test {@link SharedPreferences}.
  */
-@TestTargetClass(SharedPreferences.class)
 public class SharedPreferencesTest extends AndroidTestCase {
     private static final String TAG = "SharedPreferencesTest";
 
diff --git a/tests/tests/content/src/android/content/cts/UriMatcherTest.java b/tests/tests/content/src/android/content/cts/UriMatcherTest.java
index e7a3543..61d641c 100644
--- a/tests/tests/content/src/android/content/cts/UriMatcherTest.java
+++ b/tests/tests/content/src/android/content/cts/UriMatcherTest.java
@@ -19,13 +19,7 @@
 import android.content.UriMatcher;
 import android.net.Uri;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
-@TestTargetClass(UriMatcher.class)
 public class UriMatcherTest extends AndroidTestCase {
     UriMatcher mUriMatcher;
 
@@ -51,22 +45,10 @@
         mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor(s) of UriMatcher.",
-        method = "UriMatcher",
-        args = {int.class}
-    )
     public void testConstructor() {
         new UriMatcher(UriMatcher.NO_MATCH);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test match(Uri uri).",
-        method = "match",
-        args = {android.net.Uri.class}
-    )
     public void testMatch() {
         mUriMatcher.addURI(sAuthority, sPath1, sCode1);
         mUriMatcher.addURI(sAuthority, sPath2, sCode2);
@@ -83,13 +65,6 @@
         assertEquals(-1, mUriMatcher.match(unknown));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test match(Uri uri).",
-        method = "match",
-        args = {android.net.Uri.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "Unexpected NullPointerException")
     public void testMatchFailure() {
         try {
             mUriMatcher.match(null);
@@ -99,12 +74,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test addURI(String authority, String path, int code).",
-        method = "addURI",
-        args = {java.lang.String.class, java.lang.String.class, int.class}
-    )
     public void testAddURI() {
         assertEquals(-1, mUriMatcher.match(uri1));
         assertEquals(-1, mUriMatcher.match(uri2));
@@ -122,13 +91,6 @@
         assertEquals(sCode4, mUriMatcher.match(uri4));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test addURI(String authority, String path, int code).",
-        method = "addURI",
-        args = {java.lang.String.class, java.lang.String.class, int.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "Unexpected IllegalArgumentException")
     public void testAddURIFailure() {
         try {
             mUriMatcher.addURI(null, null, -1);
diff --git a/tests/tests/content/src/android/content/pm/cts/ActivityInfoTest.java b/tests/tests/content/src/android/content/pm/cts/ActivityInfoTest.java
index 2678f31..6c1ae40 100644
--- a/tests/tests/content/src/android/content/pm/cts/ActivityInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/ActivityInfoTest.java
@@ -16,11 +16,6 @@
 
 package android.content.pm.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.app.cts.MockActivity;
 import android.content.ComponentName;
@@ -34,24 +29,9 @@
 /**
  * Test {@link ActivityInfo}.
  */
-@TestTargetClass(ActivityInfo.class)
 public class ActivityInfoTest extends AndroidTestCase {
     ActivityInfo mActivityInfo;
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ActivityInfo",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ActivityInfo",
-            args = {android.content.pm.ActivityInfo.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "ActivityInfo#ActivityInfo(ActivityInfo), " +
-            " should check whether the input ActivityInfo is null")
     public void testConstructor() {
         new ActivityInfo();
 
@@ -66,12 +46,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {android.os.Parcel.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "NPE is not expected.")
     public void testWriteToParcel() throws NameNotFoundException {
         ComponentName componentName = new ComponentName(mContext, MockActivity.class);
 
@@ -99,11 +73,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getThemeResource",
-        args = {}
-    )
     public void testGetThemeResource() throws NameNotFoundException {
         ComponentName componentName = new ComponentName(mContext, MockActivity.class);
 
@@ -115,21 +84,11 @@
         assertEquals(mActivityInfo.theme, mActivityInfo.getThemeResource());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "toString",
-        args = {}
-    )
     public void testToString() throws NameNotFoundException {
         mActivityInfo = new ActivityInfo();
         assertNotNull(mActivityInfo.toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() throws NameNotFoundException {
         mActivityInfo = new ActivityInfo();
         assertEquals(0, mActivityInfo.describeContents());
@@ -142,12 +101,6 @@
         assertEquals(0, mActivityInfo.describeContents());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dump",
-        args = {android.util.Printer.class, java.lang.String.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "NPE is not expected.")
     public void testDump() {
         mActivityInfo = new ActivityInfo();
 
diff --git a/tests/tests/content/src/android/content/pm/cts/ApplicationInfoTest.java b/tests/tests/content/src/android/content/pm/cts/ApplicationInfoTest.java
index 45a3f89..3055e57 100644
--- a/tests/tests/content/src/android/content/pm/cts/ApplicationInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/ApplicationInfoTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager.NameNotFoundException;
@@ -32,7 +28,6 @@
 /**
  * Test {@link ApplicationInfo}.
  */
-@TestTargetClass(ApplicationInfo.class)
 public class ApplicationInfoTest extends AndroidTestCase {
     private ApplicationInfo mApplicationInfo;
     private String mPackageName;
@@ -43,18 +38,6 @@
         mPackageName = getContext().getPackageName();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ApplicationInfo",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ApplicationInfo",
-            args = {android.content.pm.ApplicationInfo.class}
-        )
-    })
     public void testConstructor() {
         ApplicationInfo info = new ApplicationInfo();
         // simple test to ensure packageName is copied by copy constructor
@@ -64,11 +47,6 @@
         assertEquals(info.packageName, copy.packageName);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {android.os.Parcel.class, int.class}
-    )
     public void testWriteToParcel() throws NameNotFoundException {
         mApplicationInfo = mContext.getPackageManager().getApplicationInfo(mPackageName, 0);
 
@@ -93,32 +71,17 @@
         assertEquals(mApplicationInfo.descriptionRes, info.descriptionRes);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "toString",
-        args = {}
-    )
     public void testToString() {
         mApplicationInfo = new ApplicationInfo();
         assertNotNull(mApplicationInfo.toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() throws NameNotFoundException {
        mApplicationInfo = mContext.getPackageManager().getApplicationInfo(mPackageName, 0);
 
         assertEquals(0, mApplicationInfo.describeContents());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dump",
-        args = {android.util.Printer.class, java.lang.String.class}
-    )
     public void testDump() {
         mApplicationInfo = new ApplicationInfo();
 
@@ -132,11 +95,6 @@
         assertTrue(sb.length() > 0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "loadDescription",
-        args = {android.content.pm.PackageManager.class}
-    )
     public void testLoadDescription() throws NameNotFoundException {
         mApplicationInfo = mContext.getPackageManager().getApplicationInfo(mPackageName, 0);
 
diff --git a/tests/tests/content/src/android/content/pm/cts/ApplicationInfo_DisplayNameComparatorTest.java b/tests/tests/content/src/android/content/pm/cts/ApplicationInfo_DisplayNameComparatorTest.java
index 0f58193..ebd75cc 100644
--- a/tests/tests/content/src/android/content/pm/cts/ApplicationInfo_DisplayNameComparatorTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/ApplicationInfo_DisplayNameComparatorTest.java
@@ -21,15 +21,10 @@
 import android.content.pm.ApplicationInfo.DisplayNameComparator;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
 /**
  * Test {@link DisplayNameComparator}.
  */
-@TestTargetClass(DisplayNameComparator.class)
 public class ApplicationInfo_DisplayNameComparatorTest extends AndroidTestCase {
     private static final String PACKAGE_NAME = "com.android.cts.stub";
     DisplayNameComparator mDisplayNameComparator;
@@ -40,12 +35,6 @@
         mDisplayNameComparator = null;
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor(s) of {@link ApplicationInfo.DisplayNameComparator}",
-        method = "ApplicationInfo.DisplayNameComparator",
-        args = {android.content.pm.PackageManager.class}
-    )
     public void testConstructor() {
         PackageManager pm = getContext().getPackageManager();
         new DisplayNameComparator(pm);
@@ -53,13 +42,6 @@
         new DisplayNameComparator(null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test compare(ApplicationInfo, ApplicationInfo)",
-        method = "compare",
-        args = {android.content.pm.ApplicationInfo.class, android.content.pm.ApplicationInfo.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "NPE is not expected.")
     public void testCompare() throws NameNotFoundException {
         PackageManager pm = getContext().getPackageManager();
         mDisplayNameComparator = new ApplicationInfo.DisplayNameComparator(pm);
diff --git a/tests/tests/content/src/android/content/pm/cts/ComponentInfoTest.java b/tests/tests/content/src/android/content/pm/cts/ComponentInfoTest.java
index 512aa7a..7850e1e 100644
--- a/tests/tests/content/src/android/content/pm/cts/ComponentInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/ComponentInfoTest.java
@@ -30,39 +30,14 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
 /**
  * Test {@link ComponentInfo}.
  */
-@TestTargetClass(ComponentInfo.class)
 public class ComponentInfoTest extends AndroidTestCase {
     private final String PACKAGE_NAME = "com.android.cts.stub";
     private ComponentInfo mComponentInfo;
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ComponentInfo",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ComponentInfo",
-            args = {android.content.pm.ComponentInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ComponentInfo",
-            args = {android.os.Parcel.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "ComponentInfo#ComponentInfo(ComponentInfo), " +
-            "ComponentInfo#ComponentInfo(Parcel), should check whether the input is null")
     public void testConstructor() {
         Parcel p = Parcel.obtain();
         ComponentInfo componentInfo = new ComponentInfo();
@@ -91,12 +66,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "loadIcon",
-        args = {android.content.pm.PackageManager.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "NullPointerException is not expected.")
     public void testLoadIcon() {
         mComponentInfo = new ComponentInfo();
         mComponentInfo.applicationInfo = new ApplicationInfo();
@@ -127,12 +96,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dumpBack",
-        args = {android.util.Printer.class, java.lang.String.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "NullPointerException is not expected.")
     public void testDumpBack() {
         MyComponentInfo ci = new MyComponentInfo();
 
@@ -162,11 +125,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getIconResource",
-        args = {}
-    )
     public void testGetIconResource() {
         mComponentInfo = new ComponentInfo();
         mComponentInfo.applicationInfo = new ApplicationInfo();
@@ -179,11 +137,6 @@
         assertEquals(mComponentInfo.applicationInfo.icon, mComponentInfo.getIconResource());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isEnabled",
-        args = {}
-    )
     public void testIsEnabled() {
         mComponentInfo = new ComponentInfo();
         mComponentInfo.applicationInfo = new ApplicationInfo();
@@ -197,12 +150,6 @@
         assertFalse(mComponentInfo.isEnabled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dumpFront",
-        args = {android.util.Printer.class, java.lang.String.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "NullPointerException is not expected.")
     public void testDumpFront() {
         MyComponentInfo ci = new MyComponentInfo();
 
@@ -233,12 +180,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "loadLabel",
-        args = {android.content.pm.PackageManager.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "NullPointerException is not expected.")
     public void testLoadLabel() throws NameNotFoundException {
         mComponentInfo = new ComponentInfo();
         mComponentInfo.applicationInfo = new ApplicationInfo();
@@ -270,12 +211,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {android.os.Parcel.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "NullPointerException is not expected.")
     public void testWriteToParcel() {
         Parcel p = Parcel.obtain();
         mComponentInfo = new ComponentInfo();
diff --git a/tests/tests/content/src/android/content/pm/cts/ConfigurationInfoTest.java b/tests/tests/content/src/android/content/pm/cts/ConfigurationInfoTest.java
index e8c7470..5310f08 100644
--- a/tests/tests/content/src/android/content/pm/cts/ConfigurationInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/ConfigurationInfoTest.java
@@ -16,10 +16,6 @@
 
 package android.content.pm.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.pm.ConfigurationInfo;
 import android.content.pm.PackageInfo;
@@ -28,40 +24,7 @@
 import android.os.Parcel;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(ConfigurationInfo.class)
 public class ConfigurationInfoTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "ConfigurationInfo",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "ConfigurationInfo",
-            args = {android.content.pm.ConfigurationInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test toString",
-            method = "toString",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test writeToParcel",
-            method = "writeToParcel",
-            args = {android.os.Parcel.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test describeContents",
-            method = "describeContents",
-            args = {}
-        )
-    })
     public void testConfigPreferences() throws NameNotFoundException {
         PackageManager pm = getContext().getPackageManager();
 
diff --git a/tests/tests/content/src/android/content/pm/cts/InstrumentationInfoTest.java b/tests/tests/content/src/android/content/pm/cts/InstrumentationInfoTest.java
index 9b1e6fd..4656949 100644
--- a/tests/tests/content/src/android/content/pm/cts/InstrumentationInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/InstrumentationInfoTest.java
@@ -16,10 +16,6 @@
 
 package android.content.pm.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.ComponentName;
 import android.content.pm.InstrumentationInfo;
@@ -28,44 +24,11 @@
 import android.os.Parcel;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(InstrumentationInfo.class)
 public class InstrumentationInfoTest extends AndroidTestCase {
     private static final String PACKAGE_NAME = "com.android.cts.stub";
     private static final String INSTRUMENTATION_NAME =
             "android.content.pm.cts.TestPmInstrumentation";
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test describeContents",
-            method = "describeContents",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "InstrumentationInfo",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "InstrumentationInfo",
-            args = {android.content.pm.InstrumentationInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test toString",
-            method = "toString",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test writeToParcel",
-            method = "writeToParcel",
-            args = {android.os.Parcel.class, int.class}
-        )
-    })
     public void testInstrumentationInfo() throws NameNotFoundException {
         PackageManager pm = getContext().getPackageManager();
         ComponentName componentName = new ComponentName(PACKAGE_NAME, INSTRUMENTATION_NAME);
diff --git a/tests/tests/content/src/android/content/pm/cts/PackageInfoTest.java b/tests/tests/content/src/android/content/pm/cts/PackageInfoTest.java
index 7dff4b9..cefe1a6 100644
--- a/tests/tests/content/src/android/content/pm/cts/PackageInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/PackageInfoTest.java
@@ -16,10 +16,6 @@
 
 package android.content.pm.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.pm.ApplicationInfo;
 import android.content.pm.ConfigurationInfo;
@@ -32,7 +28,6 @@
 
 import java.util.Arrays;
 
-@TestTargetClass(PackageInfo.class)
 public class PackageInfoTest extends AndroidTestCase {
     private PackageManager mPackageManager;
     private PackageInfo mPackageInfo;
@@ -51,32 +46,6 @@
                 | PackageManager.GET_UNINSTALLED_PACKAGES);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test describeContents",
-            method = "describeContents",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test writeToParcel",
-            method = "writeToParcel",
-            args = {android.os.Parcel.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test toString",
-            method = "toString",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test PackageInfo",
-            method = "PackageInfo",
-            args = {}
-        )
-    })
     public void testPackageInfoOp() {
         // Test constructor, describeContents, toString
         new PackageInfo();
diff --git a/tests/tests/content/src/android/content/pm/cts/PackageItemInfoTest.java b/tests/tests/content/src/android/content/pm/cts/PackageItemInfoTest.java
index db70735..d3372c6 100644
--- a/tests/tests/content/src/android/content/pm/cts/PackageItemInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/PackageItemInfoTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.ComponentName;
 import android.content.pm.ActivityInfo;
@@ -33,7 +29,6 @@
 import android.test.AndroidTestCase;
 import android.util.Printer;
 
-@TestTargetClass(PackageItemInfo.class)
 public class PackageItemInfoTest extends AndroidTestCase {
     private static final String PACKAGE_NAME = "com.android.cts.stub";
     private static final String ACTIVITY_NAME = "android.content.pm.cts.TestPmActivity";
@@ -46,38 +41,6 @@
         mPackageManager = getContext().getPackageManager();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test loadIcon",
-            method = "loadIcon",
-            args = {android.content.pm.PackageManager.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test loadLabel",
-            method = "loadLabel",
-            args = {android.content.pm.PackageManager.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test loadXmlMetaData",
-            method = "loadXmlMetaData",
-            args = {android.content.pm.PackageManager.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "PackageItemInfo",
-            args = {android.content.pm.PackageItemInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "PackageItemInfo",
-            args = {}
-        )
-    })
     public void testLoadMethods() throws NameNotFoundException {
         // Test constructors
         ActivityInfo activityInfo = (ActivityInfo) getTestItemInfo();
@@ -94,20 +57,6 @@
         assertNotNull(parser);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test dumpBack",
-            method = "dumpBack",
-            args = {android.util.Printer.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test dumpFront",
-            method = "dumpFront",
-            args = {android.util.Printer.class, java.lang.String.class}
-        )
-    })
     public void testDump() {
         MockPackageItemInfo pkgItemInfo = new MockPackageItemInfo();
         MockPrinter printer = new MockPrinter();
@@ -119,20 +68,6 @@
         pkgItemInfo.dumpFront(printer, prefix);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test writeToParcel",
-            method = "writeToParcel",
-            args = {android.os.Parcel.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "PackageItemInfo",
-            args = {Parcel.class}
-        )
-    })
     public void testWriteToParcel() throws NameNotFoundException {
         ActivityInfo activityInfo = (ActivityInfo) getTestItemInfo();
         PackageItemInfo expectedInfo = new PackageItemInfo(activityInfo);
diff --git a/tests/tests/content/src/android/content/pm/cts/PackageItemInfo_DisplayNameComparatorTest.java b/tests/tests/content/src/android/content/pm/cts/PackageItemInfo_DisplayNameComparatorTest.java
index 4859c96..f332d6e 100644
--- a/tests/tests/content/src/android/content/pm/cts/PackageItemInfo_DisplayNameComparatorTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/PackageItemInfo_DisplayNameComparatorTest.java
@@ -16,10 +16,6 @@
 
 package android.content.pm.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.ComponentName;
 import android.content.pm.ActivityInfo;
@@ -29,27 +25,11 @@
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(PackageItemInfo.DisplayNameComparator.class)
 public class PackageItemInfo_DisplayNameComparatorTest extends AndroidTestCase {
     private static final String PACKAGE_NAME = "com.android.cts.stub";
     private static final String ACTIVITY_NAME = "android.content.pm.cts.TestPmActivity";
     private static final String CMPACTIVITY_NAME = "android.content.pm.cts.TestPmCompare";
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test compare",
-            method = "compare",
-            args = {android.content.pm.PackageItemInfo.class,
-                    android.content.pm.PackageItemInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor",
-            method = "PackageItemInfo.DisplayNameComparator",
-            args = {android.content.pm.PackageManager.class}
-        )
-    })
     public void testDisplayNameComparator() throws NameNotFoundException {
         PackageManager pm = getContext().getPackageManager();
         DisplayNameComparator comparator = new DisplayNameComparator(pm);
diff --git a/tests/tests/content/src/android/content/pm/cts/PackageManagerTest.java b/tests/tests/content/src/android/content/pm/cts/PackageManagerTest.java
index 3e8eb0d..d1e1252 100644
--- a/tests/tests/content/src/android/content/pm/cts/PackageManagerTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/PackageManagerTest.java
@@ -18,11 +18,6 @@
 
 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 android.content.ComponentName;
 import android.content.Intent;
@@ -47,7 +42,6 @@
  * in AndroidManifest.xml just for test of PackageManager, and there are no corresponding parts
  * of these declarations in test project.
  */
-@TestTargetClass(PackageManager.class)
 public class PackageManagerTest extends AndroidTestCase {
     private PackageManager mPackageManager;
     private static final String PACKAGE_NAME = "com.android.cts.stub";
@@ -70,51 +64,6 @@
         mPackageManager = getContext().getPackageManager();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test queryIntentActivityOptions",
-            method = "queryIntentActivityOptions",
-            args = {android.content.ComponentName.class, android.content.Intent[].class,
-                    android.content.Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test queryIntentActivities",
-            method = "queryIntentActivities",
-            args = {android.content.Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test queryInstrumentation",
-            method = "queryInstrumentation",
-            args = {java.lang.String.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test queryBroadcastReceivers",
-            method = "queryBroadcastReceivers",
-            args = {android.content.Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test queryPermissionsByGroup",
-            method = "queryPermissionsByGroup",
-            args = {java.lang.String.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test queryContentProviders",
-            method = "queryContentProviders",
-            args = {java.lang.String.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test queryIntentServices",
-            method = "queryIntentServices",
-            args = {android.content.Intent.class, int.class}
-        )
-    })
     public void testQuery() throws NameNotFoundException {
         // Test query Intent Activity related methods
 
@@ -241,130 +190,6 @@
         assertTrue(isContained);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getPackageInfo",
-            method = "getPackageInfo",
-            args = {java.lang.String.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getApplicationInfo",
-            method = "getApplicationInfo",
-            args = {java.lang.String.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getApplicationInfo",
-            method = "getApplicationLabel",
-            args = {android.content.pm.ApplicationInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getServiceInfo",
-            method = "getServiceInfo",
-            args = {android.content.ComponentName.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getPackageArchiveInfo",
-            method = "getPackageArchiveInfo",
-            args = {java.lang.String.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getPackagesForUid",
-            method = "getPackagesForUid",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getNameForUid",
-            method = "getNameForUid",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getActivityInfo",
-            method = "getActivityInfo",
-            args = {android.content.ComponentName.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getPackageGids",
-            method = "getPackageGids",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getPermissionInfo",
-            method = "getPermissionInfo",
-            args = {java.lang.String.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getPermissionGroupInfo",
-            method = "getPermissionGroupInfo",
-            args = {java.lang.String.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getAllPermissionGroups",
-            method = "getAllPermissionGroups",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getInstalledApplications",
-            method = "getInstalledApplications",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getInstalledPackages",
-            method = "getInstalledPackages",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getInstrumentationInfo",
-            method = "getInstrumentationInfo",
-            args = {android.content.ComponentName.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getReceiverInfo",
-            method = "getReceiverInfo",
-            args = {android.content.ComponentName.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getText",
-            method = "getText",
-            args = {java.lang.String.class, int.class, android.content.pm.ApplicationInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            notes = "Test getSystemSharedLibraryNames",
-            method = "getSystemSharedLibraryNames",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getLaunchIntentForPackage",
-            method = "getLaunchIntentForPackage",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test isSafeMode",
-            method = "isSafeMode",
-            args = {}
-        )
-    })
-    @ToBeFixed(bug="1686810", explanation="From the doc of function getSystemSharedLibraryNames()."
-        + " It will return an String array or null(both are Ok).")
     public void testGetInfo() throws NameNotFoundException {
         // Test getApplicationInfo, getText
         ApplicationInfo appInfo = mPackageManager.getApplicationInfo(PACKAGE_NAME, 0);
@@ -555,32 +380,6 @@
         assertTrue(isContained);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setApplicationEnabledSetting",
-            method = "setApplicationEnabledSetting",
-            args = {java.lang.String.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getApplicationEnabledSetting",
-            method = "getApplicationEnabledSetting",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setComponentEnabledSetting",
-            method = "setComponentEnabledSetting",
-            args = {android.content.ComponentName.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getComponentEnabledSetting",
-            method = "getComponentEnabledSetting",
-            args = {android.content.ComponentName.class}
-        )
-    })
     public void testAccessEnabledSetting() {
         mPackageManager.setApplicationEnabledSetting(PACKAGE_NAME,
                 PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
@@ -594,32 +393,6 @@
                 mPackageManager.getComponentEnabledSetting(componentName));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test addPermission",
-            method = "addPermission",
-            args = {android.content.pm.PermissionInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test removePermission",
-            method = "removePermission",
-            args = {java.lang.String.class}
-        )
-    })
-    @ToBeFixed(bug="1561181", explanation="According to javadoc of these two methods," +
-            " we created a permission-tree and permission under this tree in our" +
-            " AndroidManifest.xml, then invoked addPermission method, but there was" +
-            " 'java.lang.SecurityException: Not allowed to modify non-dynamic permission'" +
-            " exception. We found that" +
-            " {@link com.android.server# PackageManagerService.addPermission" +
-            " (also removePermission) is the very method with function same to our target" +
-            " method, and in PackageManagerService.addPermission, there is a if-branch to check" +
-            " whether 'type' equals to BasePermission.TYPE_DYNAMIC(L1004), and the 'type' is" +
-            " parsed from /data/system/packages.xml in emulator, but we found no 'type'" +
-            " tag in packages.xml, as well as no other explicit ways to add this 'type' tag," +
-            " so we can't add permission in dynamic way.")
     public void testOpPermission() {
         PermissionInfo permissionInfo = new PermissionInfo();
         String permissionName = "com.android.cts.stub.permission.TEST_DYNAMIC.ADD";
@@ -631,44 +404,6 @@
         // Can't add permission in dynamic way
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getActivityIcon",
-            method = "getActivityIcon",
-            args = {android.content.ComponentName.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getActivityIcon",
-            method = "getActivityIcon",
-            args = {android.content.Intent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getDrawable",
-            method = "getDrawable",
-            args = {java.lang.String.class, int.class, android.content.pm.ApplicationInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getDefaultActivityIcon",
-            method = "getDefaultActivityIcon",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getApplicationIcon",
-            method = "getApplicationIcon",
-            args = {android.content.pm.ApplicationInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getApplicationIcon",
-            method = "getApplicationIcon",
-            args = {java.lang.String.class}
-        )
-    })
     public void testGetIcon() throws NameNotFoundException {
         assertNotNull(mPackageManager.getApplicationIcon(PACKAGE_NAME));
         assertNotNull(mPackageManager.getApplicationIcon(mPackageManager.getApplicationInfo(
@@ -685,20 +420,6 @@
         assertNotNull(mPackageManager.getDrawable(PACKAGE_NAME, iconRes, appInfo));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test checkSignatures",
-            method = "checkSignatures",
-            args = {java.lang.String.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test checkPermission",
-            method = "checkPermission",
-            args = {java.lang.String.class, java.lang.String.class}
-        )
-    })
     public void testCheckMethods() {
         assertEquals(PackageManager.SIGNATURE_MATCH, mPackageManager.checkSignatures(PACKAGE_NAME,
                 CONTENT_PKG_NAME));
@@ -706,26 +427,6 @@
                 mPackageManager.checkPermission(PERMISSION_NAME, PACKAGE_NAME));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test resolveActivity",
-            method = "resolveActivity",
-            args = {android.content.Intent.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test resolveContentProvider",
-            method = "resolveContentProvider",
-            args = {java.lang.String.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test resolveService",
-            method = "resolveService",
-            args = {android.content.Intent.class, int.class}
-        )
-    })
     public void testResolveMethods() {
         // Test resolveActivity
         Intent intent = new Intent(ACTIVITY_ACTION_NAME);
@@ -746,32 +447,6 @@
                 mPackageManager.resolveContentProvider(providerAuthorities, 0).name);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getResourcesForApplication",
-            method = "getResourcesForApplication",
-            args = {android.content.pm.ApplicationInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getResourcesForApplication",
-            method = "getResourcesForApplication",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getResourcesForActivity",
-            method = "getResourcesForActivity",
-            args = {android.content.ComponentName.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getXml",
-            method = "getXml",
-            args = {java.lang.String.class, int.class, android.content.pm.ApplicationInfo.class}
-        )
-    })
     public void testGetResources() throws NameNotFoundException {
         ComponentName componentName = new ComponentName(PACKAGE_NAME, ACTIVITY_NAME);
         int resourceId = R.xml.pm_test;
diff --git a/tests/tests/content/src/android/content/pm/cts/PackageManager_NameNotFoundExceptionTest.java b/tests/tests/content/src/android/content/pm/cts/PackageManager_NameNotFoundExceptionTest.java
index 1ad4e4d..546c628 100644
--- a/tests/tests/content/src/android/content/pm/cts/PackageManager_NameNotFoundExceptionTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/PackageManager_NameNotFoundExceptionTest.java
@@ -16,32 +16,13 @@
 
 package android.content.pm.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(PackageManager.NameNotFoundException.class)
 public class PackageManager_NameNotFoundExceptionTest extends AndroidTestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test NameNotFoundException",
-            method = "PackageManager.NameNotFoundException",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test NameNotFoundException",
-            method = "PackageManager.NameNotFoundException",
-            args = {java.lang.String.class}
-        )
-    })
     public void testNameNotFoundException() {
         PackageManager.NameNotFoundException exception = new PackageManager.NameNotFoundException();
         try {
diff --git a/tests/tests/content/src/android/content/pm/cts/PackageStatsTest.java b/tests/tests/content/src/android/content/pm/cts/PackageStatsTest.java
index 1c4b373..dca51e9 100644
--- a/tests/tests/content/src/android/content/pm/cts/PackageStatsTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/PackageStatsTest.java
@@ -16,57 +16,14 @@
 
 package android.content.pm.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.pm.PackageStats;
 import android.os.Parcel;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(PackageStats.class)
 public class PackageStatsTest extends AndroidTestCase {
     private static final String PACKAGE_NAME = "com.android.cts.stub";
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test describeContents",
-            method = "describeContents",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "PackageStats",
-            args = {android.content.pm.PackageStats.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "PackageStats",
-            args = {android.os.Parcel.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "PackageStats",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test toString",
-            method = "toString",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test writeToParcel",
-            method = "writeToParcel",
-            args = {android.os.Parcel.class, int.class}
-        )
-    })
     public void testPackageStats() {
         // Set mock data to make sure the functionality of constructor
         long codeSize = 10000;
diff --git a/tests/tests/content/src/android/content/pm/cts/PermissionGroupInfoTest.java b/tests/tests/content/src/android/content/pm/cts/PermissionGroupInfoTest.java
index 19b584b..da12a75 100644
--- a/tests/tests/content/src/android/content/pm/cts/PermissionGroupInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/PermissionGroupInfoTest.java
@@ -16,10 +16,6 @@
 
 package android.content.pm.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.pm.PackageManager;
 import android.content.pm.PermissionGroupInfo;
@@ -27,50 +23,11 @@
 import android.os.Parcel;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(PermissionGroupInfo.class)
 public class PermissionGroupInfoTest extends AndroidTestCase {
     private static final String PERMISSIONGROUP_NAME = "android.permission-group.COST_MONEY";
     private static final String DEFAULT_DISCRIPTION =
         "Allow applications to do things that can cost you money.";
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test describeContents",
-            method = "describeContents",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test loadDescription",
-            method = "loadDescription",
-            args = {android.content.pm.PackageManager.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "PermissionGroupInfo",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "PermissionGroupInfo",
-            args = {android.content.pm.PermissionGroupInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test toString",
-            method = "toString",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test writeToParcel",
-            method = "writeToParcel",
-            args = {android.os.Parcel.class, int.class}
-        )
-    })
     public void testPermissionGroupInfo() throws NameNotFoundException {
         PackageManager pm = getContext().getPackageManager();
         Parcel p = Parcel.obtain();
diff --git a/tests/tests/content/src/android/content/pm/cts/PermissionInfoTest.java b/tests/tests/content/src/android/content/pm/cts/PermissionInfoTest.java
index e2dc8fa..2565b85 100644
--- a/tests/tests/content/src/android/content/pm/cts/PermissionInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/PermissionInfoTest.java
@@ -16,10 +16,6 @@
 
 package android.content.pm.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.pm.PackageManager;
 import android.content.pm.PermissionInfo;
@@ -27,50 +23,11 @@
 import android.os.Parcel;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(PermissionInfo.class)
 public class PermissionInfoTest extends AndroidTestCase {
     private static final String PERMISSION_NAME = "android.permission.INTERNET";
     private static final String DEFAULT_DISCPRIPTION =
         "Allows an application to create network sockets.";
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test describeContents",
-            method = "describeContents",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test loadDescription",
-            method = "loadDescription",
-            args = {android.content.pm.PackageManager.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "PermissionInfo",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "PermissionInfo",
-            args = {android.content.pm.PermissionInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test toString",
-            method = "toString",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test writeToParcel",
-            method = "writeToParcel",
-            args = {android.os.Parcel.class, int.class}
-        )
-    })
     public void testPermissionInfo() throws NameNotFoundException {
         PackageManager pm = getContext().getPackageManager();
         Parcel p = Parcel.obtain();
diff --git a/tests/tests/content/src/android/content/pm/cts/ProviderInfoTest.java b/tests/tests/content/src/android/content/pm/cts/ProviderInfoTest.java
index afbe604..c585568 100644
--- a/tests/tests/content/src/android/content/pm/cts/ProviderInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/ProviderInfoTest.java
@@ -16,10 +16,6 @@
 
 package android.content.pm.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
@@ -31,43 +27,10 @@
 import java.util.Iterator;
 import java.util.List;
 
-@TestTargetClass(ProviderInfo.class)
 public class ProviderInfoTest extends AndroidTestCase {
     private static final String PACKAGE_NAME = "com.android.cts.stub";
     private static final String PROVIDER_NAME = "android.content.cts.MockContentProvider";
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test describeContents",
-            method = "describeContents",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "ProviderInfo",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "ProviderInfo",
-            args = {android.content.pm.ProviderInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test toString",
-            method = "toString",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test writeToParcel",
-            method = "writeToParcel",
-            args = {android.os.Parcel.class, int.class}
-        )
-    })
     public void testProviderInfo() throws NameNotFoundException {
         PackageManager pm = getContext().getPackageManager();
         Parcel p = Parcel.obtain();
diff --git a/tests/tests/content/src/android/content/pm/cts/ResolveInfoTest.java b/tests/tests/content/src/android/content/pm/cts/ResolveInfoTest.java
index 267f918..3501e86 100644
--- a/tests/tests/content/src/android/content/pm/cts/ResolveInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/ResolveInfoTest.java
@@ -16,10 +16,6 @@
 
 package android.content.pm.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.ComponentName;
 import android.content.Intent;
@@ -29,51 +25,12 @@
 import android.test.AndroidTestCase;
 import android.util.Printer;
 
-@TestTargetClass(ResolveInfo.class)
 public class ResolveInfoTest extends AndroidTestCase {
     private static final String PACKAGE_NAME = "com.android.cts.stub";
     private static final String MAIN_ACTION_NAME = "android.intent.action.MAIN";
     private static final String ACTIVITY_NAME = "android.content.pm.cts.TestPmActivity";
     private static final String SERVICE_NAME = "android.content.pm.cts.activity.PMTEST_SERVICE";
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test describeContents",
-            method = "describeContents",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getIconResource",
-            method = "getIconResource",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test loadIcon",
-            method = "loadIcon",
-            args = {android.content.pm.PackageManager.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test loadLabel",
-            method = "loadLabel",
-            args = {android.content.pm.PackageManager.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor",
-            method = "ResolveInfo",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test toString",
-            method = "toString",
-            args = {}
-        )
-    })
     public final void testResolveInfo() {
         // Test constructor
         new ResolveInfo();
@@ -91,20 +48,6 @@
         assertEquals(0, resolveInfo.describeContents());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test dump",
-            method = "dump",
-            args = {android.util.Printer.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test writeToParcel",
-            method = "writeToParcel",
-            args = {android.os.Parcel.class, int.class}
-        )
-    })
     public final void testDump() {
         PackageManager pm = getContext().getPackageManager();
         Intent intent = new Intent(SERVICE_NAME);
diff --git a/tests/tests/content/src/android/content/pm/cts/ResolveInfo_DisplayNameComparatorTest.java b/tests/tests/content/src/android/content/pm/cts/ResolveInfo_DisplayNameComparatorTest.java
index ea12e16..be3d99c 100644
--- a/tests/tests/content/src/android/content/pm/cts/ResolveInfo_DisplayNameComparatorTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/ResolveInfo_DisplayNameComparatorTest.java
@@ -16,10 +16,6 @@
 
 package android.content.pm.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.Intent;
 import android.content.pm.PackageManager;
@@ -27,25 +23,10 @@
 import android.content.pm.ResolveInfo.DisplayNameComparator;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(ResolveInfo.DisplayNameComparator.class)
 public class ResolveInfo_DisplayNameComparatorTest extends AndroidTestCase {
     private static final String MAIN_ACTION_NAME = "android.intent.action.MAIN";
     private static final String SERVICE_NAME = "android.content.pm.cts.activity.PMTEST_SERVICE";
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test compare",
-            method = "compare",
-            args = {android.content.pm.ResolveInfo.class, android.content.pm.ResolveInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor",
-            method = "ResolveInfo.DisplayNameComparator",
-            args = {android.content.pm.PackageManager.class}
-        )
-    })
     public void testDisplayNameComparator() {
         PackageManager pm = getContext().getPackageManager();
         DisplayNameComparator dnc = new DisplayNameComparator(pm);
diff --git a/tests/tests/content/src/android/content/pm/cts/ServiceInfoTest.java b/tests/tests/content/src/android/content/pm/cts/ServiceInfoTest.java
index 99442a7..8508c15 100644
--- a/tests/tests/content/src/android/content/pm/cts/ServiceInfoTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/ServiceInfoTest.java
@@ -16,10 +16,6 @@
 
 package android.content.pm.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.ComponentName;
 import android.content.pm.PackageManager;
@@ -28,43 +24,10 @@
 import android.os.Parcel;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(ServiceInfo.class)
 public class ServiceInfoTest extends AndroidTestCase {
     private static final String PACKAGE_NAME = "com.android.cts.stub";
     private static final String SERVICE_NAME = "android.content.pm.cts.TestPmService";
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test describeContents",
-            method = "describeContents",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "ServiceInfo",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "ServiceInfo",
-            args = {android.content.pm.ServiceInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test toString",
-            method = "toString",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test writeToParcel",
-            method = "writeToParcel",
-            args = {android.os.Parcel.class, int.class}
-        )
-    })
     public void testServiceInfo() throws NameNotFoundException {
         PackageManager pm = getContext().getPackageManager();
         ComponentName componentName = new ComponentName(PACKAGE_NAME, SERVICE_NAME);
diff --git a/tests/tests/content/src/android/content/pm/cts/SignatureTest.java b/tests/tests/content/src/android/content/pm/cts/SignatureTest.java
index 6bd77dd..f3c3d23 100644
--- a/tests/tests/content/src/android/content/pm/cts/SignatureTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/SignatureTest.java
@@ -16,10 +16,6 @@
 
 package android.content.pm.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.pm.Signature;
 import android.os.Parcel;
@@ -27,7 +23,6 @@
 
 import java.util.Arrays;
 
-@TestTargetClass(Signature.class)
 public class SignatureTest extends AndroidTestCase {
 
     private static final String SIGNATURE_STRING = "1234567890abcdef";
diff --git a/tests/tests/content/src/android/content/res/cts/AssetFileDescriptorTest.java b/tests/tests/content/src/android/content/res/cts/AssetFileDescriptorTest.java
index ecd189e..7518458 100644
--- a/tests/tests/content/src/android/content/res/cts/AssetFileDescriptorTest.java
+++ b/tests/tests/content/src/android/content/res/cts/AssetFileDescriptorTest.java
@@ -27,12 +27,7 @@
 import android.os.Parcel;
 import android.os.ParcelFileDescriptor;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(AssetFileDescriptor.class)
 public class AssetFileDescriptorTest extends AndroidTestCase {
     private static final long START_OFFSET = 0;
     private static final long LENGTH = 100;
@@ -71,23 +66,6 @@
         getContext().deleteFile(FILE_NAME);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "close",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createInputStream",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createOutputStream",
-            args = {}
-        )
-    })
     public void testInputOutputStream() throws IOException {
         /*
          * test createOutputStream() and createInputStrean()
@@ -172,54 +150,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test construct.",
-            method = "AssetFileDescriptor",
-            args = {ParcelFileDescriptor.class, long.class, long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getParcelFileDescriptor",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFileDescriptor",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLength",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStartOffset",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "toString",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "describeContents",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeToParcel",
-            args = {Parcel.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDeclaredLength",
-            args = {}
-        )
-    })
     public void testMiscMethod() {
         // test constructor
         new AssetFileDescriptor(null, START_OFFSET, LENGTH);
diff --git a/tests/tests/content/src/android/content/res/cts/AssetFileDescriptor_AutoCloseInputStreamTest.java b/tests/tests/content/src/android/content/res/cts/AssetFileDescriptor_AutoCloseInputStreamTest.java
index de9f0e3..58af714 100644
--- a/tests/tests/content/src/android/content/res/cts/AssetFileDescriptor_AutoCloseInputStreamTest.java
+++ b/tests/tests/content/src/android/content/res/cts/AssetFileDescriptor_AutoCloseInputStreamTest.java
@@ -16,10 +16,6 @@
 
 package android.content.res.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.res.AssetFileDescriptor;
 import android.os.ParcelFileDescriptor;
@@ -30,7 +26,6 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 
-@TestTargetClass(AssetFileDescriptor.AutoCloseInputStream.class)
 public class AssetFileDescriptor_AutoCloseInputStreamTest extends AndroidTestCase {
     private static final int FILE_END = -1;
     private static final String FILE_NAME = "testAssertFileDescriptorAutoCloseInputStream";
@@ -62,18 +57,6 @@
         mFile.delete();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "AssetFileDescriptor.AutoCloseInputStream",
-            args = {AssetFileDescriptor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "skip",
-            args = {long.class}
-        )
-    })
     public void testSkip() throws IOException {
         openInput(0, FILE_LENGTH);
         assertEquals(FILE_DATA[0], mInput.read());
@@ -85,18 +68,6 @@
         assertEquals(FILE_END, mInput.read());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "AssetFileDescriptor.AutoCloseInputStream",
-            args = {AssetFileDescriptor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "read",
-            args = {}
-        )
-    })
     public void testRead() throws IOException {
         openInput(0, FILE_LENGTH);
         for (int i = 0; i < FILE_LENGTH; i++) {
@@ -105,18 +76,6 @@
         assertEquals(FILE_END, mInput.read());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "AssetFileDescriptor.AutoCloseInputStream",
-            args = {AssetFileDescriptor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "read",
-            args = {}
-        )
-    })
     public void testReadPartial() throws IOException {
         long len = 6;
         openInput(0, len);
@@ -126,18 +85,6 @@
         assertEquals(FILE_END, mInput.read());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "AssetFileDescriptor.AutoCloseInputStream",
-            args = {AssetFileDescriptor.class}
-        ),
-        @TestTargetNew(
-                level = TestLevel.COMPLETE,
-                method = "read",
-                args = {byte[].class, int.class, int.class}
-        )
-    })
     public void testReadBufferLen() throws IOException {
         openInput(0, FILE_LENGTH);
         byte[] buf = new byte[FILE_LENGTH];
@@ -148,18 +95,6 @@
         assertEquals(FILE_END, mInput.read(buf, 0, 4));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "AssetFileDescriptor.AutoCloseInputStream",
-            args = {AssetFileDescriptor.class}
-        ),
-        @TestTargetNew(
-                level = TestLevel.PARTIAL_COMPLETE,
-                method = "read",
-                args = {byte[].class}
-        )
-    })
     public void testReadBuffer() throws IOException {
         openInput(0, FILE_LENGTH);
         byte[] buf = new byte[6];
@@ -170,18 +105,6 @@
         assertEquals(FILE_END, mInput.read(buf));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "AssetFileDescriptor.AutoCloseInputStream",
-            args = {AssetFileDescriptor.class}
-        ),
-        @TestTargetNew(
-                level = TestLevel.PARTIAL_COMPLETE,
-                method = "read",
-                args = {byte[].class}
-        )
-    })
     public void testReadBufferPartial() throws IOException {
         long len = 8;
         openInput(0, len);
@@ -193,18 +116,6 @@
         assertEquals(FILE_END, mInput.read(buf));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "AssetFileDescriptor.AutoCloseInputStream",
-            args = {AssetFileDescriptor.class}
-        ),
-        @TestTargetNew(
-                level = TestLevel.PARTIAL_COMPLETE,
-                method = "available",
-                args = {}
-        )
-    })
     public void testAvailableRead() throws IOException {
         openInput(0, FILE_LENGTH);
         assertEquals(FILE_LENGTH, mInput.available());
@@ -212,18 +123,6 @@
         assertEquals(FILE_LENGTH -1 , mInput.available());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "AssetFileDescriptor.AutoCloseInputStream",
-            args = {AssetFileDescriptor.class}
-        ),
-        @TestTargetNew(
-                level = TestLevel.PARTIAL_COMPLETE,
-                method = "available",
-                args = {}
-        )
-    })
     public void testAvailableReadBuffer() throws IOException {
         openInput(0, FILE_LENGTH);
         byte[] buf = new byte[3];
@@ -232,18 +131,6 @@
         assertEquals(FILE_LENGTH - buf.length, mInput.available());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "AssetFileDescriptor.AutoCloseInputStream",
-            args = {AssetFileDescriptor.class}
-        ),
-        @TestTargetNew(
-                level = TestLevel.PARTIAL_COMPLETE,
-                method = "available",
-                args = {}
-        )
-    })
     public void testAvailableReadBufferLen() throws IOException {
         openInput(0, FILE_LENGTH);
         byte[] buf = new byte[3];
@@ -255,28 +142,6 @@
     /*
      * Tests that AutoInputStream doesn't support mark().
      */
-    @TestTargets({
-        @TestTargetNew(
-                level = TestLevel.PARTIAL_COMPLETE,
-                method = "AssetFileDescriptor.AutoCloseInputStream",
-                args = {AssetFileDescriptor.class}
-         ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "mark",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "reset",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "markSupported",
-            args = {}
-        )
-    })
     public void testMark() throws IOException {
         openInput(0, FILE_LENGTH);
         assertFalse(mInput.markSupported());
diff --git a/tests/tests/content/src/android/content/res/cts/AssetFileDescriptor_AutoCloseOutputStreamTest.java b/tests/tests/content/src/android/content/res/cts/AssetFileDescriptor_AutoCloseOutputStreamTest.java
index 5a1afa3..b2947fe 100644
--- a/tests/tests/content/src/android/content/res/cts/AssetFileDescriptor_AutoCloseOutputStreamTest.java
+++ b/tests/tests/content/src/android/content/res/cts/AssetFileDescriptor_AutoCloseOutputStreamTest.java
@@ -22,12 +22,7 @@
 import android.content.res.AssetFileDescriptor;
 import android.os.ParcelFileDescriptor;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(AssetFileDescriptor.AutoCloseOutputStream.class)
 public class AssetFileDescriptor_AutoCloseOutputStreamTest extends AndroidTestCase {
 
     private static final String FILE_NAME = "testAssertFileDescriptorAutoCloseOutputStream";
@@ -56,28 +51,6 @@
      * Test AutoCloseOutputStream life circle.
      * 1. Write file data into test file.
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AssetFileDescriptor.AutoCloseOutputStream",
-            args = {AssetFileDescriptor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {byte[].class}
-        )
-    })
     public void testAutoCloseOutputStream() throws IOException {
         File file = new File(getContext().getFilesDir(), FILE_NAME);
         file.createNewFile();
diff --git a/tests/tests/content/src/android/content/res/cts/AssetManagerTest.java b/tests/tests/content/src/android/content/res/cts/AssetManagerTest.java
index 6aa7297..cbf20ec 100644
--- a/tests/tests/content/src/android/content/res/cts/AssetManagerTest.java
+++ b/tests/tests/content/src/android/content/res/cts/AssetManagerTest.java
@@ -33,12 +33,7 @@
 import com.android.cts.stub.R;
 import com.android.internal.util.XmlUtils;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(AssetManager.class)
 public class AssetManagerTest extends AndroidTestCase{
     private AssetManager mAssets;
 
@@ -48,60 +43,6 @@
         mAssets = mContext.getAssets();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "open",
-            args = {java.lang.String.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "open",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openFd",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openNonAssetFd",
-            args = {int.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openNonAssetFd",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openXmlResourceParser",
-            args = {int.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openXmlResourceParser",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLocales",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "list",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            notes = "Cannot close. Because when it is closed, it won't be opened again."
-                     + " This will cause other testcases fail",
-            method = "close",
-            args = {}
-        )
-    })
     public void testAssetOperations() throws IOException, XmlPullParserException {
         final Resources res = getContext().getResources();
         final TypedValue value = new TypedValue();
diff --git a/tests/tests/content/src/android/content/res/cts/AssetManager_AssetInputStreamTest.java b/tests/tests/content/src/android/content/res/cts/AssetManager_AssetInputStreamTest.java
index 0a38458..0100a7a 100644
--- a/tests/tests/content/src/android/content/res/cts/AssetManager_AssetInputStreamTest.java
+++ b/tests/tests/content/src/android/content/res/cts/AssetManager_AssetInputStreamTest.java
@@ -19,12 +19,7 @@
 
 import android.content.res.AssetManager;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(AssetManager.AssetInputStream.class)
 public class AssetManager_AssetInputStreamTest extends AndroidTestCase {
     private AssetManager.AssetInputStream mAssetInputStream;
     private final String CONTENT_STRING = "OneTwoThreeFourFiveSixSevenEightNineTen";
@@ -35,12 +30,6 @@
         mAssetInputStream = (AssetManager.AssetInputStream)mContext.getAssets().open("text.txt");
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "",
-        method = "close",
-        args = {}
-    )
     public void testClose() throws IOException {
         mAssetInputStream.close();
 
@@ -52,37 +41,11 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        notes = "",
-        method = "getAssetInt",
-        args = {}
-    )
     public void testGetAssetInt() {
         // the return value of getAssetInt is a random number
         mAssetInputStream.getAssetInt();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "mark",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "reset",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "markSupported",
-            args = {}
-        )
-    })
     public void testMarkReset() throws IOException {
         assertTrue(mAssetInputStream.markSupported());
         final int readlimit = 10;
@@ -97,44 +60,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "read",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test read method.",
-            method = "read",
-            args = {byte[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "read",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "skip",
-            args = {long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "available",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "reset",
-            args = {}
-        )
-    })
     public void testReadMethods() throws IOException {
         // test available()
         final byte[] bytes = CONTENT_STRING.getBytes();
diff --git a/tests/tests/content/src/android/content/res/cts/ColorStateListTest.java b/tests/tests/content/src/android/content/res/cts/ColorStateListTest.java
index 48bc4f2..cd1ac8b 100644
--- a/tests/tests/content/src/android/content/res/cts/ColorStateListTest.java
+++ b/tests/tests/content/src/android/content/res/cts/ColorStateListTest.java
@@ -29,65 +29,8 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(ColorStateList.class)
 public class ColorStateListTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ColorStateList",
-            args = {int[][].class, int[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isStateful",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDefaultColor",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "withAlpha",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createFromXml",
-            args = {Resources.class, XmlPullParser.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "describeContents",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "toString",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getColorForState",
-            args = {int[].class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "valueOf",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeToParcel",
-            args = {Parcel.class ,int.class}
-        )
-    })
     public void testColorStateList() throws NotFoundException, XmlPullParserException, IOException {
         final int[][] state = new int[][] { { 0 }, { 0 } };
         final int[] colors = new int[] { Color.RED, Color.BLUE };
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 014b08c..70443b0 100644
--- a/tests/tests/content/src/android/content/res/cts/ConfigurationTest.java
+++ b/tests/tests/content/src/android/content/res/cts/ConfigurationTest.java
@@ -22,12 +22,7 @@
 import android.content.res.Configuration;
 import android.os.Parcel;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(Configuration.class)
 public class ConfigurationTest extends AndroidTestCase {
 
     private Configuration mConfigDefault;
@@ -52,28 +47,11 @@
         mConfig.orientation = Configuration.ORIENTATION_PORTRAIT;
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Configuration",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Configuration",
-            args = {android.content.res.Configuration.class}
-        )
-    })
     public void testConstructor() {
         new Configuration();
         new Configuration(mConfigDefault);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "compareTo",
-        args = {android.content.res.Configuration.class}
-    )
     public void testCompareTo() {
         final Configuration cfg1 = new Configuration();
         final Configuration cfg2 = new Configuration();
@@ -157,11 +135,6 @@
         assertEquals(1, cfg1.compareTo(cfg2));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
         assertEquals(0, mConfigDefault.describeContents());
     }
@@ -173,11 +146,6 @@
         assertEquals(0, tmpc1.diff(c2));
     }
     
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "diff",
-        args = {android.content.res.Configuration.class}
-    )
     public void testDiff() {
         Configuration config = new Configuration();
         config.mcc = 1;
@@ -277,44 +245,15 @@
                 | ActivityInfo.CONFIG_FONT_SCALE, mConfigDefault, config);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "equals",
-            args = {android.content.res.Configuration.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "equals",
-            args = {java.lang.Object.class}
-        )
-    })
     public void testEquals() {
         assertFalse(mConfigDefault.equals(mConfig));
         assertFalse(mConfigDefault.equals(new Object()));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "hashCode",
-        args = {}
-    )
     public void testHashCode() {
         assertFalse(mConfigDefault.hashCode() == mConfig.hashCode());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "needNewResources",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "updateFrom",
-            args = {android.content.res.Configuration.class}
-        )
-    })
     public void testNeedNewResources() {
         assertTrue(Configuration.needNewResources(ActivityInfo.CONFIG_MCC,
                 ActivityInfo.CONFIG_MCC));
@@ -325,11 +264,6 @@
                 ActivityInfo.CONFIG_MCC));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setToDefaults",
-        args = {}
-    )
     public void testSetToDefaults() {
         final Configuration temp = new Configuration(mConfig);
         assertFalse(temp.equals(mConfigDefault));
@@ -337,20 +271,10 @@
         assertTrue(temp.equals(mConfigDefault));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "toString",
-        args = {}
-    )
     public void testToString() {
         assertNotNull(mConfigDefault.toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {android.os.Parcel.class, int.class}
-    )
     public void testWriteToParcel() {
         assertWriteToParcel(createConfig(null), Parcel.obtain());
         assertWriteToParcel(createConfig(Locale.JAPAN), Parcel.obtain());
diff --git a/tests/tests/content/src/android/content/res/cts/ResourcesTest.java b/tests/tests/content/src/android/content/res/cts/ResourcesTest.java
index b8f2cb1..058076c 100644
--- a/tests/tests/content/src/android/content/res/cts/ResourcesTest.java
+++ b/tests/tests/content/src/android/content/res/cts/ResourcesTest.java
@@ -19,11 +19,6 @@
 import com.android.cts.stub.R;
 import com.android.internal.util.XmlUtils;
 
-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;
@@ -50,7 +45,6 @@
 import java.io.InputStream;
 import java.util.Locale;
 
-@TestTargetClass(Resources.class)
 public class ResourcesTest extends AndroidTestCase {
     private static final String CONFIG_VARYING = "configVarying";
     private static final String SIMPLE = "simple";
@@ -67,28 +61,6 @@
         mResources = getContext().getResources();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Resources",
-            args = {AssetManager.class, DisplayMetrics.class, Configuration.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startPreloading",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishPreloading",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "flushLayoutCache",
-            args = {}
-        )
-    })
     public void testResources() {
         final AssetManager am = new AssetManager();
         final Configuration cfg = new Configuration();
@@ -101,11 +73,6 @@
         assertEquals(Configuration.KEYBOARDHIDDEN_YES, c.keyboard);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getString",
-        args = {int.class, java.lang.Object[].class}
-    )
     public void testGetString() {
         try {
             mResources.getString(-1, "%s");
@@ -118,18 +85,6 @@
         assertEquals("Go", strGo);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "obtainAttributes",
-            args = {AttributeSet.class, int[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getXml",
-            args = {int.class}
-        )
-    })
     public void testObtainAttributes() throws XmlPullParserException, IOException {
         final XmlPullParser parser = mResources.getXml(R.xml.test_color);
         XmlUtils.beginDocument(parser, "resources");
@@ -143,11 +98,6 @@
         testTypedArray.recycle();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "obtainTypedArray",
-        args = {int.class}
-    )
     public void testObtainTypedArray() {
         try {
             mResources.obtainTypedArray(-1);
@@ -206,12 +156,6 @@
                 expectedValue, actual);
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        method = "getMovie",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1790416", explanation = "Movie object is null in Resources#getMovie(id)")
     public void testGetMovie() {
         try {
             mResources.getMovie(-1);
@@ -221,11 +165,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getDimension",
-        args = {int.class}
-    )
     public void testGetDimension() {
         try {
             mResources.getDimension(-1);
@@ -239,11 +178,6 @@
         assertEquals(48.0f, dim);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getDimensionPixelOffset",
-        args = {int.class}
-    )
     public void testGetDimensionPixelOffset() {
         try {
             mResources.getDimensionPixelOffset(-1);
@@ -257,11 +191,6 @@
         assertEquals(48, dim);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getColorStateList",
-        args = {int.class}
-    )
     public void testGetColorStateList() {
         try {
             mResources.getColorStateList(-1);
@@ -276,11 +205,6 @@
         assertEquals(mResources.getColor(R.color.testcolor1), focusColor);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getColor",
-        args = {int.class}
-    )
     public void testGetColor() {
         try {
             mResources.getColor(-1);
@@ -293,18 +217,6 @@
         assertEquals(0xff00ff00, color);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "updateConfiguration",
-            args = {Configuration.class, DisplayMetrics.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getConfiguration",
-            args = {}
-        )
-    })
     public void testUpdateConfiguration() {
         final Configuration cfg = mResources.getConfiguration();
         assertTrue(cfg.fontScale != 5);
@@ -315,11 +227,6 @@
         assertEquals(5.0f, cfgNew.fontScale, 0.001f);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getDimensionPixelSize",
-        args = {int.class}
-    )
     public void testGetDimensionPixelSize() {
         try {
             mResources.getDimensionPixelSize(-1);
@@ -333,11 +240,6 @@
         assertEquals(48, size);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getDrawable",
-        args = {int.class}
-    )
     public void testGetDrawable() {
         try {
             mResources.getDrawable(-1);
@@ -355,11 +257,6 @@
         assertEquals(142 * targetDensity / defaultDensity, draw.getIntrinsicHeight(), 1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getAnimation",
-        args = {int.class}
-    )
     public void testGetAnimation() throws Exception {
         try {
             mResources.getAnimation(-1);
@@ -377,11 +274,6 @@
         assertEquals("@17432582", ani.getAttributeValue(0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getQuantityString",
-        args = {int.class, int.class, Object[].class}
-    )
     public void testGetQuantityString1() {
         try {
             mResources.getQuantityString(-1, 1, "");
@@ -394,11 +286,6 @@
         assertEquals("A dog", strGo);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getQuantityString",
-        args = {int.class, int.class}
-    )
     public void testGetQuantityString2() {
         try {
             mResources.getQuantityString(-1, 1);
@@ -411,11 +298,6 @@
         assertEquals("A dog", strGo);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getInteger",
-        args = {int.class}
-    )
     public void testGetInteger() {
         try {
             mResources.getInteger(-1);
@@ -428,11 +310,6 @@
         assertEquals(10, i);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getValue",
-        args = {String.class, TypedValue.class, boolean.class}
-    )
     public void testGetValue() {
         final TypedValue tv = new TypedValue();
 
@@ -448,31 +325,16 @@
         assertEquals("res/raw/text.txt", tv.coerceToString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getAssets",
-        args = {}
-    )
     public void testGetAssets() {
         final AssetManager aM = mResources.getAssets();
         assertNotNull(aM);
         assertTrue(aM.isUpToDate());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSystem",
-        args = {}
-    )
     public void testGetSystem() {
         assertNotNull(Resources.getSystem());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLayout",
-        args = {int.class}
-    )
     public void testGetLayout() throws Exception {
         try {
             mResources.getLayout(-1);
@@ -489,11 +351,6 @@
         assertEquals("@" + R.id.abslistview_root, layout.getAttributeValue(0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getBoolean",
-        args = {int.class}
-    )
     public void testGetBoolean() {
         try {
             mResources.getBoolean(-1);
@@ -506,28 +363,11 @@
         assertTrue(b);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getFraction",
-        args = {int.class, int.class, int.class}
-    )
     public void testgetFraction() {
         assertEquals(1, (int)mResources.getFraction(R.dimen.frac100perc, 1, 1));
         assertEquals(100, (int)mResources.getFraction(R.dimen.frac100perc, 100, 1));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "parseBundleExtras",
-            args = {XmlResourceParser.class, Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getXml",
-            args = {int.class}
-        )
-    })
     public void testParseBundleExtras() throws XmlPullParserException, IOException {
         final Bundle b = new Bundle();
         XmlResourceParser parser = mResources.getXml(R.xml.extra);
@@ -539,18 +379,6 @@
         assertEquals("android", b.getString("google"));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "parseBundleExtra",
-            args = {String.class, AttributeSet.class,Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getXml",
-            args = {int.class}
-        )
-    })
     public void testParseBundleExtra() throws XmlPullParserException, IOException {
         final Bundle b = new Bundle();
         XmlResourceParser parser = mResources.getXml(R.xml.extra);
@@ -562,11 +390,6 @@
         assertEquals("Lee", b.getString("Bruce"));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getIdentifier",
-        args = {String.class, String.class, String.class}
-    )
     public void testGetIdentifier() {
 
         int resid = mResources.getIdentifier(COM_ANDROID_CTS_STUB_IDENTIFIER, null, null);
@@ -579,11 +402,6 @@
         assertEquals(R.configVarying.simple, resid);
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        method = "getIntArray",
-        args = {int.class}
-    )
     public void testGetIntArray() {
         final int NO_EXIST_ID = -1;
         try {
@@ -615,11 +433,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        method = "getQuantityText",
-        args = {int.class, int.class}
-    )
     public void testGetQuantityText() {
         CharSequence cs;
         final Resources res = resourcesForLanguage("cs");
@@ -648,32 +461,10 @@
         return new Resources(mResources.getAssets(), mResources.getDisplayMetrics(), config);
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        method = "getResourceEntryName",
-        args = {int.class}
-    )
     public void testGetResourceEntryName() {
         assertEquals(SIMPLE, mResources.getResourceEntryName(R.configVarying.simple));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "getResourceName",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getResourcePackageName",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getResourceTypeName",
-            args = {int.class}
-        )
-    })
     public void testGetResourceName() {
         final String fullName = mResources.getResourceName(R.configVarying.simple);
         assertEquals(COM_ANDROID_CTS_STUB_IDENTIFIER, fullName);
@@ -685,11 +476,6 @@
         assertEquals(CONFIG_VARYING, typeName);
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        method = "getString",
-        args = {int.class}
-    )
     public void testGetStringWithIntParam() {
         checkString(R.string.formattedStringNone,
                 mResources.getString(R.string.formattedStringNone),
@@ -717,18 +503,6 @@
                 expected, actual);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "getStringArray",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTextArray",
-            args = {int.class}
-        )
-    })
     public void testGetStringArray() {
         checkStringArray(R.array.strings, new String[] {
                 "zero", "1", "here"
@@ -766,11 +540,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        method = "getValue",
-        args = {int.class, TypedValue.class, boolean.class}
-    )
     public void testGetValueWithID() {
         tryBoolean(R.bool.trueRes, true);
         tryBoolean(R.bool.falseRes, false);
@@ -804,28 +573,6 @@
                 expected, v.string);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "newTheme",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openRawResource",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openRawResource",
-            args = {int.class, TypedValue.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "openRawResourceFd",
-            args = {int.class}
-        )
-    })
     public void testRawResource() throws Exception {
         assertNotNull(mResources.newTheme());
 
diff --git a/tests/tests/content/src/android/content/res/cts/Resources_NotFoundExceptionTest.java b/tests/tests/content/src/android/content/res/cts/Resources_NotFoundExceptionTest.java
index be88a11..8fa8d7b 100644
--- a/tests/tests/content/src/android/content/res/cts/Resources_NotFoundExceptionTest.java
+++ b/tests/tests/content/src/android/content/res/cts/Resources_NotFoundExceptionTest.java
@@ -18,27 +18,10 @@
 
 import android.content.res.Resources;
 import android.content.res.Resources.NotFoundException;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 import junit.framework.TestCase;
 
-@TestTargetClass(Resources.NotFoundException.class)
 public class Resources_NotFoundExceptionTest extends TestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Resources.NotFoundException",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Resources.NotFoundException",
-            args = {java.lang.String.class}
-        )
-    })
     public void testNotFoundException() {
         NotFoundException ne = null;
         boolean isThrowed = false;
diff --git a/tests/tests/content/src/android/content/res/cts/Resources_ThemeTest.java b/tests/tests/content/src/android/content/res/cts/Resources_ThemeTest.java
index 789286c..4a4991f 100644
--- a/tests/tests/content/src/android/content/res/cts/Resources_ThemeTest.java
+++ b/tests/tests/content/src/android/content/res/cts/Resources_ThemeTest.java
@@ -28,12 +28,7 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(Resources.Theme.class)
 public class Resources_ThemeTest extends AndroidTestCase {
 
     private Resources.Theme mResTheme;
@@ -44,23 +39,6 @@
         mResTheme = getContext().getResources().newTheme();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "applyStyle",
-            args = {int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dump",
-            args = {int.class, java.lang.String.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTo",
-            args = {android.content.res.Resources.Theme.class}
-        )
-    })
     public void testSetMethods() {
         // call a native method, and have no way to get the style
         mResTheme.applyStyle(R.raw.testmp3, false);
@@ -71,23 +49,6 @@
         mResTheme.setTo(other);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "obtainStyledAttributes",
-            args = {android.util.AttributeSet.class, int[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "obtainStyledAttributes",
-            args = {int.class, int[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "obtainStyledAttributes",
-            args = {int[].class}
-        )
-    })
     public void testObtainStyledAttributes() {
         final int[] attrs = new int[1];
         attrs[0] = R.raw.testmp3;
@@ -111,11 +72,6 @@
         testTypedArray.recycle();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "resolveAttribute",
-        args = {int.class, android.util.TypedValue.class, boolean.class}
-    )
     public void testResolveAttribute() {
         final TypedValue value = new TypedValue();
         getContext().getResources().getValue(R.raw.testmp3, value, true);
diff --git a/tests/tests/content/src/android/content/res/cts/TypedArrayTest.java b/tests/tests/content/src/android/content/res/cts/TypedArrayTest.java
index 40d959d..c51405a 100644
--- a/tests/tests/content/src/android/content/res/cts/TypedArrayTest.java
+++ b/tests/tests/content/src/android/content/res/cts/TypedArrayTest.java
@@ -30,12 +30,7 @@
 import com.android.cts.stub.R;
 import com.android.internal.util.XmlUtils;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(TypedArray.class)
 public class TypedArrayTest extends AndroidTestCase{
     private TypedArray mTypedArray;
     private static final int DEFINT = -1;
@@ -77,143 +72,6 @@
     /*
      * Test all get attrs methods, all test value are in styles.xml and attrs.xml.
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBoolean",
-            args = {int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getColor",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getColorStateList",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDimension",
-            args = {int.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDimensionPixelOffset",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDimensionPixelSize",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDrawable",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFloat",
-            args = {int.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFraction",
-            args = {int.class, int.class, int.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIndex",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIndexCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInt",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInteger",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLayoutDimension",
-            args = {int.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLayoutDimension",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getNonResourceString",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPositionDescription",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getResourceId",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getResources",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getString",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getText",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTextArray",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getValue",
-            args = {int.class, android.util.TypedValue.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasValue",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "length",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "peekValue",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "toString",
-            args = {}
-        )
-    })
     public void testAttrsMethod() {
         // getBoolean test
         assertTrue(mTypedArray.getBoolean(R.styleable.style1_type1, false));
@@ -292,11 +150,6 @@
         assertNotNull(mTypedArray.toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        method = "recycle",
-        args = {}
-    )
     public void testRecycle() {
         final ContextThemeWrapper contextThemeWrapper = new ContextThemeWrapper(getContext(), 0);
         contextThemeWrapper.setTheme(R.style.TextAppearance);
@@ -305,12 +158,6 @@
         test.recycle();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getNonResourceString with xml file directly.",
-        method = "getNonResourceString",
-        args = {int.class}
-    )
     public void testNonResourceString() throws XmlPullParserException, IOException {
         final XmlResourceParser parser = getContext().getResources().getXml(R.xml.test_color);
         XmlUtils.beginDocument(parser, XML_BEGIN);
diff --git a/tests/tests/database/Android.mk b/tests/tests/database/Android.mk
index b565854..85cbe1b 100644
--- a/tests/tests/database/Android.mk
+++ b/tests/tests/database/Android.mk
@@ -31,5 +31,4 @@
 
 LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
 
-include $(BUILD_PACKAGE)
-
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/database/src/android/database/cts/AbstractCursorTest.java b/tests/tests/database/src/android/database/cts/AbstractCursorTest.java
index 5ae0a49..078c2dd 100644
--- a/tests/tests/database/src/android/database/cts/AbstractCursorTest.java
+++ b/tests/tests/database/src/android/database/cts/AbstractCursorTest.java
@@ -16,11 +16,6 @@
 
 package android.database.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.content.Context;
 import android.database.AbstractCursor;
@@ -41,7 +36,6 @@
 /**
  * Test {@link AbstractCursor}.
  */
-@TestTargetClass(AbstractCursor.class)
 public class AbstractCursorTest extends InstrumentationTestCase {
     private static final int POSITION0 = 0;
     private static final int POSITION1 = 1;
@@ -79,21 +73,11 @@
         super.tearDown();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "AbstractCursor",
-        args = {}
-    )
     public void testConstructor() {
         TestAbstractCursor abstractCursor = new TestAbstractCursor();
         assertEquals(-1, abstractCursor.getPosition());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getBlob",
-        args = {int.class}
-    )
     public void testGetBlob() {
         try {
             mTestAbstractCursor.getBlob(0);
@@ -103,18 +87,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "registerDataSetObserver",
-            args = {android.database.DataSetObserver.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unregisterDataSetObserver",
-            args = {android.database.DataSetObserver.class}
-        )
-    })
     public void testRegisterDataSetObserver() {
         MockDataSetObserver datasetObserver = new MockDataSetObserver();
 
@@ -138,18 +110,6 @@
         mDatabaseCursor.registerDataSetObserver(datasetObserver);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "registerContentObserver",
-            args = {android.database.ContentObserver.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unregisterContentObserver",
-            args = {android.database.ContentObserver.class}
-        )
-    })
     public void testRegisterContentObserver() {
         MockContentObserver contentObserver = new MockContentObserver();
 
@@ -173,22 +133,12 @@
         mDatabaseCursor.registerContentObserver(contentObserver);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setNotificationUri",
-        args = {android.content.ContentResolver.class, android.net.Uri.class}
-    )
     public void testSetNotificationUri() {
         String MOCK_URI = "content://abstractrcursortest/testtable";
         mDatabaseCursor.setNotificationUri(getInstrumentation().getContext().getContentResolver(),
                 Uri.parse(MOCK_URI));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "respond",
-        args = {android.os.Bundle.class}
-    )
     public void testRespond() {
         Bundle b = new Bundle();
         Bundle bundle = mDatabaseCursor.respond(b);
@@ -198,11 +148,6 @@
         assertSame(Bundle.EMPTY, bundle);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "requery",
-        args = {}
-    )
     public void testRequery() {
         MockDataSetObserver mock = new MockDataSetObserver();
         mDatabaseCursor.registerDataSetObserver(mock);
@@ -211,13 +156,6 @@
         assertTrue(mock.hadCalledOnChanged());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test onChange().Subclasses must call this method when they finish committing" +
-                " updates to notify all observers.",
-        method = "onChange",
-        args = {boolean.class}
-    )
     public void testOnChange() throws InterruptedException {
         MockContentObserver mock = new MockContentObserver();
         mTestAbstractCursor.registerContentObserver(mock);
@@ -231,18 +169,6 @@
         assertTrue(mock.hadCalledOnChange());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onMove",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "moveToFirst",
-            args = {}
-        )
-    })
     public void testOnMove() {
         mTestAbstractCursor.resetOnMoveRet();
         assertFalse(mTestAbstractCursor.getOnMoveRet());
@@ -253,63 +179,6 @@
         assertEquals(5, mTestAbstractCursor.getNewPos());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "moveToPrevious",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "moveToPosition",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPosition",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "moveToNext",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isFirst",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "moveToLast",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isLast",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isBeforeFirst",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isAfterLast",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "moveToFirst",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "move",
-            args = {int.class}
-        )
-    })
     public void testMoveToPrevious() {
         // Test moveToFirst, isFirst, moveToNext, getPosition
         assertTrue(mDatabaseCursor.moveToFirst());
@@ -380,36 +249,12 @@
         assertFalse(mDatabaseCursor.isAfterLast());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isClosed",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "close",
-            args = {}
-        )
-    })
     public void testIsClosed() {
         assertFalse(mDatabaseCursor.isClosed());
         mDatabaseCursor.close();
         assertTrue(mDatabaseCursor.isClosed());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWindow",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "fillWindow",
-            args = {int.class, android.database.CursorWindow.class}
-        )
-    })
     public void testGetWindow() {
         CursorWindow window = new CursorWindow(false);
         assertEquals(0, window.getNumRows());
@@ -426,61 +271,28 @@
         window.clear();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getWantsAllOnMoveCalls(), it always returns false.",
-        method = "getWantsAllOnMoveCalls",
-        args = {}
-    )
     public void testGetWantsAllOnMoveCalls() {
         assertFalse(mDatabaseCursor.getWantsAllOnMoveCalls());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isFieldUpdated",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1569265", explanation = "All other updating-related methods are 'hide' and "
-        + "'deprecated.")
     public void testIsFieldUpdated() {
         mTestAbstractCursor.moveToFirst();
         assertFalse(mTestAbstractCursor.isFieldUpdated(0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getUpdatedField",
-        args = {int.class}
-    )
     public void testGetUpdatedField() {
         mTestAbstractCursor.moveToFirst();
         assertNull(mTestAbstractCursor.getUpdatedField(0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getExtras",
-        args = {}
-    )
     public void testGetExtras() {
         assertSame(Bundle.EMPTY, mDatabaseCursor.getExtras());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getCount",
-        args = {}
-    )
     public void testGetCount() {
         assertEquals(DATA_COUNT, mDatabaseCursor.getCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getColumnNames",
-        args = {}
-    )
     public void testGetColumnNames() {
         String[] names = mDatabaseCursor.getColumnNames();
         assertEquals(COLUMN_NAMES1.length, names.length);
@@ -490,28 +302,11 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getColumnName",
-        args = {int.class}
-    )
     public void testGetColumnName() {
         assertEquals(COLUMN_NAMES1[0], mDatabaseCursor.getColumnName(0));
         assertEquals(COLUMN_NAMES1[1], mDatabaseCursor.getColumnName(1));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getColumnIndexOrThrow",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getColumnIndex",
-            args = {java.lang.String.class}
-        )
-    })
     public void testGetColumnIndexOrThrow() {
         final String COLUMN_FAKE = "fake_name";
         assertEquals(POSITION0, mDatabaseCursor.getColumnIndex(COLUMN_NAMES1[POSITION0]));
@@ -527,37 +322,15 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getColumnIndex.",
-        args = {java.lang.String.class}
-    )
     public void testGetColumnIndex() {
         assertEquals(POSITION0, mDatabaseCursor.getColumnIndex(COLUMN_NAMES1[POSITION0]));
         assertEquals(POSITION1, mDatabaseCursor.getColumnIndex(COLUMN_NAMES1[POSITION1]));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getColumnCount",
-        args = {}
-    )
     public void testGetColumnCount() {
         assertEquals(COLUMN_NAMES1.length, mDatabaseCursor.getColumnCount());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "deactivate",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "registerDataSetObserver",
-            args = {android.database.DataSetObserver.class}
-        )
-    })
     public void testDeactivate() {
         MockDataSetObserver mock = new MockDataSetObserver();
         mDatabaseCursor.registerDataSetObserver(mock);
@@ -566,11 +339,6 @@
         assertTrue(mock.hadCalledOnInvalid());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "copyStringToBuffer",
-        args = {int.class, android.database.CharArrayBuffer.class}
-    )
     public void testCopyStringToBuffer() {
         CharArrayBuffer ca = new CharArrayBuffer(1000);
         mTestAbstractCursor.moveToFirst();
@@ -585,11 +353,6 @@
         assertEquals(sb.toString(), new String(ca.data, 0, ca.sizeCopied));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "checkPosition",
-        args = {}
-    )
     public void testCheckPosition() {
         // Test with position = -1.
         try {
diff --git a/tests/tests/database/src/android/database/cts/AbstractCursor_SelfContentObserverTest.java b/tests/tests/database/src/android/database/cts/AbstractCursor_SelfContentObserverTest.java
index 2975e3d..99edaaa 100644
--- a/tests/tests/database/src/android/database/cts/AbstractCursor_SelfContentObserverTest.java
+++ b/tests/tests/database/src/android/database/cts/AbstractCursor_SelfContentObserverTest.java
@@ -17,44 +17,20 @@
 
 import android.database.AbstractCursor;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(AbstractCursor.class)
-// should be @TestTargetClass(AbstractCursor.SelfContentObserver.class)
 public class AbstractCursor_SelfContentObserverTest extends AndroidTestCase{
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor of SelfContentObserver",
-        method = "SelfContentObserver",
-        args = {}
-    )
     public void testConstructor() {
         MockAbstractCursor mac = new MockAbstractCursor();
         mac.getMockSelfContentObserver();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test deliverSelfNotifications of SelfContentObserver",
-        method = "deliverSelfNotifications",
-        args = {}
-    )
     public void testDeliverSelfNotifications() {
         MockAbstractCursor mac = new MockAbstractCursor();
         MockAbstractCursor.MockSelfContentObserver msc = mac.getMockSelfContentObserver();
         assertFalse(msc.deliverSelfNotifications());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test onChange of SelfContentObserver",
-        method = "onChange",
-        args = {boolean.class}
-    )
     public void testOnChange() {
         MockAbstractCursor mockCursor = new MockAbstractCursor();
         MockAbstractCursor.MockSelfContentObserver msc = mockCursor.getMockSelfContentObserver();
diff --git a/tests/tests/database/src/android/database/cts/AbstractWindowedCursorTest.java b/tests/tests/database/src/android/database/cts/AbstractWindowedCursorTest.java
index 3dfaa53..7e71c04 100644
--- a/tests/tests/database/src/android/database/cts/AbstractWindowedCursorTest.java
+++ b/tests/tests/database/src/android/database/cts/AbstractWindowedCursorTest.java
@@ -24,12 +24,7 @@
 import android.database.CursorWindow;
 import android.database.StaleDataException;
 import android.test.InstrumentationTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(AbstractWindowedCursor.class)
 public class AbstractWindowedCursorTest extends InstrumentationTestCase {
     private static final String TEST_STRING = "TESTSTRING";
     private static final int COLUMN_INDEX0 = 0;
@@ -54,11 +49,6 @@
         super.tearDown();
     }
     
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isNull",
-        args = {int.class}
-    )
     public void testIsNull() {
         mCursor.setWindow(mWindow);
 
@@ -72,11 +62,6 @@
         assertFalse(mCursor.isNull(COLUMN_INDEX0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isBlob",
-        args = {int.class}
-    )
     public void testIsBlob() {
         mCursor.setWindow(mWindow);
         assertTrue(mWindow.setNumColumns(TEST_COLUMN_COUNT));
@@ -91,23 +76,6 @@
         assertTrue(mCursor.isBlob(COLUMN_INDEX1));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasWindow",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setWindow",
-            args = {android.database.CursorWindow.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWindow",
-            args = {}
-        )
-    })
     public void testHasWindow() {
         assertFalse(mCursor.hasWindow());
         assertNull(mCursor.getWindow());
@@ -121,11 +89,6 @@
         assertNull(mCursor.getWindow());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getString",
-        args = {int.class}
-    )
     public void testGetString() {
         mCursor.setWindow(mWindow);
         assertTrue(mWindow.setNumColumns(TEST_COLUMN_COUNT));
@@ -137,11 +100,6 @@
         assertEquals(str, mCursor.getString(COLUMN_INDEX0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getShort",
-        args = {int.class}
-    )
     public void testGetShort() {
         mCursor.setWindow(mWindow);
         assertTrue(mWindow.setNumColumns(TEST_COLUMN_COUNT));
@@ -153,11 +111,6 @@
         assertEquals(shortNumber, mCursor.getShort(COLUMN_INDEX0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLong",
-        args = {int.class}
-    )
     public void testGetLong() {
         mCursor.setWindow(mWindow);
         assertTrue(mWindow.setNumColumns(TEST_COLUMN_COUNT));
@@ -169,11 +122,6 @@
         assertEquals(longNumber, mCursor.getLong(COLUMN_INDEX0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getInt",
-        args = {int.class}
-    )
     public void testGetInt() {
         mCursor.setWindow(mWindow);
         assertTrue(mWindow.setNumColumns(TEST_COLUMN_COUNT));
@@ -185,11 +133,6 @@
         assertEquals(intNumber, mCursor.getInt(COLUMN_INDEX0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getFloat",
-        args = {int.class}
-    )
     public void testGetFloat() {
         mCursor.setWindow(mWindow);
         assertTrue(mWindow.setNumColumns(TEST_COLUMN_COUNT));
@@ -201,11 +144,6 @@
         assertEquals(f1oatNumber, mCursor.getFloat(COLUMN_INDEX0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getDouble",
-        args = {int.class}
-    )
     public void testGetDouble() {
         mCursor.setWindow(mWindow);
         assertTrue(mWindow.setNumColumns(TEST_COLUMN_COUNT));
@@ -222,11 +160,6 @@
         assertEquals(db1, cd);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getBlob",
-        args = {int.class}
-    )
     public void testGetBlob() {
         byte TEST_VALUE = 3;
         byte BLOB_SIZE = 100;
@@ -246,11 +179,6 @@
         assertTrue(Arrays.equals(blob, targetBuffer));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "copyStringToBuffer",
-        args = {int.class, android.database.CharArrayBuffer.class}
-    )
     public void testCopyStringToBuffer() {
         assertTrue(mWindow.setNumColumns(TEST_COLUMN_COUNT));
         assertTrue(mWindow.allocRow());
@@ -271,11 +199,6 @@
         assertEquals(0, charArrayBuffer.sizeCopied);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "checkPosition",
-        args = {}
-    )
     public void testCheckPosition() {
         try {
             mCursor.checkPosition();
diff --git a/tests/tests/database/src/android/database/cts/CharArrayBufferTest.java b/tests/tests/database/src/android/database/cts/CharArrayBufferTest.java
index 3345bc5..63d8cdd 100644
--- a/tests/tests/database/src/android/database/cts/CharArrayBufferTest.java
+++ b/tests/tests/database/src/android/database/cts/CharArrayBufferTest.java
@@ -15,28 +15,11 @@
  */
 package android.database.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.database.CharArrayBuffer;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(android.database.CharArrayBuffer.class)
 public class CharArrayBufferTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "CharArrayBuffer",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "CharArrayBuffer",
-            args = {char[].class}
-        )
-    })
     public void testCharArrayBuffer() {
         CharArrayBuffer charArrayBuffer;
 
diff --git a/tests/tests/database/src/android/database/cts/ContentObservableTest.java b/tests/tests/database/src/android/database/cts/ContentObservableTest.java
index f9b3338..13a75a1 100644
--- a/tests/tests/database/src/android/database/cts/ContentObservableTest.java
+++ b/tests/tests/database/src/android/database/cts/ContentObservableTest.java
@@ -16,18 +16,15 @@
 
 package android.database.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.database.ContentObservable;
 import android.database.ContentObserver;
+import android.net.Uri;
 import android.test.InstrumentationTestCase;
 
-@TestTargetClass(ContentObservable.class)
 public class ContentObservableTest extends InstrumentationTestCase {
+    private static final Uri CONTENT_URI = Uri.parse("content://uri");
+
     ContentObservable mContentObservable;
     MyContentObserver mObserver;
 
@@ -39,19 +36,6 @@
         mObserver = new MyContentObserver();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "registerObserver",
-            args = {android.database.ContentObserver.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "notifyChange",
-            args = {boolean.class}
-        )
-    })
-    @ToBeFixed(bug = "1486189", explanation = "registerObserver is a redundant override method")
     public void testNotifyChange() {
         mContentObservable.registerObserver(mObserver);
         mObserver.resetStatus();
@@ -84,17 +68,13 @@
         assertTrue(second.hasChanged());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dispatchChange",
-        args = {boolean.class}
-    )
     public void testDispatchChange() {
         mContentObservable.registerObserver(mObserver);
         mObserver.resetStatus();
         assertFalse(mObserver.hasChanged());
         mContentObservable.dispatchChange(false);
         assertTrue(mObserver.hasChanged());
+        assertNull(mObserver.getUri());
 
         mObserver.resetStatus();
         assertFalse(mObserver.hasChanged());
@@ -103,6 +83,7 @@
         mObserver.setDeliverSelfNotifications(true);
         mContentObservable.dispatchChange(true);
         assertTrue(mObserver.hasChanged());
+        assertNull(mObserver.getUri());
 
         mContentObservable.unregisterObserver(mObserver);
         mObserver.resetStatus();
@@ -111,18 +92,44 @@
         assertFalse(mObserver.hasChanged());
     }
 
+    public void testDispatchChangeWithUri() {
+        mContentObservable.registerObserver(mObserver);
+        mObserver.resetStatus();
+        assertFalse(mObserver.hasChanged());
+        mContentObservable.dispatchChange(false, CONTENT_URI);
+        assertTrue(mObserver.hasChanged());
+        assertEquals(CONTENT_URI, mObserver.getUri());
+
+        mObserver.resetStatus();
+        assertFalse(mObserver.hasChanged());
+        mContentObservable.dispatchChange(true, CONTENT_URI);
+        assertFalse(mObserver.hasChanged());
+        mObserver.setDeliverSelfNotifications(true);
+        mContentObservable.dispatchChange(true, CONTENT_URI);
+        assertTrue(mObserver.hasChanged());
+        assertEquals(CONTENT_URI, mObserver.getUri());
+
+        mContentObservable.unregisterObserver(mObserver);
+        mObserver.resetStatus();
+        assertFalse(mObserver.hasChanged());
+        mContentObservable.dispatchChange(false, CONTENT_URI);
+        assertFalse(mObserver.hasChanged());
+    }
+
     private static class MyContentObserver extends ContentObserver {
         private boolean mHasChanged = false;
         private boolean mDeliverSelfNotifications = false;
+        private Uri mUri;
 
         public MyContentObserver() {
             super(null);
         }
 
         @Override
-        public void onChange(boolean selfChange) {
-            super.onChange(selfChange);
+        public void onChange(boolean selfChange, Uri uri) {
+            super.onChange(selfChange, uri);
             mHasChanged = true;
+            mUri = uri;
         }
 
         public boolean deliverSelfNotifications() {
@@ -135,10 +142,15 @@
 
         protected void resetStatus() {
             mHasChanged = false;
+            mUri = null;
         }
 
         protected void setDeliverSelfNotifications(boolean b) {
             mDeliverSelfNotifications = b;
         }
+
+        protected Uri getUri() {
+            return mUri;
+        }
     }
 }
diff --git a/tests/tests/database/src/android/database/cts/ContentObserverTest.java b/tests/tests/database/src/android/database/cts/ContentObserverTest.java
index 279df83..05fb60c 100644
--- a/tests/tests/database/src/android/database/cts/ContentObserverTest.java
+++ b/tests/tests/database/src/android/database/cts/ContentObserverTest.java
@@ -16,40 +16,19 @@
 
 package android.database.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.database.ContentObserver;
+import android.net.Uri;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Looper;
 import android.test.InstrumentationTestCase;
 
-@TestTargetClass(ContentObserver.class)
 public class ContentObserverTest extends InstrumentationTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ContentObserver",
-            args = {android.os.Handler.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchChange",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onChange",
-            args = {boolean.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
+    private static final Uri CONTENT_URI = Uri.parse("content://uri");
+
     public void testContentObserver() throws InterruptedException {
-        // Test constructor with null input, dispatchChange will directly invoke onChange.
+        // Test constructor with null handler, dispatchChange will directly invoke onChange.
         MyContentObserver contentObserver;
         contentObserver = new MyContentObserver(null);
         assertFalse(contentObserver.hasChanged());
@@ -90,11 +69,52 @@
         looper.quit();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "deliverSelfNotifications",
-        args = {}
-    )
+    public void testContentObserverWithUri() throws InterruptedException {
+        // Test constructor with null handler, dispatchChange will directly invoke onChange.
+        MyContentObserverWithUri contentObserver;
+        contentObserver = new MyContentObserverWithUri(null);
+        assertFalse(contentObserver.hasChanged());
+        assertFalse(contentObserver.getSelfChangeState());
+        contentObserver.dispatchChange(true, CONTENT_URI);
+        assertTrue(contentObserver.hasChanged());
+        assertTrue(contentObserver.getSelfChangeState());
+        assertEquals(CONTENT_URI, contentObserver.getUri());
+
+        contentObserver.resetStatus();
+        contentObserver.setSelfChangeState(true);
+        assertFalse(contentObserver.hasChanged());
+        assertTrue(contentObserver.getSelfChangeState());
+        contentObserver.dispatchChange(false, CONTENT_URI);
+        assertTrue(contentObserver.hasChanged());
+        assertFalse(contentObserver.getSelfChangeState());
+        assertEquals(CONTENT_URI, contentObserver.getUri());
+
+        HandlerThread ht = new HandlerThread(getClass().getName());
+        ht.start();
+        Looper looper = ht.getLooper();
+        Handler handler = new Handler(looper);
+        final long timeout = 1000L;
+
+        contentObserver = new MyContentObserverWithUri(handler);
+        assertFalse(contentObserver.hasChanged());
+        assertFalse(contentObserver.getSelfChangeState());
+        contentObserver.dispatchChange(true, CONTENT_URI);
+        assertTrue(contentObserver.hasChanged(timeout));
+        assertTrue(contentObserver.getSelfChangeState());
+        assertEquals(CONTENT_URI, contentObserver.getUri());
+
+        contentObserver.resetStatus();
+        contentObserver.setSelfChangeState(true);
+        assertFalse(contentObserver.hasChanged());
+        assertTrue(contentObserver.getSelfChangeState());
+        contentObserver.dispatchChange(false, CONTENT_URI);
+        assertTrue(contentObserver.hasChanged(timeout));
+        assertFalse(contentObserver.getSelfChangeState());
+        assertEquals(CONTENT_URI, contentObserver.getUri());
+
+        looper.quit();
+    }
+
     public void testDeliverSelfNotifications() {
         MyContentObserver contentObserver = new MyContentObserver(null);
         assertFalse(contentObserver.deliverSelfNotifications());
@@ -142,4 +162,54 @@
             mSelfChange = state;
         }
     }
+
+    private static class MyContentObserverWithUri extends ContentObserver {
+        private boolean mHasChanged;
+        private boolean mSelfChange;
+        private Uri mUri;
+
+        public MyContentObserverWithUri(Handler handler) {
+            super(handler);
+        }
+
+        @Override
+        public void onChange(boolean selfChange, Uri uri) {
+            super.onChange(selfChange, uri);
+            synchronized(this) {
+                mHasChanged = true;
+                mSelfChange = selfChange;
+                mUri = uri;
+                notifyAll();
+            }
+        }
+
+        protected synchronized boolean hasChanged(long timeout) throws InterruptedException {
+            if (!mHasChanged) {
+                wait(timeout);
+            }
+            return mHasChanged;
+        }
+
+        protected boolean hasChanged() {
+            return mHasChanged;
+        }
+
+        protected void resetStatus() {
+            mHasChanged = false;
+            mSelfChange = false;
+            mUri = null;
+        }
+
+        protected boolean getSelfChangeState() {
+            return mSelfChange;
+        }
+
+        protected void setSelfChangeState(boolean state) {
+            mSelfChange = state;
+        }
+
+        protected Uri getUri() {
+            return mUri;
+        }
+    }
 }
diff --git a/tests/tests/database/src/android/database/cts/CursorIndexOutOfBoundsExceptionTest.java b/tests/tests/database/src/android/database/cts/CursorIndexOutOfBoundsExceptionTest.java
index d4ee6a1..f84d967 100644
--- a/tests/tests/database/src/android/database/cts/CursorIndexOutOfBoundsExceptionTest.java
+++ b/tests/tests/database/src/android/database/cts/CursorIndexOutOfBoundsExceptionTest.java
@@ -18,28 +18,9 @@
 
 import android.database.CursorIndexOutOfBoundsException;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(android.database.CursorIndexOutOfBoundsException.class)
 public class CursorIndexOutOfBoundsExceptionTest extends AndroidTestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors of CursorIndexOutOfBoundsException.",
-            method = "CursorIndexOutOfBoundsException",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors of CursorIndexOutOfBoundsException.",
-            method = "CursorIndexOutOfBoundsException",
-            args = {int.class, int.class}
-        )
-    })
     public void testConstructors() {
         int INDEX = 100;
         int SIZE = 99;
diff --git a/tests/tests/database/src/android/database/cts/CursorJoinerTest.java b/tests/tests/database/src/android/database/cts/CursorJoinerTest.java
index b54cd35..4831588 100644
--- a/tests/tests/database/src/android/database/cts/CursorJoinerTest.java
+++ b/tests/tests/database/src/android/database/cts/CursorJoinerTest.java
@@ -16,10 +16,6 @@
 
 package android.database.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.Context;
 import android.database.Cursor;
@@ -30,7 +26,6 @@
 
 import java.io.File;
 
-@TestTargetClass(android.database.CursorJoiner.class)
 public class CursorJoinerTest extends AndroidTestCase {
 
     private static final int TEST_ITEM_COUNT = 10;
@@ -62,25 +57,6 @@
         super.tearDown();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "CursorJoiner",
-            args = {android.database.Cursor.class, java.lang.String[].class,
-                    android.database.Cursor.class, java.lang.String[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "iterator",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "it always throws UnsupportedOperationException.",
-            method = "remove",
-            args = {}
-        )
-    })
     public void testCursorJoinerAndIterator() {
         Cursor cursor1 = getCursor(TABLE_NAME_1, null, null);
         Cursor cursor2 = getCursor(TABLE_NAME_2, null, null);
@@ -155,22 +131,6 @@
         closeCursor(cursor1);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Fisrt UNIQUE_COUNT 'next' operations, the joiner controls cursor1 to move;" +
-                    " and the second UNIQUE_COUNT 'next' ops, the joiner controlscursor2" +
-                    " to move, the last EQUAL_VALUE_COUNT 'next' ops, the joiner control" +
-                    " bothcursor1 and cursor2 to move.",
-            method = "next",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasNext",
-            args = {}
-        )
-    })
     public void testNext() {
         String[] columnNames = new String[] { "number" };
         Cursor cursor1 = getCursor(TABLE_NAME_1, null, columnNames);
diff --git a/tests/tests/database/src/android/database/cts/CursorWindowTest.java b/tests/tests/database/src/android/database/cts/CursorWindowTest.java
index 9156d02..65ce3fd 100644
--- a/tests/tests/database/src/android/database/cts/CursorWindowTest.java
+++ b/tests/tests/database/src/android/database/cts/CursorWindowTest.java
@@ -16,15 +16,6 @@
 
 package android.database.cts;
 
-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 android.database.AbstractCursor;
 import android.database.CharArrayBuffer;
 import android.database.CursorWindow;
 import android.database.MatrixCursor;
@@ -36,56 +27,17 @@
 import java.util.Arrays;
 import java.util.Random;
 
-@TestTargetClass(android.database.CursorWindow.class)
 public class CursorWindowTest extends AndroidTestCase {
 
     private static final String TEST_STRING = "Test String";
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "This is a test from unittest of CursorWindowTest.",
-            method = "clear",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "This is a test from unittest of CursorWindowTest.",
-            method = "setStartPosition",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "This is a test from unittest of CursorWindowTest.",
-            method = "putString",
-            args = {java.lang.String.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "This is a test from unittest of CursorWindowTest.",
-            method = "putNull",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "This is a test from unittest of CursorWindowTest.",
-            method = "setNumColumns",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "This is a test from unittest of CursorWindowTest.",
-            method = "freeLastRow",
-            args = {}
-        )
-    })
     public void testWriteCursorToWindow() throws Exception {
         // create cursor
         String[] colNames = new String[]{"_id", "name", "number", "profit"};
         int colsize = colNames.length;
-        ArrayList<ArrayList> list = createTestList(10, colsize);
+        ArrayList<ArrayList<Integer>> list = createTestList(10, colsize);
         MatrixCursor cursor = new MatrixCursor(colNames, list.size());
-        for (ArrayList row : list) {
+        for (ArrayList<Integer> row : list) {
             cursor.addRow(row);
         }
 
@@ -95,10 +47,10 @@
 
         // read from cursor window
         for (int i = 0; i < list.size(); i++) {
-            ArrayList col = list.get(i);
+            ArrayList<Integer> col = list.get(i);
             for (int j = 0; j < colsize; j++) {
                 String s = window.getString(i, j);
-                int r2 = (Integer) col.get(j);
+                int r2 = col.get(j);
                 int r1 = Integer.parseInt(s);
                 assertEquals(r2, r1);
             }
@@ -109,10 +61,10 @@
         cursor.fillWindow(1, window);
         // read from cursor from window
         for (int i = 1; i < list.size(); i++) {
-            ArrayList col = list.get(i);
+            ArrayList<Integer> col = list.get(i);
             for (int j = 0; j < colsize; j++) {
                 String s = window.getString(i, j);
-                int r2 = (Integer) col.get(j);
+                int r2 = col.get(j);
                 int r1 = Integer.parseInt(s);
                 assertEquals(r2, r1);
             }
@@ -123,38 +75,6 @@
         assertEquals(0, window.getNumRows());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "This is a test from unittest of CursorWindowTest.",
-            method = "putNull",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "This is a test from unittest of CursorWindowTest.",
-            method = "getString",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "This is a test from unittest of CursorWindowTest.",
-            method = "getBlob",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "This is a test from unittest of CursorWindowTest.",
-            method = "getDouble",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "This is a test from unittest of CursorWindowTest.",
-            method = "getLong",
-            args = {int.class, int.class}
-        )
-    })
     public void testNull() {
         CursorWindow window = getOneByOneWindow();
 
@@ -166,32 +86,6 @@
         assertNull(window.getBlob(0, 0));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "This is a test from unittest of CursorWindowTest.",
-            method = "putString",
-            args = {java.lang.String.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "This is a test from unittest of CursorWindowTest.",
-            method = "getString",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "This is a test from unittest of CursorWindowTest.",
-            method = "getLong",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "This is a test from unittest of CursorWindowTest.",
-            method = "getDouble",
-            args = {int.class, int.class}
-        )
-    })
     public void testEmptyString() {
         CursorWindow window = getOneByOneWindow();
 
@@ -202,28 +96,6 @@
         assertEquals(0.0, window.getDouble(0, 0));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "CursorWindow",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStartPosition",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createFromParcel",
-            args = {android.os.Parcel.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeToParcel",
-            args = {android.os.Parcel.class, int.class}
-        )
-    })
     public void testConstructors() {
         int TEST_NUMBER = 5;
         CursorWindow cursorWindow;
@@ -251,33 +123,6 @@
         assertEquals(TEST_STRING, cursorWindow.getString(TEST_NUMBER, 0));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setNumColumns",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getNumRows",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "allocRow",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "freeLastRow",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "close",
-            args = {}
-        )
-    })
     public void testDataStructureOperations() {
         CursorWindow cursorWindow = new CursorWindow(true);
 
@@ -330,78 +175,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putString",
-            args = {java.lang.String.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putNull",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putLong",
-            args = {long.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putDouble",
-            args = {double.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putBlob",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getString",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getShort",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLong",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInt",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFloat",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDouble",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBlob",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isNull",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isBlob",
-            args = {int.class, int.class}
-        )
-    })
     public void testAccessDataValues() {
         final long NUMBER_LONG_INTEGER = (long) 0xaabbccddffL;
         final long NUMBER_INTEGER = (int) NUMBER_LONG_INTEGER;
@@ -506,11 +279,6 @@
         assertTrue(cursorWindow.isBlob(0, 4));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "copyStringToBuffer",
-        args = {int.class, int.class, android.database.CharArrayBuffer.class}
-    )
     public void testCopyStringToBuffer() {
         int DEFAULT_ARRAY_LENGTH = 64;
         String baseString = "0123456789";
@@ -546,18 +314,6 @@
         assertEquals(expectedString.length(), charArrayBuffer.data.length);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setStartPosition",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStartPosition",
-            args = {}
-        )
-    })
     public void testAccessStartPosition() {
         final int TEST_POSITION_1 = 0;
         final int TEST_POSITION_2 = 3;
@@ -587,18 +343,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "clear",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onAllReferencesReleased",
-            args = {}
-        )
-    })
     public void testClearAndOnAllReferencesReleased() {
         MockCursorWindow cursorWindow = new MockCursorWindow(true);
 
@@ -625,11 +369,6 @@
         assertTrue(cursorWindow.hasReleasedAllReferences());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
         CursorWindow cursorWindow = new CursorWindow(true);
         assertEquals(0, cursorWindow.describeContents());
@@ -668,12 +407,12 @@
         }
     }
 
-    private static ArrayList<ArrayList> createTestList(int rows, int cols) {
-        ArrayList<ArrayList> list = Lists.newArrayList();
+    private static ArrayList<ArrayList<Integer>> createTestList(int rows, int cols) {
+        ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
         Random generator = new Random();
 
         for (int i = 0; i < rows; i++) {
-            ArrayList<Integer> col = Lists.newArrayList();
+            ArrayList<Integer> col = new ArrayList<Integer>();
             list.add(col);
             for (int j = 0; j < cols; j++) {
                 // generate random number
diff --git a/tests/tests/database/src/android/database/cts/CursorWrapperTest.java b/tests/tests/database/src/android/database/cts/CursorWrapperTest.java
index df90237..9d517dc 100644
--- a/tests/tests/database/src/android/database/cts/CursorWrapperTest.java
+++ b/tests/tests/database/src/android/database/cts/CursorWrapperTest.java
@@ -16,14 +16,8 @@
 
 package android.database.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-import android.content.ContentResolver;
 import android.content.Context;
-import android.content.IContentProvider;
 import android.database.CharArrayBuffer;
 import android.database.ContentObserver;
 import android.database.Cursor;
@@ -31,7 +25,6 @@
 import android.database.DataSetObserver;
 import android.database.StaleDataException;
 import android.database.sqlite.SQLiteDatabase;
-import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
 import android.test.AndroidTestCase;
@@ -39,7 +32,6 @@
 import java.io.File;
 import java.util.Arrays;
 
-@TestTargetClass(android.database.CursorWrapper.class)
 public class CursorWrapperTest extends AndroidTestCase {
 
     private static final String FIRST_NUMBER = "123";
@@ -71,32 +63,6 @@
         super.tearDown();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test close() and isClosed() and the constructor method.",
-            method = "close",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test close() and isClosed() and the constructor method.",
-            method = "isClosed",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test close() and isClosed() and the constructor method.",
-            method = "requery",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test close() and isClosed() and the constructor method.",
-            method = "CursorWrapper",
-            args = {android.database.Cursor.class}
-        )
-    })
     public void testConstrucotorAndClose() {
         CursorWrapper cursorWrapper = new CursorWrapper(getCursor());
 
@@ -117,20 +83,6 @@
         return cursor;
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "getCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "requery",
-            args = {}
-        )
-    })
     public void testGetCount() {
         CursorWrapper cursorWrapper = new CursorWrapper(getCursor());
         int defaultCount = cursorWrapper.getCount();
@@ -165,26 +117,6 @@
         rebuildDatabase();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "deactivate",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "registerDataSetObserver",
-            args = {android.database.DataSetObserver.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "unregisterDataSetObserver",
-            args = {android.database.DataSetObserver.class}
-        )
-    })
     public void testDeactivate() throws IllegalStateException {
         CursorWrapper cursorWrapper = new CursorWrapper(getCursor());
         MockObserver observer = new MockObserver();
@@ -241,38 +173,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getColumnCount()",
-            method = "getColumnCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getColumnIndex(String)",
-            method = "getColumnIndex",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getColumnIndexOrThrow(String)",
-            method = "getColumnIndexOrThrow",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getColumnName(int).",
-            method = "getColumnName",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getColumnNames().",
-            method = "getColumnNames",
-            args = {}
-        )
-    })
     public void testGettingColumnInfos() {
         CursorWrapper cursorWrapper = new CursorWrapper(getCursor());
 
@@ -303,74 +203,6 @@
         cursorWrapper.close();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test cursor positioning related fuctions.",
-            method = "moveToFirst",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test cursor positioning related fuctions.",
-            method = "isAfterLast",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test cursor positioning related fuctions.",
-            method = "isBeforeFirst",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test cursor positioning related fuctions.",
-            method = "isFirst",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test cursor positioning related fuctions.",
-            method = "isLast",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test cursor positioning related fuctions.",
-            method = "moveToLast",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test cursor positioning related fuctions.",
-            method = "move",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test cursor positioning related fuctions.",
-            method = "moveToPosition",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test cursor positioning related fuctions.",
-            method = "moveToNext",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test cursor positioning related fuctions.",
-            method = "getPosition",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test cursor positioning related fuctions.",
-            method = "moveToPrevious",
-            args = {}
-        )
-    })
     public void testPositioning() {
         CursorWrapper cursorWrapper = new CursorWrapper(getCursor());
 
@@ -448,62 +280,6 @@
         cursorWrapper.close();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test value getting methods.",
-            method = "getDouble",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test value getting methods.",
-            method = "getFloat",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test value getting methods.",
-            method = "getInt",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test value getting methods.",
-            method = "getLong",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test value getting methods.",
-            method = "getShort",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test value getting methods.",
-            method = "getString",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test value getting methods.",
-            method = "getBlob",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test value getting methods.",
-            method = "getColumnCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test value getting methods.",
-            method = "isNull",
-            args = {int.class}
-        )
-    })
     public void testGettingValues() {
         final byte NUMBER_BLOB_UNIT = 99;
         final String STRING_TEXT = "Test String";
@@ -580,24 +356,12 @@
         mDatabase.execSQL("DROP TABLE test2");
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Tets getExtras().",
-        method = "getExtras",
-        args = {}
-    )
     public void testGetExtras() {
         CursorWrapper cursor = new CursorWrapper(getCursor());
         Bundle bundle = cursor.getExtras();
         assertSame(Bundle.EMPTY, bundle);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test copyStringToBuffer(int, CharArrayBuffer).",
-        method = "copyStringToBuffer",
-        args = {int.class, android.database.CharArrayBuffer.class}
-    )
     public void testCopyStringToBuffer() {
         CharArrayBuffer charArrayBuffer = new CharArrayBuffer(1000);
         Cursor cursor = getCursor();
@@ -624,12 +388,6 @@
         cursorWrapper.close();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test respond(Bundle).",
-        method = "respond",
-        args = {android.os.Bundle.class}
-    )
     public void testRespond() {
         Bundle b = new Bundle();
         CursorWrapper cursorWrapper = new CursorWrapper(getCursor());
@@ -638,32 +396,12 @@
         cursorWrapper.close();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getWantsAllOnMoveCalls()",
-        method = "getWantsAllOnMoveCalls",
-        args = {}
-    )
     public void testGetWantsAllOnMoveCalls() {
         CursorWrapper cursorWrapper = new CursorWrapper(getCursor());
         assertFalse(cursorWrapper.getWantsAllOnMoveCalls());
         cursorWrapper.close();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test registerContentObserver and unregisterContentObserver.",
-            method = "registerContentObserver",
-            args = {android.database.ContentObserver.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test registerContentObserver and unregisterContentObserver.",
-            method = "unregisterContentObserver",
-            args = {android.database.ContentObserver.class}
-        )
-    })
     public void testContentObsererOperations() throws IllegalStateException {
         CursorWrapper cursorWrapper = new CursorWrapper(getCursor());
         MockContentObserver observer = new MockContentObserver(null);
@@ -699,36 +437,6 @@
         cursorWrapper.close();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test setNotificationUri().",
-        method = "setNotificationUri",
-        args = {android.content.ContentResolver.class, android.net.Uri.class}
-    )
-    public void testSetNotificationUri() {
-        String MOCK_URI = "content://cursorwrappertest/testtable";
-        CursorWrapper cursorWrapper = new CursorWrapper(getCursor());
-        MockContentResolver contentResolver = new MockContentResolver(null);
-        cursorWrapper.setNotificationUri(contentResolver, Uri.parse(MOCK_URI));
-    }
-
-    private class MockContentResolver extends ContentResolver {
-
-        public MockContentResolver(Context context) {
-            super(context);
-        }
-
-        @Override
-        protected IContentProvider acquireProvider(Context c, String name) {
-            return null;
-        }
-
-        @Override
-        public boolean releaseProvider(IContentProvider icp) {
-            return false;
-        }
-    }
-
     private class MockContentObserver extends ContentObserver {
 
         public MockContentObserver(Handler handler) {
diff --git a/tests/tests/database/src/android/database/cts/DataSetObservableTest.java b/tests/tests/database/src/android/database/cts/DataSetObservableTest.java
index 8347bcb..026fb7e 100644
--- a/tests/tests/database/src/android/database/cts/DataSetObservableTest.java
+++ b/tests/tests/database/src/android/database/cts/DataSetObservableTest.java
@@ -19,28 +19,9 @@
 import android.database.DataSetObservable;
 import android.database.DataSetObserver;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(android.database.DataSetObservable.class)
 public class DataSetObservableTest extends AndroidTestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test notifyChanged and notifyInvalidated.",
-            method = "notifyChanged",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test notifyChanged and notifyInvalidated.",
-            method = "notifyInvalidated",
-            args = {}
-        )
-    })
     public void testNotifyMethods() {
         DataSetObservable dataSetObservalbe = new DataSetObservable();
         MockDataSetObserver dataSetObserver1 = new MockDataSetObserver();
diff --git a/tests/tests/database/src/android/database/cts/DataSetObserverTest.java b/tests/tests/database/src/android/database/cts/DataSetObserverTest.java
index edc6a0d..9107b70 100644
--- a/tests/tests/database/src/android/database/cts/DataSetObserverTest.java
+++ b/tests/tests/database/src/android/database/cts/DataSetObserverTest.java
@@ -18,30 +18,13 @@
 
 import android.database.DataSetObserver;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(android.database.DataSetObserver.class)
 public class DataSetObserverTest extends AndroidTestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test onChanged, and this is an empty method.",
-        method = "onChanged",
-        args = {}
-    )
     public void testOnChanged() {
         MockDataSetObserver dataSetObserver = new MockDataSetObserver();
         dataSetObserver.onChanged();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test OnInvalidated, and this is an empty method.",
-        method = "onInvalidated",
-        args = {}
-    )
     public void testOnInvalidated() {
         MockDataSetObserver dataSetObserver = new MockDataSetObserver();
         dataSetObserver.onInvalidated();
diff --git a/tests/tests/database/src/android/database/cts/DatabaseUtilsTest.java b/tests/tests/database/src/android/database/cts/DatabaseUtilsTest.java
index ae2a204..2f58702 100644
--- a/tests/tests/database/src/android/database/cts/DatabaseUtilsTest.java
+++ b/tests/tests/database/src/android/database/cts/DatabaseUtilsTest.java
@@ -16,11 +16,6 @@
 
 package android.database.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.content.ContentValues;
 import android.content.Context;
@@ -44,7 +39,6 @@
 import java.io.InputStream;
 import java.io.PrintStream;
 
-@TestTargetClass(android.database.DatabaseUtils.class)
 public class DatabaseUtilsTest extends AndroidTestCase {
     private SQLiteDatabase mDatabase;
     private File mDatabaseFile;
@@ -79,11 +73,6 @@
         super.tearDown();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "appendEscapedSQLString",
-        args = {java.lang.StringBuilder.class, java.lang.String.class}
-    )
     public void testAppendEscapedSQLString() {
         String expected = "name='Mike'";
         StringBuilder sb = new StringBuilder("name=");
@@ -96,21 +85,11 @@
         assertEquals(expected, sb.toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "sqlEscapeString",
-        args = {java.lang.String.class}
-    )
     public void testSqlEscapeString() {
         String expected = "'Jack'";
         assertEquals(expected, DatabaseUtils.sqlEscapeString("Jack"));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "appendValueToSql",
-        args = {java.lang.StringBuilder.class, java.lang.Object.class}
-    )
     public void testAppendValueToSql() {
         String expected = "address='LA'";
         StringBuilder sb = new StringBuilder("address=");
@@ -128,11 +107,6 @@
         assertEquals(expected, sb.toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "bindObjectToProgram",
-        args = {android.database.sqlite.SQLiteProgram.class, int.class, java.lang.Object.class}
-    )
     public void testBindObjectToProgram() {
         String name = "Mike";
         int age = 21;
@@ -161,12 +135,6 @@
         assertEquals(address, cursor.getString(3));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "createDbFromSqlStatements",
-        args = {android.content.Context.class, java.lang.String.class, int.class,
-                java.lang.String.class}
-    )
     public void testCreateDbFromSqlStatements() {
         String dbName = "ExampleName";
         String sqls = "CREATE TABLE " + TABLE_NAME + " (_id INTEGER PRIMARY KEY, name TEXT);\n"
@@ -186,12 +154,6 @@
         getContext().deleteDatabase(dbName);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "cursorDoubleToContentValues",
-        args = {android.database.Cursor.class, java.lang.String.class,
-                android.content.ContentValues.class, java.lang.String.class}
-    )
     public void testCursorDoubleToContentValues() {
         mDatabase.execSQL("INSERT INTO " + TABLE_NAME + " (name, age, address)" +
                 " VALUES ('Mike', '20', 'LA');");
@@ -212,13 +174,6 @@
         assertEquals(0.0, contentValues.getAsDouble(key));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "cursorDoubleToCursorValues",
-        args = {android.database.Cursor.class, java.lang.String.class,
-                android.content.ContentValues.class}
-    )
-    @ToBeFixed(bug = "1586458", explanation = "It's probably a typo.")
     public void testCursorDoubleToCursorValues() {
         mDatabase.execSQL("INSERT INTO " + TABLE_NAME + " (name, age, address)" +
                 " VALUES ('Mike', '20', 'LA');");
@@ -238,20 +193,6 @@
         assertEquals(0.0, contentValues.getAsDouble("name"));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "cursorIntToContentValues",
-            args = {android.database.Cursor.class, java.lang.String.class,
-                    android.content.ContentValues.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "cursorIntToContentValues",
-            args = {android.database.Cursor.class, java.lang.String.class,
-                    android.content.ContentValues.class, java.lang.String.class}
-        )
-    })
     public void testCursorIntToContentValues() {
         mDatabase.execSQL("INSERT INTO " + TABLE_NAME + " (name, age, address)" +
                 " VALUES ('Mike', '20', 'LA');");
@@ -281,20 +222,6 @@
         assertEquals(Integer.valueOf(0), contentValues.getAsInteger("name"));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "cursorLongToContentValues",
-            args = {android.database.Cursor.class, java.lang.String.class,
-                    android.content.ContentValues.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "cursorLongToContentValues",
-            args = {android.database.Cursor.class, java.lang.String.class,
-                    android.content.ContentValues.class, java.lang.String.class}
-        )
-    })
     public void testcursorLongToContentValues() {
         mDatabase.execSQL("INSERT INTO " + TABLE_NAME + " (name, age, address)" +
                 " VALUES ('Mike', '20', 'LA');");
@@ -324,11 +251,6 @@
         assertEquals(Long.valueOf(0), contentValues.getAsLong("name"));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "cursorRowToContentValues",
-        args = {android.database.Cursor.class, android.content.ContentValues.class}
-    )
     public void testCursorRowToContentValues() {
         mDatabase.execSQL("INSERT INTO " + TABLE_NAME + " (name, age, address)" +
                 " VALUES ('Mike', '20', 'LA');");
@@ -344,20 +266,6 @@
         assertEquals("LA", (String) contentValues.get("address"));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "cursorStringToContentValues",
-            args = {android.database.Cursor.class, java.lang.String.class,
-                    android.content.ContentValues.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "cursorStringToContentValues",
-            args = {android.database.Cursor.class, java.lang.String.class,
-                    android.content.ContentValues.class, java.lang.String.class}
-        )
-    })
     public void testCursorStringToContentValues() {
         mDatabase.execSQL("INSERT INTO " + TABLE_NAME + " (name, age, address)" +
                 " VALUES ('Mike', '20', 'LA');");
@@ -397,12 +305,6 @@
         assertEquals("Mike", contentValues.get("name"));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "cursorStringToInsertHelper",
-        args = {android.database.Cursor.class, java.lang.String.class,
-                android.database.DatabaseUtils.InsertHelper.class, int.class}
-    )
     public void testCursorStringToInsertHelper() {
         // create a new table.
         mDatabase.execSQL("CREATE TABLE test_copy (_id INTEGER PRIMARY KEY, " +
@@ -434,28 +336,6 @@
         assertEquals("LA", cursor.getString(3));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dumpCurrentRow",
-            args = {android.database.Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dumpCurrentRow",
-            args = {android.database.Cursor.class, java.io.PrintStream.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dumpCurrentRow",
-            args = {android.database.Cursor.class, java.lang.StringBuilder.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dumpCurrentRowToString",
-            args = {android.database.Cursor.class}
-        )
-    })
     public void testDumpCurrentRow() {
         mDatabase.execSQL("INSERT INTO " + TABLE_NAME + " (name, age, address)" +
                 " VALUES ('Mike', '20', 'LA');");
@@ -481,28 +361,6 @@
         assertEquals(expected, DatabaseUtils.dumpCurrentRowToString(cursor));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dumpCursor",
-            args = {android.database.Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dumpCursor",
-            args = {android.database.Cursor.class, java.io.PrintStream.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dumpCursor",
-            args = {android.database.Cursor.class, java.lang.StringBuilder.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dumpCursorToString",
-            args = {android.database.Cursor.class}
-        )
-    })
     public void testDumpCursor() {
         mDatabase.execSQL("INSERT INTO " + TABLE_NAME + " (name, age, address)" +
                 " VALUES ('Mike', '20', 'LA');");
@@ -546,18 +404,6 @@
         assertEquals(pos, cursor.getPosition()); // dumpCursor should not change status of cursor
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCollationKey",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getHexCollationKey",
-            args = {java.lang.String.class}
-        )
-    })
     public void testCollationKey() {
         String key1 = DatabaseUtils.getCollationKey("abc");
         String key2 = DatabaseUtils.getCollationKey("ABC");
@@ -574,19 +420,6 @@
         assertFalse(key1.equals(key3));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "longForQuery",
-            args = {android.database.sqlite.SQLiteDatabase.class, java.lang.String.class,
-                    java.lang.String[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "longForQuery",
-            args = {android.database.sqlite.SQLiteStatement.class, java.lang.String[].class}
-        )
-    })
     public void testLongForQuery() {
         mDatabase.execSQL("INSERT INTO " + TABLE_NAME + " (name, age, address)" +
                 " VALUES ('Mike', '20', 'LA');");
@@ -626,25 +459,6 @@
         statement.close();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "queryNumEntries",
-            args = {android.database.sqlite.SQLiteDatabase.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "queryNumEntries",
-            args = {android.database.sqlite.SQLiteDatabase.class, java.lang.String.class,
-                    java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "queryNumEntries",
-            args = {android.database.sqlite.SQLiteDatabase.class, java.lang.String.class,
-                    java.lang.String.class, java.lang.String[].class}
-        )
-    })
     public void testQueryNumEntries() {
         assertEquals(0, DatabaseUtils.queryNumEntries(mDatabase, TABLE_NAME));
 
@@ -676,23 +490,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readExceptionFromParcel",
-            args = {android.os.Parcel.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeExceptionToParcel",
-            args = {android.os.Parcel.class, java.lang.Exception.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readExceptionWithFileNotFoundExceptionFromParcel",
-            args = {android.os.Parcel.class}
-        )
-    })
     public void testExceptionFromParcel() {
         Parcel parcel = Parcel.obtain();
         DatabaseUtils.writeExceptionToParcel(parcel, new IllegalArgumentException());
@@ -735,19 +532,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stringForQuery",
-            args = {android.database.sqlite.SQLiteDatabase.class, java.lang.String.class,
-                    java.lang.String[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stringForQuery",
-            args = {android.database.sqlite.SQLiteStatement.class, java.lang.String[].class}
-        )
-    })
     public void testStringForQuery() {
         mDatabase.execSQL("INSERT INTO " + TABLE_NAME + " (name, age, address)" +
                 " VALUES ('Mike', '20', 'LA');");
@@ -783,19 +567,6 @@
         statement.close();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "blobFileDescriptorForQuery",
-            args = {android.database.sqlite.SQLiteDatabase.class, java.lang.String.class,
-                    java.lang.String[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "blobFileDescriptorForQuery",
-            args = {android.database.sqlite.SQLiteStatement.class, java.lang.String[].class}
-        )
-    })
     public void testBlobFileDescriptorForQuery() throws Exception {
         String data1 = "5300FEFF";
         String data2 = "DECAFBAD";
diff --git a/tests/tests/database/src/android/database/cts/DatabaseUtils_InsertHelperTest.java b/tests/tests/database/src/android/database/cts/DatabaseUtils_InsertHelperTest.java
index b918ff9..d72b78d 100644
--- a/tests/tests/database/src/android/database/cts/DatabaseUtils_InsertHelperTest.java
+++ b/tests/tests/database/src/android/database/cts/DatabaseUtils_InsertHelperTest.java
@@ -16,11 +16,6 @@
 
 package android.database.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.content.ContentValues;
 import android.content.Context;
@@ -30,7 +25,6 @@
 import android.test.AndroidTestCase;
 import android.test.MoreAsserts;
 
-@TestTargetClass(InsertHelper.class)
 public class DatabaseUtils_InsertHelperTest extends AndroidTestCase {
     private static final String TEST_TABLE_NAME = "test";
     private static final String DATABASE_NAME = "database_test.db";
@@ -55,30 +49,14 @@
         super.tearDown();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "InsertHelper",
-        args = {android.database.sqlite.SQLiteDatabase.class, java.lang.String.class}
-    )
     public void testConstructor() {
         new InsertHelper(mDatabase, TEST_TABLE_NAME);
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        method = "close",
-        args = {}
-    )
     public void testClose() {
         mInsertHelper.close();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getColumnIndex",
-        args = {String.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Javadoc does not specify exceptions thrown.")
     public void testGetColumnIndex() {
         mDatabase.execSQL("CREATE TABLE " + TEST_TABLE_NAME + " (_id INTEGER PRIMARY KEY, " +
                 "name TEXT, age INTEGER, address TEXT);");
@@ -94,64 +72,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "prepareForInsert",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "execute",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "bind",
-            args = {int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "bind",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "bind",
-            args = {int.class, long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "bind",
-            args = {int.class, double.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "bind",
-            args = {int.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "bind",
-            args = {int.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "bind",
-            args = {int.class, byte[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "bindNull",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "insert",
-            args = {android.content.ContentValues.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Javadoc does not specify exceptions thrown.")
     public void testInsert() {
         mDatabase.execSQL("CREATE TABLE " + TEST_TABLE_NAME + "(_id INTEGER PRIMARY KEY," +
                 " boolean_value INTEGER, int_value INTEGER, long_value INTEGER," +
@@ -254,64 +174,6 @@
         assertEquals(-1, mInsertHelper.insert(values));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "prepareForReplace",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "execute",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "bind",
-            args = {int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "bind",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "bind",
-            args = {int.class, long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "bind",
-            args = {int.class, double.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "bind",
-            args = {int.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "bind",
-            args = {int.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "bind",
-            args = {int.class, byte[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "bindNull",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "replace",
-            args = {android.content.ContentValues.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Javadoc does not specify exceptions thrown.")
     public void testReplace() {
         mDatabase.execSQL("CREATE TABLE " + TEST_TABLE_NAME + "(_id INTEGER PRIMARY KEY," +
                 " boolean_value INTEGER, int_value INTEGER, long_value INTEGER," +
diff --git a/tests/tests/database/src/android/database/cts/MatrixCursorTest.java b/tests/tests/database/src/android/database/cts/MatrixCursorTest.java
index ce5861e..bb50dda 100644
--- a/tests/tests/database/src/android/database/cts/MatrixCursorTest.java
+++ b/tests/tests/database/src/android/database/cts/MatrixCursorTest.java
@@ -16,10 +16,6 @@
 
 package android.database.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.database.CursorIndexOutOfBoundsException;
 import android.database.MatrixCursor;
@@ -29,7 +25,6 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(MatrixCursor.class)
 public class MatrixCursorTest extends TestCase {
     private static final String COLUMN0_NAME = "column0";
 
@@ -51,36 +46,12 @@
         mMatrixCursor = new MatrixCursor(new String[] { COLUMN0_NAME, COLUMN1_NAME, COLUMN2_NAME });
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "MatrixCursor",
-            args = {java.lang.String[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "MatrixCursor",
-            args = {java.lang.String[].class, int.class}
-        )
-    })
     public void testMatrixCursor() {
         new MatrixCursor(new String[0]);
 
         new MatrixCursor(new String[] { COLUMN0_NAME }, 10);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "newRow",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isNull",
-            args = {int.class}
-        )
-    })
     public void testNewRow() {
         assertEquals(0, mMatrixCursor.getCount());
         RowBuilder builder = mMatrixCursor.newRow();
@@ -123,23 +94,6 @@
         assertEquals(2, mMatrixCursor.getCount());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addRow",
-            args = {java.lang.Object[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addRow",
-            args = {java.lang.Iterable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCount",
-            args = {}
-        )
-    })
     public void testAddRow() {
         assertEquals(0, mMatrixCursor.getCount());
 
@@ -201,11 +155,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getColumnNames",
-        args = {}
-    )
     public void testGetColumnNames() {
         String[] names = mMatrixCursor.getColumnNames();
         assertEquals(3, names.length);
@@ -219,38 +168,6 @@
         assertEquals(COLUMN2_INDEX, mMatrixCursor.getColumnIndex(COLUMN2_NAME));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getString",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getShort",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInt",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLong",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFloat",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDouble",
-            args = {int.class}
-        )
-    })
     public void testGetters() {
         mMatrixCursor.addRow(new Short[] { Short.MIN_VALUE, 0, Short.MAX_VALUE });
         mMatrixCursor.moveToLast();
diff --git a/tests/tests/database/src/android/database/cts/MatrixCursor_RowBuilderTest.java b/tests/tests/database/src/android/database/cts/MatrixCursor_RowBuilderTest.java
index 98ed135..c5004d8 100644
--- a/tests/tests/database/src/android/database/cts/MatrixCursor_RowBuilderTest.java
+++ b/tests/tests/database/src/android/database/cts/MatrixCursor_RowBuilderTest.java
@@ -16,9 +16,6 @@
 
 package android.database.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.database.CursorIndexOutOfBoundsException;
 import android.database.MatrixCursor;
@@ -26,7 +23,6 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(RowBuilder.class)
 public class MatrixCursor_RowBuilderTest extends TestCase {
     private static final int COLUMN0_INDEX = 0;
 
@@ -34,11 +30,6 @@
 
     private static final int COLUMN2_INDEX = 2;
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "add",
-        args = {java.lang.Object.class}
-    )
     public void testAdd() {
         MatrixCursor cursor = new MatrixCursor(new String[] { "column0", "column1", "column2" });
         assertEquals(0, cursor.getCount());
diff --git a/tests/tests/database/src/android/database/cts/MergeCursorTest.java b/tests/tests/database/src/android/database/cts/MergeCursorTest.java
index 33e2a5c..a70d768 100644
--- a/tests/tests/database/src/android/database/cts/MergeCursorTest.java
+++ b/tests/tests/database/src/android/database/cts/MergeCursorTest.java
@@ -16,10 +16,6 @@
 
 package android.database.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.Context;
 import android.database.ContentObserver;
@@ -33,7 +29,6 @@
 import java.io.File;
 import java.util.Arrays;
 
-@TestTargetClass(android.database.MergeCursor.class)
 public class MergeCursorTest extends AndroidTestCase {
     private final int NUMBER_1_COLUMN_INDEX = 1;
     private static final String TABLE1_NAME = "test1";
@@ -78,18 +73,6 @@
         super.tearDown();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "MergeCursor",
-            args = {android.database.Cursor[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCount",
-            args = {}
-        )
-    })
     public void testConstructor() {
         // If each item of mCursors are null, count will be zero.
         MergeCursor mergeCursor = new MergeCursor(mCursors);
@@ -102,11 +85,6 @@
         assertEquals(mCursors[0].getCount() + mCursors[1].getCount(), mergeCursor.getCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onMove",
-        args = {int.class, int.class}
-    )
     public void testOnMove() {
         createCursors();
         MergeCursor mergeCursor = new MergeCursor(mCursors);
@@ -118,13 +96,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test method related to column infos during MergeCursor is switching" +
-                " between different single cursors",
-        method = "getColumnNames",
-        args = {}
-    )
     public void testCursorSwiching() {
         mDatabase.execSQL("CREATE TABLE " + TABLE5_NAME + " (_id INTEGER PRIMARY KEY,"
                 + TABLE3_COLUMNS + ");");
@@ -152,58 +123,6 @@
         assertTrue(Arrays.equals(tableColumns, mergeCursor.getColumnNames()));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBlob",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDouble",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFloat",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInt",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLong",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getShort",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getString",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isNull",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onMove",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getColumnNames",
-            args = {}
-        )
-    })
     public void testGetValues() {
         byte NUMBER_BLOB_UNIT = 99;
         String[] TEST_STRING = new String[] {"Test String1", "Test String2"};
@@ -263,18 +182,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "registerContentObserver",
-            args = {android.database.ContentObserver.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unregisterContentObserver",
-            args = {android.database.ContentObserver.class}
-        )
-    })
     public void testContentObsererOperations() throws IllegalStateException {
         createCursors();
         MergeCursor mergeCursor = new MergeCursor(mCursors);
@@ -312,23 +219,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "deactivate",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "registerDataSetObserver",
-            args = {android.database.DataSetObserver.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unregisterDataSetObserver",
-            args = {android.database.DataSetObserver.class}
-        )
-    })
     public void testDeactivate() throws IllegalStateException {
         createCursors();
         MergeCursor mergeCursor = new MergeCursor(mCursors);
@@ -390,23 +280,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requery",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "close",
-            args = {}
-        )
-    })
     public void testRequery() {
         final String TEST_VALUE1 = Integer.toString(MAX_VALUE + 1);
         final String TEST_VALUE2 = Integer.toString(MAX_VALUE + 2);
diff --git a/tests/tests/database/src/android/database/cts/ObservableTest.java b/tests/tests/database/src/android/database/cts/ObservableTest.java
index fd3dcaf..445f09f 100644
--- a/tests/tests/database/src/android/database/cts/ObservableTest.java
+++ b/tests/tests/database/src/android/database/cts/ObservableTest.java
@@ -18,27 +18,8 @@
 
 import android.database.Observable;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(android.database.Observable.class)
 public class ObservableTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test registerObserver(Object.class) and unregisterObserver(Object.class).",
-            method = "registerObserver",
-            args = {java.lang.Object.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test registerObserver(Object.class) and unregisterObserver(Object.class).",
-            method = "unregisterObserver",
-            args = {java.lang.Object.class}
-        )
-    })
     public void testRegisterUnRegisterObserver() {
         MockObservable observable = new MockObservable();
 
@@ -86,12 +67,6 @@
         observable.registerObserver(observer);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test unregisterAll method.",
-        method = "unregisterAll",
-        args = {}
-    )
     public void testUnregisterAll() {
         MockObservable observable = new MockObservable();
         Object observer1 = new Object();
diff --git a/tests/tests/database/src/android/database/cts/SQLExceptionTest.java b/tests/tests/database/src/android/database/cts/SQLExceptionTest.java
index d65b636..c026561 100644
--- a/tests/tests/database/src/android/database/cts/SQLExceptionTest.java
+++ b/tests/tests/database/src/android/database/cts/SQLExceptionTest.java
@@ -18,28 +18,9 @@
 
 import android.database.SQLException;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(android.database.SQLException.class)
 public class SQLExceptionTest extends AndroidTestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors of SQLException.",
-            method = "SQLException",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors of SQLException.",
-            method = "SQLException",
-            args = {java.lang.String.class}
-        )
-    })
     public void testConstructors() {
         String expected1 = "Expected exception message";
 
diff --git a/tests/tests/database/src/android/database/cts/StaleDataExceptionTest.java b/tests/tests/database/src/android/database/cts/StaleDataExceptionTest.java
index 9c27617..cffed53 100644
--- a/tests/tests/database/src/android/database/cts/StaleDataExceptionTest.java
+++ b/tests/tests/database/src/android/database/cts/StaleDataExceptionTest.java
@@ -18,27 +18,8 @@
 
 import android.database.StaleDataException;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(android.database.StaleDataException.class)
 public class StaleDataExceptionTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors of StaleDataException.",
-            method = "StaleDataException",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors of StaleDataException.",
-            method = "StaleDataException",
-            args = {java.lang.String.class}
-        )
-    })
     public void testConstructors() {
         String expected1 = "Expected exception message";
 
diff --git a/tests/tests/database/src/android/database/sqlite/cts/SQLiteAbortExceptionTest.java b/tests/tests/database/src/android/database/sqlite/cts/SQLiteAbortExceptionTest.java
index f988fb1..ccf344a 100644
--- a/tests/tests/database/src/android/database/sqlite/cts/SQLiteAbortExceptionTest.java
+++ b/tests/tests/database/src/android/database/sqlite/cts/SQLiteAbortExceptionTest.java
@@ -18,27 +18,8 @@
 
 import android.database.sqlite.SQLiteAbortException;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(android.database.sqlite.SQLiteAbortException.class)
 public class SQLiteAbortExceptionTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "SQLiteAbortException",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "SQLiteAbortException",
-            args = {java.lang.String.class}
-        )
-    })
     public void testConstructor() {
         new SQLiteAbortException();
 
diff --git a/tests/tests/database/src/android/database/sqlite/cts/SQLiteClosableTest.java b/tests/tests/database/src/android/database/sqlite/cts/SQLiteClosableTest.java
index cc6154a..4f5c60a 100644
--- a/tests/tests/database/src/android/database/sqlite/cts/SQLiteClosableTest.java
+++ b/tests/tests/database/src/android/database/sqlite/cts/SQLiteClosableTest.java
@@ -18,12 +18,7 @@
 
 import android.database.sqlite.SQLiteClosable;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(android.database.sqlite.SQLiteClosable.class)
 public class SQLiteClosableTest extends AndroidTestCase {
     private class MockSQLiteClosable extends SQLiteClosable {
         private boolean mOnAllReferencesReleasedCalled = false;
@@ -47,26 +42,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test acquireReference(), releaseReference() and onAllReferencesReleased()",
-            method = "acquireReference",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test acquireReference(), releaseReference() and onAllReferencesReleased()",
-            method = "releaseReference",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test acquireReference(), releaseReference() and onAllReferencesReleased()",
-            method = "onAllReferencesReleased",
-            args = {}
-        )
-    })
     public void testAcquireReference() {
         MockSQLiteClosable closable = new MockSQLiteClosable();
 
@@ -85,20 +60,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test releaseReferenceFromContainer(), onAllReferencesReleasedFromContainer()",
-            method = "releaseReferenceFromContainer",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test releaseReferenceFromContainer(), onAllReferencesReleasedFromContainer()",
-            method = "onAllReferencesReleasedFromContainer",
-            args = {}
-        )
-    })
     public void testReleaseReferenceFromContainer() {
         MockSQLiteClosable closable = new MockSQLiteClosable();
 
diff --git a/tests/tests/database/src/android/database/sqlite/cts/SQLiteConstraintExceptionTest.java b/tests/tests/database/src/android/database/sqlite/cts/SQLiteConstraintExceptionTest.java
index 71c8a9d..cce4d02 100644
--- a/tests/tests/database/src/android/database/sqlite/cts/SQLiteConstraintExceptionTest.java
+++ b/tests/tests/database/src/android/database/sqlite/cts/SQLiteConstraintExceptionTest.java
@@ -18,27 +18,8 @@
 
 import android.database.sqlite.SQLiteConstraintException;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(android.database.sqlite.SQLiteConstraintException.class)
 public class SQLiteConstraintExceptionTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "SQLiteConstraintException",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "SQLiteConstraintException",
-            args = {java.lang.String.class}
-        )
-    })
     public void testConstructor() {
         new SQLiteConstraintException();
 
diff --git a/tests/tests/database/src/android/database/sqlite/cts/SQLiteCursorTest.java b/tests/tests/database/src/android/database/sqlite/cts/SQLiteCursorTest.java
index c684a69..a506de5 100644
--- a/tests/tests/database/src/android/database/sqlite/cts/SQLiteCursorTest.java
+++ b/tests/tests/database/src/android/database/sqlite/cts/SQLiteCursorTest.java
@@ -16,11 +16,6 @@
 
 package android.database.sqlite.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.content.Context;
 import android.database.AbstractCursor;
@@ -38,7 +33,6 @@
 /**
  * Test {@link AbstractCursor}.
  */
-@TestTargetClass(SQLiteCursor.class)
 public class SQLiteCursorTest extends AndroidTestCase {
     private SQLiteDatabase mDatabase;
     private static final String[] COLUMNS = new String[] { "_id", "number_1", "number_2" };
@@ -65,19 +59,9 @@
         super.tearDown();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "SQLiteCursor",
-        args = {android.database.sqlite.SQLiteDatabase.class,
-                android.database.sqlite.SQLiteCursorDriver.class, java.lang.String.class,
-                android.database.sqlite.SQLiteQuery.class}
-    )
-    @ToBeFixed(bug = "1686574", explanation = "can not get an instance of SQLiteQuery" +
-            " or construct it directly for testing, and if SQLiteQuery is null, SQLiteCursor" +
-            " constructor should throw NullPointerException")
     public void testConstructor() {
         SQLiteDirectCursorDriver cursorDriver = new SQLiteDirectCursorDriver(mDatabase,
-                TEST_SQL, TABLE_NAME);
+                TEST_SQL, TABLE_NAME, null);
         try {
             new SQLiteCursor(mDatabase, cursorDriver, TABLE_NAME, null);
             fail("constructor didn't throw IllegalArgumentException when SQLiteQuery is null");
@@ -89,18 +73,6 @@
         assertNotNull(cursor);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "close",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requery",
-            args = {}
-        )
-    })
     public void testClose() {
         SQLiteCursor cursor = getCursor();
         assertTrue(cursor.moveToFirst());
@@ -116,23 +88,6 @@
         assertTrue(cursor.isClosed());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "deactivate",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setWindow",
-            args = {android.database.CursorWindow.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "registerDataSetObserver",
-            args = {android.database.DataSetObserver.class}
-        )
-    })
     public void testRegisterDataSetObserver() {
         SQLiteCursor cursor = getCursor();
         MockCursorWindow cursorWindow = new MockCursorWindow(false);
@@ -184,18 +139,6 @@
         assertFalse(observer.hasInvalidated());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requery",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCount",
-            args = {}
-        )
-    })
     public void testRequery() {
         final String DELETE = "DELETE FROM " + TABLE_NAME + " WHERE number_1 =";
         final String DELETE_1 = DELETE + "1;";
@@ -219,13 +162,6 @@
         assertTrue(observer.hasChanged());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requery",
-            args = {}
-        )
-    })
     public void testRequery2() {
         mDatabase.disableWriteAheadLogging();
         mDatabase.execSQL("create table testRequery2 (i int);");
@@ -252,18 +188,6 @@
         assertFalse(c.requery());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getColumnIndex",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getColumnNames",
-            args = {}
-        )
-    })
     public void testGetColumnIndex() {
         SQLiteCursor cursor = getCursor();
 
@@ -274,11 +198,6 @@
         assertTrue(Arrays.equals(COLUMNS, cursor.getColumnNames()));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setSelectionArguments",
-        args = {java.lang.String[].class}
-    )
     public void testSetSelectionArguments() {
         final String SELECTION = "_id > ?";
         int TEST_ARG1 = 2;
@@ -291,11 +210,6 @@
         assertEquals(TEST_COUNT - TEST_ARG2, cursor.getCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onMove",
-        args = {int.class, int.class}
-    )
     public void testOnMove() {
         // Do not test this API. It is callback which:
         // 1. The callback mechanism has been tested in super class
diff --git a/tests/tests/database/src/android/database/sqlite/cts/SQLiteDatabaseCorruptExceptionTest.java b/tests/tests/database/src/android/database/sqlite/cts/SQLiteDatabaseCorruptExceptionTest.java
index 50433f7..3d8f56a 100644
--- a/tests/tests/database/src/android/database/sqlite/cts/SQLiteDatabaseCorruptExceptionTest.java
+++ b/tests/tests/database/src/android/database/sqlite/cts/SQLiteDatabaseCorruptExceptionTest.java
@@ -18,27 +18,8 @@
 
 import android.database.sqlite.SQLiteDatabaseCorruptException;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(android.database.sqlite.SQLiteDatabaseCorruptException.class)
 public class SQLiteDatabaseCorruptExceptionTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor",
-            method = "SQLiteDatabaseCorruptException",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor",
-            method = "SQLiteDatabaseCorruptException",
-            args = {java.lang.String.class}
-        )
-    })
     public void testConstructor() {
         new SQLiteDatabaseCorruptException();
 
diff --git a/tests/tests/database/src/android/database/sqlite/cts/SQLiteDatabaseTest.java b/tests/tests/database/src/android/database/sqlite/cts/SQLiteDatabaseTest.java
index 4d2724a..8f7d10c 100644
--- a/tests/tests/database/src/android/database/sqlite/cts/SQLiteDatabaseTest.java
+++ b/tests/tests/database/src/android/database/sqlite/cts/SQLiteDatabaseTest.java
@@ -36,13 +36,7 @@
 import android.test.MoreAsserts;
 import android.test.suitebuilder.annotation.LargeTest;
 import android.test.suitebuilder.annotation.SmallTest;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
-@TestTargetClass(android.database.sqlite.SQLiteDatabase.class)
 public class SQLiteDatabaseTest extends AndroidTestCase {
     private SQLiteDatabase mDatabase;
     private File mDatabaseFile;
@@ -90,41 +84,6 @@
         super.tearDown();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test openDatabase",
-            method = "openDatabase",
-            args = {java.lang.String.class,
-                    android.database.sqlite.SQLiteDatabase.CursorFactory.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test openOrCreateDatabase",
-            method = "openOrCreateDatabase",
-            args = {java.io.File.class,
-                    android.database.sqlite.SQLiteDatabase.CursorFactory.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test openOrCreateDatabase",
-            method = "openOrCreateDatabase",
-            args = {java.lang.String.class,
-                    android.database.sqlite.SQLiteDatabase.CursorFactory.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test close",
-            method = "close",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test create",
-            method = "create",
-            args = {android.database.sqlite.SQLiteDatabase.CursorFactory.class}
-        )
-    })
     public void testOpenDatabase() {
         CursorFactory factory = new CursorFactory() {
             public Cursor newCursor(SQLiteDatabase db, SQLiteCursorDriver masterQuery,
@@ -164,44 +123,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test beginTransaction()",
-            method = "beginTransaction",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test endTransaction()",
-            method = "endTransaction",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setTransactionSuccessful()",
-            method = "setTransactionSuccessful",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test inTransaction()",
-            method = "inTransaction",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test isDbLockedByCurrentThread()",
-            method = "isDbLockedByCurrentThread",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test isDbLockedByOtherThreads()",
-            method = "isDbLockedByOtherThreads",
-            args = {}
-        )
-    })
     public void testTransaction() {
         mDatabase.execSQL("CREATE TABLE test (num INTEGER);");
         mDatabase.execSQL("INSERT INTO test (num) VALUES (0)");
@@ -328,20 +249,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getMaximumSize()",
-            method = "getMaximumSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setMaximumSize(long)",
-            method = "setMaximumSize",
-            args = {long.class}
-        )
-    })
     public void testAccessMaximumSize() {
         long curMaximumSize = mDatabase.getMaximumSize();
 
@@ -355,21 +262,6 @@
         assertTrue(mDatabase.getMaximumSize() > curMaximumSize);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getPageSize()",
-            method = "getPageSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setPageSize(long)",
-            method = "setPageSize",
-            args = {long.class}
-        )
-    })
-    @ToBeFixed(bug = "1676383", explanation = "setPageSize does not work as javadoc declares.")
     public void testAccessPageSize() {
         File databaseFile = new File(mDatabaseDir, "database.db");
         if (databaseFile.exists()) {
@@ -393,12 +285,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test compileStatement(String)",
-        method = "compileStatement",
-        args = {java.lang.String.class}
-    )
     public void testCompileStatement() {
         mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, "
                 + "name TEXT, age INTEGER, address TEXT);");
@@ -440,12 +326,6 @@
         cursor.close();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test delete(String, String, String[])",
-        method = "delete",
-        args = {java.lang.String.class, java.lang.String.class, java.lang.String[].class}
-    )
     public void testDelete() {
         mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, "
                 + "name TEXT, age INTEGER, address TEXT);");
@@ -500,20 +380,6 @@
         cursor.close();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test execSQL(String)",
-            method = "execSQL",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test execSQL(String, Object[])",
-            method = "execSQL",
-            args = {java.lang.String.class, java.lang.Object[].class}
-        )
-    })
     public void testExecSQL() {
         mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, "
                 + "name TEXT, age INTEGER, address TEXT);");
@@ -604,12 +470,6 @@
         cursor.close();;
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test findEditTable(String)",
-        method = "findEditTable",
-        args = {java.lang.String.class}
-    )
     public void testFindEditTable() {
         String tables = "table1 table2 table3";
         assertEquals("table1", SQLiteDatabase.findEditTable(tables));
@@ -627,30 +487,10 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getPath()",
-        method = "getPath",
-        args = {}
-    )
     public void testGetPath() {
         assertEquals(mDatabaseFilePath, mDatabase.getPath());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getVersion()",
-            method = "getVersion",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setVersion(int)",
-            method = "setVersion",
-            args = {int.class}
-        )
-    })
     public void testAccessVersion() {
         mDatabase.setVersion(1);
         assertEquals(1, mDatabase.getVersion());
@@ -659,22 +499,6 @@
         assertEquals(3, mDatabase.getVersion());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test insert(String, String, ContentValues)",
-            method = "insert",
-            args = {java.lang.String.class, java.lang.String.class,
-                    android.content.ContentValues.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test insertOrThrow(String, String, ContentValues)",
-            method = "insertOrThrow",
-            args = {java.lang.String.class, java.lang.String.class,
-                    android.content.ContentValues.class}
-        )
-    })
     public void testInsert() {
         mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, "
                 + "name TEXT, age INTEGER, address TEXT);");
@@ -759,12 +583,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test isOpen()",
-        method = "isOpen",
-        args = {}
-    )
     public void testIsOpen() {
         assertTrue(mDatabase.isOpen());
 
@@ -772,12 +590,6 @@
         assertFalse(mDatabase.isOpen());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test isReadOnly()",
-        method = "isReadOnly",
-        args = {}
-    )
     public void testIsReadOnly() {
         assertFalse(mDatabase.isReadOnly());
 
@@ -793,22 +605,10 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test releaseMemory()",
-        method = "releaseMemory",
-        args = {}
-    )
     public void testReleaseMemory() {
         SQLiteDatabase.releaseMemory();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test setLockingEnabled()",
-        method = "setLockingEnabled",
-        args = {boolean.class}
-    )
     public void testSetLockingEnabled() {
         mDatabase.execSQL("CREATE TABLE test (num INTEGER);");
         mDatabase.execSQL("INSERT INTO test (num) VALUES (0)");
@@ -822,20 +622,6 @@
         mDatabase.endTransaction();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test yieldIfContended()",
-            method = "yieldIfContended",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test yieldIfContendedSafely()",
-            method = "yieldIfContendedSafely",
-            args = {}
-        )
-    })
     @SuppressWarnings("deprecation")
     public void testYieldIfContended() {
         assertFalse(mDatabase.yieldIfContended());
@@ -864,54 +650,6 @@
         mDatabase.endTransaction();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test query",
-            method = "query",
-            args = {boolean.class, java.lang.String.class, java.lang.String[].class,
-                    java.lang.String.class, java.lang.String[].class, java.lang.String.class,
-                    java.lang.String.class, java.lang.String.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test queryWithFactory",
-            method = "queryWithFactory",
-            args = {android.database.sqlite.SQLiteDatabase.CursorFactory.class, boolean.class,
-                    java.lang.String.class, java.lang.String[].class, java.lang.String.class,
-                    java.lang.String[].class, java.lang.String.class, java.lang.String.class,
-                    java.lang.String.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test query",
-            method = "query",
-            args = {java.lang.String.class, java.lang.String[].class, java.lang.String.class,
-                    java.lang.String[].class, java.lang.String.class, java.lang.String.class,
-                    java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test query",
-            method = "query",
-            args = {java.lang.String.class, java.lang.String[].class, java.lang.String.class,
-                    java.lang.String[].class, java.lang.String.class, java.lang.String.class,
-                    java.lang.String.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test rawQuery",
-            method = "rawQuery",
-            args = {java.lang.String.class, java.lang.String[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test rawQueryWithFactory",
-            method = "rawQueryWithFactory",
-            args = {android.database.sqlite.SQLiteDatabase.CursorFactory.class,
-                    java.lang.String.class, java.lang.String[].class, java.lang.String.class}
-        )
-    })
     public void testQuery() {
         mDatabase.execSQL("CREATE TABLE employee (_id INTEGER PRIMARY KEY, " +
                 "name TEXT, month INTEGER, salary INTEGER);");
@@ -1021,22 +759,6 @@
         cursor.close();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test replace()",
-            method = "replace",
-            args = {java.lang.String.class, java.lang.String.class,
-                    android.content.ContentValues.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test replaceOrThrow()",
-            method = "replaceOrThrow",
-            args = {java.lang.String.class, java.lang.String.class,
-                    android.content.ContentValues.class}
-        )
-    })
     public void testReplace() {
         mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, "
                 + "name TEXT, age INTEGER, address TEXT);");
@@ -1102,13 +824,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test update()",
-        method = "update",
-        args = {java.lang.String.class, android.content.ContentValues.class,
-                java.lang.String.class, java.lang.String[].class}
-    )
     public void testUpdate() {
         mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, data TEXT);");
 
@@ -1129,12 +844,6 @@
         cursor.close();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test needUpgrade(int)",
-        method = "needUpgrade",
-        args = {int.class}
-    )
     public void testNeedUpgrade() {
         mDatabase.setVersion(0);
         assertTrue(mDatabase.needUpgrade(1));
@@ -1142,12 +851,6 @@
         assertFalse(mDatabase.needUpgrade(1));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test setLocale(Locale)",
-        method = "setLocale",
-        args = {java.util.Locale.class}
-    )
     public void testSetLocale() {
         final String[] STRINGS = {
                 "c\u00f4t\u00e9",
@@ -1191,24 +894,12 @@
         });
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test onAllReferencesReleased()",
-        method = "onAllReferencesReleased",
-        args = {}
-    )
     public void testOnAllReferencesReleased() {
         assertTrue(mDatabase.isOpen());
         mDatabase.releaseReference();
         assertFalse(mDatabase.isOpen());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test transaction with SQLTransactionListener()",
-        method = "beginTransactionWithListener",
-        args = {SQLiteTransactionListener.class}
-    )
     public void testTransactionWithSQLiteTransactionListener() {
         mDatabase.execSQL("CREATE TABLE test (num INTEGER);");
         mDatabase.execSQL("INSERT INTO test (num) VALUES (0)");
@@ -1240,12 +931,6 @@
         assertEquals(mTransactionListenerOnRollbackCalled, false);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test transaction w/rollback with SQLTransactionListener()",
-        method = "beginTransactionWithListener",
-        args = {SQLiteTransactionListener.class}
-    )
     public void testRollbackTransactionWithSQLiteTransactionListener() {
         mDatabase.execSQL("CREATE TABLE test (num INTEGER);");
         mDatabase.execSQL("INSERT INTO test (num) VALUES (0)");
@@ -1290,15 +975,6 @@
         }
     }
 
-    @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "removed the android-provided group_concat built-in function." +
-                    "Instead we are now using the sqlite3.c provided group_concat function." +
-                    "and it returns NULL if the columnds to be concatenated have null values" +
-                    " in them",
-            method = "sqlite3::group_concat built-in function",
-            args = {java.lang.String.class}
-        )
     public void testGroupConcat() {
         mDatabase.execSQL("CREATE TABLE test (i INT, j TEXT);");
 
@@ -1332,12 +1008,6 @@
         // should get no exceptions
     }
 
-    @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test schema changes - change existing table.",
-            method = "compileStatement",
-            args = {java.lang.String.class}
-        )
     public void testSchemaChanges() {
         mDatabase.execSQL("CREATE TABLE test (i INT, j INT);");
 
@@ -1405,12 +1075,6 @@
         deleteStatement.close();
     }
 
-    @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test schema changes - add new table.",
-            method = "compileStatement",
-            args = {java.lang.String.class}
-        )
     public void testSchemaChangesNewTable() {
         mDatabase.execSQL("CREATE TABLE test (i INT, j INT);");
 
@@ -1475,12 +1139,6 @@
         deleteStatement2.close();
     }
 
-    @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test schema changes - drop existing table.",
-            method = "compileStatement",
-            args = {java.lang.String.class}
-        )
     public void testSchemaChangesDropTable() {
         mDatabase.execSQL("CREATE TABLE test (i INT, j INT);");
 
@@ -1506,12 +1164,6 @@
         assertEquals(2, cursor.getInt(1));
     }
 
-    @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test enableWriteAheadLogging",
-            method = "enableWriteAheadLogging",
-            args = {}
-        )
     /**
      * With sqlite's write-ahead-logging (WAL) enabled, readers get old version of data
      * from the table that a writer is modifying at the same time.
@@ -1606,12 +1258,6 @@
         }
     }
 
-    @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test exceptions from enableWriteAheadLogging().",
-            method = "enableWriteAheadLogging",
-            args = {}
-        )
     public void testExceptionsFromEnableWriteAheadLogging() {
         // attach a database
         // redo setup to create WAL enabled database
diff --git a/tests/tests/database/src/android/database/sqlite/cts/SQLiteDiskIOExceptionTest.java b/tests/tests/database/src/android/database/sqlite/cts/SQLiteDiskIOExceptionTest.java
index fa35e43..503607f 100644
--- a/tests/tests/database/src/android/database/sqlite/cts/SQLiteDiskIOExceptionTest.java
+++ b/tests/tests/database/src/android/database/sqlite/cts/SQLiteDiskIOExceptionTest.java
@@ -18,27 +18,8 @@
 
 import android.database.sqlite.SQLiteDiskIOException;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(android.database.sqlite.SQLiteDiskIOException.class)
 public class SQLiteDiskIOExceptionTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor",
-            method = "SQLiteDiskIOException",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor",
-            method = "SQLiteDiskIOException",
-            args = {java.lang.String.class}
-        )
-    })
     public void testConstructor() {
         new SQLiteDiskIOException();
 
diff --git a/tests/tests/database/src/android/database/sqlite/cts/SQLiteDoneExceptionTest.java b/tests/tests/database/src/android/database/sqlite/cts/SQLiteDoneExceptionTest.java
index 48f84df..881d1c8 100644
--- a/tests/tests/database/src/android/database/sqlite/cts/SQLiteDoneExceptionTest.java
+++ b/tests/tests/database/src/android/database/sqlite/cts/SQLiteDoneExceptionTest.java
@@ -18,27 +18,8 @@
 
 import android.database.sqlite.SQLiteDoneException;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(android.database.sqlite.SQLiteDoneException.class)
 public class SQLiteDoneExceptionTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor",
-            method = "SQLiteDoneException",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor",
-            method = "SQLiteDoneException",
-            args = {java.lang.String.class}
-        )
-    })
     public void testConstructor() {
         new SQLiteDoneException();
 
diff --git a/tests/tests/database/src/android/database/sqlite/cts/SQLiteExceptionTest.java b/tests/tests/database/src/android/database/sqlite/cts/SQLiteExceptionTest.java
index 3f4e6ee..bac8e60 100644
--- a/tests/tests/database/src/android/database/sqlite/cts/SQLiteExceptionTest.java
+++ b/tests/tests/database/src/android/database/sqlite/cts/SQLiteExceptionTest.java
@@ -18,27 +18,8 @@
 
 import android.database.sqlite.SQLiteException;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(android.database.sqlite.SQLiteException.class)
 public class SQLiteExceptionTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor",
-            method = "SQLiteException",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor",
-            method = "SQLiteException",
-            args = {java.lang.String.class}
-        )
-    })
     public void testConstructor() {
         new SQLiteException();
 
diff --git a/tests/tests/database/src/android/database/sqlite/cts/SQLiteFullExceptionTest.java b/tests/tests/database/src/android/database/sqlite/cts/SQLiteFullExceptionTest.java
index 5f37b25..5745c88 100644
--- a/tests/tests/database/src/android/database/sqlite/cts/SQLiteFullExceptionTest.java
+++ b/tests/tests/database/src/android/database/sqlite/cts/SQLiteFullExceptionTest.java
@@ -18,27 +18,8 @@
 
 import android.database.sqlite.SQLiteFullException;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(android.database.sqlite.SQLiteFullException.class)
 public class SQLiteFullExceptionTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor",
-            method = "SQLiteFullException",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor",
-            method = "SQLiteFullException",
-            args = {java.lang.String.class}
-        )
-    })
     public void testConstructor() {
         new SQLiteFullException();
 
diff --git a/tests/tests/database/src/android/database/sqlite/cts/SQLiteMisuseExceptionTest.java b/tests/tests/database/src/android/database/sqlite/cts/SQLiteMisuseExceptionTest.java
index efb9299..a670184 100644
--- a/tests/tests/database/src/android/database/sqlite/cts/SQLiteMisuseExceptionTest.java
+++ b/tests/tests/database/src/android/database/sqlite/cts/SQLiteMisuseExceptionTest.java
@@ -18,27 +18,8 @@
 
 import android.database.sqlite.SQLiteMisuseException;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(android.database.sqlite.SQLiteMisuseException.class)
 public class SQLiteMisuseExceptionTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor",
-            method = "SQLiteMisuseException",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor",
-            method = "SQLiteMisuseException",
-            args = {java.lang.String.class}
-        )
-    })
     public void testConstructor() {
         new SQLiteMisuseException();
 
diff --git a/tests/tests/database/src/android/database/sqlite/cts/SQLiteOpenHelperTest.java b/tests/tests/database/src/android/database/sqlite/cts/SQLiteOpenHelperTest.java
index c5a90b2..8a0ba21 100644
--- a/tests/tests/database/src/android/database/sqlite/cts/SQLiteOpenHelperTest.java
+++ b/tests/tests/database/src/android/database/sqlite/cts/SQLiteOpenHelperTest.java
@@ -25,15 +25,10 @@
 import android.database.sqlite.SQLiteQuery;
 import android.database.sqlite.SQLiteDatabase.CursorFactory;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
 /**
  * Test {@link SQLiteOpenHelper}.
  */
-@TestTargetClass(SQLiteOpenHelper.class)
 public class SQLiteOpenHelperTest extends AndroidTestCase {
     private static final String TEST_DATABASE_NAME = "database_test.db";
     private static final int TEST_VERSION = 1;
@@ -52,12 +47,6 @@
         mOpenHelper = getOpenHelper();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "SQLiteOpenHelper",
-        args = {android.content.Context.class, java.lang.String.class,
-                android.database.sqlite.SQLiteDatabase.CursorFactory.class, int.class}
-    )
     public void testConstructor() {
         new MockOpenHelper(mContext, TEST_DATABASE_NAME, mFactory, TEST_VERSION);
 
@@ -72,28 +61,6 @@
         new MockOpenHelper(mContext, TEST_DATABASE_NAME, null, TEST_VERSION);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onOpen",
-            args = {android.database.sqlite.SQLiteDatabase.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getReadableDatabase",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWritableDatabase",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "close",
-            args = {}
-        )
-    })
     public void testGetDatabase() {
         SQLiteDatabase database = null;
         assertFalse(mOpenHelper.hasCalledOnOpen());
diff --git a/tests/tests/database/src/android/database/sqlite/cts/SQLiteProgramTest.java b/tests/tests/database/src/android/database/sqlite/cts/SQLiteProgramTest.java
index a9a3293..36f69a4 100644
--- a/tests/tests/database/src/android/database/sqlite/cts/SQLiteProgramTest.java
+++ b/tests/tests/database/src/android/database/sqlite/cts/SQLiteProgramTest.java
@@ -16,10 +16,6 @@
 
 package android.database.sqlite.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.Context;
 import android.database.Cursor;
@@ -31,7 +27,6 @@
 import android.test.AndroidTestCase;
 import android.test.MoreAsserts;
 
-@TestTargetClass(android.database.sqlite.SQLiteProgram.class)
 public class SQLiteProgramTest extends AndroidTestCase {
     private static final String DATABASE_NAME = "database_test.db";
 
@@ -54,33 +49,6 @@
         super.tearDown();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "bindLong",
-            args = {int.class, long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "bindDouble",
-            args = {int.class, double.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "bindString",
-            args = {int.class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "clearBindings",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "close",
-            args = {}
-        )
-    })
     public void testBind() {
         mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, text1 TEXT, text2 TEXT, " +
                 "num1 INTEGER, num2 INTEGER, image BLOB);");
@@ -151,12 +119,6 @@
         statement.close();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test bindNull()",
-        method = "bindNull",
-        args = {int.class}
-    )
     public void testBindNull() {
         mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, text1 TEXT, text2 TEXT, " +
                 "num1 INTEGER, num2 INTEGER, image BLOB);");
@@ -187,12 +149,6 @@
         cursor.close();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test bindBlob()",
-        method = "bindBlob",
-        args = {int.class, byte[].class}
-    )
     public void testBindBlob() {
         mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, text1 TEXT, text2 TEXT, " +
                 "num1 INTEGER, num2 INTEGER, image BLOB);");
diff --git a/tests/tests/database/src/android/database/sqlite/cts/SQLiteQueryBuilderTest.java b/tests/tests/database/src/android/database/sqlite/cts/SQLiteQueryBuilderTest.java
index 15e3515..8eb089f 100644
--- a/tests/tests/database/src/android/database/sqlite/cts/SQLiteQueryBuilderTest.java
+++ b/tests/tests/database/src/android/database/sqlite/cts/SQLiteQueryBuilderTest.java
@@ -16,12 +16,10 @@
 
 package android.database.sqlite.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
+import android.content.CancellationSignal;
 import android.content.Context;
+import android.content.OperationCanceledException;
 import android.database.Cursor;
 import android.database.sqlite.SQLiteCursor;
 import android.database.sqlite.SQLiteCursorDriver;
@@ -32,8 +30,8 @@
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.concurrent.Semaphore;
 
-@TestTargetClass(android.database.sqlite.SQLiteQueryBuilder.class)
 public class SQLiteQueryBuilderTest extends AndroidTestCase {
     private SQLiteDatabase mDatabase;
     private final String TEST_TABLE_NAME = "test";
@@ -56,42 +54,10 @@
         super.tearDown();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "SQLiteQueryBuilder",
-        args = {}
-    )
     public void testConstructor() {
         new SQLiteQueryBuilder();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDistinct",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTables",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTables",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "appendWhere",
-            args = {java.lang.CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "appendWhereEscapeString",
-            args = {java.lang.String.class}
-        )
-    })
     public void testSetDistinct() {
         String expected;
         SQLiteQueryBuilder sqliteQueryBuilder = new SQLiteQueryBuilder();
@@ -126,11 +92,6 @@
         assertEquals(expected, sql);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setProjectionMap",
-        args = {java.util.Map.class}
-    )
     public void testSetProjectionMap() {
         String expected;
         Map<String, String> projectMap = new HashMap<String, String>();
@@ -159,11 +120,6 @@
         assertEquals(expected, sql);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setCursorFactory",
-        args = {android.database.sqlite.SQLiteDatabase.CursorFactory.class}
-    )
     public void testSetCursorFactory() {
         mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, " +
                 "name TEXT, age INTEGER, address TEXT);");
@@ -198,13 +154,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "buildQueryString",
-        args = {boolean.class, java.lang.String.class, java.lang.String[].class,
-                java.lang.String.class, java.lang.String.class, java.lang.String.class,
-                java.lang.String.class, java.lang.String.class}
-    )
     public void testBuildQueryString() {
         String expected;
         final String[] DEFAULT_TEST_PROJECTION = new String [] { "name", "age", "sum(salary)" };
@@ -223,13 +172,6 @@
         assertEquals(expected, sql);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "buildQuery",
-        args = {java.lang.String[].class, java.lang.String.class, java.lang.String[].class,
-                java.lang.String.class, java.lang.String.class, java.lang.String.class,
-                java.lang.String.class}
-    )
     public void testBuildQuery() {
         final String[] DEFAULT_TEST_PROJECTION = new String[] { "name", "sum(salary)" };
         final String DEFAULT_TEST_WHERE = "age > 25";
@@ -246,11 +188,6 @@
         assertEquals(expected, sql);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "appendColumns",
-        args = {java.lang.StringBuilder.class, java.lang.String[].class}
-    )
     public void testAppendColumns() {
         StringBuilder sb = new StringBuilder();
         String[] columns = new String[] { "name", "age" };
@@ -260,37 +197,8 @@
         assertEquals("name, age ", sb.toString());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "query",
-            args = {android.database.sqlite.SQLiteDatabase.class, java.lang.String[].class,
-                    java.lang.String.class, java.lang.String[].class, java.lang.String.class,
-                    java.lang.String.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "query",
-            args = {android.database.sqlite.SQLiteDatabase.class, java.lang.String[].class,
-                    java.lang.String.class, java.lang.String[].class, java.lang.String.class,
-                    java.lang.String.class, java.lang.String.class, java.lang.String.class}
-        )
-    })
     public void testQuery() {
-        mDatabase.execSQL("CREATE TABLE employee (_id INTEGER PRIMARY KEY, " +
-                "name TEXT, month INTEGER, salary INTEGER);");
-        mDatabase.execSQL("INSERT INTO employee (name, month, salary) " +
-                "VALUES ('Mike', '1', '1000');");
-        mDatabase.execSQL("INSERT INTO employee (name, month, salary) " +
-                "VALUES ('Mike', '2', '3000');");
-        mDatabase.execSQL("INSERT INTO employee (name, month, salary) " +
-                "VALUES ('jack', '1', '2000');");
-        mDatabase.execSQL("INSERT INTO employee (name, month, salary) " +
-                "VALUES ('jack', '3', '1500');");
-        mDatabase.execSQL("INSERT INTO employee (name, month, salary) " +
-                "VALUES ('Jim', '1', '1000');");
-        mDatabase.execSQL("INSERT INTO employee (name, month, salary) " +
-                "VALUES ('Jim', '3', '3500');");
+        createEmployeeTable();
 
         SQLiteQueryBuilder sqliteQueryBuilder = new SQLiteQueryBuilder();
         sqliteQueryBuilder.setTables("Employee");
@@ -328,20 +236,6 @@
         assertEquals(4000, cursor.getInt(COLUMN_SALARY_INDEX));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "buildUnionQuery",
-            args = {java.lang.String[].class, java.lang.String.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "buildUnionSubQuery",
-            args = {java.lang.String.class, java.lang.String[].class, java.util.Set.class,
-                    int.class, java.lang.String.class, java.lang.String.class,
-                    java.lang.String[].class, java.lang.String.class, java.lang.String.class}
-        )
-    })
     public void testUnionQuery() {
         String expected;
         String[] innerProjection = new String[] {"name", "age", "location"};
@@ -376,4 +270,206 @@
                 "UNION SELECT name, age, location FROM people WHERE (location=LA)";
         assertEquals(expected, unionQuery);
     }
+
+    public void testCancelableQuery_WhenNotCanceled_ReturnsResultSet() {
+        createEmployeeTable();
+
+        CancellationSignal cancellationSignal = new CancellationSignal();
+        SQLiteQueryBuilder sqliteQueryBuilder = new SQLiteQueryBuilder();
+        sqliteQueryBuilder.setTables("Employee");
+        Cursor cursor = sqliteQueryBuilder.query(mDatabase,
+                new String[] { "name", "sum(salary)" }, null, null,
+                "name", "sum(salary)>1000", "name", null, cancellationSignal);
+
+        assertEquals(3, cursor.getCount());
+    }
+
+    public void testCancelableQuery_WhenCanceledBeforeQuery_ThrowsImmediately() {
+        createEmployeeTable();
+
+        CancellationSignal cancellationSignal = new CancellationSignal();
+        SQLiteQueryBuilder sqliteQueryBuilder = new SQLiteQueryBuilder();
+        sqliteQueryBuilder.setTables("Employee");
+
+        cancellationSignal.cancel();
+        try {
+            sqliteQueryBuilder.query(mDatabase,
+                    new String[] { "name", "sum(salary)" }, null, null,
+                    "name", "sum(salary)>1000", "name", null, cancellationSignal);
+            fail("Expected OperationCanceledException");
+        } catch (OperationCanceledException ex) {
+            // expected
+        }
+    }
+
+    public void testCancelableQuery_WhenCanceledAfterQuery_ThrowsWhenExecuted() {
+        createEmployeeTable();
+
+        CancellationSignal cancellationSignal = new CancellationSignal();
+        SQLiteQueryBuilder sqliteQueryBuilder = new SQLiteQueryBuilder();
+        sqliteQueryBuilder.setTables("Employee");
+
+        Cursor cursor = sqliteQueryBuilder.query(mDatabase,
+                new String[] { "name", "sum(salary)" }, null, null,
+                "name", "sum(salary)>1000", "name", null, cancellationSignal);
+
+        cancellationSignal.cancel();
+        try {
+            cursor.getCount(); // force execution
+            fail("Expected OperationCanceledException");
+        } catch (OperationCanceledException ex) {
+            // expected
+        }
+    }
+
+    public void testCancelableQuery_WhenCanceledDueToContention_StopsWaitingAndThrows() {
+        createEmployeeTable();
+
+        for (int i = 0; i < 5; i++) {
+            final CancellationSignal cancellationSignal = new CancellationSignal();
+            final Semaphore barrier1 = new Semaphore(0);
+            final Semaphore barrier2 = new Semaphore(0);
+            Thread contentionThread = new Thread() {
+                @Override
+                public void run() {
+                    mDatabase.beginTransaction(); // acquire the only available connection
+                    barrier1.release(); // release query to start running
+                    try {
+                        barrier2.acquire(); // wait for test to end
+                    } catch (InterruptedException e) {
+                    }
+                    mDatabase.endTransaction(); // release the connection
+                }
+            };
+            Thread cancellationThread = new Thread() {
+                @Override
+                public void run() {
+                    try {
+                        Thread.sleep(300);
+                    } catch (InterruptedException ex) {
+                    }
+                    cancellationSignal.cancel();
+                }
+            };
+            try {
+                SQLiteQueryBuilder sqliteQueryBuilder = new SQLiteQueryBuilder();
+                sqliteQueryBuilder.setTables("Employee");
+
+                contentionThread.start();
+                cancellationThread.start();
+
+                try {
+                    barrier1.acquire(); // wait for contention thread to start transaction
+                } catch (InterruptedException e) {
+                }
+
+                final long startTime = System.nanoTime();
+                try {
+                    Cursor cursor = sqliteQueryBuilder.query(mDatabase,
+                            new String[] { "name", "sum(salary)" }, null, null,
+                            "name", "sum(salary)>1000", "name", null, cancellationSignal);
+                    cursor.getCount(); // force execution
+                    fail("Expected OperationCanceledException");
+                } catch (OperationCanceledException ex) {
+                    // expected
+                }
+
+                // We want to confirm that the query really was blocked trying to acquire a
+                // connection for a certain amount of time before it was freed by cancel.
+                final long waitTime = System.nanoTime() - startTime;
+                if (waitTime > 150 * 1000000L) {
+                    return; // success!
+                }
+            } finally {
+                barrier1.release();
+                barrier2.release();
+                try {
+                    contentionThread.join();
+                    cancellationThread.join();
+                } catch (InterruptedException e) {
+                }
+            }
+        }
+
+        // Occasionally we might miss the timing deadline due to factors in the
+        // environment, but if after several trials we still couldn't demonstrate
+        // that the query was blocked, then the test must be broken.
+        fail("Could not prove that the query actually blocked before cancel() was called.");
+    }
+
+    public void testCancelableQuery_WhenCanceledDuringLongRunningQuery_CancelsQueryAndThrows() {
+        // Populate a table with a bunch of integers.
+        mDatabase.execSQL("CREATE TABLE x (v INTEGER);");
+        for (int i = 0; i < 100; i++) {
+            mDatabase.execSQL("INSERT INTO x VALUES (?)", new Object[] { i });
+        }
+
+        for (int i = 0; i < 5; i++) {
+            final CancellationSignal cancellationSignal = new CancellationSignal();
+            Thread cancellationThread = new Thread() {
+                @Override
+                public void run() {
+                    try {
+                        Thread.sleep(300);
+                    } catch (InterruptedException ex) {
+                    }
+                    cancellationSignal.cancel();
+                }
+            };
+            try {
+                // Build an unsatisfiable 5-way cross-product query over 100 values but
+                // produces no output.  This should force SQLite to loop for a long time
+                // as it tests 10^10 combinations.
+                SQLiteQueryBuilder sqliteQueryBuilder = new SQLiteQueryBuilder();
+                sqliteQueryBuilder.setTables("x AS a, x AS b, x AS c, x AS d, x AS e");
+
+                cancellationThread.start();
+
+                final long startTime = System.nanoTime();
+                try {
+                    Cursor cursor = sqliteQueryBuilder.query(mDatabase, null,
+                            "a.v + b.v + c.v + d.v + e.v > 1000000",
+                            null, null, null, null, null, cancellationSignal);
+                    cursor.getCount(); // force execution
+                    fail("Expected OperationCanceledException");
+                } catch (OperationCanceledException ex) {
+                    // expected
+                }
+
+                // We want to confirm that the query really was running and then got
+                // canceled midway.
+                final long waitTime = System.nanoTime() - startTime;
+                if (waitTime > 150 * 1000000L && waitTime < 600 * 1000000L) {
+                    return; // success!
+                }
+            } finally {
+                try {
+                    cancellationThread.join();
+                } catch (InterruptedException e) {
+                }
+            }
+        }
+
+        // Occasionally we might miss the timing deadline due to factors in the
+        // environment, but if after several trials we still couldn't demonstrate
+        // that the query was canceled, then the test must be broken.
+        fail("Could not prove that the query actually canceled midway during execution.");
+    }
+
+    private void createEmployeeTable() {
+        mDatabase.execSQL("CREATE TABLE employee (_id INTEGER PRIMARY KEY, " +
+                "name TEXT, month INTEGER, salary INTEGER);");
+        mDatabase.execSQL("INSERT INTO employee (name, month, salary) " +
+                "VALUES ('Mike', '1', '1000');");
+        mDatabase.execSQL("INSERT INTO employee (name, month, salary) " +
+                "VALUES ('Mike', '2', '3000');");
+        mDatabase.execSQL("INSERT INTO employee (name, month, salary) " +
+                "VALUES ('jack', '1', '2000');");
+        mDatabase.execSQL("INSERT INTO employee (name, month, salary) " +
+                "VALUES ('jack', '3', '1500');");
+        mDatabase.execSQL("INSERT INTO employee (name, month, salary) " +
+                "VALUES ('Jim', '1', '1000');");
+        mDatabase.execSQL("INSERT INTO employee (name, month, salary) " +
+                "VALUES ('Jim', '3', '3500');");
+    }
 }
diff --git a/tests/tests/database/src/android/database/sqlite/cts/SQLiteQueryTest.java b/tests/tests/database/src/android/database/sqlite/cts/SQLiteQueryTest.java
index fe9be3c..c0549fd 100644
--- a/tests/tests/database/src/android/database/sqlite/cts/SQLiteQueryTest.java
+++ b/tests/tests/database/src/android/database/sqlite/cts/SQLiteQueryTest.java
@@ -16,49 +16,9 @@
 
 package android.database.sqlite.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;
 
-@TestTargetClass(android.database.sqlite.SQLiteQuery.class)
 public class SQLiteQueryTest extends TestCase {
-    @TestTargets ({
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "bindDouble",
-            args = {int.class, double.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "bindLong",
-            args = {int.class, long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "bindNull",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "bindString",
-            args = {int.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "close",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "toString",
-            args = {}
-        )
-    })
-    @ToBeFixed(bug = "1686574", explanation = "can not get an instance of SQLiteQuery" +
-            " or construct it directly for testing")
     public void testMethods() {
         // cannot obtain an instance of SQLiteQuery
     }
diff --git a/tests/tests/database/src/android/database/sqlite/cts/SQLiteStatementTest.java b/tests/tests/database/src/android/database/sqlite/cts/SQLiteStatementTest.java
index b568b8c..09cf790 100644
--- a/tests/tests/database/src/android/database/sqlite/cts/SQLiteStatementTest.java
+++ b/tests/tests/database/src/android/database/sqlite/cts/SQLiteStatementTest.java
@@ -16,10 +16,6 @@
 
 package android.database.sqlite.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.ContentValues;
 import android.content.Context;
@@ -36,7 +32,6 @@
 import java.io.IOException;
 import java.io.InputStream;
 
-@TestTargetClass(android.database.sqlite.SQLiteStatement.class)
 public class SQLiteStatementTest extends AndroidTestCase {
     private static final String STRING1 = "this is a test";
     private static final String STRING2 = "another test";
@@ -86,11 +81,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "executeUpdateDelete",
-        args = {}
-    )
     public void testExecute() {
         mDatabase.disableWriteAheadLogging();
         populateDefaultTable();
@@ -134,18 +124,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "executeInsert",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "execute",
-            args = {}
-        )
-    })
     public void testExecuteInsert() {
         populateDefaultTable();
 
@@ -185,11 +163,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "simpleQueryForLong",
-        args = {}
-    )
     public void testSimpleQueryForLong() {
         mDatabase.execSQL("CREATE TABLE test (num INTEGER NOT NULL, str TEXT NOT NULL);");
         mDatabase.execSQL("INSERT INTO test VALUES (1234, 'hello');");
@@ -214,11 +187,6 @@
         statement.close();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "simpleQueryForString",
-        args = {}
-    )
     public void testSimpleQueryForString() {
         mDatabase.execSQL("CREATE TABLE test (num INTEGER NOT NULL, str TEXT NOT NULL);");
         mDatabase.execSQL("INSERT INTO test VALUES (1234, 'hello');");
@@ -243,29 +211,14 @@
         statement.close();
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL_COMPLETE,
-        method = "simpleQueryForBlobFileDescriptor",
-        args = {}
-    )
     public void testSimpleQueryForBlobFileDescriptorSuccessNormal() throws IOException {
         doTestSimpleQueryForBlobFileDescriptorSuccess(0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL_COMPLETE,
-        method = "simpleQueryForBlobFileDescriptor",
-        args = {}
-    )
     public void testSimpleQueryForBlobFileDescriptorSuccessEmpty() throws IOException {
         doTestSimpleQueryForBlobFileDescriptorSuccess(1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL_COMPLETE,
-        method = "simpleQueryForBlobFileDescriptor",
-        args = {}
-    )
     public void testSimpleQueryForBlobFileDescriptorSuccessNull() {
         populateBlobTable();
 
@@ -274,29 +227,14 @@
         assertNull(stm.simpleQueryForBlobFileDescriptor());
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL_COMPLETE,
-        method = "simpleQueryForBlobFileDescriptor",
-        args = {}
-    )
     public void testSimpleQueryForBlobFileDescriptorSuccess00() throws IOException {
         doTestSimpleQueryForBlobFileDescriptorSuccess(3);
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL_COMPLETE,
-        method = "simpleQueryForBlobFileDescriptor",
-        args = {}
-    )
     public void testSimpleQueryForBlobFileDescriptorSuccessFF() throws IOException {
         doTestSimpleQueryForBlobFileDescriptorSuccess(4);
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL_COMPLETE,
-        method = "simpleQueryForBlobFileDescriptor",
-        args = {}
-    )
     public void testSimpleQueryForBlobFileDescriptorSuccessEmbeddedNul() throws IOException {
         doTestSimpleQueryForBlobFileDescriptorSuccess(5);
     }
@@ -310,11 +248,6 @@
         assertFileDescriptorContent(BLOBS[i], fd);
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL_COMPLETE,
-        method = "simpleQueryForBlobFileDescriptor",
-        args = {}
-    )
     public void testSimpleQueryForBlobFileDescriptorSuccessParam() throws IOException {
         populateBlobTable();
 
@@ -325,11 +258,6 @@
         assertFileDescriptorContent(BLOBS[0], fd);
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL_COMPLETE,
-        method = "simpleQueryForBlobFileDescriptor",
-        args = {}
-    )
     public void testGetBlobFailureNoParam() throws Exception {
         populateBlobTable();
 
@@ -350,11 +278,6 @@
         assertNotNull("Should have thrown SQLiteDoneException", expectedException);
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL_COMPLETE,
-        method = "simpleQueryForBlobFileDescriptor",
-        args = {}
-    )
     public void testGetBlobFailureParam() throws Exception {
         populateBlobTable();
 
diff --git a/tests/tests/dpi/Android.mk b/tests/tests/dpi/Android.mk
index ffbe8a3..2f256c4 100644
--- a/tests/tests/dpi/Android.mk
+++ b/tests/tests/dpi/Android.mk
@@ -30,7 +30,7 @@
 
 LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_PACKAGE)
 
 # ============================================================
 
diff --git a/tests/tests/dpi2/Android.mk b/tests/tests/dpi2/Android.mk
index 9dadcf9..cc11256 100644
--- a/tests/tests/dpi2/Android.mk
+++ b/tests/tests/dpi2/Android.mk
@@ -33,4 +33,4 @@
 # doesn't currently support setting LOCAL_SDK_VERSION to anything but
 # current.
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/drm/Android.mk b/tests/tests/drm/Android.mk
index 61e1f10..6e6ba56 100644
--- a/tests/tests/drm/Android.mk
+++ b/tests/tests/drm/Android.mk
@@ -32,4 +32,4 @@
 # uncomment when dalvik.annotation.Test* are removed or part of SDK
 #LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/drm/src/android/drm/cts/DRMTest.java b/tests/tests/drm/src/android/drm/cts/DRMTest.java
index 631446c..bb77668 100644
--- a/tests/tests/drm/src/android/drm/cts/DRMTest.java
+++ b/tests/tests/drm/src/android/drm/cts/DRMTest.java
@@ -16,9 +16,6 @@
 
 package android.drm.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.content.ContentValues;
 import android.test.AndroidTestCase;
@@ -39,7 +36,6 @@
 import android.drm.DrmStore;
 import android.drm.DrmUtils;
 
-@TestTargetClass(DrmManagerClient.class)
 public class DRMTest extends AndroidTestCase {
     private static String TAG = "CtsDRMTest";
     private static final int WAIT_TIME = 60000; // 1 min max
diff --git a/tests/tests/effect/Android.mk b/tests/tests/effect/Android.mk
new file mode 100644
index 0000000..075dc82
--- /dev/null
+++ b/tests/tests/effect/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_PACKAGE_NAME := CtsEffectTestCases
+
+# Don't include this package in any target.
+LOCAL_MODULE_TAGS := optional
+
+# When built, explicitly put it in the data partition.
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+# All tests should include android.test.runner.
+LOCAL_JAVA_LIBRARIES := android.test.runner
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/effect/AndroidManifest.xml b/tests/tests/effect/AndroidManifest.xml
new file mode 100644
index 0000000..e410800
--- /dev/null
+++ b/tests/tests/effect/AndroidManifest.xml
@@ -0,0 +1,30 @@
+<?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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.cts.effect">
+
+    <application>
+        <uses-library android:name="android.test.runner" />
+    </application>
+
+    <!-- This is a self-instrumenting test package. -->
+    <instrumentation android:name="android.test.InstrumentationTestRunner"
+                     android:targetPackage="com.android.cts.effect"
+                     android:label="CTS tests of android.media.effect component"/>
+
+</manifest>
+
diff --git a/tests/tests/effect/src/android/effect/cts/EffectTest.java b/tests/tests/effect/src/android/effect/cts/EffectTest.java
new file mode 100644
index 0000000..007e4f3
--- /dev/null
+++ b/tests/tests/effect/src/android/effect/cts/EffectTest.java
@@ -0,0 +1,161 @@
+/*
+ * 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.effect.cts;
+
+import android.graphics.Bitmap;
+import android.media.effect.Effect;
+import android.media.effect.EffectContext;
+import android.media.effect.EffectFactory;
+
+import junit.framework.TestCase;
+
+/**
+ * Test case to assert that the EffectFactory is correctly instantiating the effects that should
+ * be available on all devices, and that they execute as expected.
+ */
+public class EffectTest extends TestCase {
+
+    /** The GL environment that our tests will run in */
+    private GLEnv mEnv;
+
+    /** This is the effect context we will run the tests in */
+    private EffectContext mEffectContext;
+
+    /** This array contains the list of effects we expect to be available and fuctioning */
+    private static String[] mExpectedEffects;
+
+    @Override
+    protected void setUp() throws Exception {
+        mEnv = new GLEnv();
+        mEnv.makeCurrent();
+        mEffectContext = EffectContext.createWithCurrentGlContext();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        if (mEffectContext != null) {
+            mEffectContext.release();
+        }
+        if (mEnv != null) {
+            mEnv.tearDown();
+        }
+    }
+
+    /** Assert an effect context can be created and attached to GL context. */
+    public void test1_createContext() {
+        assertNotNull("EffectContext attachment", mEffectContext);
+    }
+
+    /** Test that a factory can be retrieved from an EffectContext */
+    public void test2_getFactory() {
+        EffectFactory factory = getEffectContext().getFactory();
+        assertNotNull("EffectFactory retrieval", factory);
+    }
+
+    /** Assert the built-in effects are available */
+    public void test3_availableEffects() {
+        EffectFactory factory = getEffectContext().getFactory();
+        for (String effectName : getExpectedEffectList()) {
+            assertTrue(
+                "Effect '" + effectName + "' supported",
+                factory.isEffectSupported(effectName));
+        }
+    }
+
+    /** Assert that bogus effects are unavailable */
+    public void test4_effectCreate() {
+        EffectFactory factory = getEffectContext().getFactory();
+        assertFalse("Empty effect name unsupported", factory.isEffectSupported(""));
+        assertFalse("Bogus effect name unsupported", factory.isEffectSupported("!BOGUS!"));
+        //assertFalse("Non-effect name unsupported", factory.isEffectSupported("java.lang.String"));
+    }
+
+    /** Assert that we can instantiate an effect */
+    public void test5_effectCreate() {
+        EffectFactory factory = getEffectContext().getFactory();
+        for (String effectName : getExpectedEffectList()) {
+            Effect effect = factory.createEffect(effectName);
+            assertNotNull("Effect '" + effectName + "' instantiation", effect);
+            effect.release();
+        }
+    }
+
+    /** Assert that we can apply an effect */
+    public void test6_effectApply() {
+        EffectFactory factory = getEffectContext().getFactory();
+        Effect effect = factory.createEffect(EffectFactory.EFFECT_SEPIA);
+        Bitmap bitmap = createTestBitmap();
+        int inputTexture = mEnv.bitmapToTexture(bitmap);
+        int outputTexture = mEnv.generateTexture();
+        try {
+            effect.apply(inputTexture, bitmap.getWidth(), bitmap.getHeight(), outputTexture);
+        } catch(RuntimeException e) {
+            fail("Applying EFFECT_SEPIA failed: '" + e.getMessage() + "'");
+        }
+        mEnv.releaseTexture(inputTexture);
+        mEnv.releaseTexture(outputTexture);
+    }
+
+    private EffectContext getEffectContext() {
+        assertNotNull("EffectContext attachment", mEffectContext);
+        return mEffectContext;
+    }
+
+    private Bitmap createTestBitmap() {
+        Bitmap testBitmap = Bitmap.createBitmap(2, 2, Bitmap.Config.ARGB_8888);
+        testBitmap.setPixel(0, 0, 0xFF000000);
+        testBitmap.setPixel(0, 1, 0xFF0000FF);
+        testBitmap.setPixel(1, 0, 0xFF00FF00);
+        testBitmap.setPixel(1, 1, 0xFFFF0000);
+        return testBitmap;
+    }
+
+    private String[] getExpectedEffectList() {
+        if (mExpectedEffects == null) {
+            mExpectedEffects = new String[] {
+                EffectFactory.EFFECT_BRIGHTNESS,
+                EffectFactory.EFFECT_CONTRAST,
+                EffectFactory.EFFECT_FISHEYE,
+                EffectFactory.EFFECT_BACKDROPPER,
+                EffectFactory.EFFECT_AUTOFIX,
+                EffectFactory.EFFECT_BLACKWHITE,
+                EffectFactory.EFFECT_CROP,
+                EffectFactory.EFFECT_CROSSPROCESS,
+                EffectFactory.EFFECT_DOCUMENTARY,
+                EffectFactory.EFFECT_BITMAPOVERLAY,
+                EffectFactory.EFFECT_DUOTONE,
+                EffectFactory.EFFECT_FILLLIGHT,
+                EffectFactory.EFFECT_FLIP,
+                EffectFactory.EFFECT_GRAIN,
+                EffectFactory.EFFECT_GRAYSCALE,
+                EffectFactory.EFFECT_LOMOISH,
+                EffectFactory.EFFECT_NEGATIVE,
+                EffectFactory.EFFECT_POSTERIZE,
+                EffectFactory.EFFECT_REDEYE,
+                EffectFactory.EFFECT_ROTATE,
+                EffectFactory.EFFECT_SATURATE,
+                EffectFactory.EFFECT_SEPIA,
+                EffectFactory.EFFECT_SHARPEN,
+                EffectFactory.EFFECT_STRAIGHTEN,
+                EffectFactory.EFFECT_TEMPERATURE,
+                EffectFactory.EFFECT_TINT,
+                EffectFactory.EFFECT_VIGNETTE
+            };
+        }
+        return mExpectedEffects;
+    }
+}
diff --git a/tests/tests/effect/src/android/effect/cts/GLEnv.java b/tests/tests/effect/src/android/effect/cts/GLEnv.java
new file mode 100644
index 0000000..f9f55e7
--- /dev/null
+++ b/tests/tests/effect/src/android/effect/cts/GLEnv.java
@@ -0,0 +1,107 @@
+/*
+ * 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.effect.cts;
+
+import android.graphics.Bitmap;
+import android.opengl.GLUtils;
+import android.opengl.GLES20;
+
+import javax.microedition.khronos.egl.*;
+import javax.microedition.khronos.opengles.*;
+
+public class GLEnv {
+
+    private EGLContext mEGLContext;
+    private EGLSurface mEGLSurface;
+    private EGLDisplay mEGLDisplay;
+    private EGLConfig  mEGLConfig;
+
+    private static final int EGL_CONTEXT_CLIENT_VERSION = 0x3098;
+
+    public GLEnv() {
+        EGL10 egl = (EGL10)EGLContext.getEGL();
+
+        mEGLDisplay = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
+        checkForEGLErrors("eglGetDisplay");
+
+        int[] version = new int[2];
+        egl.eglInitialize(mEGLDisplay, version);
+        int[] configSpec = {
+            EGL10.EGL_SURFACE_TYPE, EGL10.EGL_PBUFFER_BIT,
+            EGL10.EGL_RED_SIZE, 8,
+            EGL10.EGL_GREEN_SIZE, 8,
+            EGL10.EGL_BLUE_SIZE, 8,
+            EGL10.EGL_NONE
+        };
+        EGLConfig[] configs = new EGLConfig[1];
+        int[] num_config = new int[1];
+        egl.eglChooseConfig(mEGLDisplay, configSpec, configs, 1, num_config);
+        checkForEGLErrors("eglChooseConfig");
+        if (num_config[0] < 1) {
+            throw new RuntimeException("Could not find a suitable config for EGL context!");
+        }
+        mEGLConfig = configs[0];
+
+        int[] attribs = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE };
+        mEGLContext = egl.eglCreateContext(mEGLDisplay, mEGLConfig, EGL10.EGL_NO_CONTEXT, attribs);
+        checkForEGLErrors("eglCreateContext");
+
+        int[] surfaceSize = { EGL10.EGL_WIDTH, 1, EGL10.EGL_HEIGHT, 1, EGL10.EGL_NONE };
+        mEGLSurface = egl.eglCreatePbufferSurface(mEGLDisplay, mEGLConfig, surfaceSize);
+        checkForEGLErrors("eglCreatePbufferSurface");
+    }
+
+    public void makeCurrent() {
+        EGL10 egl = (EGL10)EGLContext.getEGL();
+        egl.eglMakeCurrent(mEGLDisplay, mEGLSurface, mEGLSurface, mEGLContext);
+        checkForEGLErrors("eglMakeCurrent");
+    }
+
+    public int generateTexture() {
+        int textures[] = new int[1];
+        GLES20.glGenTextures(1, textures, 0);
+        return textures[0];
+    }
+
+    public int bitmapToTexture(Bitmap bitmap) {
+        int texId = generateTexture();
+        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texId);
+        GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
+        return texId;
+    }
+
+    public void releaseTexture(int texId) {
+        int[] textures = new int[1];
+        textures[0] = texId;
+        GLES20.glDeleteTextures(1, textures, 0);
+    }
+
+    public void tearDown() {
+        EGL10 egl = (EGL10)EGLContext.getEGL();
+        egl.eglDestroySurface(mEGLDisplay, mEGLSurface);
+        egl.eglDestroyContext(mEGLDisplay, mEGLContext);
+    }
+
+    public void checkForEGLErrors(String operation) {
+        EGL10 egl = (EGL10)EGLContext.getEGL();
+        int error = egl.eglGetError();
+        if (error != EGL10.EGL_SUCCESS) {
+            throw new RuntimeException("Operation '" + operation + "' caused EGL error: " + error);
+        }
+    }
+
+}
diff --git a/tests/tests/example/Android.mk b/tests/tests/example/Android.mk
index d32f59b..7e2d841 100644
--- a/tests/tests/example/Android.mk
+++ b/tests/tests/example/Android.mk
@@ -32,4 +32,4 @@
 
 LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/gesture/Android.mk b/tests/tests/gesture/Android.mk
index 22aeaec..f4fa8b3 100755
--- a/tests/tests/gesture/Android.mk
+++ b/tests/tests/gesture/Android.mk
@@ -29,5 +29,4 @@
 
 LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
-
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/gesture/src/android/gesture/cts/GestureLibraryTest.java b/tests/tests/gesture/src/android/gesture/cts/GestureLibraryTest.java
index f3cc521..058b19f 100644
--- a/tests/tests/gesture/src/android/gesture/cts/GestureLibraryTest.java
+++ b/tests/tests/gesture/src/android/gesture/cts/GestureLibraryTest.java
@@ -15,7 +15,6 @@
  */
 package android.gesture.cts;
 
-import dalvik.annotation.TestTargetClass;
 
 import android.gesture.Gesture;
 import android.gesture.GestureLibrary;
@@ -29,7 +28,6 @@
  * <p/>
  * Most {@link GestureLibrary} methods are tested by {@link GestureStorageTester}
  */
-@TestTargetClass(GestureLibrary.class)
 public class GestureLibraryTest extends GestureStorageTester {
 
     private GestureLibrary mLibrary = null;
diff --git a/tests/tests/gesture/src/android/gesture/cts/GesturePointTest.java b/tests/tests/gesture/src/android/gesture/cts/GesturePointTest.java
index 4d366fa..34575d3 100755
--- a/tests/tests/gesture/src/android/gesture/cts/GesturePointTest.java
+++ b/tests/tests/gesture/src/android/gesture/cts/GesturePointTest.java
@@ -15,7 +15,6 @@
  */
 package android.gesture.cts;
 
-import dalvik.annotation.TestTargetClass;
 
 import android.gesture.GesturePoint;
 
@@ -24,7 +23,6 @@
 /**
  * A (very) simple compatibility test for {@link GesturePoint}
  */
-@TestTargetClass(GesturePoint.class)
 public class GesturePointTest extends TestCase {
 
     /**
diff --git a/tests/tests/gesture/src/android/gesture/cts/GestureStoreTest.java b/tests/tests/gesture/src/android/gesture/cts/GestureStoreTest.java
index 44c33d2..bfa38ba 100644
--- a/tests/tests/gesture/src/android/gesture/cts/GestureStoreTest.java
+++ b/tests/tests/gesture/src/android/gesture/cts/GestureStoreTest.java
@@ -15,7 +15,6 @@
  */
 package android.gesture.cts;
 
-import dalvik.annotation.TestTargetClass;
 
 import android.gesture.Gesture;
 import android.gesture.GestureStore;
@@ -32,7 +31,6 @@
  * <p/>
  * Inherits from GestureStorageTester to test common methods.
  */
-@TestTargetClass(GestureStore.class)
 public class GestureStoreTest extends GestureStorageTester {
 
     private GestureStore mGestureStore = null;
diff --git a/tests/tests/gesture/src/android/gesture/cts/GestureStrokeTest.java b/tests/tests/gesture/src/android/gesture/cts/GestureStrokeTest.java
index c53242a..b3ba1fb 100755
--- a/tests/tests/gesture/src/android/gesture/cts/GestureStrokeTest.java
+++ b/tests/tests/gesture/src/android/gesture/cts/GestureStrokeTest.java
@@ -15,7 +15,6 @@
  */
 package android.gesture.cts;
 
-import dalvik.annotation.TestTargetClass;
 
 import android.gesture.GesturePoint;
 import android.gesture.GestureStroke;
@@ -28,7 +27,6 @@
 /**
  * Simple compatibility unit tests for {@link GestureStroke}
  */
-@TestTargetClass(GestureStroke.class)
 public class GestureStrokeTest extends TestCase {
 
     private LineGestureStrokeHelper mHelper;
diff --git a/tests/tests/graphics/Android.mk b/tests/tests/graphics/Android.mk
index d0ebd37..9575dd3 100644
--- a/tests/tests/graphics/Android.mk
+++ b/tests/tests/graphics/Android.mk
@@ -32,5 +32,4 @@
 # uncomment when dalvik.annotation.Test* are removed or part of SDK
 #LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
-
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/graphics/src/android/graphics/cts/AvoidXfermodeTest.java b/tests/tests/graphics/src/android/graphics/cts/AvoidXfermodeTest.java
index 13be1d5..44c9347 100644
--- a/tests/tests/graphics/src/android/graphics/cts/AvoidXfermodeTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/AvoidXfermodeTest.java
@@ -16,10 +16,6 @@
 package android.graphics.cts;
 
 import dalvik.annotation.KnownFailure;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
 import android.graphics.AvoidXfermode;
 import android.graphics.Bitmap;
@@ -30,7 +26,6 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(AvoidXfermode.class)
 public class AvoidXfermodeTest extends TestCase {
     /*
      * ToBeFixed: This test ought to work with a TOLERANCE of 0. See bug 2034547.
@@ -40,13 +35,6 @@
     private static final int BITMAP_HEIGHT = BASE_SIZE * 2;
     private static final int BITMAP_WIDTH = BASE_SIZE * 2;
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "AvoidXfermode",
-        args = {int.class, int.class, android.graphics.AvoidXfermode.Mode.class}
-    )
-    @ToBeFixed(bug = "2034547",
-               explanation = "AvoidXfermode does not work as expected with tolerance 0.")
     public void testAvoidXfermode() {
         Paint greenPaint;
         Paint redAvoidingGreenPaint;
diff --git a/tests/tests/graphics/src/android/graphics/cts/AvoidXfermode_ModeTest.java b/tests/tests/graphics/src/android/graphics/cts/AvoidXfermode_ModeTest.java
index 9485981..8704e6f 100644
--- a/tests/tests/graphics/src/android/graphics/cts/AvoidXfermode_ModeTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/AvoidXfermode_ModeTest.java
@@ -18,36 +18,14 @@
 import android.graphics.AvoidXfermode;
 import android.graphics.AvoidXfermode.Mode;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(AvoidXfermode.Mode.class)
 public class AvoidXfermode_ModeTest extends AndroidTestCase{
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "valueOf",
-        args = {java.lang.String.class}
-    )
     public void testValueOf(){
         assertEquals(Mode.AVOID, Mode.valueOf("AVOID"));
         assertEquals(Mode.TARGET, Mode.valueOf("TARGET"));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "values",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AvoidXfermode",
-            args = {int.class, int.class, android.graphics.AvoidXfermode.Mode.class}
-        )
-    })
     public void testValues(){
         Mode[] mode = Mode.values();
 
diff --git a/tests/tests/graphics/src/android/graphics/cts/BitmapFactoryTest.java b/tests/tests/graphics/src/android/graphics/cts/BitmapFactoryTest.java
index 73a712b..d6b4fde 100755
--- a/tests/tests/graphics/src/android/graphics/cts/BitmapFactoryTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/BitmapFactoryTest.java
@@ -18,9 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.content.res.Resources;
 import android.graphics.Bitmap;
@@ -44,7 +41,6 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 
-@TestTargetClass(BitmapFactory.class)
 public class BitmapFactoryTest extends InstrumentationTestCase {
     private Resources mRes;
     // opt for non-null
@@ -90,22 +86,11 @@
         mOpt2.inJustDecodeBounds = true;
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "BitmapFactory",
-        args = {}
-    )
     public void testConstructor() {
         // new the BitmapFactory instance
         new BitmapFactory();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "decodeResource",
-        args = {android.content.res.Resources.class, int.class,
-                android.graphics.BitmapFactory.Options.class}
-    )
     public void testDecodeResource1() {
         Bitmap b = BitmapFactory.decodeResource(mRes, R.drawable.start,
                 mOpt1);
@@ -117,11 +102,6 @@
         assertNull(BitmapFactory.decodeResource(mRes, R.drawable.start, mOpt2));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "decodeResource",
-        args = {android.content.res.Resources.class, int.class}
-    )
     public void testDecodeResource2() {
         Bitmap b = BitmapFactory.decodeResource(mRes, R.drawable.start);
         assertNotNull(b);
@@ -130,13 +110,6 @@
         assertEquals(START_WIDTH * mTargetDensity / mDefaultDensity, b.getWidth(), 1.1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "decodeResourceStream",
-        args = {android.content.res.Resources.class, android.util.TypedValue.class,
-                java.io.InputStream.class, android.graphics.Rect.class,
-                android.graphics.BitmapFactory.Options.class}
-    )
     public void testDecodeResourceStream() {
         InputStream is = obtainInputStream();
         Rect r = new Rect(1, 1, 1, 1);
@@ -148,11 +121,6 @@
         assertEquals(START_WIDTH, b.getWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "decodeByteArray",
-        args = {byte[].class, int.class, int.class, android.graphics.BitmapFactory.Options.class}
-    )
     public void testDecodeByteArray1() {
         byte[] array = obtainArray();
         Bitmap b = BitmapFactory.decodeByteArray(array, 0, array.length, mOpt1);
@@ -164,11 +132,6 @@
         assertNull(BitmapFactory.decodeByteArray(array, 0, array.length, mOpt2));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "decodeByteArray",
-        args = {byte[].class, int.class, int.class}
-    )
     public void testDecodeByteArray2() {
         byte[] array = obtainArray();
         Bitmap b = BitmapFactory.decodeByteArray(array, 0, array.length);
@@ -178,12 +141,6 @@
         assertEquals(START_WIDTH, b.getWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "decodeStream",
-        args = {java.io.InputStream.class, android.graphics.Rect.class,
-                android.graphics.BitmapFactory.Options.class}
-    )
     public void testDecodeStream1() {
         InputStream is = obtainInputStream();
         Rect r = new Rect(1, 1, 1, 1);
@@ -196,11 +153,6 @@
         assertNull(BitmapFactory.decodeStream(is, r, mOpt2));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "decodeStream",
-        args = {java.io.InputStream.class}
-    )
     public void testDecodeStream2() {
         InputStream is = obtainInputStream();
         Bitmap b = BitmapFactory.decodeStream(is);
@@ -210,11 +162,6 @@
         assertEquals(START_WIDTH, b.getWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "decodeStream",
-        args = {java.io.InputStream.class}
-    )
     public void testDecodeStream3() throws IOException {
         for (int i = 0; i < RES_IDS.length; ++i) {
             InputStream is = obtainInputStream(RES_IDS[i]);
@@ -226,11 +173,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "decodeStream",
-        args = {java.io.InputStream.class}
-    )
     public void testDecodeStream4() throws IOException {
         BitmapFactory.Options options = new BitmapFactory.Options();
         for (int k = 0; k < COLOR_CONFIGS.length; ++k) {
@@ -259,12 +201,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "decodeFileDescriptor",
-        args = {java.io.FileDescriptor.class, android.graphics.Rect.class,
-                android.graphics.BitmapFactory.Options.class}
-    )
     public void testDecodeFileDescriptor1() throws IOException {
         ParcelFileDescriptor pfd = obtainParcelDescriptor(obtainPath());
         FileDescriptor input = pfd.getFileDescriptor();
@@ -278,11 +214,6 @@
         assertNull(BitmapFactory.decodeFileDescriptor(input, r, mOpt2));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "decodeFileDescriptor",
-        args = {java.io.FileDescriptor.class}
-    )
     public void testDecodeFileDescriptor2() throws IOException {
         ParcelFileDescriptor pfd = obtainParcelDescriptor(obtainPath());
         FileDescriptor input = pfd.getFileDescriptor();
@@ -293,11 +224,6 @@
         assertEquals(START_WIDTH, b.getWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "decodeFile",
-        args = {java.lang.String.class, android.graphics.BitmapFactory.Options.class}
-    )
     public void testDecodeFile1() throws IOException {
         Bitmap b = BitmapFactory.decodeFile(obtainPath(), mOpt1);
         assertNotNull(b);
@@ -308,11 +234,6 @@
         assertNull(BitmapFactory.decodeFile(obtainPath(), mOpt2));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "decodeFile",
-        args = {java.lang.String.class}
-    )
     public void testDecodeFile2() throws IOException {
         Bitmap b = BitmapFactory.decodeFile(obtainPath());
         assertNotNull(b);
diff --git a/tests/tests/graphics/src/android/graphics/cts/BitmapFactory_OptionsTest.java b/tests/tests/graphics/src/android/graphics/cts/BitmapFactory_OptionsTest.java
index 5314753..426e1b2 100644
--- a/tests/tests/graphics/src/android/graphics/cts/BitmapFactory_OptionsTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/BitmapFactory_OptionsTest.java
@@ -17,26 +17,12 @@
 
 import android.graphics.BitmapFactory;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(BitmapFactory.Options.class)
 public class BitmapFactory_OptionsTest extends AndroidTestCase{
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "BitmapFactory.Options",
-        args = {}
-    )
     public void testOptions(){
         new BitmapFactory.Options();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "requestCancelDecode",
-        args = {}
-    )
     public void testRequestCancelDecode(){
         BitmapFactory.Options option = new BitmapFactory.Options();
 
diff --git a/tests/tests/graphics/src/android/graphics/cts/BitmapRegionDecoderTest.java b/tests/tests/graphics/src/android/graphics/cts/BitmapRegionDecoderTest.java
index 93d8bd6..d51fc72 100755
--- a/tests/tests/graphics/src/android/graphics/cts/BitmapRegionDecoderTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/BitmapRegionDecoderTest.java
@@ -31,10 +31,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import java.io.ByteArrayOutputStream;
 import java.io.File;
@@ -44,7 +40,6 @@
 import java.io.InputStream;
 import java.util.ArrayList;
 
-@TestTargetClass(BitmapRegionDecoder.class)
 public class BitmapRegionDecoderTest extends InstrumentationTestCase {
     private static final String TAG = "BitmapRegionDecoderTest";
     private ArrayList<File> mFilesCreated = new ArrayList<File>(
@@ -110,11 +105,6 @@
         super.tearDown();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "newInstance",
-        args = {java.lang.String.class, boolean.class}
-    )
     public void testNewInstanceInputStream() throws IOException {
         for (int i = 0; i < RES_IDS.length; ++i) {
             InputStream is = obtainInputStream(RES_IDS[i]);
@@ -134,11 +124,6 @@
         }
     }
 
-    @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "newInstance",
-            args = {byte[].class, int.class, int.class, boolean.class}
-    )
     public void testNewInstanceByteArray() throws IOException {
         for (int i = 0; i < RES_IDS.length; ++i) {
             byte[] imageData = obtainByteArray(RES_IDS[i]);
@@ -154,11 +139,6 @@
         }
     }
 
-    @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "newInstance",
-            args = {java.io.FileDescriptor.class, boolean.class}
-    )
     public void testNewInstanceStringAndFileDescriptor() throws IOException {
         for (int i = 0; i < RES_IDS.length; ++i) {
             String filepath = obtainPath(i);
@@ -181,11 +161,6 @@
         }
     }
 
-    @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "decodeRegion",
-            args = {android.graphics.Rect.class, android.graphics.BitmapFactory.Options.class}
-    )
     public void testDecodeRegionInputStream() throws IOException {
         Options opts = new BitmapFactory.Options();
         for (int i = 0; i < NUM_TEST_IMAGES; ++i) {
@@ -211,11 +186,6 @@
         }
     }
 
-    @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "decodeRegion",
-            args = {android.graphics.Rect.class, android.graphics.BitmapFactory.Options.class}
-    )
     public void testDecodeRegionByteArray() throws IOException {
         Options opts = new BitmapFactory.Options();
         for (int i = 0; i < NUM_TEST_IMAGES; ++i) {
@@ -242,11 +212,6 @@
         }
     }
 
-    @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "decodeRegion",
-            args = {android.graphics.Rect.class, android.graphics.BitmapFactory.Options.class}
-    )
     public void testDecodeRegionStringAndFileDescriptor() throws IOException {
         Options opts = new BitmapFactory.Options();
         for (int i = 0; i < NUM_TEST_IMAGES; ++i) {
@@ -283,18 +248,6 @@
         }
     }
 
-    @TestTargets ({
-        @TestTargetNew(
-                level = TestLevel.COMPLETE,
-                method = "recycle",
-                args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isRecycled",
-            args = {}
-        )
-    })
     public void testRecycle() throws IOException {
         InputStream is = obtainInputStream(RES_IDS[0]);
         BitmapRegionDecoder decoder = BitmapRegionDecoder.newInstance(is, false);
diff --git a/tests/tests/graphics/src/android/graphics/cts/BitmapShaderTest.java b/tests/tests/graphics/src/android/graphics/cts/BitmapShaderTest.java
index 63da47b..4331581 100644
--- a/tests/tests/graphics/src/android/graphics/cts/BitmapShaderTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/BitmapShaderTest.java
@@ -15,9 +15,6 @@
  */
 package android.graphics.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapShader;
@@ -30,7 +27,6 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(BitmapShader.class)
 public class BitmapShaderTest extends TestCase {
     private static final int TILE_WIDTH = 20;
     private static final int TILE_HEIGHT = 20;
@@ -39,11 +35,6 @@
     private static final int CENTER_COLOR = Color.RED;
     private static final int NUM_TILES = 4;
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "BitmapShader",
-        args = {Bitmap.class, TileMode.class, TileMode.class}
-    )
     public void testBitmapShader() {
         Bitmap tile = Bitmap.createBitmap(TILE_WIDTH, TILE_HEIGHT, Config.ARGB_8888);
         tile.eraseColor(BORDER_COLOR);
diff --git a/tests/tests/graphics/src/android/graphics/cts/BitmapTest.java b/tests/tests/graphics/src/android/graphics/cts/BitmapTest.java
index f8d3ee9..c8edfd7 100644
--- a/tests/tests/graphics/src/android/graphics/cts/BitmapTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/BitmapTest.java
@@ -17,10 +17,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.res.Resources;
 import android.graphics.Bitmap;
@@ -42,7 +38,6 @@
 import java.nio.IntBuffer;
 import java.nio.ShortBuffer;
 
-@TestTargetClass(Bitmap.class)
 public class BitmapTest extends AndroidTestCase {
     private Resources mRes;
     private Bitmap mBitmap;
@@ -58,11 +53,6 @@
         mBitmap = BitmapFactory.decodeResource(mRes, R.drawable.start, mOptions);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "compress",
-        args = {android.graphics.Bitmap.CompressFormat.class, int.class, java.io.OutputStream.class}
-    )
     public void testCompress(){
         mBitmap.recycle();
 
@@ -100,11 +90,6 @@
         assertTrue(mBitmap.compress(CompressFormat.JPEG, 50, new ByteArrayOutputStream()));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "copy",
-        args = {android.graphics.Bitmap.Config.class, boolean.class}
-    )
     public void testCopy(){
         mBitmap.recycle();
 
@@ -121,18 +106,6 @@
         WidgetTestUtils.assertEquals(mBitmap, bitmap);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "copyPixelsToBuffer",
-            args = {java.nio.Buffer.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "copyPixelsFromBuffer",
-            args = {java.nio.Buffer.class}
-        )
-    })
     public void testCopyPixelsToBuffer(){
         final int pixSize = mBitmap.getRowBytes() * mBitmap.getHeight();
         final int tooSmall = pixSize / 2;
@@ -198,18 +171,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createBitmap",
-            args = {android.graphics.Bitmap.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createBitmap",
-            args = {int[].class, int.class, int.class, android.graphics.Bitmap.Config.class}
-        )
-    })
     public void testCreateBitmap1(){
         int[] colors = createColors(100);
         Bitmap bitmap = Bitmap.createBitmap(colors, 10, 10, Config.RGB_565);
@@ -220,11 +181,6 @@
         assertEquals(Config.RGB_565, ret.getConfig());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "createBitmap",
-        args = {android.graphics.Bitmap.class, int.class, int.class, int.class, int.class}
-    )
     public void testCreateBitmap2(){
         //abnormal case: Illegal Argument
         try{
@@ -246,12 +202,6 @@
         assertFalse(mBitmap.equals(ret));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "createBitmap",
-        args = {android.graphics.Bitmap.class, int.class, int.class, int.class, int.class,
-                android.graphics.Matrix.class, boolean.class}
-    )
     public void testCreateBitmap3(){
         mBitmap = Bitmap.createBitmap(100, 100, Config.ARGB_8888);
 
@@ -296,11 +246,6 @@
         assertFalse(mBitmap.equals(ret));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "createBitmap",
-        args = {int.class, int.class, android.graphics.Bitmap.Config.class}
-    )
     public void testCreateBitmap4(){
         Bitmap ret = Bitmap.createBitmap(100, 200, Config.RGB_565);
         assertNotNull(ret);
@@ -309,12 +254,6 @@
         assertEquals(Config.RGB_565, ret.getConfig());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "createBitmap",
-        args = {int[].class, int.class, int.class, int.class, int.class,
-                android.graphics.Bitmap.Config.class}
-    )
     public void testCreateBitmap6(){
         int[] colors = createColors(100);
 
@@ -361,11 +300,6 @@
         assertEquals(Config.RGB_565, ret.getConfig());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "createScaledBitmap",
-        args = {android.graphics.Bitmap.class, int.class, int.class, boolean.class}
-    )
     public void testCreateScaledBitmap(){
         mBitmap = Bitmap.createBitmap(100, 200, Config.RGB_565);
         Bitmap ret = Bitmap.createScaledBitmap(mBitmap, 50, 100, false);
@@ -374,20 +308,10 @@
         assertEquals(100, ret.getHeight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents(){
         assertEquals(0, mBitmap.describeContents());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "eraseColor",
-        args = {int.class}
-    )
     public void testEraseColor(){
         mBitmap.recycle();
 
@@ -414,11 +338,6 @@
         assertEquals(0xffff0000, mBitmap.getPixel(50, 50));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "extractAlpha",
-        args = {}
-    )
     public void testExtractAlpha1(){
         mBitmap.recycle();
 
@@ -437,11 +356,6 @@
         assertEquals(0x00, Color.alpha(color));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "extractAlpha",
-        args = {android.graphics.Paint.class, int[].class}
-    )
     public void testExtractAlpha2(){
         mBitmap.recycle();
 
@@ -460,11 +374,6 @@
         assertEquals(0x00, Color.alpha(color));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getConfig",
-        args = {}
-    )
     public void testGetConfig(){
         Bitmap bm0 = Bitmap.createBitmap(100, 200, Bitmap.Config.ALPHA_8);
         Bitmap bm1 = Bitmap.createBitmap(100, 200, Bitmap.Config.ARGB_8888);
@@ -477,31 +386,16 @@
         assertEquals(Bitmap.Config.ARGB_4444, bm3.getConfig());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getHeight",
-        args = {}
-    )
     public void testGetHeight(){
         assertEquals(31, mBitmap.getHeight());
         mBitmap = Bitmap.createBitmap(100, 200, Bitmap.Config.ARGB_8888);
         assertEquals(200, mBitmap.getHeight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getNinePatchChunk",
-        args = {}
-    )
     public void testGetNinePatchChunk(){
         assertNull(mBitmap.getNinePatchChunk());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getPixel",
-        args = {int.class, int.class}
-    )
     public void testGetPixel(){
         mBitmap.recycle();
 
@@ -533,11 +427,6 @@
         assertEquals(0xFF << 24, mBitmap.getPixel(10, 16));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getRowBytes",
-        args = {}
-    )
     public void testGetRowBytes(){
         Bitmap bm0 = Bitmap.createBitmap(100, 200, Bitmap.Config.ALPHA_8);
         Bitmap bm1 = Bitmap.createBitmap(100, 200, Bitmap.Config.ARGB_8888);
@@ -550,62 +439,30 @@
         assertEquals(200, bm3.getRowBytes());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getWidth",
-        args = {}
-    )
     public void testGetWidth(){
         assertEquals(31, mBitmap.getWidth());
         mBitmap = Bitmap.createBitmap(100, 200, Bitmap.Config.ARGB_8888);
         assertEquals(100, mBitmap.getWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "hasAlpha",
-        args = {}
-    )
     public void testHasAlpha(){
         assertFalse(mBitmap.hasAlpha());
         mBitmap = Bitmap.createBitmap(100, 200, Bitmap.Config.ARGB_8888);
         assertTrue(mBitmap.hasAlpha());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isMutable",
-        args = {}
-    )
     public void testIsMutable(){
         assertFalse(mBitmap.isMutable());
         mBitmap = Bitmap.createBitmap(100, 100, Config.ARGB_8888);
         assertTrue(mBitmap.isMutable());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isRecycled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "recycle",
-            args = {}
-        )
-    })
     public void testIsRecycled(){
         assertFalse(mBitmap.isRecycled());
         mBitmap.recycle();
         assertTrue(mBitmap.isRecycled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setPixel",
-        args = {int.class, int.class, int.class}
-    )
     public void testSetPixel(){
         int color = 0xff << 24;
 
@@ -648,18 +505,6 @@
         assertEquals(0xFF << 24, mBitmap.getPixel(10, 16));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPixels",
-            args = {int[].class, int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPixels",
-            args = {int[].class, int.class, int.class, int.class, int.class, int.class, int.class}
-        )
-    })
     public void testSetPixels(){
         int[] colors = createColors(100);
 
@@ -757,11 +602,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {android.os.Parcel.class, int.class}
-    )
     public void testWriteToParcel(){
         mBitmap.recycle();
 
@@ -790,11 +630,6 @@
         mBitmap.equals(Bitmap.CREATOR.createFromParcel(p));
     }
 
-    @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getScaledHeight",
-            args = {int.class}
-    )
     public void testGetScaledHeight1() {
         int dummyDensity = 5;
         Bitmap ret = Bitmap.createBitmap(100, 200, Config.RGB_565);
@@ -803,11 +638,6 @@
         assertEquals(scaledHeight, ret.getScaledHeight(dummyDensity));
     }
 
-    @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getScaledHeight",
-            args = {android.util.DisplayMetrics.class}
-    )
     public void testGetScaledHeight2() {
         Bitmap ret = Bitmap.createBitmap(100, 200, Config.RGB_565);
         DisplayMetrics metrics = new DisplayMetrics();
@@ -816,11 +646,6 @@
         assertEquals(scaledHeight, ret.getScaledHeight(metrics));
     }
 
-    @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getScaledHeight",
-            args = {android.graphics.Canvas.class}
-    )
     public void testGetScaledHeight3() {
         Bitmap ret = Bitmap.createBitmap(100, 200, Config.RGB_565);
         Bitmap mMutableBitmap = Bitmap.createBitmap(100, 200, Config.ARGB_8888);
@@ -832,11 +657,6 @@
         assertEquals(scaledHeight, ret.getScaledHeight(mCanvas));
     }
 
-    @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getScaledWidth",
-            args = {android.graphics.Canvas.class}
-    )
     public void testGetScaledWidth1() {
         int dummyDensity = 5;
         Bitmap ret = Bitmap.createBitmap(100, 200, Config.RGB_565);
@@ -845,11 +665,6 @@
         assertEquals(scaledWidth, ret.getScaledWidth(dummyDensity));
     }
 
-    @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getScaledWidth",
-            args = {android.util.DisplayMetrics.class}
-    )
     public void testGetScaledWidth2() {
         Bitmap ret = Bitmap.createBitmap(100, 200, Config.RGB_565);
         DisplayMetrics metrics = new DisplayMetrics();
@@ -858,11 +673,6 @@
         assertEquals(scaledWidth, ret.getScaledWidth(metrics));
     }
 
-    @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getScaledWidth",
-            args = {android.graphics.Canvas.class}
-    )
     public void testGetScaledWidth3() {
         Bitmap ret = Bitmap.createBitmap(100, 200, Config.RGB_565);
         Bitmap mMutableBitmap = Bitmap.createBitmap(100, 200, Config.ARGB_8888);
diff --git a/tests/tests/graphics/src/android/graphics/cts/Bitmap_CompressFormatTest.java b/tests/tests/graphics/src/android/graphics/cts/Bitmap_CompressFormatTest.java
index afe3409..8ae4133 100644
--- a/tests/tests/graphics/src/android/graphics/cts/Bitmap_CompressFormatTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/Bitmap_CompressFormatTest.java
@@ -21,38 +21,15 @@
 import android.graphics.Bitmap.CompressFormat;
 import android.graphics.Bitmap.Config;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(Bitmap.CompressFormat.class)
 public class Bitmap_CompressFormatTest extends AndroidTestCase{
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "valueOf",
-        args = {java.lang.String.class}
-    )
     public void testValueOf(){
         assertEquals(CompressFormat.JPEG, CompressFormat.valueOf("JPEG"));
         assertEquals(CompressFormat.PNG, CompressFormat.valueOf("PNG"));
         assertEquals(CompressFormat.WEBP, CompressFormat.valueOf("WEBP"));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "values",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "compress",
-            args = {android.graphics.Bitmap.CompressFormat.class, int.class,
-                    java.io.OutputStream.class}
-        )
-    })
     public void testValues(){
         CompressFormat[] comFormat = CompressFormat.values();
 
diff --git a/tests/tests/graphics/src/android/graphics/cts/Bitmap_ConfigTest.java b/tests/tests/graphics/src/android/graphics/cts/Bitmap_ConfigTest.java
index ff7d7ad..7fc5917 100644
--- a/tests/tests/graphics/src/android/graphics/cts/Bitmap_ConfigTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/Bitmap_ConfigTest.java
@@ -18,18 +18,9 @@
 import junit.framework.TestCase;
 import android.graphics.Bitmap;
 import android.graphics.Bitmap.Config;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(Bitmap.Config.class)
 public class Bitmap_ConfigTest extends TestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "valueOf",
-        args = {java.lang.String.class}
-    )
     public void testValueOf(){
         assertEquals(Config.ALPHA_8, Config.valueOf("ALPHA_8"));
         assertEquals(Config.RGB_565, Config.valueOf("RGB_565"));
@@ -37,11 +28,6 @@
         assertEquals(Config.ARGB_8888, Config.valueOf("ARGB_8888"));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "values",
-        args = {}
-    )
     public void testValues(){
         Config[] config = Config.values();
 
diff --git a/tests/tests/graphics/src/android/graphics/cts/BlurMaskFilterTest.java b/tests/tests/graphics/src/android/graphics/cts/BlurMaskFilterTest.java
index 64f56a5..23ac16b 100644
--- a/tests/tests/graphics/src/android/graphics/cts/BlurMaskFilterTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/BlurMaskFilterTest.java
@@ -15,9 +15,6 @@
  */
 package android.graphics.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.graphics.Bitmap;
 import android.graphics.BlurMaskFilter;
@@ -30,7 +27,6 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(BlurMaskFilter.class)
 public class BlurMaskFilterTest extends TestCase {
     private static final int OFFSET = 10;
     private static final int RADIUS = 5;
@@ -38,11 +34,6 @@
     private static final int BITMAP_HEIGHT = 100;
     private static final int CENTER = BITMAP_HEIGHT / 2;
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "BlurMaskFilter",
-        args = {float.class, android.graphics.BlurMaskFilter.Blur.class}
-    )
     public void testBlurMaskFilter(){
         BlurMaskFilter filter = new BlurMaskFilter(RADIUS, Blur.NORMAL);
         Paint paint = new Paint();
diff --git a/tests/tests/graphics/src/android/graphics/cts/BlurMaskFilter_BlurTest.java b/tests/tests/graphics/src/android/graphics/cts/BlurMaskFilter_BlurTest.java
index 9d49c8e..77d2ffa 100644
--- a/tests/tests/graphics/src/android/graphics/cts/BlurMaskFilter_BlurTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/BlurMaskFilter_BlurTest.java
@@ -18,18 +18,9 @@
 import junit.framework.TestCase;
 import android.graphics.BlurMaskFilter;
 import android.graphics.BlurMaskFilter.Blur;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(BlurMaskFilter.Blur.class)
 public class BlurMaskFilter_BlurTest extends TestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "valueOf",
-        args = {java.lang.String.class}
-    )
     public void testValueOf(){
         assertEquals(Blur.NORMAL, Blur.valueOf("NORMAL"));
         assertEquals(Blur.SOLID, Blur.valueOf("SOLID"));
@@ -37,11 +28,6 @@
         assertEquals(Blur.INNER, Blur.valueOf("INNER"));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "values",
-        args = {}
-    )
     public void testValues(){
         Blur[] bulr = Blur.values();
 
diff --git a/tests/tests/graphics/src/android/graphics/cts/CameraTest.java b/tests/tests/graphics/src/android/graphics/cts/CameraTest.java
index 20de025..a28d6ff 100755
--- a/tests/tests/graphics/src/android/graphics/cts/CameraTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/CameraTest.java
@@ -19,12 +19,7 @@
 import android.graphics.Canvas;
 import android.graphics.Matrix;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(Camera.class)
 public class CameraTest extends AndroidTestCase {
     private Camera mCamera;
 
@@ -34,45 +29,16 @@
         mCamera = new Camera();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "Camera",
-        args = {}
-    )
     public void testCamera(){
         new Camera();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "save",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "restore",
-            args = {}
-        )
-    })
     public void testRestore() {
         // we cannot get the state changed because it was a native method
         mCamera.save();
         mCamera.restore();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "translate",
-            args = {float.class, float.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMatrix",
-            args = {android.graphics.Matrix.class}
-        )
-    })
     public void testTranslate() {
         Matrix m1 = new Matrix();
         preCompare(m1);
@@ -95,18 +61,6 @@
         assertEquals(1.0f, f[8]);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "rotateX",
-            args = {float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMatrix",
-            args = {android.graphics.Matrix.class}
-        )
-    })
     public void testRotateX() {
         Matrix m1 = new Matrix();
         preCompare(m1);
@@ -129,18 +83,6 @@
         assertEquals(1.0f, f[8]);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "rotateY",
-            args = {float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMatrix",
-            args = {android.graphics.Matrix.class}
-        )
-    })
     public void testRotateY() {
         Matrix m1 = new Matrix();
         preCompare(m1);
@@ -163,18 +105,6 @@
         assertEquals(1.0f, f[8]);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "rotateZ",
-            args = {float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMatrix",
-            args = {android.graphics.Matrix.class}
-        )
-    })
     public void testRotateZ() {
         Matrix m1 = new Matrix();
         preCompare(m1);
@@ -197,11 +127,6 @@
         assertEquals(1.0f, f[8]);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "applyToCanvas",
-        args = {android.graphics.Canvas.class}
-    )
     public void testApplyToCanvas() {
         Canvas c1 = new Canvas();
         mCamera.applyToCanvas(c1);
@@ -214,11 +139,6 @@
         assertTrue(c1.getMatrix().equals(c2.getMatrix()));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dotWithNormal",
-        args = {float.class, float.class, float.class}
-    )
     public void testDotWithNormal() {
         assertEquals(0.0792f, mCamera.dotWithNormal(0.1f, 0.28f, 0.2008f));
     }
diff --git a/tests/tests/graphics/src/android/graphics/cts/CanvasTest.java b/tests/tests/graphics/src/android/graphics/cts/CanvasTest.java
index 5f20ae6..4102957 100644
--- a/tests/tests/graphics/src/android/graphics/cts/CanvasTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/CanvasTest.java
@@ -43,13 +43,7 @@
 
 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;
 
-@TestTargetClass(Canvas.class)
 public class CanvasTest extends InstrumentationTestCase {
     private final static int PAINT_COLOR = 0xff00ff00;
     private final static int BITMAP_WIDTH = 10;
@@ -90,21 +84,10 @@
         mCanvas = new Canvas(mMutableBitmap);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "Canvas",
-        args = {}
-    )
     public void testCanvas1() {
         final Canvas c = new Canvas();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "Canvas",
-        args = {android.graphics.Bitmap.class}
-    )
-    @ToBeFixed(bug="1839977", explanation="These two abnormal case will crash the process")
     public void testCanvas2() {
         // abnormal case: bitmap to be constructed is immutable
         try {
@@ -128,11 +111,6 @@
         new Canvas(mMutableBitmap);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setBitmap",
-        args = {android.graphics.Bitmap.class}
-    )
     public void testSetBitmap() {
         // abnormal case: bitmap to be set is immutable
         try {
@@ -159,20 +137,10 @@
         assertEquals(31, mCanvas.getHeight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isOpaque",
-        args = {}
-    )
     public void testIsOpaque() {
         assertFalse(mCanvas.isOpaque());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "restore",
-        args = {}
-    )
     public void testRestore() {
         // abnormal case: save not called before restore
         try {
@@ -187,18 +155,6 @@
         mCanvas.restore();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "save",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "restore",
-            args = {}
-        )
-    })
     public void testSave1() {
         final Matrix m1 = new Matrix();
         m1.setValues(values1);
@@ -227,18 +183,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "save",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "restore",
-            args = {}
-        )
-    })
     public void testSave2() {
         // test save current matrix only
         Matrix m1 = new Matrix();
@@ -323,18 +267,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "saveLayer",
-            args = {android.graphics.RectF.class, android.graphics.Paint.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "restore",
-            args = {}
-        )
-    })
     public void testSaveLayer1() {
         final Paint p = new Paint();
         final RectF rF = new RectF(0, 10, 31, 0);
@@ -422,19 +354,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "saveLayer",
-            args = {float.class, float.class, float.class, float.class,
-                    android.graphics.Paint.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "restore",
-            args = {}
-        )
-    })
     public void testSaveLayer2() {
         final Paint p = new Paint();
 
@@ -521,18 +440,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "saveLayerAlpha",
-            args = {android.graphics.RectF.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "restore",
-            args = {}
-        )
-    })
     public void testSaveLayerAlpha1() {
         final RectF rF = new RectF(0, 10, 31, 0);
 
@@ -619,18 +526,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "saveLayerAlpha",
-            args = {float.class, float.class, float.class, float.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "restore",
-            args = {}
-        )
-    })
     public void testSaveLayerAlpha2() {
         // test save current matrix only
         Matrix m1 = new Matrix();
@@ -715,11 +610,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSaveCount",
-        args = {}
-    )
     public void testGetSaveCount() {
         // why is 1 not 0
         assertEquals(1, mCanvas.getSaveCount());
@@ -733,11 +623,6 @@
         assertEquals(5, mCanvas.getSaveCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "restoreToCount",
-        args = {int.class}
-    )
     public void testRestoreToCount() {
         // abnormal case: saveCount less than 1
         try {
@@ -775,18 +660,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMatrix",
-            args = {android.graphics.Matrix.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setMatrix",
-            args = {android.graphics.Matrix.class}
-        )
-    })
     public void testGetMatrix1() {
         final float[] f1 = {
                 1, 2, 3, 4, 5, 6, 7, 8, 9
@@ -808,18 +681,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMatrix",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setMatrix",
-            args = {android.graphics.Matrix.class}
-        )
-    })
     public void testGetMatrix2() {
         final float[] f1 = {
                 1, 2, 3, 4, 5, 6, 7, 8, 9
@@ -840,11 +701,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "translate",
-        args = {float.class, float.class}
-    )
     public void testTranslate() {
         preCompare();
 
@@ -863,11 +719,6 @@
         assertEquals(1.0f, values[8]);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "scale",
-        args = {float.class, float.class}
-    )
     public void testScale1() {
         preCompare();
 
@@ -886,11 +737,6 @@
         assertEquals(1.0f, values[8]);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "scale",
-        args = {float.class, float.class, float.class, float.class}
-    )
     public void testScale2() {
         preCompare();
 
@@ -909,11 +755,6 @@
         assertEquals(1.0f, values[8]);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "rotate",
-        args = {float.class}
-    )
     public void testRotate1() {
         preCompare();
 
@@ -932,11 +773,6 @@
         assertEquals(1.0f, values[8]);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "rotate",
-        args = {float.class, float.class, float.class}
-    )
     public void testRotate2() {
         preCompare();
 
@@ -955,11 +791,6 @@
         assertEquals(1.0f, values[8]);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "skew",
-        args = {float.class, float.class}
-    )
     public void testSkew() {
         preCompare();
 
@@ -978,11 +809,6 @@
         assertEquals(1.0f, values[8]);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "concat",
-        args = {android.graphics.Matrix.class}
-    )
     public void testConcat() {
         preCompare();
 
@@ -1004,11 +830,6 @@
         assertEquals(8.0f, values[8]);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clipRect",
-        args = {android.graphics.RectF.class, android.graphics.Region.Op.class}
-    )
     public void testClipRect1() {
         assertFalse(mCanvas.clipRect(mRectF, Op.DIFFERENCE));
         assertFalse(mCanvas.clipRect(mRectF, Op.INTERSECT));
@@ -1018,11 +839,6 @@
         assertFalse(mCanvas.clipRect(mRectF, Op.XOR));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clipRect",
-        args = {android.graphics.Rect.class, android.graphics.Region.Op.class}
-    )
     public void testClipRect2() {
         assertFalse(mCanvas.clipRect(mRect, Op.DIFFERENCE));
         assertFalse(mCanvas.clipRect(mRect, Op.INTERSECT));
@@ -1032,30 +848,14 @@
         assertFalse(mCanvas.clipRect(mRect, Op.XOR));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clipRect",
-        args = {android.graphics.RectF.class}
-    )
     public void testClipRect3() {
         assertTrue(mCanvas.clipRect(mRectF));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clipRect",
-        args = {android.graphics.Rect.class}
-    )
     public void testClipRect4() {
         assertTrue(mCanvas.clipRect(mRect));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clipRect",
-        args = {float.class, float.class, float.class, float.class,
-                android.graphics.Region.Op.class}
-    )
     public void testClipRect5() {
         assertFalse(mCanvas.clipRect(0, 0, 10, 31, Op.DIFFERENCE));
         assertFalse(mCanvas.clipRect(0, 0, 10, 31, Op.INTERSECT));
@@ -1065,40 +865,20 @@
         assertFalse(mCanvas.clipRect(0, 0, 10, 31, Op.XOR));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clipRect",
-        args = {float.class, float.class, float.class, float.class}
-    )
     public void testClipRect6() {
         assertTrue(mCanvas.clipRect(0.5f, 0.5f, 10.5f, 31.5f));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clipRect",
-        args = {int.class, int.class, int.class, int.class}
-    )
     public void testClipRect7() {
         assertTrue(mCanvas.clipRect(0, 0, 10, 31));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clipPath",
-        args = {android.graphics.Path.class}
-    )
     public void testClipPath1() {
         final Path p = new Path();
         p.addRect(mRectF, Direction.CCW);
         assertTrue(mCanvas.clipPath(p));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clipPath",
-        args = {android.graphics.Path.class, android.graphics.Region.Op.class}
-    )
     public void testClipPath2() {
         final Path p = new Path();
         p.addRect(mRectF, Direction.CCW);
@@ -1111,20 +891,10 @@
         assertFalse(mCanvas.clipPath(p, Op.XOR));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clipRegion",
-        args = {android.graphics.Region.class}
-    )
     public void testClipRegion1() {
         assertFalse(mCanvas.clipRegion(new Region(0, 10, 29, 0)));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clipRegion",
-        args = {android.graphics.Region.class, android.graphics.Region.Op.class}
-    )
     public void testClipRegion2() {
         final Region r = new Region(0, 10, 29, 0);
 
@@ -1136,18 +906,6 @@
         assertFalse(mCanvas.clipRegion(r, Op.XOR));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDrawFilter",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDrawFilter",
-            args = {android.graphics.DrawFilter.class}
-        )
-    })
     public void testGetDrawFilter() {
         assertNull(mCanvas.getDrawFilter());
         final DrawFilter dF = new DrawFilter();
@@ -1156,21 +914,11 @@
         assertTrue(dF.equals(mCanvas.getDrawFilter()));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "quickReject",
-        args = {android.graphics.RectF.class, android.graphics.Canvas.EdgeType.class}
-    )
     public void testQuickReject1() {
         assertFalse(mCanvas.quickReject(mRectF, EdgeType.AA));
         assertFalse(mCanvas.quickReject(mRectF, EdgeType.BW));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "quickReject",
-        args = {android.graphics.Path.class, android.graphics.Canvas.EdgeType.class}
-    )
     public void testQuickReject2() {
         final Path p = new Path();
         p.addRect(mRectF, Direction.CCW);
@@ -1179,23 +927,11 @@
         assertFalse(mCanvas.quickReject(p, EdgeType.BW));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "quickReject",
-        args = {float.class, float.class, float.class, float.class,
-                android.graphics.Canvas.EdgeType.class}
-    )
     public void testQuickReject3() {
         assertFalse(mCanvas.quickReject(0, 0, 10, 31, EdgeType.AA));
         assertFalse(mCanvas.quickReject(0, 0, 10, 31, EdgeType.BW));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getClipBounds",
-        args = {android.graphics.Rect.class}
-    )
-    @ToBeFixed(bug = "1488979", explanation = "the width and height returned are error")
     public void testGetClipBounds1() {
         final Rect r = new Rect();
 
@@ -1204,12 +940,6 @@
         assertEquals(BITMAP_HEIGHT, r.height());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getClipBounds",
-        args = {}
-    )
-    @ToBeFixed(bug = "1488979", explanation = "the width and height returned are error")
     public void testGetClipBounds2() {
         final Rect r = mCanvas.getClipBounds();
 
@@ -1223,11 +953,6 @@
         assertEquals(color, mMutableBitmap.getPixel(BITMAP_WIDTH - 1, BITMAP_HEIGHT - 1));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawRGB",
-        args = {int.class, int.class, int.class}
-    )
     public void testDrawRGB() {
         final int alpha = 0xff;
         final int red = 0xff;
@@ -1240,11 +965,6 @@
         checkDrewColor(color);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawARGB",
-        args = {int.class, int.class, int.class, int.class}
-    )
     public void testDrawARGB() {
         final int alpha = 0xff;
         final int red = 0x22;
@@ -1256,11 +976,6 @@
         checkDrewColor(color);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawColor",
-        args = {int.class}
-    )
     public void testDrawColor1() {
         final int color = 0xffff0000;
 
@@ -1268,11 +983,6 @@
         checkDrewColor(color);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawColor",
-        args = {int.class, android.graphics.PorterDuff.Mode.class}
-    )
     public void testDrawColor2() {
         mCanvas.drawColor(0xffff0000, Mode.CLEAR);
         mCanvas.drawColor(0xffff0000, Mode.DARKEN);
@@ -1292,22 +1002,12 @@
         mCanvas.drawColor(0xffff0000, Mode.XOR);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawPaint",
-        args = {android.graphics.Paint.class}
-    )
     public void testDrawPaint() {
         mCanvas.drawPaint(mPaint);
 
         assertEquals(PAINT_COLOR, mMutableBitmap.getPixel(0, 0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawPoints",
-        args = {float[].class, int.class, int.class, android.graphics.Paint.class}
-    )
     public void testDrawPoints1() {
         // abnormal case: invalid offset
         try {
@@ -1337,44 +1037,24 @@
         assertEquals(PAINT_COLOR, mMutableBitmap.getPixel(0, 0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawPoints",
-        args = {float[].class, android.graphics.Paint.class}
-    )
     public void testDrawPoints2() {
         mCanvas.drawPoints(new float[]{0, 0}, mPaint);
 
         assertEquals(PAINT_COLOR, mMutableBitmap.getPixel(0, 0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawPoint",
-        args = {float.class, float.class, android.graphics.Paint.class}
-    )
     public void testDrawPoint() {
         mCanvas.drawPoint(0, 0, mPaint);
 
         assertEquals(PAINT_COLOR, mMutableBitmap.getPixel(0, 0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawLine",
-        args = {float.class, float.class, float.class, float.class, android.graphics.Paint.class}
-    )
     public void testDrawLine() {
         mCanvas.drawLine(0, 0, 10, 12, mPaint);
 
         assertEquals(PAINT_COLOR, mMutableBitmap.getPixel(0, 0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawLines",
-        args = {float[].class, int.class, int.class, android.graphics.Paint.class}
-    )
     public void testDrawLines1() {
         // abnormal case: invalid offset
         try {
@@ -1404,11 +1084,6 @@
         assertEquals(PAINT_COLOR, mMutableBitmap.getPixel(0, 0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawLines",
-        args = {float[].class, android.graphics.Paint.class}
-    )
     public void testDrawLines2() {
         mCanvas.drawLines(new float[] {
                 0, 0, 10, 12
@@ -1423,44 +1098,24 @@
         assertEquals(PAINT_COLOR, mMutableBitmap.getPixel(9, 11));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawRect",
-        args = {android.graphics.RectF.class, android.graphics.Paint.class}
-    )
     public void testDrawRect1() {
         mCanvas.drawRect(new RectF(0, 0, 10, 12), mPaint);
 
         checkDrewPaint();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawRect",
-        args = {android.graphics.Rect.class, android.graphics.Paint.class}
-    )
     public void testDrawRect2() {
         mCanvas.drawRect(new Rect(0, 0, 10, 12), mPaint);
 
         checkDrewPaint();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawRect",
-        args = {float.class, float.class, float.class, float.class, android.graphics.Paint.class}
-    )
     public void testDrawRect3() {
         mCanvas.drawRect(0, 0, 10, 12, mPaint);
 
         checkDrewPaint();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawOval",
-        args = {android.graphics.RectF.class, android.graphics.Paint.class}
-    )
     public void testDrawOval() {
         // abnormal case: Oval is null
         try {
@@ -1474,11 +1129,6 @@
         mCanvas.drawOval(new RectF(0, 0, 10, 12), mPaint);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawCircle",
-        args = {float.class, float.class, float.class, android.graphics.Paint.class}
-    )
     public void testDrawCircle() {
         // special case: circle's radius <= 0
         mCanvas.drawCircle(10.0f, 10.0f, -1.0f, mPaint);
@@ -1489,12 +1139,6 @@
         assertEquals(PAINT_COLOR, mMutableBitmap.getPixel(9, 11));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawArc",
-        args = {android.graphics.RectF.class, float.class, float.class, boolean.class,
-                android.graphics.Paint.class}
-    )
     public void testDrawArc() {
         // abnormal case: oval is null
         try {
@@ -1509,12 +1153,6 @@
         mCanvas.drawArc(new RectF(0, 0, 10, 12), 10, 11, true, mPaint);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawRoundRect",
-        args = {android.graphics.RectF.class, float.class, float.class,
-                android.graphics.Paint.class}
-    )
     public void testDrawRoundRect() {
         // abnormal case: RoundRect is null
         try {
@@ -1527,21 +1165,10 @@
         mCanvas.drawRoundRect(new RectF(0, 0, 10, 12), 8, 8, mPaint);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawPath",
-        args = {android.graphics.Path.class, android.graphics.Paint.class}
-    )
     public void testDrawPath() {
         mCanvas.drawPath(new Path(), mPaint);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawBitmap",
-        args = {android.graphics.Bitmap.class, float.class, float.class,
-                android.graphics.Paint.class}
-    )
     public void testDrawBitmap1() {
         Bitmap b = Bitmap.createBitmap(BITMAP_WIDTH, 29, Config.ARGB_8888);
 
@@ -1559,12 +1186,6 @@
         mCanvas.drawBitmap(b, 5, 12, mPaint);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawBitmap",
-        args = {android.graphics.Bitmap.class, android.graphics.Rect.class,
-                android.graphics.RectF.class, android.graphics.Paint.class}
-    )
     public void testDrawBitmap2() {
         Bitmap b = Bitmap.createBitmap(BITMAP_WIDTH, 29, Config.ARGB_8888);
 
@@ -1582,12 +1203,6 @@
         mCanvas.drawBitmap(b, new Rect(), new RectF(), mPaint);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawBitmap",
-        args = {android.graphics.Bitmap.class, android.graphics.Rect.class,
-                android.graphics.Rect.class, android.graphics.Paint.class}
-    )
     public void testDrawBitmap3() {
         Bitmap b = Bitmap.createBitmap(BITMAP_WIDTH, 29, Config.ARGB_8888);
 
@@ -1605,12 +1220,6 @@
         mCanvas.drawBitmap(b, new Rect(), new Rect(), mPaint);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawBitmap",
-        args = {int[].class, int.class, int.class, int.class, int.class, int.class,
-                int.class, boolean.class, android.graphics.Paint.class}
-    )
     public void testDrawBitmap4() {
         final int[] colors = new int[2008];
 
@@ -1667,12 +1276,6 @@
         mCanvas.drawBitmap(colors, 10, 10, 10, 10, 10, 29, true, mPaint);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawBitmap",
-        args = {int[].class, int.class, int.class, float.class, float.class, int.class,
-                int.class, boolean.class, android.graphics.Paint.class}
-    )
     public void testDrawBitmap6() {
         final int[] colors = new int[2008];
 
@@ -1729,24 +1332,12 @@
         mCanvas.drawBitmap(colors, 10, 10, 10.0f, 10.0f, 10, 29, true, mPaint);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawBitmap",
-        args = {android.graphics.Bitmap.class, android.graphics.Matrix.class,
-                android.graphics.Paint.class}
-    )
     public void testDrawBitmap5() {
         final Bitmap b = Bitmap.createBitmap(BITMAP_WIDTH, 29, Config.ARGB_8888);
         mCanvas.drawBitmap(b, new Matrix(), null);
         mCanvas.drawBitmap(b, new Matrix(), mPaint);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawBitmapMesh",
-        args = {android.graphics.Bitmap.class, int.class, int.class, float[].class,
-                int.class, int[].class, int.class, android.graphics.Paint.class}
-    )
     public void testDrawBitmapMesh() {
         final Bitmap b = Bitmap.createBitmap(BITMAP_WIDTH, 29, Config.ARGB_8888);
 
@@ -1820,13 +1411,6 @@
         mCanvas.drawBitmapMesh(b, 10, 10, verts, 10, colors, 10, mPaint);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawVertices",
-        args = {android.graphics.Canvas.VertexMode.class, int.class, float[].class,
-                int.class, float[].class, int.class, int[].class, int.class, short[].class,
-                int.class, int.class, android.graphics.Paint.class}
-    )
     public void testDrawVertices() {
         final float[] verts = new float[10];
         final float[] texs = new float[10];
@@ -1897,12 +1481,6 @@
                 6, mPaint);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawText",
-        args = {char[].class, int.class, int.class, float.class, float.class,
-                android.graphics.Paint.class}
-    )
     public void testDrawText1() {
         final char[] text = {
                 'a', 'n', 'd', 'r', 'o', 'i', 'd'
@@ -1937,21 +1515,10 @@
         mCanvas.drawText(text, 0, 7, 10, 10, mPaint);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawText",
-        args = {java.lang.String.class, float.class, float.class, android.graphics.Paint.class}
-    )
     public void testDrawText2() {
         mCanvas.drawText("android", 10, 30, mPaint);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawText",
-        args = {java.lang.String.class, int.class, int.class, float.class, float.class,
-                android.graphics.Paint.class}
-    )
     public void testDrawText3() {
         final String text = "android";
 
@@ -1992,12 +1559,6 @@
         mCanvas.drawText(text, 0, 7, 10, 30, mPaint);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawText",
-        args = {java.lang.CharSequence.class, int.class, int.class, float.class, float.class,
-                android.graphics.Paint.class}
-    )
     public void testDrawText4() {
         final String t1 = "android";
         mCanvas.drawText(t1, 0, 7, 10, 30, mPaint);
@@ -2015,11 +1576,6 @@
         mCanvas.drawText(t5, 0, 7, 10, 30, mPaint);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawPosText",
-        args = {char[].class, int.class, int.class, float[].class, android.graphics.Paint.class}
-    )
     public void testDrawPosText1() {
         final char[] text = {
                 'a', 'n', 'd', 'r', 'o', 'i', 'd'
@@ -2061,11 +1617,6 @@
         mCanvas.drawPosText(text, 0, 7, pos, mPaint);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawPosText",
-        args = {java.lang.String.class, float[].class, android.graphics.Paint.class}
-    )
     public void testDrawPosText2() {
         final String text = "android";
         final float[] pos = new float[] {
@@ -2088,12 +1639,6 @@
         mCanvas.drawPosText(text, pos, mPaint);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawTextOnPath",
-        args = {char[].class, int.class, int.class, android.graphics.Path.class,
-                float.class, float.class, android.graphics.Paint.class}
-    )
     public void testDrawTextOnPath1() {
         final Path path = new Path();
         final char[] text = {
@@ -2121,12 +1666,6 @@
         mCanvas.drawTextOnPath(text, 0, 7, path, 10.0f, 10.0f, mPaint);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawTextOnPath",
-        args = {java.lang.String.class, android.graphics.Path.class, float.class,
-                float.class, android.graphics.Paint.class}
-    )
     public void testDrawTextOnPath2() {
         final Path path = new Path();
         String text = "";
@@ -2139,20 +1678,10 @@
         mCanvas.drawTextOnPath(text, path, 10.0f, 10.0f, mPaint);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawPicture",
-        args = {android.graphics.Picture.class}
-    )
     public void testDrawPicture1() {
         mCanvas.drawPicture(new Picture());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawPicture",
-        args = {android.graphics.Picture.class, android.graphics.RectF.class}
-    )
     public void testDrawPicture2() {
         final RectF dst = new RectF(0, 0, 10, 31);
         final Picture p = new Picture();
@@ -2164,11 +1693,6 @@
         mCanvas.drawPicture(p, dst);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawPicture",
-        args = {android.graphics.Picture.class, android.graphics.Rect.class}
-    )
     public void testDrawPicture3() {
         final Rect dst = new Rect(0, 10, 30, 0);
         final Picture p = new Picture();
@@ -2180,18 +1704,6 @@
         mCanvas.drawPicture(p, dst);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDensity",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDensity",
-            args = {android.util.DisplayMetrics.class}
-        )
-    })
     public void testDensity() {
         // set Density
         mCanvas.setDensity(DisplayMetrics.DENSITY_DEFAULT);
diff --git a/tests/tests/graphics/src/android/graphics/cts/Canvas_EdgeTypeTest.java b/tests/tests/graphics/src/android/graphics/cts/Canvas_EdgeTypeTest.java
index c57079e..3716d82 100644
--- a/tests/tests/graphics/src/android/graphics/cts/Canvas_EdgeTypeTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/Canvas_EdgeTypeTest.java
@@ -20,28 +20,14 @@
 import android.graphics.Path;
 import android.graphics.RectF;
 import android.graphics.Canvas.EdgeType;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(Canvas.EdgeType.class)
 public class Canvas_EdgeTypeTest extends TestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "valueOf",
-        args = {java.lang.String.class}
-    )
     public void testValueOf(){
         assertEquals(EdgeType.BW, EdgeType.valueOf("BW"));
         assertEquals(EdgeType.AA, EdgeType.valueOf("AA"));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "values",
-        args = {}
-    )
     public void testValues(){
         EdgeType[] edgeType = EdgeType.values();
 
diff --git a/tests/tests/graphics/src/android/graphics/cts/Canvas_VertexModeTest.java b/tests/tests/graphics/src/android/graphics/cts/Canvas_VertexModeTest.java
index 25a91aa..d963ac8 100644
--- a/tests/tests/graphics/src/android/graphics/cts/Canvas_VertexModeTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/Canvas_VertexModeTest.java
@@ -21,32 +21,15 @@
 import android.graphics.Bitmap.Config;
 import android.graphics.Canvas.VertexMode;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(Canvas.VertexMode.class)
 public class Canvas_VertexModeTest extends AndroidTestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "valueOf",
-        args = {java.lang.String.class}
-    )
     public void testValueOf(){
         assertEquals(VertexMode.TRIANGLES, VertexMode.valueOf("TRIANGLES"));
         assertEquals(VertexMode.TRIANGLE_STRIP, VertexMode.valueOf("TRIANGLE_STRIP"));
         assertEquals(VertexMode.TRIANGLE_FAN, VertexMode.valueOf("TRIANGLE_FAN"));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "values",
-            args = {}
-        )
-    })
     public void testValues(){
         VertexMode[] verMode = VertexMode.values();
 
diff --git a/tests/tests/graphics/src/android/graphics/cts/ColorMatrixColorFilterTest.java b/tests/tests/graphics/src/android/graphics/cts/ColorMatrixColorFilterTest.java
index 21f9e25..fdef54c 100644
--- a/tests/tests/graphics/src/android/graphics/cts/ColorMatrixColorFilterTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/ColorMatrixColorFilterTest.java
@@ -15,10 +15,6 @@
  */
 package android.graphics.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
@@ -30,23 +26,10 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(ColorMatrixColorFilter.class)
 public class ColorMatrixColorFilterTest extends TestCase {
 
     private static final int TOLERANCE = 1;
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ColorMatrixColorFilter",
-            args = {ColorMatrix.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ColorMatrixColorFilter",
-            args = {float[].class}
-        )
-    })
     public void testColorMatrixColorFilter() {
         ColorMatrixColorFilter filter;
 
diff --git a/tests/tests/graphics/src/android/graphics/cts/ColorMatrixTest.java b/tests/tests/graphics/src/android/graphics/cts/ColorMatrixTest.java
index 7f55ddb..569b9fb 100644
--- a/tests/tests/graphics/src/android/graphics/cts/ColorMatrixTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/ColorMatrixTest.java
@@ -17,12 +17,7 @@
 
 import android.graphics.ColorMatrix;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(ColorMatrix.class)
 public class ColorMatrixTest extends AndroidTestCase {
     private ColorMatrix mColorMatrix;
 
@@ -42,23 +37,6 @@
         mColorMatrix = new ColorMatrix(mSrc);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ColorMatrix",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ColorMatrix",
-            args = {float[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ColorMatrix",
-            args = {android.graphics.ColorMatrix.class}
-        )
-    })
     public void testColorMatrix(){
         new ColorMatrix();
 
@@ -82,18 +60,6 @@
 
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "reset",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getArray",
-            args = {}
-        )
-    })
     public void testReset(){
         float[] ret = mColorMatrix.getArray();
         preCompare(ret);
@@ -112,18 +78,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "set",
-            args = {float[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getArray",
-            args = {}
-        )
-    })
     public void testSet1(){
         float[] ret = mColorMatrix.getArray();
         preCompare(ret);
@@ -145,18 +99,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "set",
-            args = {android.graphics.ColorMatrix.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getArray",
-            args = {}
-        )
-    })
     public void testSet2(){
         float[] ret = mColorMatrix.getArray();
         preCompare(ret);
@@ -178,18 +120,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRotate",
-            args = {int.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getArray",
-            args = {}
-        )
-    })
     public void testSetRotate(){
         // abnormal case: IllegalArgument axis
         try{
@@ -219,18 +149,6 @@
         assertEquals(0, ret[5], TOLERANCE);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSaturation",
-            args = {float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getArray",
-            args = {}
-        )
-    })
     public void testSetSaturation(){
         mColorMatrix.setSaturation(0.5f);
         float[] ret = mColorMatrix.getArray();
@@ -257,18 +175,6 @@
         assertEquals(0.0f, ret[19]);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setScale",
-            args = {float.class, float.class, float.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getArray",
-            args = {}
-        )
-    })
     public void testSetScale(){
         float[] ret = mColorMatrix.getArray();
         preCompare(ret);
@@ -291,18 +197,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRGB2YUV",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getArray",
-            args = {}
-        )
-    })
     public void testSetRGB2YUV(){
         mColorMatrix.setRGB2YUV();
         float[] ret = mColorMatrix.getArray();
@@ -329,18 +223,6 @@
         assertEquals(0.0f, ret[19]);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setYUV2RGB",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getArray",
-            args = {}
-        )
-    })
     public void testSetYUV2RGB(){
         mColorMatrix.setYUV2RGB();
         float[] ret = mColorMatrix.getArray();
@@ -367,18 +249,6 @@
         assertEquals(0.0f, ret[19]);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "postConcat",
-            args = {android.graphics.ColorMatrix.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getArray",
-            args = {}
-        )
-    })
     public void testPostConcat(){
         mColorMatrix.postConcat(new ColorMatrix());
 
@@ -389,18 +259,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "preConcat",
-            args = {android.graphics.ColorMatrix.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getArray",
-            args = {}
-        )
-    })
     public void testPreConcat(){
         mColorMatrix.preConcat(new ColorMatrix());
 
@@ -411,18 +269,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setConcat",
-            args = {android.graphics.ColorMatrix.class, android.graphics.ColorMatrix.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getArray",
-            args = {}
-        )
-    })
     public void testSetConcat(){
         float[] floatA = new float[]{
             0, 1, 2, 3, 4,
diff --git a/tests/tests/graphics/src/android/graphics/cts/ColorTest.java b/tests/tests/graphics/src/android/graphics/cts/ColorTest.java
index d29182d..760e3f9 100644
--- a/tests/tests/graphics/src/android/graphics/cts/ColorTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/ColorTest.java
@@ -17,74 +17,30 @@
 
 import android.graphics.Color;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(Color.class)
 public class ColorTest extends AndroidTestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "alpha",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Color",
-            args = {}
-        )
-    })
     public void testAlpha(){
         assertEquals(0xff, Color.alpha(Color.RED));
         assertEquals(0xff, Color.alpha(Color.YELLOW));
         new Color();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "argb",
-        args = {int.class, int.class, int.class, int.class}
-    )
     public void testArgb(){
         assertEquals(Color.RED, Color.argb(0xff, 0xff, 0x00, 0x00));
         assertEquals(Color.YELLOW, Color.argb(0xff, 0xff, 0xff, 0x00));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "blue",
-        args = {int.class}
-    )
     public void testBlue(){
         assertEquals(0x00, Color.blue(Color.RED));
         assertEquals(0x00, Color.blue(Color.YELLOW));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "green",
-        args = {int.class}
-    )
     public void testGreen(){
         assertEquals(0x00, Color.green(Color.RED));
         assertEquals(0xff, Color.green(Color.GREEN));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "HSVToColor",
-            args = {float[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "colorToHSV",
-            args = {int.class, float[].class}
-        )
-    })
     public void testHSVToColor1(){
         //abnormal case: hsv length less than 3
         try{
@@ -100,18 +56,6 @@
         assertEquals(Color.RED, Color.HSVToColor(hsv));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "HSVToColor",
-            args = {int.class, float[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "colorToHSV",
-            args = {int.class, float[].class}
-        )
-    })
     public void testHSVToColor2(){
         //abnormal case: hsv length less than 3
         try{
@@ -127,11 +71,6 @@
         assertEquals(Color.RED, Color.HSVToColor(0xff, hsv));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "parseColor",
-        args = {java.lang.String.class}
-    )
     public void testParseColor(){
         //abnormal case: colorString starts with '#' but length is neither 7 nor 9
         try{
@@ -165,31 +104,16 @@
         assertEquals(Color.MAGENTA, Color.parseColor("magenta"));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "red",
-        args = {int.class}
-    )
     public void testRed(){
         assertEquals(0xff, Color.red(Color.RED));
         assertEquals(0xff, Color.red(Color.YELLOW));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "rgb",
-        args = {int.class, int.class, int.class}
-    )
     public void testRgb(){
         assertEquals(Color.RED, Color.rgb(0xff, 0x00, 0x00));
         assertEquals(Color.YELLOW, Color.rgb(0xff, 0xff, 0x00));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "RGBToHSV",
-        args = {int.class, int.class, int.class, float[].class}
-    )
     public void testRGBToHSV(){
         //abnormal case: hsv length less than 3
         try{
diff --git a/tests/tests/graphics/src/android/graphics/cts/ComposePathEffectTest.java b/tests/tests/graphics/src/android/graphics/cts/ComposePathEffectTest.java
index 32b68bf..35a38a3 100644
--- a/tests/tests/graphics/src/android/graphics/cts/ComposePathEffectTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/ComposePathEffectTest.java
@@ -15,9 +15,6 @@
  */
 package android.graphics.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
@@ -31,7 +28,6 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(ComposePathEffect.class)
 public class ComposePathEffectTest extends TestCase {
     private static final int BITMAP_WIDTH = 110;
     private static final int BITMAP_HEIGHT = 20;
@@ -39,11 +35,6 @@
     private static final int END_X = BITMAP_WIDTH - 10;
     private static final int CENTER = BITMAP_HEIGHT / 2;
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "ComposePathEffect",
-        args = {PathEffect.class, PathEffect.class}
-    )
     public void testComposePathEffect() {
         Path path = new Path();
         path.moveTo(START_X, CENTER);
diff --git a/tests/tests/graphics/src/android/graphics/cts/ComposeShaderTest.java b/tests/tests/graphics/src/android/graphics/cts/ComposeShaderTest.java
index a52ede1..1a2164a 100644
--- a/tests/tests/graphics/src/android/graphics/cts/ComposeShaderTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/ComposeShaderTest.java
@@ -15,9 +15,6 @@
  */
 package android.graphics.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapShader;
@@ -36,17 +33,11 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(ComposeShader.class)
 public class ComposeShaderTest extends TestCase {
 
     private static final int SIZE = 255;
     private static final int TOLERANCE = 5;
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "ComposeShader",
-        args = {Shader.class, Shader.class, PorterDuff.Mode.class}
-    )
     public void testPorterDuff() {
         LinearGradient blueGradient = new LinearGradient(0, 0, SIZE, 0,
                 Color.GREEN, Color.BLUE, Shader.TileMode.CLAMP);
@@ -79,11 +70,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "ComposeShader",
-        args = {Shader.class, Shader.class, Xfermode.class}
-    )
     public void testXfermode() {
         Bitmap greenBitmap = Bitmap.createBitmap(1, 1, Config.ARGB_8888);
         greenBitmap.eraseColor(Color.GREEN);
diff --git a/tests/tests/graphics/src/android/graphics/cts/CornerPathEffectTest.java b/tests/tests/graphics/src/android/graphics/cts/CornerPathEffectTest.java
index eceb290..125a6b0 100644
--- a/tests/tests/graphics/src/android/graphics/cts/CornerPathEffectTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/CornerPathEffectTest.java
@@ -15,10 +15,6 @@
  */
 package android.graphics.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
@@ -35,7 +31,6 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(CornerPathEffect.class)
 public class CornerPathEffectTest extends TestCase {
     private static final int BITMAP_WIDTH = 100;
     private static final int BITMAP_HEIGHT = 100;
@@ -43,13 +38,6 @@
     private static final int RADIUS = 20;
     private static final int TOLERANCE = 5;
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "CornerPathEffect",
-        args = {float.class}
-    )
-    @ToBeFixed(bug = "2037365", explanation = "CornerPathEffect ends the path prematurely it " +
-            "is not closed.")
     public void testCornerPathEffect() {
         Path path = new Path();
         path.moveTo(0, PADDING);
diff --git a/tests/tests/graphics/src/android/graphics/cts/DashPathEffectTest.java b/tests/tests/graphics/src/android/graphics/cts/DashPathEffectTest.java
index 1e3aa17..209003b 100644
--- a/tests/tests/graphics/src/android/graphics/cts/DashPathEffectTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/DashPathEffectTest.java
@@ -15,10 +15,6 @@
  */
 package android.graphics.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
@@ -33,7 +29,6 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(DashPathEffect.class)
 public class DashPathEffectTest extends TestCase {
     private static final int BITMAP_WIDTH = 200;
     private static final int BITMAP_HEIGHT = 20;
@@ -45,13 +40,6 @@
     private static final int BACKGROUND = Color.TRANSPARENT;
     private static final int FOREGROUND = Color.GREEN;
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "DashPathEffect",
-        args = {float[].class, float.class}
-    )
-    @ToBeFixed(bug = "2039296", explanation = "Javadoc for phase parameter is wrong. The phase" +
-        " determines the start offset within the pattern and not an initial gap")
     public void testDashPathEffect() {
         PathEffect effect = new DashPathEffect(PATTERN, OFFSET);
         Bitmap bitmap = Bitmap.createBitmap(BITMAP_WIDTH, BITMAP_HEIGHT, Config.ARGB_8888);
diff --git a/tests/tests/graphics/src/android/graphics/cts/DiscretePathEffectTest.java b/tests/tests/graphics/src/android/graphics/cts/DiscretePathEffectTest.java
index d54dc83..adae2ed 100644
--- a/tests/tests/graphics/src/android/graphics/cts/DiscretePathEffectTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/DiscretePathEffectTest.java
@@ -16,9 +16,6 @@
 
 package android.graphics.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
@@ -33,7 +30,6 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(DiscretePathEffect.class)
 public class DiscretePathEffectTest extends TestCase {
     private static final int BITMAP_WIDTH = 200;
     private static final int BITMAP_HEIGHT = 100;
@@ -43,11 +39,6 @@
     private static final int SEGMENT_LENGTH = 10; // must be < BITMAP_WIDTH
     private static final int DEVIATION = 10; // must be < BITMAP_HEIGHT
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "DiscretePathEffect",
-        args = {float.class, float.class}
-    )
     public void testDiscretePathEffect() {
         DiscretePathEffect effect = new DiscretePathEffect(SEGMENT_LENGTH, DEVIATION);
 
diff --git a/tests/tests/graphics/src/android/graphics/cts/DrawFilterTest.java b/tests/tests/graphics/src/android/graphics/cts/DrawFilterTest.java
index f3c6422..c20bf0e 100644
--- a/tests/tests/graphics/src/android/graphics/cts/DrawFilterTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/DrawFilterTest.java
@@ -18,11 +18,7 @@
 
 import junit.framework.TestCase;
 import android.graphics.DrawFilter;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(DrawFilter.class)
 public class DrawFilterTest extends TestCase {
 
     @Override
@@ -30,11 +26,6 @@
         super.setUp();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "DrawFilter",
-        args = {}
-    )
     public void testConstructor() {
         // new the DrawFilter instance
         new DrawFilter();
diff --git a/tests/tests/graphics/src/android/graphics/cts/EmbossMaskFilterTest.java b/tests/tests/graphics/src/android/graphics/cts/EmbossMaskFilterTest.java
index 10bfbad..a61345a 100644
--- a/tests/tests/graphics/src/android/graphics/cts/EmbossMaskFilterTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/EmbossMaskFilterTest.java
@@ -16,9 +16,6 @@
 
 package android.graphics.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
@@ -31,7 +28,6 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(EmbossMaskFilter.class)
 public class EmbossMaskFilterTest extends TestCase {
     private static final int BITMAP_WIDTH = 100;
     private static final int BITMAP_HEIGHT = 100;
@@ -41,12 +37,6 @@
     private static final int CENTER_Y = BITMAP_HEIGHT / 2;
     private static final int STROKE_WIDTH = 10;
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        notes = "Javadoc is incomplete, cannot test all parameters",
-        method = "EmbossMaskFilter",
-        args = {float[].class, float.class, float.class, float.class}
-    )
     public void testEmbossMaskFilter() {
         EmbossMaskFilter filter = new EmbossMaskFilter(new float[] { 1, 1, 1 }, 0.5f, 8, 3);
 
diff --git a/tests/tests/graphics/src/android/graphics/cts/InterpolatorTest.java b/tests/tests/graphics/src/android/graphics/cts/InterpolatorTest.java
index 6a32dc7..20e419e 100644
--- a/tests/tests/graphics/src/android/graphics/cts/InterpolatorTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/InterpolatorTest.java
@@ -20,30 +20,12 @@
 import android.graphics.Interpolator;
 import android.graphics.Interpolator.Result;
 import android.os.SystemClock;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
-@TestTargetClass(Interpolator.class)
 public class InterpolatorTest extends TestCase {
 
     private static final int DEFAULT_KEYFRAME_COUNT = 2;
     private static final float TOLERANCE = 0.1f;
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Interpolator",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Interpolator",
-            args = {int.class, int.class}
-        )
-    })
     public void testConstructor() {
         Interpolator i = new Interpolator(10);
         assertEquals(10, i.getValueCount());
@@ -54,18 +36,6 @@
         assertEquals(20, i.getKeyFrameCount());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "reset",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getValueCount",
-            args = {}
-        )
-    })
     public void testReset1() {
         final int expected = 100;
         Interpolator interpolator = new Interpolator(10);
@@ -75,23 +45,6 @@
         assertEquals(DEFAULT_KEYFRAME_COUNT, interpolator.getKeyFrameCount());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "reset",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getKeyFrameCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getValueCount",
-            args = {}
-        )
-    })
     public void testReset2() {
         int expected1 = 100;
         int expected2 = 200;
@@ -102,33 +55,6 @@
         assertEquals(expected2, interpolator.getKeyFrameCount());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "timeToValues",
-            args = {float[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "reset",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setKeyFrame",
-            args = {int.class, int.class, float[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getValueCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setKeyFrame",
-            args = {int.class, int.class, float[].class, float[].class}
-        )
-    })
     public void testTimeToValues1() throws InterruptedException {
         Interpolator interpolator = new Interpolator(1);
         assertEquals(1, interpolator.getValueCount());
@@ -168,24 +94,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "timeToValues",
-            args = {int.class, float[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "reset",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setKeyFrame",
-            args = {int.class, int.class, float[].class}
-        )
-    })
-    @ToBeFixed(explanation="For time < 0 results may be wrong due to signed/unsigned conversion")
     public void testTimeToValues2() {
         Interpolator interpolator = new Interpolator(1);
         interpolator.setKeyFrame(0, 2000, new float[] {1.0f});
@@ -227,25 +135,6 @@
         assertValues(8000, new float[] {2.0f, 4.0f}, Result.FREEZE_END, interpolator);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setKeyFrame",
-            args = {int.class, int.class, float[].class, float[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setKeyFrame",
-            args = {int.class, int.class, float[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRepeatMirror",
-            args = {float.class, boolean.class}
-        )
-    })
-    @ToBeFixed(explanation="For repeat > 1 and time < start key frame, FREEZE_END and the values" +
-    		" for the end key frame are returned.")
     public void testSetRepeatMirror() {
         Interpolator interpolator = new Interpolator(1, 3);
         interpolator.setKeyFrame(0, 2000, new float[] {1.0f});
@@ -276,18 +165,6 @@
         assertValue(11000, 4.0f, Result.FREEZE_END, interpolator);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setKeyFrame",
-            args = {int.class, int.class, float[].class, float[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setKeyFrame",
-            args = {int.class, int.class, float[].class}
-        )
-    })
     public void testSetKeyFrame() {
         final float[] aZero = new float[] {0.0f};
         final float[] aOne = new float[] {1.0f};
diff --git a/tests/tests/graphics/src/android/graphics/cts/Interpolator_ResultTest.java b/tests/tests/graphics/src/android/graphics/cts/Interpolator_ResultTest.java
index 82419db..6c29cda 100644
--- a/tests/tests/graphics/src/android/graphics/cts/Interpolator_ResultTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/Interpolator_ResultTest.java
@@ -20,29 +20,15 @@
 import android.graphics.Interpolator.Result;
 import android.graphics.Shader.TileMode;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(Result.class)
 public class Interpolator_ResultTest extends TestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "valueOf",
-        args = {java.lang.String.class}
-    )
     public void testValueOf() {
         assertEquals(Result.FREEZE_START, Result.valueOf("FREEZE_START"));
         assertEquals(Result.FREEZE_END, Result.valueOf("FREEZE_END"));
         assertEquals(Result.NORMAL, Result.valueOf("NORMAL"));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "values",
-        args = {}
-    )
     public void testValues() {
         Result[] result = Result.values();
         assertEquals(3, result.length);
diff --git a/tests/tests/graphics/src/android/graphics/cts/LayerRasterizerTest.java b/tests/tests/graphics/src/android/graphics/cts/LayerRasterizerTest.java
index e4b4376..4309ac5 100644
--- a/tests/tests/graphics/src/android/graphics/cts/LayerRasterizerTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/LayerRasterizerTest.java
@@ -19,29 +19,15 @@
 import junit.framework.TestCase;
 import android.graphics.LayerRasterizer;
 import android.graphics.Paint;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(LayerRasterizer.class)
 public class LayerRasterizerTest extends TestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "LayerRasterizer",
-        args = {}
-    )
     public void testConstructor() {
 
         // new the LayerRasterizer instance
         new LayerRasterizer();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addLayer",
-        args = {android.graphics.Paint.class, float.class, float.class}
-    )
     public void testAddLayer1() {
         // new the LayerRasterizer instance
         LayerRasterizer layerRasterizer = new LayerRasterizer();
@@ -51,11 +37,6 @@
         // it doesn't throw out any exception.
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addLayer",
-        args = {android.graphics.Paint.class}
-    )
     public void testAddLayer2() {
         // new the LayerRasterizer instance
         LayerRasterizer layerRasterizer = new LayerRasterizer();
diff --git a/tests/tests/graphics/src/android/graphics/cts/LightingColorFilterTest.java b/tests/tests/graphics/src/android/graphics/cts/LightingColorFilterTest.java
index 0bb2027..b8f28e0 100644
--- a/tests/tests/graphics/src/android/graphics/cts/LightingColorFilterTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/LightingColorFilterTest.java
@@ -16,9 +16,6 @@
 
 package android.graphics.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
@@ -29,16 +26,10 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(LightingColorFilter.class)
 public class LightingColorFilterTest extends TestCase {
 
     private static final int TOLERANCE = 2;
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "LightingColorFilter",
-        args = {int.class, int.class}
-    )
     public void testLightingColorFilter() {
         Bitmap bitmap = Bitmap.createBitmap(1, 1, Config.ARGB_8888);
         Canvas canvas = new Canvas(bitmap);
diff --git a/tests/tests/graphics/src/android/graphics/cts/LinearGradientTest.java b/tests/tests/graphics/src/android/graphics/cts/LinearGradientTest.java
index 2f26272..d44f7e3 100644
--- a/tests/tests/graphics/src/android/graphics/cts/LinearGradientTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/LinearGradientTest.java
@@ -16,10 +16,6 @@
 
 package android.graphics.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
@@ -30,23 +26,8 @@
 import android.graphics.Shader.TileMode;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(LinearGradient.class)
 public class LinearGradientTest extends AndroidTestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "LinearGradient",
-            args = {float.class, float.class, float.class, float.class, int[].class, float[].class,
-                    android.graphics.Shader.TileMode.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "LinearGradient",
-            args = {float.class, float.class, float.class, float.class, int.class, int.class,
-                    android.graphics.Shader.TileMode.class}
-        )
-    })
     public void testLinearGradient() {
         Bitmap b;
         LinearGradient lg;
diff --git a/tests/tests/graphics/src/android/graphics/cts/MaskFilterTest.java b/tests/tests/graphics/src/android/graphics/cts/MaskFilterTest.java
index 0e3461f..0a05ef3 100644
--- a/tests/tests/graphics/src/android/graphics/cts/MaskFilterTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/MaskFilterTest.java
@@ -18,18 +18,9 @@
 
 import junit.framework.TestCase;
 import android.graphics.MaskFilter;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(MaskFilter.class)
 public class MaskFilterTest extends TestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "MaskFilter",
-        args = {}
-    )
     public void testConstructor() {
         // new the MaskFilter instance
         new MaskFilter();
diff --git a/tests/tests/graphics/src/android/graphics/cts/MatrixTest.java b/tests/tests/graphics/src/android/graphics/cts/MatrixTest.java
index 06dbc84..ebe20a2 100644
--- a/tests/tests/graphics/src/android/graphics/cts/MatrixTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/MatrixTest.java
@@ -19,12 +19,7 @@
 import android.graphics.RectF;
 import android.graphics.Matrix.ScaleToFit;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(Matrix.class)
 public class MatrixTest extends AndroidTestCase {
     private Matrix mMatrix;
     private float[] mValues;
@@ -36,55 +31,23 @@
         mValues = new float[9];
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Matrix",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Matrix",
-            args = {android.graphics.Matrix.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finalize",
-            args = {}
-        )
-    })
     public void testConstractor() {
         new Matrix();
         new Matrix(mMatrix);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isIdentity",
-        args = {}
-    )
     public void testIsIdentity() {
         assertTrue(mMatrix.isIdentity());
         mMatrix.setScale(0f, 0f);
         assertFalse(mMatrix.isIdentity());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "rectStaysRect",
-        args = {}
-    )
     public void testRectStaysRect() {
         assertTrue(mMatrix.rectStaysRect());
         mMatrix.postRotate(80);
         assertFalse(mMatrix.rectStaysRect());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "set",
-        args = {android.graphics.Matrix.class}
-    )
     public void testSet() {
         mValues[0] = 1000;
         mMatrix.getValues(mValues);
@@ -96,11 +59,6 @@
         assertEquals(1f, mValues[0]);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "equals",
-        args = {java.lang.Object.class}
-    )
     public void testEquals() {
         mMatrix.setScale(1f, 2f);
         Matrix matrix = new Matrix();
@@ -110,11 +68,6 @@
         assertTrue(mMatrix.equals(matrix));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "reset",
-        args = {}
-    )
     public void testReset() {
         mMatrix.setScale(1f, 2f, 3f, 4f);
         String expect = "[1.0, 0.0, 0.0][0.0, 2.0, -4.0][0.0, 0.0, 1.0]";
@@ -124,11 +77,6 @@
         assertEquals(expect, mMatrix.toShortString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setScale",
-        args = {float.class, float.class}
-    )
     public void testSetScale() {
         String expect = "[1.0, 0.0, 0.0][0.0, 1.0, 0.0][0.0, 0.0, 1.0]";
         assertEquals(expect, mMatrix.toShortString());
@@ -137,11 +85,6 @@
         assertEquals(expect, mMatrix.toShortString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setScale",
-        args = {float.class, float.class, float.class, float.class}
-    )
     public void testSetScale2() {
         String expect = "[1.0, 0.0, 0.0][0.0, 1.0, 0.0][0.0, 0.0, 1.0]";
         assertEquals(expect, mMatrix.toShortString());
@@ -151,11 +94,6 @@
         assertEquals(expect, mMatrix.toShortString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setRotate",
-        args = {float.class}
-    )
     public void testSetRotate() {
         mMatrix.setRotate(1f);
         String expect = "[0.9998477, -0.017452406, 0.0]"
@@ -163,11 +101,6 @@
         assertEquals(expect, mMatrix.toShortString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setRotate",
-        args = {float.class, float.class, float.class}
-    )
     public void testSetRotate2() {
         mMatrix.setRotate(1f, 2f, 3f);
         String expect = "[0.9998477, -0.017452406, 0.0526618]"
@@ -175,55 +108,30 @@
         assertEquals(expect, mMatrix.toShortString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setSinCos",
-        args = {float.class, float.class}
-    )
     public void testSetSinCos() {
         mMatrix.setSinCos(1f, 2f);
         String expect = "[2.0, -1.0, 0.0][1.0, 2.0, 0.0][0.0, 0.0, 1.0]";
         assertEquals(expect, mMatrix.toShortString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setSinCos",
-        args = {float.class, float.class, float.class, float.class}
-    )
     public void testSetSinCos2() {
         mMatrix.setSinCos(1f, 2f, 3f, 4f);
         String expect = "[2.0, -1.0, 1.0][1.0, 2.0, -7.0][0.0, 0.0, 1.0]";
         assertEquals(expect, mMatrix.toShortString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setSkew",
-        args = {float.class, float.class}
-    )
     public void testSetSkew() {
         mMatrix.setSkew(1f, 2f);
         String expect = "[1.0, 1.0, 0.0][2.0, 1.0, 0.0][0.0, 0.0, 1.0]";
         assertEquals(expect, mMatrix.toShortString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setSkew",
-        args = {float.class, float.class, float.class, float.class}
-    )
     public void testSetSkew2() {
         mMatrix.setSkew(1f, 2f, 3f, 4f);
         String expect = "[1.0, 1.0, -4.0][2.0, 1.0, -6.0][0.0, 0.0, 1.0]";
         assertEquals(expect, mMatrix.toShortString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setConcat",
-        args = {android.graphics.Matrix.class, android.graphics.Matrix.class}
-    )
     public void testSetConcat() {
         Matrix a = new Matrix();
         Matrix b = new Matrix();
@@ -243,44 +151,24 @@
         assertEquals(expect, mMatrix.toShortString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "preTranslate",
-        args = {float.class, float.class}
-    )
     public void testPreTranslate() {
         assertTrue(mMatrix.preTranslate(1f, 2f));
         String expect = "[1.0, 0.0, 1.0][0.0, 1.0, 2.0][0.0, 0.0, 1.0]";
         assertEquals(expect, mMatrix.toShortString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "preScale",
-        args = {float.class, float.class}
-    )
     public void testPreScale() {
         assertTrue(mMatrix.preScale(1f, 2f));
         String expect = "[1.0, 0.0, 0.0][0.0, 2.0, 0.0][0.0, 0.0, 1.0]";
         assertEquals(expect, mMatrix.toShortString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "preScale",
-        args = {float.class, float.class, float.class, float.class}
-    )
     public void testPreScale2() {
         assertTrue(mMatrix.preScale(1f, 2f, 3f, 4f));
         String expect = "[1.0, 0.0, 0.0][0.0, 2.0, -4.0][0.0, 0.0, 1.0]";
         assertEquals(expect, mMatrix.toShortString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "preRotate",
-        args = {float.class}
-    )
     public void testPreRotate() {
         assertTrue(mMatrix.preRotate(1f));
         String expect = "[0.9998477, -0.017452406, 0.0][0.017452406, 0.9998477, "
@@ -288,11 +176,6 @@
         assertEquals(expect, mMatrix.toShortString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "preRotate",
-        args = {float.class, float.class, float.class}
-    )
     public void testPreRotate2() {
         assertTrue(mMatrix.preRotate(1f, 2f, 3f));
         float[] values = new float[9];
@@ -302,33 +185,18 @@
         assertEquals(expect, mMatrix.toShortString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "preSkew",
-        args = {float.class, float.class}
-    )
     public void testPreSkew() {
         assertTrue(mMatrix.preSkew(1f, 2f));
         String expect = "[1.0, 1.0, 0.0][2.0, 1.0, 0.0][0.0, 0.0, 1.0]";
         assertEquals(expect, mMatrix.toShortString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "preSkew",
-        args = {float.class, float.class, float.class, float.class}
-    )
     public void testPreSkew2() {
         assertTrue(mMatrix.preSkew(1f, 2f, 3f, 4f));
         String expect = "[1.0, 1.0, -4.0][2.0, 1.0, -6.0][0.0, 0.0, 1.0]";
         assertEquals(expect, mMatrix.toShortString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "preConcat",
-        args = {android.graphics.Matrix.class}
-    )
     public void testPreConcat() {
         float[] values = new float[9];
         values[0] = 1000;
@@ -339,44 +207,24 @@
         assertEquals(expect, mMatrix.toShortString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "postTranslate",
-        args = {float.class, float.class}
-    )
     public void testPostTranslate() {
         assertTrue(mMatrix.postTranslate(1f, 2f));
         String expect = "[1.0, 0.0, 1.0][0.0, 1.0, 2.0][0.0, 0.0, 1.0]";
         assertEquals(expect, mMatrix.toShortString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "postScale",
-        args = {float.class, float.class}
-    )
     public void testPostScale() {
         assertTrue(mMatrix.postScale(1f, 2f));
         String expect = "[1.0, 0.0, 0.0][0.0, 2.0, 0.0][0.0, 0.0, 1.0]";
         assertEquals(expect, mMatrix.toShortString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "postScale",
-        args = {float.class, float.class, float.class, float.class}
-    )
     public void testPostScale2() {
         assertTrue(mMatrix.postScale(1f, 2f, 3f, 4f));
         String expect = "[1.0, 0.0, 0.0][0.0, 2.0, -4.0][0.0, 0.0, 1.0]";
         assertEquals(expect, mMatrix.toShortString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "postRotate",
-        args = {float.class}
-    )
     public void testPostRotate() {
         assertTrue(mMatrix.postRotate(1f));
         String expect = "[0.9998477, -0.017452406, 0.0]" +
@@ -384,11 +232,6 @@
         assertEquals(expect, mMatrix.toShortString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "postRotate",
-        args = {float.class, float.class, float.class}
-    )
     public void testPostRotate2() {
         assertTrue(mMatrix.postRotate(1f, 2f, 3f));
         String expect = "[0.9998477, -0.017452406, 0.0526618]" +
@@ -396,33 +239,18 @@
         assertEquals(expect, mMatrix.toShortString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "postSkew",
-        args = {float.class, float.class}
-    )
     public void testPostSkew() {
         assertTrue(mMatrix.postSkew(1f, 2f));
         String expect = "[1.0, 1.0, 0.0][2.0, 1.0, 0.0][0.0, 0.0, 1.0]";
         assertEquals(expect, mMatrix.toShortString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "postSkew",
-        args = {float.class, float.class, float.class, float.class}
-    )
     public void testPostSkew2() {
         assertTrue(mMatrix.postSkew(1f, 2f, 3f, 4f));
         String expect = "[1.0, 1.0, -4.0][2.0, 1.0, -6.0][0.0, 0.0, 1.0]";
         assertEquals(expect, mMatrix.toShortString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "postConcat",
-        args = {android.graphics.Matrix.class}
-    )
     public void testPostConcat() {
         Matrix matrix = new Matrix();
         float[] values = new float[9];
@@ -434,12 +262,6 @@
         assertEquals(expect, mMatrix.toShortString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setRectToRect",
-        args = {android.graphics.RectF.class, android.graphics.RectF.class,
-                android.graphics.Matrix.ScaleToFit.class}
-    )
     public void testSetRectToRect() {
         RectF r1 = new RectF();
         r1.set(1f, 2f, 3f, 3f);
@@ -474,11 +296,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "invert",
-        args = {android.graphics.Matrix.class}
-    )
     public void testInvert() {
         Matrix matrix = new Matrix();
         float[] values = new float[9];
@@ -498,11 +315,6 @@
         assertFalse(result);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setPolyToPoly",
-        args = {float[].class, int.class, float[].class, int.class, int.class}
-    )
     public void testSetPolyToPoly() {
         float[] src = new float[9];
         src[0] = 100f;
@@ -519,11 +331,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "mapPoints",
-        args = {float[].class}
-    )
     public void testMapPoints() {
         float[] value = new float[9];
         value[0] = 100f;
@@ -536,11 +343,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "mapPoints",
-        args = {float[].class, float[].class}
-    )
     public void testMapPoints2() {
         float[] dst = new float[9];
         dst[0] = 100f;
@@ -555,11 +357,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "mapPoints",
-        args = {float[].class, int.class, float[].class, int.class, int.class}
-    )
     public void testMapPoints3() {
         float[] dst = new float[9];
         dst[0] = 100f;
@@ -574,11 +371,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "mapVectors",
-        args = {float[].class}
-    )
     public void testMapVectors() {
         float[] values = new float[9];
         values = new float[9];
@@ -592,11 +384,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "mapVectors",
-        args = {float[].class, float[].class}
-    )
     public void testMapVectors2() {
         float[] src = new float[9];
         src[0] = 100f;
@@ -612,11 +399,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "mapVectors",
-        args = {float[].class, int.class, float[].class, int.class, int.class}
-    )
     public void testMapVectors3() {
         float[] src = new float[9];
         src[0] = 100f;
@@ -631,11 +413,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "mapRadius",
-        args = {float.class}
-    )
     public void testMapRadius() {
         assertEquals(mMatrix.mapRadius(100f), 100f);
         assertEquals(mMatrix.mapRadius(Float.MAX_VALUE),
@@ -643,11 +420,6 @@
         assertEquals(mMatrix.mapRadius(Float.MIN_VALUE), 0f);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "mapRect",
-        args = {android.graphics.RectF.class}
-    )
     public void testMapRect() {
         RectF r = new RectF();
         r.set(1f, 2f, 3f, 4f);
@@ -664,11 +436,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "mapRect",
-        args = {android.graphics.RectF.class, android.graphics.RectF.class}
-    )
     public void testMapRect2() {
         RectF dst = new RectF();
         dst.set(100f, 100f, 200f, 200f);
@@ -692,18 +459,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setValues",
-            args = {float[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getValues",
-            args = {float[].class}
-        )
-    })
     public void testAccessValues() {
         Matrix matrix = new Matrix();
         mMatrix.invert(matrix);
@@ -723,30 +478,15 @@
                 + values[6] + ", " + values[7] + ", " + values[8] + "]";
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "toString",
-        args = {}
-    )
     public void testToString() {
         assertNotNull(mMatrix.toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "toShortString",
-        args = {}
-    )
     public void testToShortString() {
         String expect = "[1.0, 0.0, 0.0][0.0, 1.0, 0.0][0.0, 0.0, 1.0]";
         assertEquals(expect, mMatrix.toShortString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setTranslate",
-        args = {float.class, float.class}
-    )
     public void testSetTranslate() {
         mMatrix.setTranslate(2f, 3f);
         String expect = "[1.0, 0.0, 2.0][0.0, 1.0, 3.0][0.0, 0.0, 1.0]";
diff --git a/tests/tests/graphics/src/android/graphics/cts/Matrix_ScaleToFitTest.java b/tests/tests/graphics/src/android/graphics/cts/Matrix_ScaleToFitTest.java
index dc9a919..5670740 100644
--- a/tests/tests/graphics/src/android/graphics/cts/Matrix_ScaleToFitTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/Matrix_ScaleToFitTest.java
@@ -18,19 +18,10 @@
 
 import android.graphics.Matrix.ScaleToFit;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(ScaleToFit.class)
 public class Matrix_ScaleToFitTest extends AndroidTestCase {
 
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "values",
-        args = {}
-    )
     public void testValues() {
         ScaleToFit[] scaleToFits = ScaleToFit.values();
         assertEquals(ScaleToFit.FILL,scaleToFits[0]);
@@ -39,11 +30,6 @@
         assertEquals( ScaleToFit.END,scaleToFits[3]);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "valueOf",
-        args = {java.lang.String.class}
-    )
     public void testValueOf() {
         assertEquals(ScaleToFit.FILL,ScaleToFit.valueOf("FILL"));
         assertEquals( ScaleToFit.START,ScaleToFit.valueOf("START"));
@@ -51,11 +37,6 @@
         assertEquals(ScaleToFit.END,ScaleToFit.valueOf("END") );
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "valueOf",
-        args = {android.graphics.Matrix.ScaleToFit.class, java.lang.String.class}
-    )
     public void testValueOf2() {
         assertEquals(ScaleToFit.FILL, ScaleToFit.valueOf(ScaleToFit.class,
                 "FILL"));
diff --git a/tests/tests/graphics/src/android/graphics/cts/MovieTest.java b/tests/tests/graphics/src/android/graphics/cts/MovieTest.java
index accb08f..f129035 100644
--- a/tests/tests/graphics/src/android/graphics/cts/MovieTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/MovieTest.java
@@ -31,12 +31,7 @@
 import android.test.ActivityInstrumentationTestCase2;
 import android.widget.cts.WidgetTestUtils;
 
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(Movie.class)
 public class MovieTest extends ActivityInstrumentationTestCase2<MockActivity> {
     private Movie mMovie;
     private final int MOVIE = com.android.cts.stub.R.drawable.animated;
@@ -51,33 +46,17 @@
         mMovie = getActivity().getResources().getMovie(MOVIE);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "draw",
-        args = {android.graphics.Canvas.class, float.class, float.class,
-                android.graphics.Paint.class}
-    )
     public void testDraw1() {
         Canvas c = new Canvas();
         Paint p = new Paint();
         mMovie.draw(c, 100, 200, p);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "draw",
-        args = {android.graphics.Canvas.class, float.class, float.class}
-    )
     public void testDraw2() {
         Canvas c = new Canvas();
         mMovie.draw(c, 100, 200);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "decodeFile",
-        args = {java.lang.String.class}
-    )
     public void testDecodeFile() throws Exception {
         mMovie = null;
         File dbDir = getInstrumentation().getTargetContext().getDir("tests",
@@ -131,12 +110,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test decodeByteArray",
-        method = "decodeByteArray",
-        args = {byte[].class, int.class, int.class}
-    )
     public void testDecodeByteArray() throws Exception {
         mMovie = null;
         InputStream is = getActivity().getResources().openRawResource(MOVIE);
@@ -146,12 +119,6 @@
         assertNotNull(mMovie);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test decodeStream method",
-        method = "decodeStream",
-        args = {java.io.InputStream.class}
-    )
     public void testDecodeStream() {
         assertFalse(mMovie.isOpaque());
         mMovie = null;
@@ -166,12 +133,6 @@
         assertNotNull(mMovie);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test setTime method",
-        method = "setTime",
-        args = {int.class}
-    )
     public void testSetTime() {
         assertTrue(mMovie.setTime(1000));
         assertFalse(mMovie.setTime(Integer.MAX_VALUE));
@@ -179,28 +140,6 @@
         assertFalse(mMovie.setTime(-1));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "duration",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isOpaque",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "height",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "width",
-            args = {}
-        )
-    })
     public void testGetMovieProperties() {
         assertEquals(1000, mMovie.duration());
         assertFalse(mMovie.isOpaque());
diff --git a/tests/tests/graphics/src/android/graphics/cts/NinePatchTest.java b/tests/tests/graphics/src/android/graphics/cts/NinePatchTest.java
index d2b9af0..d5fcc62 100644
--- a/tests/tests/graphics/src/android/graphics/cts/NinePatchTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/NinePatchTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.res.Resources;
 import android.graphics.Bitmap;
@@ -35,7 +31,6 @@
 import android.graphics.Region;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(NinePatch.class)
 public class NinePatchTest extends AndroidTestCase {
     private static int ALPHA_OPAQUE = 0xFF;
 
@@ -61,11 +56,6 @@
         mNinePatch = new NinePatch(mBitmap, mChunk, NAME);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "NinePatch",
-        args = {android.graphics.Bitmap.class, byte[].class, java.lang.String.class}
-    )
     public void testConstructor() {
         mNinePatch = null;
         try {
@@ -76,11 +66,6 @@
         mNinePatch = new NinePatch(mBitmap, mChunk, NAME);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isNinePatchChunk",
-        args = {byte[].class}
-    )
     public void testIsNinePatchChunk() {
         assertTrue(NinePatch.isNinePatchChunk(mChunk));
         Bitmap bitmap = Bitmap.createBitmap(COLOR, 10, 10, Bitmap.Config.ARGB_4444);
@@ -89,28 +74,6 @@
 
     }
 
-    @TestTargets(value = {
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "draw",
-            args = {android.graphics.Canvas.class, android.graphics.RectF.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "draw",
-            args = {android.graphics.Canvas.class, android.graphics.Rect.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "draw",
-            args = {android.graphics.Canvas.class, android.graphics.Rect.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPaint",
-            args = {android.graphics.Paint.class}
-        )
-    })
     public void testDraw() {
         Bitmap expected = BitmapFactory.decodeResource(mRes, R.drawable.scaled1, mOptNoScale);
 
@@ -168,11 +131,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "hasAlpha",
-        args = {}
-    )
     public void testHasAlpha() {
         assertFalse(mNinePatch.hasAlpha());
         assertEquals(mNinePatch.hasAlpha(), mBitmap.hasAlpha());
@@ -185,31 +143,16 @@
         assertEquals(ninePatch.hasAlpha(), bitmap.hasAlpha());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getHeight",
-        args = {}
-    )
     public void testGetHeight() {
         assertEquals(5, mNinePatch.getHeight());
         assertEquals(mNinePatch.getHeight(), mBitmap.getHeight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getWidth",
-        args = {}
-    )
     public void testGetWidth() {
         assertEquals(5, mNinePatch.getHeight());
         assertEquals(mNinePatch.getWidth(), mBitmap.getWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getDensity",
-        args = {}
-    )
     public void testGetDensity() {
         mBitmap.setDensity(11);
         assertEquals(11, mNinePatch.getDensity());
@@ -217,11 +160,6 @@
         assertEquals(mNinePatch.getDensity(), mBitmap.getDensity());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getTransparentRegion",
-        args = {android.graphics.Rect.class}
-    )
     public void testGetTransparentRegion() {
         // no transparency in opaque bitmap
         Rect location = new Rect(0, 0, mBitmap.getWidth(), mBitmap.getHeight());
diff --git a/tests/tests/graphics/src/android/graphics/cts/PaintFlagsDrawFilterTest.java b/tests/tests/graphics/src/android/graphics/cts/PaintFlagsDrawFilterTest.java
index b394d28..31dbf16 100755
--- a/tests/tests/graphics/src/android/graphics/cts/PaintFlagsDrawFilterTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/PaintFlagsDrawFilterTest.java
@@ -16,9 +16,6 @@
 
 package android.graphics.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
@@ -30,7 +27,6 @@
 import android.graphics.Paint.Align;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(PaintFlagsDrawFilter.class)
 public class PaintFlagsDrawFilterTest extends AndroidTestCase {
 
     private static final float TEXT_SIZE = 20;
@@ -46,11 +42,6 @@
         super.setUp();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "PaintFlagsDrawFilter",
-        args = {int.class, int.class}
-    )
     public void testPaintFlagsDrawFilter() {
 
         Bitmap bitmapWithoutFilter = drawText(null);
diff --git a/tests/tests/graphics/src/android/graphics/cts/PaintTest.java b/tests/tests/graphics/src/android/graphics/cts/PaintTest.java
index 169fb56..ec95a5e 100644
--- a/tests/tests/graphics/src/android/graphics/cts/PaintTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/PaintTest.java
@@ -16,10 +16,6 @@
 
 package android.graphics.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.graphics.ColorFilter;
 import android.graphics.MaskFilter;
@@ -37,7 +33,6 @@
 import android.test.AndroidTestCase;
 import android.text.SpannedString;
 
-@TestTargetClass(Paint.class)
 public class PaintTest extends AndroidTestCase {
 
     private static final Typeface[] TYPEFACES = new Typeface[] {
@@ -48,23 +43,6 @@
             Typeface.SERIF,
     };
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Paint",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Paint",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Paint",
-            args = {android.graphics.Paint.class}
-        )
-    })
     public void testConstructor() {
         new Paint();
 
@@ -162,11 +140,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "set",
-        args = {android.graphics.Paint.class}
-    )
     public void testSet() {
         Paint p  = new Paint();
         Paint p2 = new Paint();
@@ -229,18 +202,6 @@
         assertNull(p2.getXfermode());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setStrokeCap",
-            args = {android.graphics.Paint.Cap.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStrokeCap",
-            args = {}
-        )
-    })
     public void testAccessStrokeCap() {
         Paint p = new Paint();
 
@@ -261,18 +222,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setXfermode",
-            args = {android.graphics.Xfermode.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getXfermode",
-            args = {}
-        )
-    })
     public void testAccessXfermode() {
         Paint p = new Paint();
         Xfermode x = new Xfermode();
@@ -284,18 +233,6 @@
         assertNull(p.getXfermode());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setShader",
-            args = {android.graphics.Shader.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getShader",
-            args = {}
-        )
-    })
     public void testAccessShader() {
         Paint p = new Paint();
         Shader s = new Shader();
@@ -307,18 +244,6 @@
         assertNull(p.getShader());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAntiAlias",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isAntiAlias",
-            args = {}
-        )
-    })
     public void testSetAntiAlias() {
         Paint p = new Paint();
 
@@ -330,18 +255,6 @@
 
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTypeface",
-            args = {android.graphics.Typeface.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTypeface",
-            args = {}
-        )
-    })
 
     public void testAccessTypeface() {
         Paint p = new Paint();
@@ -359,18 +272,6 @@
         assertNull(p.getTypeface());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPathEffect",
-            args = {android.graphics.PathEffect.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPathEffect",
-            args = {}
-        )
-    })
     public void testAccessPathEffect() {
         Paint p = new Paint();
         PathEffect e = new PathEffect();
@@ -382,18 +283,6 @@
         assertNull(p.getPathEffect());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFakeBoldText",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isFakeBoldText",
-            args = {}
-        )
-    })
     public void testSetFakeBoldText() {
         Paint p = new Paint();
 
@@ -404,18 +293,6 @@
         assertFalse(p.isFakeBoldText());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setStrokeJoin",
-            args = {android.graphics.Paint.Join.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStrokeJoin",
-            args = {}
-        )
-    })
     public void testAccessStrokeJoin() {
         Paint p = new Paint();
 
@@ -436,18 +313,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setStyle",
-            args = {android.graphics.Paint.Style.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStyle",
-            args = {}
-        )
-    })
     public void testAccessStyle() {
         Paint p = new Paint();
 
@@ -468,11 +333,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getFontSpacing",
-        args = {}
-    )
     public void testGetFontSpacing() {
         Paint p = new Paint();
 
@@ -489,18 +349,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isSubpixelText",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSubpixelText",
-            args = {boolean.class}
-        )
-    })
     public void testSetSubpixelText() {
         Paint p = new Paint();
 
@@ -511,18 +359,6 @@
         assertFalse(p.isSubpixelText());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTextScaleX",
-            args = {float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTextScaleX",
-            args = {}
-        )
-    })
     public void testAccessTextScaleX() {
         Paint p = new Paint();
 
@@ -537,18 +373,6 @@
 
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setMaskFilter",
-            args = {android.graphics.MaskFilter.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMaskFilter",
-            args = {}
-        )
-    })
     public void testAccessMaskFilter() {
         Paint p = new Paint();
         MaskFilter m = new MaskFilter();
@@ -560,18 +384,6 @@
         assertNull(p.getMaskFilter());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setColorFilter",
-            args = {android.graphics.ColorFilter.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getColorFilter",
-            args = {}
-        )
-    })
     public void testAccessColorFilter() {
         Paint p = new Paint();
         ColorFilter c = new ColorFilter();
@@ -583,18 +395,6 @@
         assertNull(p.getColorFilter());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRasterizer",
-            args = {android.graphics.Rasterizer.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRasterizer",
-            args = {}
-        )
-    })
     public void testAccessRasterizer() {
         Paint p = new Paint();
         Rasterizer r = new Rasterizer();
@@ -606,11 +406,6 @@
         assertNull(p.getRasterizer());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setARGB",
-        args = {int.class, int.class, int.class, int.class}
-    )
     public void testSetARGB() {
         Paint p = new Paint();
 
@@ -622,11 +417,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "ascent",
-        args = {}
-    )
     public void testAscent() {
         Paint p = new Paint();
 
@@ -643,18 +433,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTextSkewX",
-            args = {float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTextSkewX",
-            args = {}
-        )
-    })
     public void testAccessTextSkewX() {
         Paint p = new Paint();
 
@@ -668,18 +446,6 @@
         assertEquals(-0.25f, p.getTextSkewX());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTextSize",
-            args = {float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTextSize",
-            args = {}
-        )
-    })
     public void testAccessTextSize() {
         Paint p = new Paint();
 
@@ -744,18 +510,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isStrikeThruText",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setStrikeThruText",
-            args = {boolean.class}
-        )
-    })
     public void testSetStrikeThruText() {
         Paint p = new Paint();
 
@@ -766,18 +520,6 @@
         assertFalse(p.isStrikeThruText());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTextAlign",
-            args = {android.graphics.Paint.Align.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTextAlign",
-            args = {}
-        )
-    })
     public void testAccessTextAlign() {
         Paint p = new Paint();
 
@@ -791,11 +533,6 @@
         assertEquals(Align.RIGHT, p.getTextAlign());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getFillPath",
-        args = {android.graphics.Path.class, android.graphics.Path.class}
-    )
     public void testGetFillPath() {
         Paint p = new Paint();
         Path path1 = new Path();
@@ -811,18 +548,6 @@
 
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAlpha",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAlpha",
-            args = {}
-        )
-    })
     public void testAccessAlpha() {
         Paint p = new Paint();
 
@@ -841,18 +566,6 @@
         assertEquals(236, p.getAlpha());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isFilterBitmap",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFilterBitmap",
-            args = {boolean.class}
-        )
-    })
     public void testSetFilterBitmap() {
         Paint p = new Paint();
 
@@ -863,18 +576,6 @@
         assertFalse(p.isFilterBitmap());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setColor",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getColor",
-            args = {}
-        )
-    })
     public void testAccessColor() {
         Paint p = new Paint();
 
@@ -894,20 +595,10 @@
         assertEquals(256, p.getColor());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setShadowLayer",
-        args = {float.class, float.class, float.class, int.class}
-    )
     public void testSetShadowLayer() {
         new Paint().setShadowLayer(10, 1, 1, 0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getFontMetrics",
-        args = {android.graphics.Paint.FontMetrics.class}
-    )
     public void testGetFontMetrics1() {
         Paint p = new Paint();
         Paint.FontMetrics fm = new Paint.FontMetrics();
@@ -927,11 +618,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getFontMetrics",
-        args = {}
-    )
     public void testGetFontMetrics2() {
         Paint p = new Paint();
 
@@ -950,18 +636,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setStrokeMiter",
-            args = {float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStrokeMiter",
-            args = {}
-        )
-    })
     public void testAccessStrokeMiter() {
         Paint p = new Paint();
 
@@ -976,27 +650,10 @@
         assertEquals(10.0f, p.getStrokeMiter());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clearShadowLayer",
-        args = {}
-    )
     public void testClearShadowLayer() {
         new Paint().clearShadowLayer();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setUnderlineText",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isUnderlineText",
-            args = {}
-        )
-    })
     public void testSetUnderlineText() {
         Paint p = new Paint();
 
@@ -1007,18 +664,6 @@
         assertFalse(p.isUnderlineText());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDither",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isDither",
-            args = {}
-        )
-    })
     public void testSetDither() {
         Paint p = new Paint();
 
@@ -1029,11 +674,6 @@
         assertFalse(p.isDither());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "descent",
-        args = {}
-    )
     public void testDescent() {
         Paint p = new Paint();
 
@@ -1050,18 +690,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFlags",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFlags",
-            args = {}
-        )
-    })
     public void testAccessFlags() {
         Paint p = new Paint();
 
@@ -1072,18 +700,6 @@
         assertEquals(Paint.DEV_KERN_TEXT_FLAG, p.getFlags());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setStrokeWidth",
-            args = {float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStrokeWidth",
-            args = {}
-        )
-    })
     public void testAccessStrokeWidth() {
         Paint p = new Paint();
 
@@ -1098,11 +714,6 @@
         assertEquals(10.0f, p.getStrokeWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "reset",
-        args = {}
-    )
     public void testReset() {
 
         Paint p  = new Paint();
@@ -1143,18 +754,6 @@
 
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isLinearText",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setLinearText",
-            args = {boolean.class}
-        )
-    })
     public void testSetLinearText() {
         Paint p = new Paint();
 
@@ -1165,11 +764,6 @@
         assertFalse(p.isLinearText());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getFontMetricsInt",
-        args = {android.graphics.Paint.FontMetricsInt.class}
-    )
     public void testGetFontMetricsInt1() {
         Paint p = new Paint();
         Paint.FontMetricsInt fmi = new Paint.FontMetricsInt();
@@ -1189,11 +783,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getFontMetricsInt",
-        args = {}
-    )
     public void testGetFontMetricsInt2() {
         Paint p = new Paint();
         Paint.FontMetricsInt fmi;
@@ -1283,12 +872,6 @@
         assertEquals(widths[3], expectedWidth);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getTextPath",
-        args = {char[].class, int.class, int.class, float.class, float.class,
-                android.graphics.Path.class}
-    )
     public void testGetTextPath1() {
         Paint p = new Paint();
         char[] chars = {'H', 'I', 'J', 'K', 'L', 'M', 'N'};
@@ -1318,12 +901,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getTextPath",
-        args = {java.lang.String.class, int.class, int.class, float.class, float.class,
-                android.graphics.Path.class}
-    )
     public void testGetTextPath2() {
         Paint p = new Paint();
         String string = "HIJKLMN";
diff --git a/tests/tests/graphics/src/android/graphics/cts/Paint_AlignTest.java b/tests/tests/graphics/src/android/graphics/cts/Paint_AlignTest.java
index 7eaea5b..ff07f45 100644
--- a/tests/tests/graphics/src/android/graphics/cts/Paint_AlignTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/Paint_AlignTest.java
@@ -17,44 +17,17 @@
 package android.graphics.cts;
 
 import junit.framework.TestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 import android.graphics.Paint.Align;
 import android.graphics.Paint;
 
-@TestTargetClass(Paint.Align.class)
 public class Paint_AlignTest extends TestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "valueOf",
-        args = {java.lang.String.class}
-    )
     public void testValueOf() {
         assertEquals(Align.LEFT, Align.valueOf("LEFT"));
         assertEquals(Align.CENTER, Align.valueOf("CENTER"));
         assertEquals(Align.RIGHT, Align.valueOf("RIGHT"));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "values",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTextAlign",
-            args = {android.graphics.Paint.Align.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTextAlign",
-            args = {}
-        )
-    })
     public void testValues() {
         // set the actual value
         Align[] actual = Align.values();
diff --git a/tests/tests/graphics/src/android/graphics/cts/Paint_CapTest.java b/tests/tests/graphics/src/android/graphics/cts/Paint_CapTest.java
index 458e334..1c9fe33 100644
--- a/tests/tests/graphics/src/android/graphics/cts/Paint_CapTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/Paint_CapTest.java
@@ -17,21 +17,11 @@
 package android.graphics.cts;
 
 import junit.framework.TestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 import android.graphics.Paint;
 import android.graphics.Paint.Cap;
 
-@TestTargetClass(Paint.Cap.class)
 public class Paint_CapTest extends TestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "valueOf",
-        args = {java.lang.String.class}
-    )
     public void testValueOf() {
 
         assertEquals(Cap.BUTT, Cap.valueOf("BUTT"));
@@ -39,23 +29,6 @@
         assertEquals(Cap.SQUARE, Cap.valueOf("SQUARE"));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "values",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setStrokeCap",
-            args = {android.graphics.Paint.Cap.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStrokeCap",
-            args = {}
-        )
-    })
     public void testValues() {
         // set the actual value
         Cap[] actual = Cap.values();
diff --git a/tests/tests/graphics/src/android/graphics/cts/Paint_FontMetricsIntTest.java b/tests/tests/graphics/src/android/graphics/cts/Paint_FontMetricsIntTest.java
index e62ed5b..1b01ecd 100644
--- a/tests/tests/graphics/src/android/graphics/cts/Paint_FontMetricsIntTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/Paint_FontMetricsIntTest.java
@@ -19,28 +19,14 @@
 import junit.framework.TestCase;
 import android.graphics.Paint;
 import android.graphics.Paint.FontMetricsInt;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(Paint.FontMetricsInt.class)
 public class Paint_FontMetricsIntTest extends TestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "Paint.FontMetricsInt",
-        args = {}
-    )
     public void testConstructor() {
         // new the FontMetricsInt instance
         new Paint.FontMetricsInt();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "toString",
-        args = {}
-    )
     public void testToString() {
         // set the expected value
         int top = 1;
diff --git a/tests/tests/graphics/src/android/graphics/cts/Paint_JoinTest.java b/tests/tests/graphics/src/android/graphics/cts/Paint_JoinTest.java
index abbe046..0e264f1 100644
--- a/tests/tests/graphics/src/android/graphics/cts/Paint_JoinTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/Paint_JoinTest.java
@@ -17,44 +17,17 @@
 package android.graphics.cts;
 
 import junit.framework.TestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 import android.graphics.Paint.Join;
 import android.graphics.Paint;
 
-@TestTargetClass(Paint.Join.class)
 public class Paint_JoinTest extends TestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "valueOf",
-        args = {java.lang.String.class}
-    )
     public void testValueOf() {
         assertEquals(Join.BEVEL, Join.valueOf("BEVEL"));
         assertEquals(Join.MITER, Join.valueOf("MITER"));
         assertEquals(Join.ROUND, Join.valueOf("ROUND"));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "values",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setStrokeJoin",
-            args = {android.graphics.Paint.Join.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStrokeJoin",
-            args = {}
-        )
-    })
     public void testValues() {
         // set the actual value
         Join[] actual = Join.values();
diff --git a/tests/tests/graphics/src/android/graphics/cts/Paint_StyleTest.java b/tests/tests/graphics/src/android/graphics/cts/Paint_StyleTest.java
index 32a338a..d43693f 100644
--- a/tests/tests/graphics/src/android/graphics/cts/Paint_StyleTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/Paint_StyleTest.java
@@ -17,44 +17,17 @@
 package android.graphics.cts;
 
 import junit.framework.TestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 import android.graphics.Paint;
 import android.graphics.Paint.Style;
 
-@TestTargetClass(Paint.Style.class)
 public class Paint_StyleTest extends TestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "valueOf",
-        args = {java.lang.String.class}
-    )
     public void testValueOf() {
         assertEquals(Style.FILL, Style.valueOf("FILL"));
         assertEquals(Style.STROKE, Style.valueOf("STROKE"));
         assertEquals(Style.FILL_AND_STROKE, Style.valueOf("FILL_AND_STROKE"));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "values",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setStyle",
-            args = {android.graphics.Paint.Style.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStyle",
-            args = {}
-        )
-    })
     public void testValues() {
         // set the actual value
         Style[] actual = Style.values();
diff --git a/tests/tests/graphics/src/android/graphics/cts/PathDashPathEffectTest.java b/tests/tests/graphics/src/android/graphics/cts/PathDashPathEffectTest.java
index eadd932..71e42d2 100644
--- a/tests/tests/graphics/src/android/graphics/cts/PathDashPathEffectTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/PathDashPathEffectTest.java
@@ -16,9 +16,6 @@
 
 package android.graphics.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
@@ -32,7 +29,6 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(PathDashPathEffect.class)
 public class PathDashPathEffectTest extends TestCase {
 
     private static final int SQUARE = 10;
@@ -40,12 +36,6 @@
     private static final int WIDTH = 100;
     private static final int HEIGHT = 100;
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        method = "PathDashPathEffect",
-        args = {android.graphics.Path.class, float.class, float.class,
-                android.graphics.PathDashPathEffect.Style.class}
-    )
     public void testPathDashPathEffect() {
         Bitmap b = Bitmap.createBitmap(WIDTH, HEIGHT, Config.ARGB_8888);
         b.eraseColor(Color.BLACK);
diff --git a/tests/tests/graphics/src/android/graphics/cts/PathDashPathEffect_StyleTest.java b/tests/tests/graphics/src/android/graphics/cts/PathDashPathEffect_StyleTest.java
index 584f0a9..93de1ee 100644
--- a/tests/tests/graphics/src/android/graphics/cts/PathDashPathEffect_StyleTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/PathDashPathEffect_StyleTest.java
@@ -19,19 +19,10 @@
 import android.graphics.PathDashPathEffect;
 import android.graphics.PathDashPathEffect.Style;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(PathDashPathEffect.Style.class)
 public class PathDashPathEffect_StyleTest extends AndroidTestCase {
 
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "valueOf",
-        args = {java.lang.String.class}
-    )
     public void testValueOf() {
         assertEquals(Style.TRANSLATE, Style.valueOf("TRANSLATE"));
         assertEquals(Style.ROTATE, Style.valueOf("ROTATE"));
@@ -39,11 +30,6 @@
         // Every Style element will be tested somewhere else.
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "values",
-        args = {}
-    )
     public void testValues() {
         // set the expected value
         Style[] expected = {
diff --git a/tests/tests/graphics/src/android/graphics/cts/PathEffectTest.java b/tests/tests/graphics/src/android/graphics/cts/PathEffectTest.java
index 7c14166..28136c3 100644
--- a/tests/tests/graphics/src/android/graphics/cts/PathEffectTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/PathEffectTest.java
@@ -18,18 +18,9 @@
 
 import android.graphics.PathEffect;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(PathEffect.class)
 public class PathEffectTest extends AndroidTestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "PathEffect",
-        args = {}
-    )
     public void testConstructor() {
         new PathEffect();
     }
diff --git a/tests/tests/graphics/src/android/graphics/cts/PathMeasureTest.java b/tests/tests/graphics/src/android/graphics/cts/PathMeasureTest.java
index 94e352a..8e1fca0 100644
--- a/tests/tests/graphics/src/android/graphics/cts/PathMeasureTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/PathMeasureTest.java
@@ -16,10 +16,6 @@
 
 package android.graphics.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.graphics.Matrix;
 import android.graphics.Path;
@@ -27,7 +23,6 @@
 import android.graphics.Path.Direction;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(PathMeasure.class)
 public class PathMeasureTest extends AndroidTestCase {
     private PathMeasure mPathMeasure;
     private Path mPath;
@@ -40,18 +35,6 @@
 
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "PathMeasure",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "PathMeasure",
-            args = {android.graphics.Path.class, boolean.class}
-        )
-    })
     public void testConstructor() {
         mPathMeasure = new PathMeasure();
 
@@ -63,11 +46,6 @@
         mPathMeasure = new PathMeasure(path, false);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getPosTan",
-        args = {float.class, float[].class, float[].class}
-    )
     public void testGetPosTan() {
         float distance = 1f;
         float[] pos = { 1f };
@@ -90,11 +68,6 @@
         assertTrue(mPathMeasure.getPosTan(0f, pos3, tan3));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "nextContour",
-        args = {}
-    )
     public void testNextContour() {
         assertFalse(mPathMeasure.nextContour());
         mPath.addRect(1, 2, 3, 4, Path.Direction.CW);
@@ -102,11 +75,6 @@
         assertTrue(mPathMeasure.nextContour());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLength",
-        args = {}
-    )
     public void testGetLength() {
         assertEquals(0f, mPathMeasure.getLength());
         mPath.addRect(1, 2, 3, 4, Path.Direction.CW);
@@ -114,11 +82,6 @@
         assertEquals(8.0f, mPathMeasure.getLength());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isClosed",
-        args = {}
-    )
     public void testIsClosed() {
         Path circle = new Path();
         circle.addCircle(0, 0, 1, Direction.CW);
@@ -137,21 +100,11 @@
         assertTrue(measure.isClosed());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setPath",
-        args = {android.graphics.Path.class, boolean.class}
-    )
     public void testSetPath() {
         mPathMeasure.setPath(mPath, true);
         //There is no getter and we can't obtain any status about it.
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSegment",
-        args = {float.class, float.class, android.graphics.Path.class, boolean.class}
-    )
     public void testGetSegment() {
         assertEquals(0f, mPathMeasure.getLength());
         mPath.addRect(1, 2, 3, 4, Path.Direction.CW);
@@ -162,11 +115,6 @@
         assertFalse(mPathMeasure.getSegment(mPathMeasure.getLength(), 0, dst, true));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getMatrix",
-        args = {float.class, android.graphics.Matrix.class, int.class}
-    )
     public void testGetMatrix() {
         Matrix matrix = new Matrix();
         assertFalse(mPathMeasure.getMatrix(1f, matrix, PathMeasure.POSITION_MATRIX_FLAG));
diff --git a/tests/tests/graphics/src/android/graphics/cts/PathTest.java b/tests/tests/graphics/src/android/graphics/cts/PathTest.java
index 1e74999..c15bc38 100644
--- a/tests/tests/graphics/src/android/graphics/cts/PathTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/PathTest.java
@@ -20,13 +20,7 @@
 import android.graphics.Matrix;
 import android.graphics.Path;
 import android.graphics.RectF;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
-@TestTargetClass(Path.class)
 public class PathTest extends TestCase {
 
     // Test constants
@@ -37,18 +31,6 @@
     private static final float XCOORD = 40.0f;
     private static final float YCOORD = 40.0f;
 
-	@TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Path",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Path",
-            args = {android.graphics.Path.class}
-        )
-    })
     public void testConstructor() {
         // new the Path instance
         new Path();
@@ -57,18 +39,6 @@
         new Path(new Path());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addRect",
-            args = {android.graphics.RectF.class, android.graphics.Path.Direction.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isEmpty",
-            args = {}
-        )
-    })
     public void testAddRect1() {
 
         // new the Path instance
@@ -79,19 +49,6 @@
         assertFalse(path.isEmpty());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addRect",
-            args = {float.class, float.class, float.class, float.class,
-                    android.graphics.Path.Direction.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isEmpty",
-            args = {}
-        )
-    })
     public void testAddRect2() {
 
         // new the Path instance
@@ -101,33 +58,12 @@
         assertFalse(path.isEmpty());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "moveTo",
-        args = {float.class, float.class}
-    )
-    @ToBeFixed(bug = "1451096", explanation = "Test moveTo(float x, float y)." +
-            "When this method called, the current point will move to the" +
-            "appointed coordinate, but there is no more way to get known" +
-            "about whether current point is just in that coordinate correctly")
     public void testMoveTo() {
         // new the Path instance
         Path path = new Path();
         path.moveTo(10.0f, 10.0f);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "set",
-            args = {android.graphics.Path.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isEmpty",
-            args = {}
-        )
-    })
     public void testSet() {
         // new the Path instance
         Path path = new Path();
@@ -138,18 +74,6 @@
         assertFalse(path.isEmpty());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFillType",
-            args = {android.graphics.Path.FillType.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFillType",
-            args = {}
-        )
-    })
     public void testAccessFillType() {
         // set the expected value
         Path.FillType expected1 = Path.FillType.EVEN_ODD;
@@ -170,18 +94,6 @@
         assertEquals(expected4, path.getFillType());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "rQuadTo",
-            args = {float.class, float.class, float.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isEmpty",
-            args = {}
-        )
-    })
     public void testRQuadTo() {
         // new the Path instance
         Path path = new Path();
@@ -190,18 +102,6 @@
         assertFalse(path.isEmpty());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "transform",
-            args = {android.graphics.Matrix.class, android.graphics.Path.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isEmpty",
-            args = {}
-        )
-    })
     public void testTransform1() {
         // new the Path instance
         Path path = new Path();
@@ -212,31 +112,10 @@
         assertFalse(dst.isEmpty());
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        method = "transform",
-        args = {android.graphics.Matrix.class}
-    )
-    @ToBeFixed(bug = "1451096", explanation = "The function of this method is" +
-              "almost the same as transform(Matrix matrix, Path dst) but no dst" +
-              "to show if it works when called, and we can't get any information" +
-              "in this method when called" )
     public void testTransform2() {
 
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "lineTo",
-            args = {float.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isEmpty",
-            args = {}
-        )
-    })
     public void testLineTo() {
         // new the Path instance
         Path path = new Path();
@@ -245,14 +124,6 @@
         assertFalse(path.isEmpty());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "close",
-        args = {}
-    )
-    @ToBeFixed(bug = "1451096", explanation = "What does 'close' mean, clear the " +
-            "contour or others? If clear, why the path is not empty when" +
-            "there is just one path.")
     public void testClose() {
         // new the Path instance
         Path path = new Path();
@@ -261,18 +132,6 @@
         path.close();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "quadTo",
-            args = {float.class, float.class, float.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isEmpty",
-            args = {}
-        )
-    })
     public void testQuadTo() {
         // new the Path instance
         Path path = new Path();
@@ -281,18 +140,6 @@
         assertFalse(path.isEmpty());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addCircle",
-            args = {float.class, float.class, float.class, android.graphics.Path.Direction.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isEmpty",
-            args = {}
-        )
-    })
     public void testAddCircle() {
         // new the Path instance
         Path path = new Path();
@@ -301,18 +148,6 @@
         assertFalse(path.isEmpty());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "arcTo",
-            args = {android.graphics.RectF.class, float.class, float.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isEmpty",
-            args = {}
-        )
-    })
     public void testArcTo1() {
         // new the Path instance
         Path path = new Path();
@@ -322,18 +157,6 @@
         assertFalse(path.isEmpty());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "arcTo",
-            args = {android.graphics.RectF.class, float.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isEmpty",
-            args = {}
-        )
-    })
     public void testArcTo2() {
         // new the Path instance
         Path path = new Path();
@@ -343,11 +166,6 @@
         assertFalse(path.isEmpty());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "computeBounds",
-        args = {android.graphics.RectF.class, boolean.class}
-    )
     public void testComputeBounds1() {
 
         RectF expected = new RectF(0.0f, 0.0f, 0.0f, 0.0f);
@@ -363,18 +181,6 @@
         assertEquals(expected.height(), bounds.height());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "computeBounds",
-            args = {android.graphics.RectF.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addRect",
-            args = {android.graphics.RectF.class, android.graphics.Path.Direction.class}
-        )
-    })
     public void testComputeBounds2() {
 
         RectF expected = new RectF(LEFT, TOP, RIGHT, BOTTOM);
@@ -391,45 +197,16 @@
         assertEquals(expected.height(), bounds.height());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "rMoveTo",
-        args = {float.class, float.class}
-    )
-    @ToBeFixed(bug = "1451096", explanation = "When this method called, the current" +
-            "point will move to the appointed coordinate, but there is no more" +
-            "way to get known about whether current point is just in that" +
-            "coordinate correctly")
     public void testRMoveTo() {
         // new the Path instance
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setLastPoint",
-        args = {float.class, float.class}
-    )
-    @ToBeFixed(bug = "1451096", explanation = "When called, we can't" +
-              "get any useful information to make sure the point has been" +
-              "correctly set")
     public void testSetLastPoint() {
         // new the Path instance
         Path path = new Path();
         path.setLastPoint(10.0f, 10.0f);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "rLineTo",
-            args = {float.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isEmpty",
-            args = {}
-        )
-    })
     public void testRLineTo() {
         // new the Path instance
         Path path = new Path();
@@ -438,11 +215,6 @@
         assertFalse(path.isEmpty());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isEmpty",
-        args = {}
-    )
     public void testIsEmpty() {
 
         // new the Path instance
@@ -452,18 +224,6 @@
         assertFalse(path.isEmpty());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "rewind",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isEmpty",
-            args = {}
-        )
-    })
     public void testRewind() {
 
         // set the expected value
@@ -479,11 +239,6 @@
         assertEquals(expected, path.getFillType());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addOval",
-        args = {android.graphics.RectF.class, android.graphics.Path.Direction.class}
-    )
     public void testAddOval() {
         // new the Path instance
         Path path = new Path();
@@ -493,13 +248,6 @@
         assertFalse(path.isEmpty());
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        method = "isRect",
-        args = {android.graphics.RectF.class}
-    )
-    @ToBeFixed(bug = "1451096", explanation = "what does 'specify' in the note of " +
-              "this method mean? The return always is false, is it correct?")
     public void testIsRect() {
 
         // new the Path instance
@@ -508,28 +256,9 @@
         setPath(path);
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        method = "incReserve",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1451096", explanation = "Maybe this method has little" +
-              "obvious behavior to test")
     public void testIncReserve() {
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addPath",
-            args = {android.graphics.Path.class, float.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isEmpty",
-            args = {}
-        )
-    })
     public void testAddPath1() {
         // new the Path instance
         Path path = new Path();
@@ -540,18 +269,6 @@
         assertFalse(path.isEmpty());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addPath",
-            args = {android.graphics.Path.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isEmpty",
-            args = {}
-        )
-    })
     public void testAddPath2() {
         // new the Path instance
         Path path = new Path();
@@ -562,18 +279,6 @@
         assertFalse(path.isEmpty());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addPath",
-            args = {android.graphics.Path.class, android.graphics.Matrix.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isEmpty",
-            args = {}
-        )
-    })
     public void testAddPath3() {
         // new the Path instance
         Path path = new Path();
@@ -585,19 +290,6 @@
         assertFalse(path.isEmpty());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addRoundRect",
-            args = {android.graphics.RectF.class, float.class, float.class,
-                    android.graphics.Path.Direction.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isEmpty",
-            args = {}
-        )
-    })
     public void testAddRoundRect1() {
         // new the Path instance
         Path path = new Path();
@@ -607,19 +299,6 @@
         assertFalse(path.isEmpty());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addRoundRect",
-            args = {android.graphics.RectF.class, float[].class,
-                    android.graphics.Path.Direction.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isEmpty",
-            args = {}
-        )
-    })
     public void testAddRoundRect2() {
         // new the Path instance
         Path path = new Path();
@@ -633,18 +312,6 @@
         assertFalse(path.isEmpty());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isInverseFillType",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFillType",
-            args = {android.graphics.Path.FillType.class}
-        )
-    })
     public void testIsInverseFillType() {
 
         // new the Path instance
@@ -654,11 +321,6 @@
         assertTrue(path.isInverseFillType());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "offset",
-        args = {float.class, float.class, android.graphics.Path.class}
-    )
     public void testOffset1() {
         // new the Path instance
         Path path = new Path();
@@ -669,31 +331,10 @@
         assertFalse(dst.isEmpty());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "offset",
-        args = {float.class, float.class}
-    )
-    @ToBeFixed(bug = "1451096", explanation = "The function of this method is" +
-              "almost the same as offset(float dx, float dy, Path dst) but no dst" +
-              "to show if it works when called, and we can't get any information" +
-              "in this method when called")
     public void testOffset2() {
         // new the Path instance
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "cubicTo",
-            args = {float.class, float.class, float.class, float.class, float.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isEmpty",
-            args = {}
-        )
-    })
     public void testCubicTo() {
         // new the Path instance
         Path path = new Path();
@@ -702,28 +343,6 @@
         assertFalse(path.isEmpty());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "reset",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addRect",
-            args = {android.graphics.RectF.class, android.graphics.Path.Direction.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "set",
-            args = {android.graphics.Path.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isEmpty",
-            args = {}
-        )
-    })
     public void testReset() {
         // new the Path instance
         Path path = new Path();
@@ -736,18 +355,6 @@
         assertTrue(path.isEmpty());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "toggleInverseFillType",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isInverseFillType",
-            args = {}
-        )
-    })
     public void testToggleInverseFillType() {
         // new the Path instance
         Path path = new Path();
@@ -756,18 +363,6 @@
         assertTrue(path.isInverseFillType());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addArc",
-            args = {android.graphics.RectF.class, float.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isEmpty",
-            args = {}
-        )
-    })
     public void testAddArc() {
         // new the Path instance
         Path path = new Path();
@@ -777,18 +372,6 @@
         assertFalse(path.isEmpty());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "rCubicTo",
-            args = {float.class, float.class, float.class, float.class, float.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isEmpty",
-            args = {}
-        )
-    })
     public void testRCubicTo() {
         // new the Path instance
         Path path = new Path();
diff --git a/tests/tests/graphics/src/android/graphics/cts/Path_DirectionTest.java b/tests/tests/graphics/src/android/graphics/cts/Path_DirectionTest.java
index a26a5df..5e27b2a 100644
--- a/tests/tests/graphics/src/android/graphics/cts/Path_DirectionTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/Path_DirectionTest.java
@@ -19,29 +19,15 @@
 import android.graphics.Path;
 import android.graphics.Path.Direction;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(Path.Direction.class)
 public class Path_DirectionTest extends AndroidTestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "valueOf",
-        args = {java.lang.String.class}
-    )
     public void testValueOf() {
         assertEquals(Direction.CW, Direction.valueOf("CW"));
         assertEquals(Direction.CCW, Direction.valueOf("CCW"));
         // Every Direction element will be tested somewhere else.
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "values",
-        args = {}
-    )
     public void testValues() {
         // set the expected value
         Direction[] expected = {
diff --git a/tests/tests/graphics/src/android/graphics/cts/Path_FillTypeTest.java b/tests/tests/graphics/src/android/graphics/cts/Path_FillTypeTest.java
index 1092e5e..60b0586 100644
--- a/tests/tests/graphics/src/android/graphics/cts/Path_FillTypeTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/Path_FillTypeTest.java
@@ -19,18 +19,9 @@
 import android.graphics.Path;
 import android.graphics.Path.FillType;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(Path.FillType.class)
 public class Path_FillTypeTest extends AndroidTestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "valueOf",
-        args = {java.lang.String.class}
-    )
     public void testValueOf() {
         assertEquals(FillType.WINDING, FillType.valueOf("WINDING"));
         assertEquals(FillType.EVEN_ODD, FillType.valueOf("EVEN_ODD"));
@@ -39,11 +30,6 @@
         // Every FillType element will be tested somewhere else.
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "values",
-        args = {}
-    )
     public void testValues() {
         // set the expected value
         FillType[] expected = {
diff --git a/tests/tests/graphics/src/android/graphics/cts/PictureTest.java b/tests/tests/graphics/src/android/graphics/cts/PictureTest.java
index 9954b10..81f053d 100644
--- a/tests/tests/graphics/src/android/graphics/cts/PictureTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/PictureTest.java
@@ -28,64 +28,12 @@
 import android.graphics.Picture;
 import android.graphics.Paint.Style;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(Picture.class)
 public class PictureTest extends TestCase {
 
     private static final int TEST_WIDTH = 4; // must be >= 2
     private static final int TEST_HEIGHT = 3; // must >= 2
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Picture",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Picture",
-            args = {android.graphics.Picture.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "beginRecording",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "endRecording",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getHeight",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWidth",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeToStream",
-            args = {java.io.OutputStream.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createFromStream",
-            args = {java.io.InputStream.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "draw",
-            args = {android.graphics.Canvas.class}
-        )
-    })
     public void testPicture() throws Exception {
 
         Picture picture = new Picture();
diff --git a/tests/tests/graphics/src/android/graphics/cts/PixelFormatTest.java b/tests/tests/graphics/src/android/graphics/cts/PixelFormatTest.java
index 3127c4e..dcbb084 100644
--- a/tests/tests/graphics/src/android/graphics/cts/PixelFormatTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/PixelFormatTest.java
@@ -18,11 +18,7 @@
 
 import junit.framework.TestCase;
 import android.graphics.PixelFormat;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(PixelFormat.class)
 public class PixelFormatTest extends TestCase {
 
     private PixelFormat mPixelFormat;
@@ -33,22 +29,12 @@
         mPixelFormat = null;
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "PixelFormat",
-        args = {}
-    )
     public void testConstructor() {
         mPixelFormat = null;
         // new the PixelFormat instance
         mPixelFormat = new PixelFormat();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getPixelFormatInfo",
-        args = {int.class, android.graphics.PixelFormat.class}
-    )
     public void testGetPixelFormatInfo() {
 
         // new the PixelFormat instance
@@ -130,11 +116,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "formatHasAlpha",
-        args = {int.class}
-    )
     public void testFormatHasAlpha() {
 
         assertTrue(PixelFormat.formatHasAlpha(PixelFormat.RGBA_8888));
diff --git a/tests/tests/graphics/src/android/graphics/cts/PixelXorXfermodeTest.java b/tests/tests/graphics/src/android/graphics/cts/PixelXorXfermodeTest.java
index 780e49a..e2d68da 100644
--- a/tests/tests/graphics/src/android/graphics/cts/PixelXorXfermodeTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/PixelXorXfermodeTest.java
@@ -23,18 +23,9 @@
 import android.graphics.PixelXorXfermode;
 import android.graphics.Bitmap.Config;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(PixelXorXfermode.class)
 public class PixelXorXfermodeTest extends AndroidTestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "PixelXorXfermode",
-        args = {int.class}
-    )
     public void testPixelXorXfermode() {
         int width = 100;
         int height = 100;
diff --git a/tests/tests/graphics/src/android/graphics/cts/PointFTest.java b/tests/tests/graphics/src/android/graphics/cts/PointFTest.java
index db54e63..77b72d4 100644
--- a/tests/tests/graphics/src/android/graphics/cts/PointFTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/PointFTest.java
@@ -19,12 +19,7 @@
 import android.graphics.Point;
 import android.graphics.PointF;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(PointF.class)
 public class PointFTest extends AndroidTestCase {
 
     private PointF mPointF;
@@ -35,23 +30,6 @@
         mPointF = null;
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "PointF",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "PointF",
-            args = {float.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "PointF",
-            args = {android.graphics.Point.class}
-        )
-    })
     public void testConstructor() {
 
         mPointF = null;
@@ -69,11 +47,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "negate",
-        args = {}
-    )
     public void testNegate() {
         mPointF = new PointF(10, 10);
         mPointF.negate();
@@ -81,30 +54,15 @@
         assertEquals(-10.0f, mPointF.y);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "length",
-        args = {}
-    )
     public void testLength1() {
         mPointF = new PointF(0.3f, 0.4f);
         assertEquals(0.5f, mPointF.length());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "length",
-        args = {float.class, float.class}
-    )
     public void testLength2() {
         assertEquals(0.5f, PointF.length(0.3f, 0.4f));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "set",
-        args = {float.class, float.class}
-    )
     public void testSet1() {
         mPointF = new PointF();
         mPointF.set(0.3f, 0.4f);
@@ -112,11 +70,6 @@
         assertEquals(0.4f, mPointF.y);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "set",
-        args = {android.graphics.PointF.class}
-    )
     public void testSet2() {
         mPointF = new PointF();
         PointF pointF = new PointF(0.3f, 0.4f);
@@ -125,22 +78,12 @@
         assertEquals(0.4f, mPointF.y);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "equals",
-        args = {float.class, float.class}
-    )
     public void testEquals() {
         mPointF = new PointF(0.3f, 0.4f);
         assertTrue(mPointF.equals(0.3f, 0.4f));
         assertFalse(mPointF.equals(0.4f, 0.3f));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "offset",
-        args = {float.class, float.class}
-    )
     public void testOffset() {
         mPointF = new PointF(10.0f, 10.0f);
         mPointF.offset(1.0f, 1.1f);
diff --git a/tests/tests/graphics/src/android/graphics/cts/PointTest.java b/tests/tests/graphics/src/android/graphics/cts/PointTest.java
index baa1a03..e4ede58 100644
--- a/tests/tests/graphics/src/android/graphics/cts/PointTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/PointTest.java
@@ -18,12 +18,7 @@
 
 import android.graphics.Point;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(Point.class)
 public class PointTest extends AndroidTestCase {
 
     private Point mPoint;
@@ -34,23 +29,6 @@
         mPoint = null;
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Point",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Point",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Point",
-            args = {android.graphics.Point.class}
-        )
-    })
     public void testConstructor() {
 
         // new the Point instance
@@ -65,11 +43,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "set",
-        args = {int.class, int.class}
-    )
     public void testSet() {
         mPoint = new Point();
         mPoint.set(3, 4);
@@ -77,22 +50,12 @@
         assertEquals(4, mPoint.y);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "equals",
-        args = {int.class, int.class}
-    )
     public void testEquals1() {
         mPoint = new Point(3, 4);
         assertTrue(mPoint.equals(3, 4));
         assertFalse(mPoint.equals(4, 3));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "equals",
-        args = {java.lang.Object.class}
-    )
     public void testEquals2() {
         mPoint = new Point(3, 4);
         Point point = new Point(3, 4);
@@ -101,32 +64,17 @@
         assertFalse(mPoint.equals(point));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "hashCode",
-        args = {}
-    )
     public void testHashCode() {
         mPoint = new Point(10, 10);
         Point p = new Point(100, 10);
         assertTrue(p.hashCode() != mPoint.hashCode());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "toString",
-        args = {}
-    )
     public void testToString() {
         mPoint = new Point();
         assertNotNull(mPoint.toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "offset",
-        args = {int.class, int.class}
-    )
     public void testOffset() {
         mPoint = new Point(10, 10);
         mPoint.offset(1, 1);
@@ -134,11 +82,6 @@
         assertEquals(11, mPoint.y);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "negate",
-        args = {}
-    )
     public void testNegate() {
         mPoint = new Point(10, 10);
         mPoint.negate();
diff --git a/tests/tests/graphics/src/android/graphics/cts/PorterDuffColorFilterTest.java b/tests/tests/graphics/src/android/graphics/cts/PorterDuffColorFilterTest.java
index e0f5bd2..301d532 100644
--- a/tests/tests/graphics/src/android/graphics/cts/PorterDuffColorFilterTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/PorterDuffColorFilterTest.java
@@ -23,20 +23,11 @@
 import android.graphics.PorterDuffColorFilter;
 import android.graphics.Bitmap.Config;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(PorterDuffColorFilter.class)
 public class PorterDuffColorFilterTest extends AndroidTestCase {
 
     private static final int TOLERANCE = 5;
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "PorterDuffColorFilter",
-        args = {int.class, PorterDuff.Mode.class}
-    )
     public void testPorterDuffColorFilter() {
         int width = 100;
         int height = 100;
diff --git a/tests/tests/graphics/src/android/graphics/cts/PorterDuffXfermodeTest.java b/tests/tests/graphics/src/android/graphics/cts/PorterDuffXfermodeTest.java
index b22758b..2e7cca5 100644
--- a/tests/tests/graphics/src/android/graphics/cts/PorterDuffXfermodeTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/PorterDuffXfermodeTest.java
@@ -15,9 +15,6 @@
  */
 package android.graphics.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
@@ -29,17 +26,11 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(PorterDuffXfermode.class)
 public class PorterDuffXfermodeTest extends TestCase {
 
     private static final int WIDTH = 100;
     private static final int HEIGHT = 100;
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "PorterDuffXfermode",
-        args = {android.graphics.PorterDuff.Mode.class}
-    )
     public void testPorterDuffXfermode() {
         Bitmap target = Bitmap.createBitmap(WIDTH, HEIGHT, Config.ARGB_8888);
         target.eraseColor(Color.TRANSPARENT);
diff --git a/tests/tests/graphics/src/android/graphics/cts/RasterizerTest.java b/tests/tests/graphics/src/android/graphics/cts/RasterizerTest.java
index 1e6368a..c3f7c49 100644
--- a/tests/tests/graphics/src/android/graphics/cts/RasterizerTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/RasterizerTest.java
@@ -16,30 +16,11 @@
 
 package android.graphics.cts;
 
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 import android.graphics.Rasterizer;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(Rasterizer.class)
 public class RasterizerTest extends AndroidTestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test finalize function",
-            method = "finalize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test finalize function",
-            method = "Rasterizer",
-            args = {}
-        )
-    })
     public void testFinalize() {
         MockRasterizer mr = new MockRasterizer();
         try {
diff --git a/tests/tests/graphics/src/android/graphics/cts/RectFTest.java b/tests/tests/graphics/src/android/graphics/cts/RectFTest.java
index fa56042..f5788af 100644
--- a/tests/tests/graphics/src/android/graphics/cts/RectFTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/RectFTest.java
@@ -16,17 +16,12 @@
 
 package android.graphics.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.graphics.Rect;
 import android.graphics.RectF;
 import android.os.Parcel;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(RectF.class)
 public class RectFTest extends AndroidTestCase {
 
     private RectF mRectF;
@@ -37,28 +32,6 @@
         mRectF = null;
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "RectF",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "RectF",
-            args = {float.class, float.class, float.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "RectF",
-            args = {android.graphics.RectF.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "RectF",
-            args = {android.graphics.Rect.class}
-        )
-    })
     public void testConstructor() {
 
         mRectF = null;
@@ -81,11 +54,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "sort",
-        args = {}
-    )
     public void testSort() {
 
         mRectF = new RectF(10, 10, 5, 5);
@@ -102,11 +70,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "set",
-        args = {float.class, float.class, float.class, float.class}
-    )
     public void testSet1() {
 
         mRectF = new RectF();
@@ -118,11 +81,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "set",
-        args = {android.graphics.RectF.class}
-    )
     public void testSet2() {
 
         RectF rectF = new RectF(1.0f, 2.0f, 3.0f, 4.0f);
@@ -135,11 +93,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "set",
-        args = {android.graphics.Rect.class}
-    )
     public void testSet3() {
 
         Rect rect = new Rect(1, 2, 3, 4);
@@ -152,11 +105,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "intersects",
-        args = {float.class, float.class, float.class, float.class}
-    )
     public void testIntersects1() {
 
         mRectF = new RectF(0, 0, 10, 10);
@@ -175,11 +123,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "intersects",
-        args = {android.graphics.RectF.class, android.graphics.RectF.class}
-    )
     public void testIntersects2() {
 
         RectF rectF1;
@@ -195,11 +138,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "intersect",
-        args = {float.class, float.class, float.class, float.class}
-    )
     public void testIntersect1() {
 
         mRectF = new RectF(0, 0, 10, 10);
@@ -218,11 +156,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "intersect",
-        args = {android.graphics.RectF.class}
-    )
     public void testIntersect2() {
 
         RectF rectF;
@@ -245,11 +178,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "union",
-        args = {float.class, float.class, float.class, float.class}
-    )
     public void testUnion1() {
 
         // Both rect1 and rect2 are not empty.
@@ -300,11 +228,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "union",
-        args = {android.graphics.RectF.class}
-    )
     public void testUnion2() {
 
         RectF rectF;
@@ -362,11 +285,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "union",
-        args = {float.class, float.class}
-    )
     public void testUnion3() {
 
         // rect1 is not empty (x > right, y > bottom).
@@ -403,11 +321,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "contains",
-        args = {float.class, float.class}
-    )
     public void testContains1() {
 
         mRectF = new RectF(1.0f, 1.0f, 20.0f, 20.0f);
@@ -418,11 +331,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "contains",
-        args = {float.class, float.class, float.class, float.class}
-    )
     public void testContains2() {
 
         mRectF = new RectF(1.0f, 1.0f, 20.0f, 20.0f);
@@ -432,11 +340,6 @@
         assertFalse(mRectF.contains(0.0f, 0.0f, 19.0f, 19.0f));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "contains",
-        args = {android.graphics.RectF.class}
-    )
     public void testContains3() {
 
         RectF rectF;
@@ -452,11 +355,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "offset",
-        args = {float.class, float.class}
-    )
     public void testOffset() {
 
        mRectF = new RectF(5, 5, 10, 10);
@@ -468,11 +366,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "inset",
-        args = {float.class, float.class}
-    )
     public void testInset() {
 
         mRectF = new RectF(5.0f, 5.0f, 10.0f, 10.0f);
@@ -491,31 +384,16 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "height",
-        args = {}
-    )
     public void testHeight() {
         mRectF = new RectF(1.0f, 1.0f, 20.5f, 20.5f);
         assertEquals(19.5f, mRectF.height());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "width",
-        args = {}
-    )
     public void testWidth() {
         mRectF = new RectF(1.0f, 1.0f, 20.5f, 20.5f);
         assertEquals(19.5f, mRectF.width());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "offsetTo",
-        args = {float.class, float.class}
-    )
     public void testOffsetTo() {
 
         mRectF = new RectF(5, 5, 10, 10);
@@ -527,11 +405,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setEmpty",
-        args = {}
-    )
     public void testSetEmpty() {
 
         // Before setEmpty()
@@ -550,11 +423,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isEmpty",
-        args = {}
-    )
     public void testIsEmpty() {
 
         mRectF = new RectF();
@@ -568,11 +436,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "centerX",
-        args = {}
-    )
     public void testCenterX() {
 
         mRectF = new RectF(10.0f, 10.0f, 20.0f, 20.0f);
@@ -584,11 +447,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "centerY",
-        args = {}
-    )
     public void testCenterY() {
 
         mRectF = new RectF(10.0f, 10.0f, 20.0f, 20.0f);
@@ -599,21 +457,11 @@
         assertEquals(15.2f, mRectF.centerY());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "toString",
-        args = {}
-    )
     public void testToString() {
         mRectF = new RectF();
         assertNotNull(mRectF.toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setIntersect",
-        args = {android.graphics.RectF.class, android.graphics.RectF.class}
-    )
     public void testSetIntersect() {
 
         RectF rectF1 = new RectF(0, 0, 10, 10);
@@ -637,11 +485,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "roundOut",
-        args = {android.graphics.Rect.class}
-    )
     public void testRoundOut() {
 
         Rect rect = new Rect();
@@ -654,11 +497,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "round",
-        args = {android.graphics.Rect.class}
-    )
     public void testRound() {
 
         Rect rect = new Rect();
@@ -671,23 +509,6 @@
 
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readFromParcel",
-            args = {android.os.Parcel.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeToParcel",
-            args = {android.os.Parcel.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "describeContents",
-            args = {}
-        )
-    })
     public void testWriteReadParcel() {
         RectF rectOut = new RectF(0.0f,0.0f,10.0f,10.0f);
         Parcel out = Parcel.obtain();
diff --git a/tests/tests/graphics/src/android/graphics/cts/RectTest.java b/tests/tests/graphics/src/android/graphics/cts/RectTest.java
index 5eb788f..c29ec0d 100644
--- a/tests/tests/graphics/src/android/graphics/cts/RectTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/RectTest.java
@@ -19,12 +19,7 @@
 import android.graphics.Rect;
 import android.os.Parcel;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(Rect.class)
 public class RectTest extends AndroidTestCase {
     private Rect mRect;
 
@@ -34,23 +29,6 @@
         mRect = null;
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Rect",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Rect",
-            args = {int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Rect",
-            args = {android.graphics.Rect.class}
-        )
-    })
     public void testConstructor() {
 
         mRect = null;
@@ -68,11 +46,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "set",
-        args = {int.class, int.class, int.class, int.class}
-    )
     public void testSet1() {
 
         mRect = new Rect();
@@ -84,11 +57,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "set",
-        args = {android.graphics.Rect.class}
-    )
     public void testSet2() {
 
         Rect rect = new Rect(1, 2, 3, 4);
@@ -100,11 +68,6 @@
         assertEquals(4, mRect.bottom);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "intersects",
-        args = {int.class, int.class, int.class, int.class}
-    )
     public void testIntersects1() {
 
         mRect = new Rect(0, 0, 10, 10);
@@ -123,11 +86,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "intersects",
-        args = {android.graphics.Rect.class, android.graphics.Rect.class}
-    )
     public void testIntersects2() {
 
         Rect rect1;
@@ -143,21 +101,11 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "height",
-        args = {}
-    )
     public void testHeight() {
         mRect = new Rect(6, 6, 10, 10);
         assertEquals(4, mRect.height());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "offsetTo",
-        args = {int.class, int.class}
-    )
     public void testOffsetTo() {
 
         mRect = new Rect(5, 5, 10, 10);
@@ -169,11 +117,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setIntersect",
-        args = {android.graphics.Rect.class, android.graphics.Rect.class}
-    )
     public void testSetIntersect() {
 
         Rect rect1 = new Rect(0, 0, 10, 10);
@@ -197,11 +140,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "union",
-        args = {int.class, int.class, int.class, int.class}
-    )
     public void testUnion1() {
 
         // Both rect1 and rect2 are not empty.
@@ -251,11 +189,6 @@
         assertEquals(1, mRect.bottom);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "union",
-        args = {android.graphics.Rect.class}
-    )
     public void testUnion2() {
 
         Rect rect;
@@ -312,11 +245,6 @@
         assertEquals(1, mRect.bottom);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "union",
-        args = {int.class, int.class}
-    )
     public void testUnion3() {
 
         // rect1 is not empty (x > right, y > bottom).
@@ -353,11 +281,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "contains",
-        args = {int.class, int.class}
-    )
     public void testContains1() {
 
         mRect = new Rect(1, 1, 20, 20);
@@ -368,11 +291,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "contains",
-        args = {int.class, int.class, int.class, int.class}
-    )
     public void testContains2() {
 
         mRect = new Rect(1, 1, 20, 20);
@@ -383,11 +301,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "contains",
-        args = {android.graphics.Rect.class}
-    )
     public void testContains3() {
 
         Rect rect;
@@ -402,21 +315,11 @@
         assertFalse(mRect.contains(rect));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "width",
-        args = {}
-    )
     public void testWidth() {
         mRect = new Rect(6, 6, 10, 10);
         assertEquals(4, mRect.width());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isEmpty",
-        args = {}
-    )
     public void testIsEmpty() {
 
         mRect = new Rect();
@@ -429,11 +332,6 @@
         assertFalse(mRect.isEmpty());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "intersect",
-        args = {int.class, int.class, int.class, int.class}
-    )
     public void testIntersect1() {
 
         mRect = new Rect(0, 0, 10, 10);
@@ -451,11 +349,6 @@
         assertEquals(10, mRect.bottom);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "intersect",
-        args = {android.graphics.Rect.class}
-    )
     public void testIntersect2() {
 
         Rect rect;
@@ -477,11 +370,6 @@
         assertEquals(10, mRect.bottom);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "centerY",
-        args = {}
-    )
     public void testCenterY() {
 
         mRect = new Rect(10, 10, 20, 20);
@@ -492,18 +380,6 @@
         assertEquals(16, mRect.centerY());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "toString",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "toShortString",
-            args = {}
-        )
-    })
     public void testToString() {
         mRect = new Rect();
         assertNotNull(mRect.toString());
@@ -514,11 +390,6 @@
         assertNotNull(mRect.toShortString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "sort",
-        args = {}
-    )
     public void testSort() {
 
         mRect = new Rect(10, 10, 5, 5);
@@ -535,11 +406,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "centerX",
-        args = {}
-    )
     public void testCenterX() {
 
         mRect = new Rect(10, 10, 20, 20);
@@ -551,11 +417,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "equals",
-        args = {java.lang.Object.class}
-    )
     public void testEquals() {
 
         mRect = new Rect(1, 2, 3, 4);
@@ -566,11 +427,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "offset",
-        args = {int.class, int.class}
-    )
     public void testOffset() {
 
         mRect = new Rect(5, 5, 10, 10);
@@ -582,11 +438,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "inset",
-        args = {int.class, int.class}
-    )
     public void testInset() {
 
         mRect = new Rect(5, 5, 10, 10);
@@ -605,11 +456,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setEmpty",
-        args = {}
-    )
     public void testSetEmpty() {
 
         // Before setEmpty()
@@ -628,38 +474,16 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "exactCenterX",
-        args = {}
-    )
     public void testExactCenterX() {
         mRect = new Rect(11, 10, 20, 20);
         assertEquals(15.5f, mRect.exactCenterX());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "exactCenterY",
-        args = {}
-    )
     public void testExactCenterY() {
         mRect = new Rect(10, 11, 20, 20);
         assertEquals(15.5f, mRect.exactCenterY());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readFromParcel",
-            args = {android.os.Parcel.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeToParcel",
-            args = {android.os.Parcel.class, int.class}
-        )
-    })
     public void testAccessParcel() {
 
         Rect rect;
@@ -677,18 +501,6 @@
 
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "flattenToString",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unflattenFromString",
-            args = {java.lang.String.class}
-        )
-    })
     public void testFlattenToString() {
         Rect mRect = new Rect(1, 2, 3, 4);
         String flattenString = mRect.flattenToString();
@@ -701,11 +513,6 @@
         assertNull(rect);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
         mRect = new Rect();
         assertEquals(0, mRect.describeContents());
diff --git a/tests/tests/graphics/src/android/graphics/cts/RegionIteratorTest.java b/tests/tests/graphics/src/android/graphics/cts/RegionIteratorTest.java
index fc54464..35ce621 100644
--- a/tests/tests/graphics/src/android/graphics/cts/RegionIteratorTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/RegionIteratorTest.java
@@ -20,27 +20,13 @@
 import android.graphics.Region;
 import android.graphics.RegionIterator;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(RegionIterator.class)
 public class RegionIteratorTest extends AndroidTestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "RegionIterator",
-        args = {android.graphics.Region.class}
-    )
     public void testConstructor() {
         new RegionIterator(new Region());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "next",
-        args = {android.graphics.Rect.class}
-    )
     public void testNext() {
         Region region = new Region();
         region.set(1, 1, 10, 10);
diff --git a/tests/tests/graphics/src/android/graphics/cts/RegionTest.java b/tests/tests/graphics/src/android/graphics/cts/RegionTest.java
index 80a8879..803f3e9 100644
--- a/tests/tests/graphics/src/android/graphics/cts/RegionTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/RegionTest.java
@@ -21,12 +21,7 @@
 import android.graphics.Region;
 import android.os.Parcel;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(Region.class)
 public class RegionTest extends AndroidTestCase {
 
     // DIFFERENCE
@@ -116,28 +111,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Region",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Region",
-            args = {android.graphics.Region.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Region",
-            args = {android.graphics.Rect.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Region",
-            args = {int.class, int.class, int.class, int.class}
-        )
-    })
     public void testConstructor() {
         // Test Region()
         new Region();
@@ -154,18 +127,6 @@
         new Region(0, 0, 100, 100);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "set",
-            args = {android.graphics.Region.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBounds",
-            args = {}
-        )
-    })
     public void testSet1() {
 
         mRegion = new Region();
@@ -178,18 +139,6 @@
         assertEquals(4, mRegion.getBounds().bottom);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "set",
-            args = {android.graphics.Rect.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBounds",
-            args = {}
-        )
-    })
     public void testSet2() {
 
         mRegion = new Region();
@@ -201,18 +150,6 @@
         assertEquals(4, mRegion.getBounds().bottom);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "set",
-            args = {int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBounds",
-            args = {}
-        )
-    })
     public void testSet3() {
 
         mRegion = new Region();
@@ -223,11 +160,6 @@
         assertEquals(4, mRegion.getBounds().bottom);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isRect",
-        args = {}
-    )
     public void testIsRect() {
 
         mRegion = new Region();
@@ -236,18 +168,6 @@
         assertTrue(mRegion.isRect());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isComplex",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "set",
-            args = {int.class, int.class, int.class, int.class}
-        )
-    })
     public void testIsComplex() {
 
         // Region is null
@@ -266,11 +186,6 @@
         assertTrue(mRegion.isComplex());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "quickContains",
-        args = {android.graphics.Rect.class}
-    )
     public void testQuickContains1() {
 
         mRegion = new Region();
@@ -285,11 +200,6 @@
         assertFalse(mRegion.quickContains(rect));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "quickContains",
-        args = {int.class, int.class, int.class, int.class}
-    )
     public void testQuickContains2() {
 
         mRegion = new Region();
@@ -303,11 +213,6 @@
         assertFalse(mRegion.quickContains(1, 2, 3, 4));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "union",
-        args = {android.graphics.Rect.class}
-    )
     public void testUnion() {
 
         Rect rect1 = new Rect();
@@ -350,11 +255,6 @@
         assertPointsOutsideRegion(UNION_WITHOUT3);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "contains",
-        args = {int.class, int.class}
-    )
     public void testContains() {
 
         mRegion = new Region();
@@ -388,18 +288,6 @@
         assertTrue(mRegion.contains(7, 7));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEmpty",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isEmpty",
-            args = {}
-        )
-    })
     public void testEmpty() {
 
         mRegion = new Region();
@@ -411,11 +299,6 @@
         assertTrue(mRegion.isEmpty());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getBounds",
-        args = {android.graphics.Rect.class}
-    )
     public void testGetBounds() {
 
         // Exception
@@ -436,11 +319,6 @@
         assertFalse(mRegion.getBounds(rect2));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "op",
-        args = {android.graphics.Rect.class, android.graphics.Region.Op.class}
-    )
     public void testOp1() {
 
         Rect rect1 = new Rect();
@@ -666,11 +544,6 @@
         assertEquals(rect5, mRegion.getBounds());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "op",
-        args = {int.class, int.class, int.class, int.class, android.graphics.Region.Op.class}
-    )
     public void testOp2() {
 
         Rect rect2 = new Rect(0, 0, 20, 20);
@@ -886,11 +759,6 @@
         assertEquals(rect5, mRegion.getBounds());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "op",
-        args = {android.graphics.Region.class, android.graphics.Region.Op.class}
-    )
     public void testOp3() {
 
         Region region1 = new Region();
@@ -1116,12 +984,6 @@
         assertEquals(region5.getBounds(), mRegion.getBounds());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "op",
-        args = {android.graphics.Rect.class, android.graphics.Region.class,
-                android.graphics.Region.Op.class}
-    )
     public void testOp4() {
 
         Rect rect1 = new Rect();
@@ -1324,12 +1186,6 @@
         assertEquals(region5.getBounds(), mRegion.getBounds());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "op",
-        args = {android.graphics.Region.class, android.graphics.Region.class,
-                android.graphics.Region.Op.class}
-    )
     public void testOp5() {
 
         Region region1 = new Region();
@@ -1527,11 +1383,6 @@
         assertEquals(region5.getBounds(), mRegion.getBounds());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getBoundaryPath",
-        args = {}
-    )
     public void testGetBoundaryPath1() {
         mRegion = new Region();
         assertTrue(mRegion.getBoundaryPath().isEmpty());
@@ -1544,11 +1395,6 @@
         assertFalse(mRegion.getBoundaryPath().isEmpty());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getBoundaryPath",
-        args = {android.graphics.Path.class}
-    )
     public void testGetBoundaryPath2() {
 
         mRegion = new Region();
@@ -1573,11 +1419,6 @@
         assertTrue(mRegion.getBoundaryPath(path));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setPath",
-        args = {android.graphics.Path.class, android.graphics.Region.class}
-    )
     public void testSetPath() {
 
         mRegion = new Region();
@@ -1627,11 +1468,6 @@
         assertNotSame(unexpected.right, actual.right);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "translate",
-        args = {int.class, int.class}
-    )
     public void testTranslate1() {
 
         Rect rect1 = new Rect(0, 0, 20, 20);
@@ -1642,11 +1478,6 @@
         assertEquals(rect2, mRegion.getBounds());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "translate",
-        args = {int.class, int.class, android.graphics.Region.class}
-    )
     public void testTranslate2() {
 
         Region dst = new Region();
@@ -1660,11 +1491,6 @@
         assertEquals(rect2, dst.getBounds());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {android.os.Parcel.class, int.class}
-    )
     public void testWriteToParcel() {
 
         int flags = 0;
@@ -1688,11 +1514,6 @@
         assertEquals(oriRect.right, dst.getBounds().right);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
 
         mRegion = new Region();
@@ -1700,11 +1521,6 @@
         assertEquals(0, actual);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "quickReject",
-        args = {android.graphics.Rect.class}
-    )
     public void testQuickReject1() {
         Rect oriRect = new Rect(0, 0, 20, 20);
         Rect rect1 = new Rect();
@@ -1723,11 +1539,6 @@
         assertFalse(mRegion.quickReject(rect4));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "quickReject",
-        args = {int.class, int.class, int.class, int.class}
-    )
     public void testQuickReject2() {
         mRegion = new Region();
         // Return true if the region is empty
@@ -1740,11 +1551,6 @@
         assertFalse(mRegion.quickReject(10, 10, 30, 30));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "quickReject",
-        args = {android.graphics.Region.class}
-    )
     public void testQuickReject3() {
         Region oriRegion = new Region(0, 0, 20, 20);
         Region region1 = new Region();
diff --git a/tests/tests/graphics/src/android/graphics/cts/Region_OpTest.java b/tests/tests/graphics/src/android/graphics/cts/Region_OpTest.java
index c178917..daa7181 100644
--- a/tests/tests/graphics/src/android/graphics/cts/Region_OpTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/Region_OpTest.java
@@ -19,18 +19,9 @@
 import android.graphics.Region;
 import android.graphics.Region.Op;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(Region.Op.class)
 public class Region_OpTest extends AndroidTestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "valueOf",
-        args = {java.lang.String.class}
-    )
     public void testValueOf() {
         assertEquals(Op.DIFFERENCE, Op.valueOf("DIFFERENCE"));
         assertEquals(Op.INTERSECT, Op.valueOf("INTERSECT"));
@@ -43,11 +34,6 @@
         // Every Op element indicates one operation type.
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "values",
-        args = {}
-    )
     public void testValues() {
         // set the expected value
         Op[] expected = {
diff --git a/tests/tests/graphics/src/android/graphics/cts/ShaderTest.java b/tests/tests/graphics/src/android/graphics/cts/ShaderTest.java
index 3945ed5..5b093d2 100644
--- a/tests/tests/graphics/src/android/graphics/cts/ShaderTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/ShaderTest.java
@@ -21,34 +21,12 @@
 import android.graphics.Matrix;
 import android.graphics.Shader;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(android.graphics.Shader.class)
 public class ShaderTest extends AndroidTestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "Shader",
-        args = {}
-    )
     public void testConstructor() {
         new Shader();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setLocalMatrix",
-            args = {android.graphics.Matrix.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLocalMatrix",
-            args = {android.graphics.Matrix.class}
-        )
-    })
     public void testAccessLocalMatrix() {
         int width = 80;
         int height = 120;
diff --git a/tests/tests/graphics/src/android/graphics/cts/Shader_TileModeTest.java b/tests/tests/graphics/src/android/graphics/cts/Shader_TileModeTest.java
index 4389032..d66f9a8 100644
--- a/tests/tests/graphics/src/android/graphics/cts/Shader_TileModeTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/Shader_TileModeTest.java
@@ -19,30 +19,15 @@
 import junit.framework.TestCase;
 import android.graphics.Shader;
 import android.graphics.Shader.TileMode;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(Shader.TileMode.class)
 public class Shader_TileModeTest extends TestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "valueOf",
-        args = {java.lang.String.class}
-    )
     public void testValueOf() {
         assertEquals(TileMode.CLAMP, TileMode.valueOf("CLAMP"));
         assertEquals(TileMode.MIRROR, TileMode.valueOf("MIRROR"));
         assertEquals(TileMode.REPEAT, TileMode.valueOf("REPEAT"));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "values",
-        args = {}
-    )
     public void testValues() {
         TileMode[] tileMode = TileMode.values();
         assertEquals(3, tileMode.length);
diff --git a/tests/tests/graphics/src/android/graphics/cts/SumPathEffectTest.java b/tests/tests/graphics/src/android/graphics/cts/SumPathEffectTest.java
index c9a936a..73c034c 100644
--- a/tests/tests/graphics/src/android/graphics/cts/SumPathEffectTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/SumPathEffectTest.java
@@ -16,9 +16,6 @@
 
 package android.graphics.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
@@ -34,17 +31,11 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(SumPathEffect.class)
 public class SumPathEffectTest extends TestCase {
 
     private static final int WIDTH = 100;
     private static final int HEIGHT = 100;
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "SumPathEffect",
-        args = {android.graphics.PathEffect.class, android.graphics.PathEffect.class}
-    )
     public void testSumPathEffect() {
         Bitmap bitmap = Bitmap.createBitmap(WIDTH, HEIGHT, Config.ARGB_8888);
         bitmap.eraseColor(Color.BLACK);
diff --git a/tests/tests/graphics/src/android/graphics/cts/SweepGradientTest.java b/tests/tests/graphics/src/android/graphics/cts/SweepGradientTest.java
index c46b89e..03bd0d7 100644
--- a/tests/tests/graphics/src/android/graphics/cts/SweepGradientTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/SweepGradientTest.java
@@ -16,9 +16,6 @@
 
 package android.graphics.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
@@ -31,7 +28,6 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(SweepGradient.class)
 public class SweepGradientTest extends TestCase {
 
     private Paint mPaint;
@@ -53,11 +49,6 @@
         mCanvas = new Canvas(mBitmap);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "SweepGradient",
-        args = {float.class, float.class, int.class, int.class}
-    )
     public void test2Colors() {
         final int[] colors = new int[] { Color.GREEN, Color.RED };
         final float[] positions = new float[] { 0f, 1f };
@@ -67,11 +58,6 @@
         checkColors(colors, positions, TOLERANCE);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "SweepGradient",
-        args = {float.class, float.class, int[].class, float[].class}
-    )
     public void testColorArray() {
         final int[] colors = new int[] { Color.GREEN, Color.RED, Color.BLUE };
         final float[] positions = new float[] { 0f, 0.3f, 1f };
@@ -82,11 +68,6 @@
         checkColors(colors, positions, TOLERANCE);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "SweepGradient",
-        args = {float.class, float.class, int[].class, float[].class}
-    )
     public void testMultiColor() {
         final int[] colors = new int[] { Color.GREEN, Color.RED, Color.BLUE, Color.GREEN };
         final float[] positions = new float[] { 0f, 0.25f, 0.5f, 1f };
diff --git a/tests/tests/graphics/src/android/graphics/cts/TypefaceTest.java b/tests/tests/graphics/src/android/graphics/cts/TypefaceTest.java
index 19f3f46..5932e64 100755
--- a/tests/tests/graphics/src/android/graphics/cts/TypefaceTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/TypefaceTest.java
@@ -16,10 +16,6 @@
 
 package android.graphics.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.graphics.Typeface;
 import android.content.res.AssetFileDescriptor;
@@ -35,7 +31,6 @@
 import java.io.IOException;
 import java.io.InputStream;
 
-@TestTargetClass(android.graphics.Typeface.class)
 public class TypefaceTest extends AndroidTestCase {
 
     // generic family name for monospaced fonts
@@ -63,23 +58,6 @@
     }
 
 
-    @TestTargets ({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isBold",
-            args = {}
-        ),
-        @TestTargetNew(
-                level = TestLevel.COMPLETE,
-                method = "isItalic",
-                args = {}
-        ),
-        @TestTargetNew(
-                level = TestLevel.COMPLETE,
-                method = "getStyle",
-                args = {}
-        )
-    })
     public void testIsBold() {
         Typeface typeface = createTypeface(Typeface.BOLD);
         if (typeface != null) {
@@ -110,18 +88,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "create",
-            args = {java.lang.String.class, int.class}
-        ),
-        @TestTargetNew(
-                level = TestLevel.COMPLETE,
-                method = "create",
-                args = {android.graphics.Typeface.class, int.class}
-        )
-    })
     public void testCreate() {
         Typeface typeface = Typeface.create(DEFAULT, Typeface.NORMAL);
         assertNotNull(typeface);
@@ -136,11 +102,6 @@
         assertNotNull(typeface);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "defaultFromStyle",
-        args = {int.class}
-    )
     public void testDefaultFromStyle() {
         Typeface typeface = Typeface.defaultFromStyle(Typeface.NORMAL);
         assertNotNull(typeface);
@@ -160,11 +121,6 @@
         assertNotNull(Typeface.SERIF);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "createFromAsset",
-        args = {android.content.res.AssetManager.class, java.lang.String.class}
-    )
     public void testCreateFromAsset() {
         // input abnormal params.
         try {
@@ -178,11 +134,6 @@
         assertNotNull(typeface);
     }
 
-    @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createFromFile",
-            args = {java.io.File.class}
-    )
     public void testCreateFromFile1() throws IOException {
         // input abnormal params.
         try {
@@ -196,11 +147,6 @@
         assertNotNull(typeface);
     }
 
-    @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createFromFile",
-            args = {java.lang.String.class}
-    )
     public void testCreateFromFile2() throws IOException {
         // input abnormal params.
         try {
diff --git a/tests/tests/graphics/src/android/graphics/cts/YuvImageTest.java b/tests/tests/graphics/src/android/graphics/cts/YuvImageTest.java
index eb0b21f..f0ffc13 100755
--- a/tests/tests/graphics/src/android/graphics/cts/YuvImageTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/YuvImageTest.java
@@ -35,12 +35,7 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(YuvImage.class)
 public class YuvImageTest extends AndroidTestCase {
 
     // Coefficients are taken from jcolor.c in libjpeg.
@@ -94,11 +89,6 @@
         super.setUp();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "YuvImage",
-        args = {byte[].class, int.class, int.class, int.class, int[].class}
-    )
     public void testYuvImage(){
         int width = 100;
         int height = 100;
@@ -164,11 +154,6 @@
 
    }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "compressToJpeg",
-        args = {android.graphics.Rect.class, int.class, java.io.OutputStream.class}
-    )
     public void testCompressYuvToJpeg() {
         generateTestBitmaps(WIDTH, HEIGHT);
 
@@ -203,18 +188,6 @@
 
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getHeight",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWidth",
-            args = {}
-        )
-    })
     public void testGetHeight() {
         generateTestBitmaps(WIDTH, HEIGHT);
         YuvImage image = generateYuvImage(ImageFormat.YUY2, mTestBitmaps[0], 0);
@@ -222,11 +195,6 @@
         assertEquals(mTestBitmaps[0].getWidth(), image.getWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getYuvData",
-        args = {}
-    )
     public void testGetYuvData() {
         generateTestBitmaps(WIDTH, HEIGHT);
         int width = mTestBitmaps[0].getWidth();
@@ -242,11 +210,6 @@
         assertEquals(yuv, image.getYuvData());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getYuvFormat",
-        args = {}
-    )
     public void testGetYuvFormat() {
         generateTestBitmaps(WIDTH, HEIGHT);
         YuvImage image = generateYuvImage(ImageFormat.YUY2, mTestBitmaps[0], 0);
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/AnimationDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/AnimationDrawableTest.java
index 3edaad8..5c4bf1e 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/AnimationDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/AnimationDrawableTest.java
@@ -18,11 +18,6 @@
 
 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;
@@ -30,18 +25,17 @@
 import android.app.Activity;
 import android.content.res.Resources;
 import android.content.res.XmlResourceParser;
+import android.cts.util.PollingCheck;
 import android.graphics.drawable.AnimationDrawable;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.DrawableContainer.DrawableContainerState;
 import android.test.ActivityInstrumentationTestCase2;
 import android.util.Xml;
-import android.view.animation.cts.DelayedCheck;
 import android.widget.ImageView;
 import android.widget.cts.ImageViewStubActivity;
 
 import java.io.IOException;
 
-@TestTargetClass(AnimationDrawable.class)
 public class AnimationDrawableTest extends ActivityInstrumentationTestCase2<ImageViewStubActivity> {
     private static final int FRAMES_COUNT        = 3;
     private static final int FIRST_FRAME_INDEX   = 0;
@@ -77,12 +71,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "AnimationDrawable",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testConstructor() {
         mAnimationDrawable = new AnimationDrawable();
         // Check the values set in the constructor
@@ -91,11 +79,6 @@
         assertTrue(mAnimationDrawable.isOneShot());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setVisible",
-        args = {boolean.class, boolean.class}
-    )
     public void testSetVisible() throws Throwable {
         assertTrue(mAnimationDrawable.isVisible());
         runTestOnUiThread(new Runnable() {
@@ -107,7 +90,7 @@
         assertSame(mAnimationDrawable.getFrame(FIRST_FRAME_INDEX),
                 mAnimationDrawable.getCurrent());
 
-        delayedCheckDrawable(SECOND_FRAME_INDEX, FIRST_FRAME_DURATION);
+        pollingCheckDrawable(SECOND_FRAME_INDEX, FIRST_FRAME_DURATION);
 
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -129,23 +112,6 @@
         assertStoppedAnimation(FIRST_FRAME_INDEX, FIRST_FRAME_DURATION);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "start",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isRunning",
-            args = {}
-        )
-    })
     public void testStart() throws Throwable {
         // animation should play repeat if do not stop it.
         assertFalse(mAnimationDrawable.isOneShot());
@@ -159,7 +125,7 @@
         assertTrue(mAnimationDrawable.isRunning());
         assertSame(mAnimationDrawable.getFrame(FIRST_FRAME_INDEX),
                 mAnimationDrawable.getCurrent());
-        delayedCheckDrawable(SECOND_FRAME_INDEX, FIRST_FRAME_DURATION);
+        pollingCheckDrawable(SECOND_FRAME_INDEX, FIRST_FRAME_DURATION);
 
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -167,7 +133,7 @@
                 mAnimationDrawable.start();
             }
         });
-        delayedCheckDrawable(THIRD_FRAME_INDEX, SECOND_FRAME_DURATION);
+        pollingCheckDrawable(THIRD_FRAME_INDEX, SECOND_FRAME_DURATION);
 
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -187,20 +153,10 @@
         assertStoppedAnimation(THIRD_FRAME_INDEX, THIRD_FRAME_DURATION);
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "run",
-        args = {}
-    )
     public void testRun() {
         // This method should not be called directly.
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "unscheduleSelf",
-        args = {java.lang.Runnable.class}
-    )
     public void testUnscheduleSelf() throws Throwable {
         assertFalse(mAnimationDrawable.isRunning());
         runTestOnUiThread(new Runnable() {
@@ -210,7 +166,7 @@
         });
 
         assertTrue(mAnimationDrawable.isRunning());
-        delayedCheckDrawable(SECOND_FRAME_INDEX, FIRST_FRAME_DURATION);
+        pollingCheckDrawable(SECOND_FRAME_INDEX, FIRST_FRAME_DURATION);
 
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -221,20 +177,6 @@
         assertStoppedAnimation(SECOND_FRAME_INDEX, SECOND_FRAME_DURATION);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getNumberOfFrames",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addFrame",
-            args = {android.graphics.drawable.Drawable.class, int.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of "
-        + "AnimationDrawable#addFrame(Drawable, int) when param frame is null")
     public void testGetNumberOfFrames() {
         assertEquals(FRAMES_COUNT, mAnimationDrawable.getNumberOfFrames());
 
@@ -254,13 +196,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getFrame",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of "
-            + "AnimationDrawable#getFrame(int) when param index is out of bounds")
     public void testGetFrame() {
         Drawable frame = mAnimationDrawable.getFrame(FIRST_FRAME_INDEX);
         Drawable drawable = mResources.getDrawable(R.drawable.testimage);
@@ -294,13 +229,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getDuration",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of "
-            + "AnimationDrawable#getDuration(int) when param index is out of bounds")
     public void testGetDuration() {
         assertEquals(FIRST_FRAME_DURATION, mAnimationDrawable.getDuration(FIRST_FRAME_INDEX));
         assertEquals(SECOND_FRAME_DURATION, mAnimationDrawable.getDuration(SECOND_FRAME_INDEX));
@@ -322,18 +250,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isOneShot",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOneShot",
-            args = {boolean.class}
-        )
-    })
     public void testAccessOneShot() throws Throwable {
         // animation should play repeat if do not stop it.
         assertFalse(mAnimationDrawable.isOneShot());
@@ -342,10 +258,10 @@
                 mAnimationDrawable.start();
             }
         });
-        delayedCheckDrawable(SECOND_FRAME_INDEX, FIRST_FRAME_DURATION);
-        delayedCheckDrawable(THIRD_FRAME_INDEX, SECOND_FRAME_DURATION);
+        pollingCheckDrawable(SECOND_FRAME_INDEX, FIRST_FRAME_DURATION);
+        pollingCheckDrawable(THIRD_FRAME_INDEX, SECOND_FRAME_DURATION);
         // begin to repeat
-        delayedCheckDrawable(FIRST_FRAME_INDEX, THIRD_FRAME_DURATION);
+        pollingCheckDrawable(FIRST_FRAME_INDEX, THIRD_FRAME_DURATION);
 
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -355,19 +271,12 @@
                 mAnimationDrawable.start();
             }
         });
-        delayedCheckDrawable(SECOND_FRAME_INDEX, FIRST_FRAME_DURATION);
-        delayedCheckDrawable(THIRD_FRAME_INDEX, SECOND_FRAME_DURATION);
+        pollingCheckDrawable(SECOND_FRAME_INDEX, FIRST_FRAME_DURATION);
+        pollingCheckDrawable(THIRD_FRAME_INDEX, SECOND_FRAME_DURATION);
         // do not repeat
         assertStoppedAnimation(THIRD_FRAME_INDEX, THIRD_FRAME_DURATION);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "inflate",
-        args = {android.content.res.Resources.class, org.xmlpull.v1.XmlPullParser.class,
-                android.util.AttributeSet.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testInflate() throws XmlPullParserException, IOException {
         mAnimationDrawable = new AnimationDrawable();
         DrawableContainerState drawableContainerState =
@@ -412,15 +321,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "inflate",
-        args = {android.content.res.Resources.class, org.xmlpull.v1.XmlPullParser.class,
-                android.util.AttributeSet.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of "
-            + "AnimationDrawable#inflate(Resources, XmlPullParser, AttributeSet) "
-            + "when param r, parser or attrs is null")
     public void testInflateWithNullParameters() throws XmlPullParserException, IOException {
         XmlResourceParser parser = getResourceParser(R.drawable.animationdrawable);
         try {
@@ -445,12 +345,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        method = "mutate",
-        args = {}
-    )
-    @ToBeFixed(bug = "", explanation = "mutate always throws out NullPointerException")
     public void testMutate() {
         AnimationDrawable d1 = (AnimationDrawable) mResources
                 .getDrawable(R.drawable.animationdrawable);
@@ -471,12 +365,12 @@
     }
 
     /**
-     * Delayed check specific frame should be current one in timeout.
+     * Polling check specific frame should be current one in timeout.
      * @param index - expected index of frame.
      * @param timeout - timeout.
      */
-    private void delayedCheckDrawable(final int index, long timeout) {
-        new DelayedCheck(timeout + TOLERANCE) {
+    private void pollingCheckDrawable(final int index, long timeout) {
+        new PollingCheck(timeout + TOLERANCE) {
             Drawable expected = mAnimationDrawable.getFrame(index);
             @Override
             protected boolean check() {
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/BitmapDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/BitmapDrawableTest.java
index 5e9e88d..c3217f1 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/BitmapDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/BitmapDrawableTest.java
@@ -18,11 +18,6 @@
 
 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;
 
@@ -48,7 +43,6 @@
 import java.io.IOException;
 import java.io.InputStream;
 
-@TestTargetClass(android.graphics.drawable.BitmapDrawable.class)
 public class BitmapDrawableTest extends InstrumentationTestCase {
     // The target context.
     private Context mContext;
@@ -59,58 +53,6 @@
         mContext = getInstrumentation().getTargetContext();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "BitmapDrawable",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "BitmapDrawable",
-            args = {android.content.res.Resources.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "BitmapDrawable",
-            args = {android.graphics.Bitmap.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "BitmapDrawable",
-            args = {android.content.res.Resources.class, android.graphics.Bitmap.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "BitmapDrawable",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "BitmapDrawable",
-            args = {android.content.res.Resources.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "BitmapDrawable",
-            args = {java.io.InputStream.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "BitmapDrawable",
-            args = {android.content.res.Resources.class, java.io.InputStream.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPaint",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBitmap",
-            args = {}
-        )
-    })
     @SuppressWarnings("deprecation")
     public void testConstructor() {
         // TODO: should default paint flags be left as an untested implementation detail?
@@ -149,18 +91,6 @@
         new BitmapDrawable((InputStream) null);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getGravity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setGravity",
-            args = {int.class}
-        )
-    })
     public void testAccessGravity() {
         InputStream source = mContext.getResources().openRawResource(R.raw.testimage);
         BitmapDrawable bitmapDrawable = new BitmapDrawable(source);
@@ -177,11 +107,6 @@
         assertEquals(Integer.MAX_VALUE, bitmapDrawable.getGravity());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setAntiAlias",
-        args = {boolean.class}
-    )
     public void testSetAntiAlias() {
         InputStream source = mContext.getResources().openRawResource(R.raw.testimage);
         BitmapDrawable bitmapDrawable = new BitmapDrawable(source);
@@ -195,11 +120,6 @@
         assertFalse(bitmapDrawable.getPaint().isAntiAlias());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setFilterBitmap",
-        args = {boolean.class}
-    )
     public void testSetFilterBitmap() {
         InputStream source = mContext.getResources().openRawResource(R.raw.testimage);
         BitmapDrawable bitmapDrawable = new BitmapDrawable(source);
@@ -213,11 +133,6 @@
         assertTrue(bitmapDrawable.getPaint().isFilterBitmap());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setDither",
-        args = {boolean.class}
-    )
     public void testSetDither() {
         InputStream source = mContext.getResources().openRawResource(R.raw.testimage);
         BitmapDrawable bitmapDrawable = new BitmapDrawable(source);
@@ -232,33 +147,6 @@
 
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTileModeX",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTileModeY",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTileModeX",
-            args = {android.graphics.Shader.TileMode.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTileModeY",
-            args = {android.graphics.Shader.TileMode.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTileModeXY",
-            args = {android.graphics.Shader.TileMode.class, android.graphics.Shader.TileMode.class}
-        )
-    })
     public void testAccessTileMode() {
         InputStream source = mContext.getResources().openRawResource(R.raw.testimage);
         BitmapDrawable bitmapDrawable = new BitmapDrawable(source);
@@ -299,11 +187,6 @@
         assertNotSame(oldShader, bitmapDrawable.getPaint().getShader());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getChangingConfigurations",
-        args = {}
-    )
     public void testGetChangingConfigurations() {
         InputStream source = mContext.getResources().openRawResource(R.raw.testimage);
         BitmapDrawable bitmapDrawable = new BitmapDrawable(source);
@@ -317,22 +200,12 @@
         assertEquals(2, bitmapDrawable.getChangingConfigurations());
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onBoundsChange",
-        args = {android.graphics.Rect.class}
-    )
     public void testOnBoundsChange() {
         // Do not test this API. it is callbacks which:
         // 1. The callback machanism has been tested in super class
         // 2. The functionality is implmentation details, no need to test
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setAlpha",
-        args = {int.class}
-    )
     public void testSetAlpha() {
         InputStream source = mContext.getResources().openRawResource(R.raw.testimage);
         BitmapDrawable bitmapDrawable = new BitmapDrawable(source);
@@ -353,11 +226,6 @@
         assertEquals(0, bitmapDrawable.getPaint().getAlpha());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setColorFilter",
-        args = {android.graphics.ColorFilter.class}
-    )
     public void testSetColorFilter() {
         InputStream source = mContext.getResources().openRawResource(R.raw.testimage);
         BitmapDrawable bitmapDrawable = new BitmapDrawable(source);
@@ -372,11 +240,6 @@
         assertNull(bitmapDrawable.getPaint().getColorFilter());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getOpacity",
-        args = {}
-    )
     public void testGetOpacity() {
         BitmapDrawable bitmapDrawable = new BitmapDrawable();
         assertEquals(Gravity.FILL, bitmapDrawable.getGravity());
@@ -396,11 +259,6 @@
         assertEquals(PixelFormat.TRANSLUCENT, bitmapDrawable.getOpacity());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getConstantState",
-        args = {}
-    )
     public void testGetConstantState() {
         InputStream source = mContext.getResources().openRawResource(R.raw.testimage);
         BitmapDrawable bitmapDrawable = new BitmapDrawable(source);
@@ -414,18 +272,6 @@
         assertEquals(1, constantState.getChangingConfigurations());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIntrinsicWidth",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIntrinsicHeight",
-            args = {}
-        )
-    })
     @SuppressWarnings("deprecation")
     public void testGetIntrinsicSize() {
         BitmapDrawable bitmapDrawable = new BitmapDrawable();
@@ -445,18 +291,6 @@
         assertEquals(48, bitmapDrawable.getIntrinsicHeight());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTargetDensity",
-            args = {android.graphics.Canvas.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTargetDensity",
-            args = {android.util.DisplayMetrics.class}
-        )
-    })
     @SuppressWarnings("deprecation")
     public void testSetTargetDensity() {
         BitmapDrawable bitmapDrawable = new BitmapDrawable();
@@ -477,14 +311,6 @@
         assertEquals(48, bitmapDrawable.getIntrinsicHeight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "inflate",
-        args = {android.content.res.Resources.class, org.xmlpull.v1.XmlPullParser.class,
-                android.util.AttributeSet.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for draw() is incomplete." +
-            "1. not clear what is supposed to happen if the Resource is null.")
     @SuppressWarnings("deprecation")
     public void testInflate() throws IOException, XmlPullParserException {
         BitmapDrawable bitmapDrawable = new BitmapDrawable();
@@ -544,13 +370,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "draw",
-        args = {android.graphics.Canvas.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for draw() is incomplete." +
-            "1. not clear what is supposed to happen if canvas is null.")
     public void testDraw() {
         InputStream source = mContext.getResources().openRawResource(R.raw.testimage);
         BitmapDrawable bitmapDrawable = new BitmapDrawable(source);
@@ -566,11 +385,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "mutate",
-        args = {}
-    )
     public void testMutate() {
         Resources resources = mContext.getResources();
         BitmapDrawable d1 = (BitmapDrawable) resources.getDrawable(R.drawable.testimage);
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 8a5d7aa..33d81f3 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/ClipDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/ClipDrawableTest.java
@@ -38,19 +38,8 @@
 import android.util.StateSet;
 import android.util.Xml;
 import android.view.Gravity;
-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 {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test Constructor",
-        method = "ClipDrawable",
-        args = {android.graphics.drawable.Drawable.class, int.class, int.class}
-    )
     @SuppressWarnings("deprecation")
     public void testClipDrawable() {
         new ClipDrawable((Drawable) null, Gravity.BOTTOM, ClipDrawable.HORIZONTAL);
@@ -59,14 +48,6 @@
         new ClipDrawable(bmpDrawable, Gravity.BOTTOM, ClipDrawable.HORIZONTAL);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test draw(Canvas)",
-        method = "draw",
-        args = {android.graphics.Canvas.class}
-    )
-    @ToBeFixed(bug = "1400249", explanation = "It will be tested by functional test, " +
-            "and NPE is not expected.")
     public void testDraw() {
         MockDrawable mockDrawable = new MockDrawable();
         mockDrawable.setLevel(5000);
@@ -85,12 +66,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getChangingConfigurations()",
-        method = "getChangingConfigurations",
-        args = {}
-    )
     public void testGetChangingConfigurations() {
         MockDrawable mockDrawable = new MockDrawable();
         ClipDrawable clipDrawable = new ClipDrawable(mockDrawable,
@@ -107,12 +82,6 @@
         assertEquals(3, clipDrawable.getChangingConfigurations());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getConstantState()",
-        method = "getConstantState",
-        args = {}
-    )
     public void testGetConstantState() {
         MockDrawable mockDrawable = new MockDrawable();
         ClipDrawable clipDrawable = new ClipDrawable(mockDrawable,
@@ -126,12 +95,6 @@
         assertEquals(1, clipDrawable.getConstantState().getChangingConfigurations());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getIntrinsicHeight()",
-        method = "getIntrinsicHeight",
-        args = {}
-    )
     @SuppressWarnings("deprecation")
     public void testGetIntrinsicHeight() {
         MockDrawable mockDrawable = new MockDrawable();
@@ -146,12 +109,6 @@
         assertEquals(50, clipDrawable.getIntrinsicHeight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getIntrinsicWidth()",
-        method = "getIntrinsicWidth",
-        args = {}
-    )
     @SuppressWarnings("deprecation")
     public void testGetIntrinsicWidth() {
         MockDrawable mockDrawable = new MockDrawable();
@@ -166,12 +123,6 @@
         assertEquals(100, clipDrawable.getIntrinsicWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getOpacity()",
-        method = "getOpacity",
-        args = {}
-    )
     @SuppressWarnings("deprecation")
     public void testGetOpacity() {
         BitmapDrawable bmpDrawable =
@@ -186,13 +137,6 @@
         assertEquals(PixelFormat.TRANSLUCENT, clipDrawable.getOpacity());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getPadding(Rect)",
-        method = "getPadding",
-        args = {android.graphics.Rect.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "NPE is not expected.")
     public void testGetPadding() {
         MockDrawable mockDrawable = new MockDrawable();
         ClipDrawable clipDrawable = new ClipDrawable(mockDrawable,
@@ -211,13 +155,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test inflate(Resources, XmlPullParser, AttributeSet)",
-        method = "inflate",
-        args = {android.content.res.Resources.class, org.xmlpull.v1.XmlPullParser.class,
-                android.util.AttributeSet.class}
-    )
     @SuppressWarnings("deprecation")
     public void testInflate() throws XmlPullParserException, IOException {
         BitmapDrawable bmpDrawable = new BitmapDrawable();
@@ -229,12 +166,6 @@
         clipDrawable.inflate(mContext.getResources(), parser, attrs);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test invalidateDrawable(Drawable)",
-        method = "invalidateDrawable",
-        args = {android.graphics.drawable.Drawable.class}
-    )
     public void testInvalidateDrawable() {
         MockDrawable mockDrawable = new MockDrawable();
         ClipDrawable clipDrawable = new ClipDrawable(mockDrawable,
@@ -247,12 +178,6 @@
         clipDrawable.invalidateDrawable(null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test isStateful()",
-        method = "isStateful",
-        args = {}
-    )
     @SuppressWarnings("deprecation")
     public void testIsStateful() {
         MockDrawable mockDrawable = new MockDrawable();
@@ -266,13 +191,6 @@
         assertFalse(clipDrawable.isStateful());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test onBoundsChange(Rect)",
-        method = "onBoundsChange",
-        args = {android.graphics.Rect.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "NPE is not expected.")
     public void testOnBoundsChange() {
         MockDrawable mockDrawable = new MockDrawable();
         MockClipDrawable mockClipDrawable = new MockClipDrawable(mockDrawable,
@@ -294,12 +212,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test onLevelChange(int)",
-        method = "onLevelChange",
-        args = {int.class}
-    )
     public void testOnLevelChange() {
         MockDrawable mockDrawable = new MockDrawable();
         MockClipDrawable mockClipDrawable = new MockClipDrawable(mockDrawable,
@@ -319,12 +231,6 @@
         assertEquals(10000, mockDrawable.getLevel());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test onStateChange(int[])",
-        method = "onStateChange",
-        args = {int[].class}
-    )
     public void testOnStateChange() {
         MockDrawable mockDrawable = new MockDrawable();
         MockClipDrawable mockClipDrawable = new MockClipDrawable(mockDrawable,
@@ -338,12 +244,6 @@
         mockClipDrawable.onStateChange(null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test scheduleDrawable(Drawable, Runnable, long)",
-        method = "scheduleDrawable",
-        args = {android.graphics.drawable.Drawable.class, java.lang.Runnable.class, long.class}
-    )
     public void testScheduleDrawable() {
         MockDrawable mockDrawable = new MockDrawable();
         ClipDrawable clipDrawable = new ClipDrawable(mockDrawable,
@@ -356,12 +256,6 @@
         assertEquals(1000L, callback.getWhen());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test setAlpha(int)",
-        method = "setAlpha",
-        args = {int.class}
-    )
     public void testSetAlpha() {
         MockDrawable mockDrawable = new MockDrawable();
         ClipDrawable clipDrawable = new ClipDrawable(mockDrawable,
@@ -377,12 +271,6 @@
         assertEquals(255, mockDrawable.getAlpha());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test setColorFilter(ColorFilter)",
-        method = "setColorFilter",
-        args = {android.graphics.ColorFilter.class}
-    )
     public void testSetColorFilter() {
         MockDrawable mockDrawable = new MockDrawable();
         ClipDrawable clipDrawable = new ClipDrawable(mockDrawable,
@@ -396,12 +284,6 @@
         assertNull(mockDrawable.getColorFilter());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test setVisible(boolean, boolean)",
-        method = "setVisible",
-        args = {boolean.class, boolean.class}
-    )
     public void testSetVisible() {
         MockDrawable mockDrawable = new MockDrawable();
         ClipDrawable clipDrawable = new ClipDrawable(mockDrawable,
@@ -418,12 +300,6 @@
         assertTrue(clipDrawable.isVisible());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test unscheduleDrawable(Drawable, Runnable)",
-        method = "unscheduleDrawable",
-        args = {android.graphics.drawable.Drawable.class, java.lang.Runnable.class}
-    )
     public void testUnscheduleDrawable() {
         MockDrawable mockDrawable = new MockDrawable();
         ClipDrawable clipDrawable = new ClipDrawable(mockDrawable,
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/ColorDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/ColorDrawableTest.java
index af0fbf5..1267885 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/ColorDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/ColorDrawableTest.java
@@ -18,11 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
@@ -39,52 +34,16 @@
 
 import java.io.IOException;
 
-@TestTargetClass(android.graphics.drawable.ColorDrawable.class)
 public class ColorDrawableTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Constructors",
-            method = "ColorDrawable",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Constructors",
-            method = "ColorDrawable",
-            args = {int.class}
-        )
-    })
     public void testConstructors() {
         new ColorDrawable();
         new ColorDrawable(0);
         new ColorDrawable(1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test draw(Canvas)",
-        method = "draw",
-        args = {android.graphics.Canvas.class}
-    )
-    @ToBeFixed(bug = "1400249", explanation = "It will be tested by functional test.")
     public void testDraw() {
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getAlpha() and setAlpha(int)",
-            method = "getAlpha",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getAlpha() and setAlpha(int)",
-            method = "setAlpha",
-            args = {int.class}
-        )
-    })
     public void testAccessAlpha() {
         ColorDrawable colorDrawable = new ColorDrawable();
         assertEquals(0, colorDrawable.getAlpha());
@@ -102,12 +61,6 @@
         assertEquals(1, colorDrawable.getAlpha());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getChangingConfigurations()",
-        method = "getChangingConfigurations",
-        args = {}
-    )
     public void testGetChangingConfigurations() {
         final ColorDrawable colorDrawable = new ColorDrawable();
         assertEquals(0, colorDrawable.getChangingConfigurations());
@@ -122,12 +75,6 @@
         assertEquals(Integer.MAX_VALUE, colorDrawable.getChangingConfigurations());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getConstantState()",
-        method = "getConstantState",
-        args = {}
-    )
     public void testGetConstantState() {
         final ColorDrawable colorDrawable = new ColorDrawable();
         assertNotNull(colorDrawable.getConstantState());
@@ -135,12 +82,6 @@
                 colorDrawable.getConstantState().getChangingConfigurations());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getOpacity()",
-        method = "getOpacity",
-        args = {}
-    )
     public void testGetOpacity() {
         ColorDrawable colorDrawable = new ColorDrawable();
         assertEquals(PixelFormat.TRANSPARENT, colorDrawable.getOpacity());
@@ -152,13 +93,6 @@
         assertEquals(PixelFormat.TRANSLUCENT, colorDrawable.getOpacity());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test inflate(Resources, XmlPullParser, AttributeSet)",
-        method = "inflate",
-        args = {android.content.res.Resources.class, org.xmlpull.v1.XmlPullParser.class, 
-                android.util.AttributeSet.class}
-    )
     public void testInflate() throws XmlPullParserException, IOException {
         int eventType = -1;
         final ColorDrawable colorDrawable = new ColorDrawable();
@@ -185,12 +119,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test setColorFilter(ColorFilter)",
-        method = "setColorFilter",
-        args = {android.graphics.ColorFilter.class}
-    )
     public void testSetColorFilter() {
         final ColorDrawable colorDrawable = new ColorDrawable();
 
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableContainerStateTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableContainerStateTest.java
index bfe3ec7..2adc587 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableContainerStateTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableContainerStateTest.java
@@ -16,11 +16,6 @@
 
 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 android.graphics.Canvas;
 import android.graphics.ColorFilter;
@@ -33,7 +28,6 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(DrawableContainerState.class)
 public class DrawableContainerStateTest extends TestCase{
     private DrawableContainerState mDrawableContainerState;
 
@@ -50,25 +44,6 @@
         assertNotNull(mDrawableContainerState);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addChild",
-            args = {android.graphics.drawable.Drawable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getChildCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getChildren",
-            args = {}
-        )
-    })
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "DrawableContainerState#addChild(int) when param dr is null")
     public void testAddChild() {
         try {
             mDrawableContainerState.addChild(null);
@@ -113,12 +88,6 @@
         assertSame(dr1, children[2]);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Drawables should not dynamically change statefulness",
-        method = "isStateful",
-        args = {}
-    )
     public void testIsStateFul() {
         assertEquals(0, mDrawableContainerState.getChildCount());
         assertFalse(mDrawableContainerState.isStateful());
@@ -148,18 +117,6 @@
         assertTrue(mDrawableContainerState.isStateful());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isConstantSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setConstantSize",
-            args = {boolean.class}
-        )
-    })
     public void testAccessConstantSize() {
         mDrawableContainerState.setConstantSize(true);
         assertTrue(mDrawableContainerState.isConstantSize());
@@ -168,19 +125,6 @@
         assertFalse(mDrawableContainerState.isConstantSize());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "setVariablePadding",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            notes = "Dynamically changing a child's padding does not change this value",
-            method = "getConstantPadding",
-            args = {}
-        )
-    })
     public void testAccessConstantPadding() {
         mDrawableContainerState.setVariablePadding(true);
         assertNull(mDrawableContainerState.getConstantPadding());
@@ -213,32 +157,6 @@
         */
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Dynamically changing a child's height does not change this value",
-            method = "getConstantHeight",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Dynamically changing a child's width does not change this value",
-            method = "getConstantWidth",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Dynamically changing a child's minimum height does not change this value",
-            method = "getConstantMinimumHeight",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Dynamically changing a child's minimum width does not change this value",
-            method = "getConstantMinimumWidth",
-            args = {}
-        )
-    })
     public void testConstantHeightsAndWidths() {
         assertEquals(0, mDrawableContainerState.getChildCount());
         assertEquals(-1, mDrawableContainerState.getConstantHeight());
@@ -283,12 +201,6 @@
         assertEquals(5, mDrawableContainerState.getConstantMinimumWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Dynamically changing a child's opacity does not change this value",
-        method = "getOpacity",
-        args = {}
-    )
     public void testGetOpacity() {
         assertEquals(0, mDrawableContainerState.getChildCount());
         assertEquals(PixelFormat.TRANSPARENT, mDrawableContainerState.getOpacity());
@@ -324,36 +236,12 @@
         assertEquals(PixelFormat.UNKNOWN, mDrawableContainerState.getOpacity());
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        method = "canConstantState",
-        args = {}
-    )
-    @ToBeFixed(bug = "", explanation = "This method is not final. It is not guaranteed that the "
-            + "subclass has exactly the same behavior as super class. Can not use the object of "
-            + "subclass of DrawableContainerState to test.")
     public void testCanConstantState(){
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        method = "getChangingConfigurations",
-        args = {}
-    )
-    @ToBeFixed(bug = "", explanation = "This method is not final. It is not guaranteed that the "
-            + "subclass has exactly the same behavior as super class. Can not use the object of "
-            + "subclass of DrawableContainerState to test.")
     public void testGetChangingConfigurations(){
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        method = "growArray",
-        args = {int.class, int.class}
-    )
-    @ToBeFixed(bug = "", explanation = "This method is not final. It is not guaranteed that the "
-            + "subclass has exactly the same behavior as super class. Can not use the object of "
-            + "subclass of DrawableContainerState to test.")
     public void testGrowArray(){
     }
 
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 9191cac..d2c2244 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableContainerTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableContainerTest.java
@@ -28,13 +28,7 @@
 import android.graphics.drawable.DrawableContainer;
 import android.graphics.drawable.DrawableContainer.DrawableContainerState;
 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 {
     private DrawableContainerState mDrawableContainerState;
 
@@ -52,11 +46,6 @@
         mDrawableContainer = new MockDrawableContainer();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "draw",
-        args = {android.graphics.Canvas.class}
-    )
     public void testDraw() {
         assertConstantStateNotSet();
         assertNull(mDrawableContainer.getCurrent());
@@ -77,13 +66,6 @@
         assertTrue(dr.hasDrawCalled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getChangingConfigurations",
-        args = {}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "DrawableContainer#getChangingConfigurations() when the constant state is not set.")
     public void testGetChangingConfigurations() {
         assertConstantStateNotSet();
 
@@ -109,14 +91,6 @@
                 mDrawableContainer.getChangingConfigurations());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getPadding",
-        args = {android.graphics.Rect.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "DrawableContainer#getPadding(Rect) when the constant state is not set "
-            + "or the param padding is null.")
     public void testGetPadding() {
         assertConstantStateNotSet();
         assertNull(mDrawableContainer.getCurrent());
@@ -165,11 +139,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setAlpha",
-        args = {int.class}
-    )
     public void testSetAlpha() {
         assertConstantStateNotSet();
         assertNull(mDrawableContainer.getCurrent());
@@ -191,11 +160,6 @@
         assertFalse(dr.hasSetAlphaCalled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setDither",
-        args = {boolean.class}
-    )
     public void testSetDither() {
         assertConstantStateNotSet();
         assertNull(mDrawableContainer.getCurrent());
@@ -218,11 +182,6 @@
         assertTrue(dr.hasSetDitherCalled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setColorFilter",
-        args = {android.graphics.ColorFilter.class}
-    )
     public void testSetColorFilter() {
         assertConstantStateNotSet();
         assertNull(mDrawableContainer.getCurrent());
@@ -245,13 +204,6 @@
         assertTrue(dr.hasSetColorFilterCalled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onBoundsChange",
-        args = {android.graphics.Rect.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "DrawableContainer#onBoundsChange(Rect) when the param bounds is null.")
     public void testOnBoundsChange() {
         assertConstantStateNotSet();
         assertNull(mDrawableContainer.getCurrent());
@@ -283,13 +235,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isStateful",
-        args = {}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "DrawableContainer#isStateful() when the constant state is not set.")
     public void testIsStateful() {
         assertConstantStateNotSet();
 
@@ -316,11 +261,6 @@
         assertEquals(true, mDrawableContainer.isStateful());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onStateChange",
-        args = {int[].class}
-    )
     public void testOnStateChange() {
         assertConstantStateNotSet();
         assertNull(mDrawableContainer.getCurrent());
@@ -351,11 +291,6 @@
         assertTrue(Arrays.equals(new int[] { 0 }, dr.getState()));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onLevelChange",
-        args = {int.class}
-    )
     public void testOnLevelChange() {
         assertConstantStateNotSet();
         assertNull(mDrawableContainer.getCurrent());
@@ -388,13 +323,6 @@
         assertFalse(dr.hasOnLevelChangedCalled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getIntrinsicWidth",
-        args = {}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "DrawableContainer#getIntrinsicWidth() when the constant state is not set.")
     public void testGetIntrinsicWidth() {
         assertConstantStateNotSet();
 
@@ -429,13 +357,6 @@
         assertEquals(1, mDrawableContainer.getIntrinsicWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getIntrinsicHeight",
-        args = {}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "DrawableContainer#getIntrinsicHeight() when the constant state is not set.")
     public void testGetIntrinsicHeight() {
         assertConstantStateNotSet();
 
@@ -470,13 +391,6 @@
         assertEquals(1, mDrawableContainer.getIntrinsicHeight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getMinimumWidth",
-        args = {}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "DrawableContainer#getMinimumWidth() when the constant state is not set.")
     public void testGetMinimumWidth() {
         assertConstantStateNotSet();
 
@@ -511,13 +425,6 @@
         assertEquals(1, mDrawableContainer.getMinimumWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getMinimumHeight",
-        args = {}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "DrawableContainer#getMinimumHeight() when the constant state is not set.")
     public void testGetMinimumHeight() {
         assertConstantStateNotSet();
 
@@ -552,11 +459,6 @@
         assertEquals(1, mDrawableContainer.getMinimumHeight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "invalidateDrawable",
-        args = {android.graphics.drawable.Drawable.class}
-    )
     public void testInvalidateDrawable() {
         assertConstantStateNotSet();
         assertNull(mDrawableContainer.getCurrent());
@@ -596,11 +498,6 @@
         assertTrue(callback.hasInvalidateDrawableCalled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "scheduleDrawable",
-        args = {android.graphics.drawable.Drawable.class, java.lang.Runnable.class, long.class}
-    )
     public void testScheduleDrawable() {
         assertConstantStateNotSet();
         assertNull(mDrawableContainer.getCurrent());
@@ -649,11 +546,6 @@
         assertTrue(callback.hasScheduleDrawableCalled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "unscheduleDrawable",
-        args = {android.graphics.drawable.Drawable.class, java.lang.Runnable.class}
-    )
     public void testUnscheduleDrawable() {
         assertConstantStateNotSet();
         assertNull(mDrawableContainer.getCurrent());
@@ -702,11 +594,6 @@
         assertTrue(callback.hasUnscheduleDrawableCalled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setVisible",
-        args = {boolean.class, boolean.class}
-    )
     public void testSetVisible() {
         assertConstantStateNotSet();
         assertNull(mDrawableContainer.getCurrent());
@@ -729,13 +616,6 @@
         assertFalse(dr.isVisible());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getOpacity",
-        args = {}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "Should document default return value"
-        + " when the container is empty")
     public void testGetOpacity() {
         assertConstantStateNotSet();
 
@@ -762,20 +642,6 @@
         assertEquals(PixelFormat.TRANSLUCENT, mDrawableContainer.getOpacity());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "selectDrawable",
-            args = {int.class}
-        )
-    })
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "DrawableContainer#selectDrawable(int) when the constant state is not set.")
     public void testAccessCurrentDrawable() {
         assertConstantStateNotSet();
 
@@ -820,20 +686,6 @@
         assertFalse(dr1.isVisible());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setConstantState",
-            args = {android.graphics.drawable.DrawableContainer.DrawableContainerState.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getConstantState",
-            args = {}
-        )
-    })
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "DrawableContainer#getConstantState() when the constant state is not set.")
     public void testAccessConstantState() {
         try {
             mDrawableContainer.getConstantState();
@@ -848,11 +700,6 @@
         assertConstantStateNotSet();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "mutate",
-        args = {}
-    )
     public void testMutate() {
         assertConstantStateNotSet();
         try {
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 97f160f..f14f59f 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/DrawableTest.java
@@ -44,13 +44,7 @@
 import android.util.StateSet;
 import android.util.TypedValue;
 import android.util.Xml;
-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 {
     Resources mResources;
 
@@ -61,11 +55,6 @@
         mResources = mContext.getResources();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clearColorFilter",
-        args = {}
-    )
     public void testClearColorFilter() {
         MockDrawable mockDrawable = new MockDrawable();
         mockDrawable.clearColorFilter();
@@ -79,19 +68,6 @@
         assertNull(mockDrawable.getColorFilter());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "copyBounds",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "copyBounds",
-            args = {android.graphics.Rect.class}
-        )
-    })
-    @ToBeFixed(bug = "1417734", explanation = "NPE is not expected.")
     public void testCopyBounds() {
         MockDrawable mockDrawable = new MockDrawable();
         Rect rect1 = mockDrawable.copyBounds();
@@ -139,11 +115,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "createFromPath",
-        args = {java.lang.String.class}
-    )
     public void testCreateFromPath() throws IOException {
         assertNull(Drawable.createFromPath(null));
 
@@ -185,11 +156,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "createFromStream",
-        args = {java.io.InputStream.class, java.lang.String.class}
-    )
     public void testCreateFromStream() throws FileNotFoundException, IOException {
         FileInputStream inputEmptyStream = null;
         FileInputStream inputStream = null;
@@ -234,12 +200,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "createFromResourceStream",
-        args = {android.content.res.Resources.class, android.util.TypedValue.class,
-                java.io.InputStream.class, java.lang.String.class}
-    )
     public void testCreateFromResourceStream1() throws FileNotFoundException, IOException {
         FileInputStream inputEmptyStream = null;
         FileInputStream inputStream = null;
@@ -287,13 +247,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "createFromResourceStream",
-        args = {android.content.res.Resources.class, android.util.TypedValue.class,
-                java.io.InputStream.class, java.lang.String.class,
-                android.graphics.BitmapFactory.Options.class}
-    )
     public void testCreateFromResourceStream2() throws FileNotFoundException, IOException {
         FileInputStream inputEmptyStream = null;
         FileInputStream inputStream = null;
@@ -344,11 +297,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "createFromXml",
-        args = {android.content.res.Resources.class, org.xmlpull.v1.XmlPullParser.class}
-    )
     public void testCreateFromXml() throws XmlPullParserException, IOException {
         XmlPullParser parser = mResources.getXml(R.drawable.gradientdrawable);
         Drawable drawable = Drawable.createFromXml(mResources, parser);
@@ -357,12 +305,6 @@
         assertEquals(63, drawable.getIntrinsicHeight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "createFromXmlInner",
-        args = {android.content.res.Resources.class, org.xmlpull.v1.XmlPullParser.class,
-                android.util.AttributeSet.class}
-    )
     public void testCreateFromXmlInner() throws XmlPullParserException, IOException {
         XmlPullParser parser = mResources.getXml(R.drawable.gradientdrawable);
         while (parser.next() != XmlPullParser.START_TAG) {
@@ -378,24 +320,6 @@
         assertEquals(expected.getIntrinsicHeight(), drawable.getIntrinsicHeight());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBounds",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setBounds",
-            args = {int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setBounds",
-            args = {android.graphics.Rect.class}
-        )
-    })
-    @ToBeFixed(bug = "1417734", explanation = "NPE is not expected.")
     public void testAccessBounds() {
         MockDrawable mockDrawable = new MockDrawable();
         mockDrawable.setBounds(0, 0, 100, 100);
@@ -419,18 +343,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getChangingConfigurations",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setChangingConfigurations",
-            args = {int.class}
-        )
-    })
     public void testAccessChangingConfigurations() {
         MockDrawable mockDrawable = new MockDrawable();
         assertEquals(0, mockDrawable.getChangingConfigurations());
@@ -445,58 +357,26 @@
         assertEquals(Integer.MIN_VALUE, mockDrawable.getChangingConfigurations());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getConstantState",
-        args = {}
-    )
     public void testGetConstantState() {
         MockDrawable mockDrawable = new MockDrawable();
         assertNull(mockDrawable.getConstantState());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getCurrent",
-        args = {}
-    )
     public void testGetCurrent() {
         MockDrawable mockDrawable = new MockDrawable();
         assertSame(mockDrawable, mockDrawable.getCurrent());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getIntrinsicHeight",
-        args = {}
-    )
     public void testGetIntrinsicHeight() {
         MockDrawable mockDrawable = new MockDrawable();
         assertEquals(-1, mockDrawable.getIntrinsicHeight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getIntrinsicWidth",
-        args = {}
-    )
     public void testGetIntrinsicWidth() {
         MockDrawable mockDrawable = new MockDrawable();
         assertEquals(-1, mockDrawable.getIntrinsicWidth());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLevel",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setLevel",
-            args = {int.class}
-        )
-    })
     public void testAccessLevel() {
         MockDrawable mockDrawable = new MockDrawable();
         assertEquals(0, mockDrawable.getLevel());
@@ -514,32 +394,16 @@
         assertEquals(10000, mockDrawable.getLevel());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getMinimumHeight",
-        args = {}
-    )
     public void testGetMinimumHeight() {
         MockDrawable mockDrawable = new MockDrawable();
         assertEquals(0, mockDrawable.getMinimumHeight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getMinimumWidth",
-        args = {}
-    )
     public void testGetMinimumWidth() {
         MockDrawable mockDrawable = new MockDrawable();
         assertEquals(0, mockDrawable.getMinimumWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getPadding",
-        args = {android.graphics.Rect.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "NPE is not expected.")
     public void testGetPadding() {
         MockDrawable mockDrawable = new MockDrawable();
         Rect r = new Rect(10, 10, 20, 20);
@@ -556,18 +420,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setState",
-            args = {int[].class}
-        )
-    })
     public void testAccessState() {
         MockDrawable mockDrawable = new MockDrawable();
         assertEquals(StateSet.WILD_CARD, mockDrawable.getState());
@@ -579,24 +431,11 @@
         mockDrawable.setState(null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getTransparentRegion",
-        args = {}
-    )
     public void testGetTransparentRegion() {
         MockDrawable mockDrawable = new MockDrawable();
         assertNull(mockDrawable.getTransparentRegion());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "inflate",
-        args = {android.content.res.Resources.class, org.xmlpull.v1.XmlPullParser.class,
-                android.util.AttributeSet.class}
-    )
-    @ToBeFixed(bug = "", explanation = "the attribute visible has been set to false " +
-            "in drawable_test.xml, but isVisible() still returns true")
     public void testInflate() throws XmlPullParserException, IOException {
         MockDrawable mockDrawable = new MockDrawable();
 
@@ -611,11 +450,6 @@
         assertFalse(mockDrawable.isVisible());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "invalidateSelf",
-        args = {}
-    )
     public void testInvalidateSelf() {
         MockDrawable mockDrawable = new MockDrawable();
         // if setCallback() is not called, invalidateSelf() would do nothing,
@@ -628,28 +462,11 @@
         assertEquals(mockDrawable, mockCallback.getInvalidateDrawable());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isStateful",
-        args = {}
-    )
     public void testIsStateful() {
         MockDrawable mockDrawable = new MockDrawable();
         assertFalse(mockDrawable.isStateful());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isVisible",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVisible",
-            args = {boolean.class, boolean.class}
-        )
-    })
     public void testVisible() {
         MockDrawable mockDrawable = new MockDrawable();
         assertTrue(mockDrawable.isVisible());
@@ -664,11 +481,6 @@
         assertTrue(mockDrawable.isVisible());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onBoundsChange",
-        args = {android.graphics.Rect.class}
-    )
     public void testOnBoundsChange() {
         MockDrawable mockDrawable = new MockDrawable();
 
@@ -676,31 +488,16 @@
         mockDrawable.onBoundsChange(new Rect(0, 0, 10, 10));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onLevelChange",
-        args = {int.class}
-    )
     public void testOnLevelChange() {
         MockDrawable mockDrawable = new MockDrawable();
         assertFalse(mockDrawable.onLevelChange(0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onStateChange",
-        args = {int[].class}
-    )
     public void testOnStateChange() {
         MockDrawable mockDrawable = new MockDrawable();
         assertFalse(mockDrawable.onStateChange(null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "resolveOpacity",
-        args = {int.class, int.class}
-    )
     public void testResolveOpacity() {
         assertEquals(PixelFormat.TRANSLUCENT,
                 Drawable.resolveOpacity(PixelFormat.TRANSLUCENT, PixelFormat.TRANSLUCENT));
@@ -714,11 +511,6 @@
                 Drawable.resolveOpacity(PixelFormat.RGB_888, PixelFormat.RGB_565));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "scheduleSelf",
-        args = {java.lang.Runnable.class, long.class}
-    )
     public void testScheduleSelf() {
         MockDrawable mockDrawable = new MockDrawable();
         MockCallback mockCallback = new MockCallback();
@@ -729,11 +521,6 @@
         assertEquals(1000L, mockCallback.getWhen());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setCallback",
-        args = {android.graphics.drawable.Drawable.Callback.class}
-    )
     public void testSetCallback() {
         MockDrawable mockDrawable = new MockDrawable();
 
@@ -745,23 +532,12 @@
         assertEquals(1000L, mockCallback.getWhen());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setColorFilter",
-        args = {int.class, android.graphics.PorterDuff.Mode.class}
-    )
-    @ToBeFixed(bug="1400249", explanation="It will be tested by functional test")
     public void testSetColorFilter() {
         MockDrawable mockDrawable = new MockDrawable();
 
         mockDrawable.setColorFilter(5, PorterDuff.Mode.CLEAR);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setDither",
-        args = {boolean.class}
-    )
     public void testSetDither() {
         MockDrawable mockDrawable = new MockDrawable();
 
@@ -769,11 +545,6 @@
         mockDrawable.setDither(false);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setFilterBitmap",
-        args = {boolean.class}
-    )
     public void testSetFilterBitmap() {
         MockDrawable mockDrawable = new MockDrawable();
 
@@ -781,11 +552,6 @@
         mockDrawable.setFilterBitmap(false);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "unscheduleSelf",
-        args = {java.lang.Runnable.class}
-    )
     public void testUnscheduleSelf() {
         MockDrawable mockDrawable = new MockDrawable();
         MockCallback mockCallback = new MockCallback();
@@ -795,22 +561,12 @@
         assertNull(mockCallback.getRunnable());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "mutate",
-        args = {}
-    )
     public void testMutate() {
         MockDrawable mockDrawable = new MockDrawable();
 
         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);
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/Drawable_ConstantStateTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/Drawable_ConstantStateTest.java
index d5a62af..0f33dd1 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/Drawable_ConstantStateTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/Drawable_ConstantStateTest.java
@@ -18,29 +18,12 @@
 
 import junit.framework.TestCase;
 import android.graphics.drawable.Drawable;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(Drawable.ConstantState.class)
 public class Drawable_ConstantStateTest extends TestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getChangingConfigurations()",
-        method = "getChangingConfigurations",
-        args = {}
-    )
     public void testGetChangingConfigurations() {
         // getChangingConfigurations is an abstract function.
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test newDrawable()",
-        method = "newDrawable",
-        args = {}
-    )
     public void testNewDrawable() {
         // newDrawable is an abstract function.
     }
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/GradientDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/GradientDrawableTest.java
index d2599e4..30074c4 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/GradientDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/GradientDrawableTest.java
@@ -18,11 +18,6 @@
 
 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;
@@ -40,20 +35,7 @@
 
 import java.io.IOException;
 
-@TestTargetClass(android.graphics.drawable.GradientDrawable.class)
 public class GradientDrawableTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "GradientDrawable",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "GradientDrawable",
-            args = {android.graphics.drawable.GradientDrawable.Orientation.class, int[].class}
-        )
-    })
     public void testConstructor() {
         int[] color = new int[] {1, 2, 3};
 
@@ -62,14 +44,6 @@
         new GradientDrawable(null, null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setCornerRadii",
-        args = {float[].class}
-    )
-    @ToBeFixed(bug = "", explanation = "can not assert, because GradientState is package" +
-            " protected, this method change the GradientState field," +
-            " but we can not get it to assert.")
     public void testSetCornerRadii() {
         float[] radii = new float[] {1.0f, 2.0f, 3.0f};
 
@@ -83,14 +57,6 @@
         gradientDrawable.setCornerRadii(null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setCornerRadius",
-        args = {float.class}
-    )
-    @ToBeFixed(bug = "", explanation = "can not assert, because GradientState is package" +
-            " protected, this method change the GradientState field," +
-            " but we can not get it to assert.")
     public void testSetCornerRadius() {
         GradientDrawable gradientDrawable = new GradientDrawable();
 
@@ -98,14 +64,6 @@
         gradientDrawable.setCornerRadius(-2.5f);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setStroke",
-        args = {int.class, int.class}
-    )
-    @ToBeFixed(bug = "", explanation = "can not assert, because GradientState is package" +
-            " protected, this method change the GradientState field," +
-            " but we can not get it to assert.")
     public void testSetStroke() {
         GradientDrawable gradientDrawable = new GradientDrawable();
 
@@ -113,14 +71,6 @@
         gradientDrawable.setStroke(-2, -3);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setStroke",
-        args = {int.class, int.class, float.class, float.class}
-    )
-    @ToBeFixed(bug = "", explanation = "can not assert, because GradientState is package" +
-            " protected, this method change the GradientState field," +
-            " but we can not get it to assert.")
     public void testSetStroke1() {
         int width = 2;
         int color = 3;
@@ -137,11 +87,6 @@
         gradientDrawable.setStroke(width, color, dashWidth, dashGap);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setSize",
-        args = {int.class, int.class}
-    )
     public void testSetSize() {
         GradientDrawable gradientDrawable = new GradientDrawable();
         gradientDrawable.setSize(6, 4);
@@ -161,14 +106,6 @@
         assertEquals(Integer.MIN_VALUE, gradientDrawable.getIntrinsicHeight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setShape",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "", explanation = "can not assert, because GradientState is package" +
-            " protected, this method change the GradientState field," +
-            " but we can not get it to assert.")
     public void testSetShape() {
         GradientDrawable gradientDrawable = new GradientDrawable();
 
@@ -179,14 +116,6 @@
         gradientDrawable.setShape(Integer.MIN_VALUE);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setGradientType",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "", explanation = "can not assert, because GradientState is package" +
-            " protected, this method change the GradientState field," +
-            " but we can not get it to assert.")
     public void testSetGradientType() {
         GradientDrawable gradientDrawable = new GradientDrawable();
 
@@ -197,14 +126,6 @@
         gradientDrawable.setGradientType(Integer.MIN_VALUE);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setGradientCenter",
-        args = {float.class, float.class}
-    )
-    @ToBeFixed(bug = "", explanation = "can not assert, because GradientState is package" +
-            " protected, this method change the GradientState field," +
-            " but we can not get it to assert.")
     public void testSetGradientCenter() {
         GradientDrawable gradientDrawable = new GradientDrawable();
 
@@ -212,14 +133,6 @@
         gradientDrawable.setGradientCenter(-3.4f, -5.5f);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setGradientRadius",
-        args = {float.class}
-    )
-    @ToBeFixed(bug = "", explanation = "can not assert, because GradientState is package" +
-            " protected, this method change the GradientState field," +
-            " but we can not get it to assert.")
     public void testSetGradientRadius() {
         GradientDrawable gradientDrawable = new GradientDrawable();
 
@@ -227,14 +140,6 @@
         gradientDrawable.setGradientRadius(-3.6f);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setUseLevel",
-        args = {boolean.class}
-    )
-    @ToBeFixed(bug = "", explanation = "can not assert, because GradientState is package" +
-            " protected, this method change the GradientState field," +
-            " but we can not get it to assert.")
     public void testSetUseLevel() {
         GradientDrawable gradientDrawable = new GradientDrawable();
 
@@ -242,12 +147,6 @@
         gradientDrawable.setUseLevel(false);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "draw",
-        args = {android.graphics.Canvas.class}
-    )
-    @ToBeFixed(bug = "", explanation = "can not assert.")
     public void testDraw() {
         GradientDrawable gradientDrawable = new GradientDrawable();
         Canvas c = new Canvas();
@@ -257,14 +156,6 @@
         gradientDrawable.draw(null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setColor",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "", explanation = "can not assert, because GradientState is package" +
-            " protected, this method change the GradientState field," +
-            " but we can not get it to assert.")
     public void testSetColor() {
         GradientDrawable gradientDrawable = new GradientDrawable();
 
@@ -275,11 +166,6 @@
         gradientDrawable.setColor(Integer.MIN_VALUE);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getChangingConfigurations",
-        args = {}
-    )
     public void testGetChangingConfigurations() {
         GradientDrawable gradientDrawable = new GradientDrawable();
         assertEquals(0, gradientDrawable.getChangingConfigurations());
@@ -291,12 +177,6 @@
         assertEquals(-20, gradientDrawable.getChangingConfigurations());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setAlpha",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1386429", explanation = "no getter can not be tested")
     public void testSetAlpha() {
         GradientDrawable gradientDrawable = new GradientDrawable();
 
@@ -304,12 +184,6 @@
         gradientDrawable.setAlpha(-1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setDither",
-        args = {boolean.class}
-    )
-    @ToBeFixed(bug = "1386429", explanation = "no getter can not be tested")
     public void testSetDither() {
         GradientDrawable gradientDrawable = new GradientDrawable();
 
@@ -317,12 +191,6 @@
         gradientDrawable.setDither(false);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setColorFilter",
-        args = {android.graphics.ColorFilter.class}
-    )
-    @ToBeFixed(bug = "1386429", explanation = "no getter can not be tested")
     public void testSetColorFilter() {
         GradientDrawable gradientDrawable = new GradientDrawable();
         ColorFilter cf = new ColorFilter();
@@ -332,46 +200,15 @@
         gradientDrawable.setColorFilter(null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getOpacity",
-        args = {}
-    )
     public void testGetOpacity() {
         GradientDrawable gradientDrawable = new GradientDrawable();
         assertEquals(PixelFormat.TRANSLUCENT, gradientDrawable.getOpacity());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onBoundsChange",
-            args = {android.graphics.Rect.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onLevelChange",
-            args = {int.class}
-        )
-    })
     public void testMethods() {
         // implementation details, do not test.
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "inflate",
-            args = {android.content.res.Resources.class, org.xmlpull.v1.XmlPullParser.class,
-                    android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPadding",
-            args = {android.graphics.Rect.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testInflate() throws XmlPullParserException, IOException {
         GradientDrawable gradientDrawable = new GradientDrawable();
         Rect rect = new Rect();
@@ -416,11 +253,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getIntrinsicWidth",
-        args = {}
-    )
     public void testGetIntrinsicWidth() {
         GradientDrawable gradientDrawable = new GradientDrawable();
         gradientDrawable.setSize(6, 4);
@@ -430,11 +262,6 @@
         assertEquals(-10, gradientDrawable.getIntrinsicWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getIntrinsicHeight",
-        args = {}
-    )
     public void testGetIntrinsicHeight() {
         GradientDrawable gradientDrawable = new GradientDrawable();
         gradientDrawable.setSize(5, 3);
@@ -444,23 +271,11 @@
         assertEquals(-15, gradientDrawable.getIntrinsicHeight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getConstantState",
-        args = {}
-    )
-    @ToBeFixed(bug = "", explanation = "can not assert the inner fields, because the class" +
-            " GradientState is package protected.")
     public void testGetConstantState() {
         GradientDrawable gradientDrawable = new GradientDrawable();
         assertNotNull(gradientDrawable.getConstantState());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "mutate",
-        args = {}
-    )
     public void testMutate() {
         Resources resources = mContext.getResources();
         GradientDrawable d1 = (GradientDrawable) resources.getDrawable(R.drawable.gradientdrawable);
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/InsetDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/InsetDrawableTest.java
index c3a0b45..767d89d 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/InsetDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/InsetDrawableTest.java
@@ -18,11 +18,6 @@
 
 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;
@@ -41,21 +36,7 @@
 
 import java.io.IOException;
 
-@TestTargetClass(android.graphics.drawable.InsetDrawable.class)
 public class InsetDrawableTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "InsetDrawable",
-            args = {android.graphics.drawable.Drawable.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "InsetDrawable",
-            args = {android.graphics.drawable.Drawable.class, int.class, int.class, int.class,
-                    int.class}
-        )
-    })
     public void testConstructor() {
         Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
         new InsetDrawable(d, 1);
@@ -65,14 +46,6 @@
         new InsetDrawable(null, -1, -1, -1, -1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "inflate",
-        args = {android.content.res.Resources.class, org.xmlpull.v1.XmlPullParser.class,
-                android.util.AttributeSet.class}
-    )
-    @ToBeFixed(bug = "1386429", explanation = "no getter can not be tested," +
-            " and there should not be a NullPointerException thrown out.")
     public void testInflate() {
         Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
@@ -103,13 +76,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "invalidateDrawable",
-        args = {android.graphics.drawable.Drawable.class}
-    )
-    @ToBeFixed(bug = "1400249", explanation = "it's hard to do unit test, should be tested by" +
-            " functional test.")
     public void testInvalidateDrawable() {
         Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
@@ -117,13 +83,6 @@
         insetDrawable.invalidateDrawable(d);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "scheduleDrawable",
-        args = {android.graphics.drawable.Drawable.class, java.lang.Runnable.class, long.class}
-    )
-    @ToBeFixed(bug = "1400249", explanation = "it's hard to do unit test, should be tested by" +
-            " functional test.")
     public void testScheduleDrawable() {
         Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
@@ -139,13 +98,6 @@
         // expected, no Exception thrown out, test success
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "unscheduleDrawable",
-        args = {android.graphics.drawable.Drawable.class, java.lang.Runnable.class}
-    )
-    @ToBeFixed(bug = "1400249", explanation = "it's hard to do unit test, should be tested by" +
-            " functional test.")
     public void testUnscheduleDrawable() {
         Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
@@ -161,13 +113,6 @@
         // expected, no Exception thrown out, test success
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "draw",
-        args = {android.graphics.Canvas.class}
-    )
-    @ToBeFixed(bug = "1400249", explanation = "it's hard to do unit test, should be tested by" +
-            " functional test, and there should not be an NullPointerException thrown out.")
     public void testDraw() {
         Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
@@ -184,11 +129,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getChangingConfigurations",
-        args = {}
-    )
     public void testGetChangingConfigurations() {
         Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
@@ -200,13 +140,6 @@
         assertEquals(-21, insetDrawable.getChangingConfigurations());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getPadding",
-        args = {android.graphics.Rect.class}
-    )
-    @ToBeFixed(bug = "1371108", explanation = "There should not be a" +
-            " NullPointerException thrown out.")
     public void testGetPadding() {
         Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 1, 2, 3, 4);
@@ -249,11 +182,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setVisible",
-        args = {boolean.class, boolean.class}
-    )
     public void testSetVisible() {
         Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
@@ -263,12 +191,6 @@
         assertFalse(insetDrawable.setVisible(false, true)); /* unchanged */
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setAlpha",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1386429", explanation = "no getter can not be tested")
     public void testSetAlpha() {
         Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
@@ -281,12 +203,6 @@
         insetDrawable.setAlpha(Integer.MIN_VALUE);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setColorFilter",
-        args = {android.graphics.ColorFilter.class}
-    )
-    @ToBeFixed(bug = "1386429", explanation = "no getter can not be tested")
     public void testSetColorFilter() {
         Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
@@ -299,11 +215,6 @@
         // expected, no Exception thrown out, test success
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getOpacity",
-        args = {}
-    )
     public void testGetOpacity() {
         Drawable d = mContext.getResources().getDrawable(R.drawable.testimage);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
@@ -314,23 +225,12 @@
         assertEquals(PixelFormat.TRANSLUCENT, insetDrawable.getOpacity());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isStateful",
-        args = {}
-    )
     public void testIsStateful() {
         Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
         assertFalse(insetDrawable.isStateful());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onStateChange",
-        args = {int[].class}
-    )
-    @ToBeFixed(bug = "", explanation = "The onStateChange will always return false.")
     public void testOnStateChange() {
         Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
         MockInsetDrawable insetDrawable = new MockInsetDrawable(d, 10);
@@ -354,13 +254,6 @@
         // expected, no Exception thrown out, test success
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onBoundsChange",
-        args = {android.graphics.Rect.class}
-    )
-    @ToBeFixed(bug = "1371108", explanation = "There should not be a" +
-            " NullPointerException thrown out.")
     public void testOnBoundsChange() {
         Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
         MockInsetDrawable insetDrawable = new MockInsetDrawable(d, 5);
@@ -388,11 +281,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getIntrinsicWidth",
-        args = {}
-    )
     public void testGetIntrinsicWidth() {
         Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
@@ -407,11 +295,6 @@
         assertEquals(expected, insetDrawable.getIntrinsicWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getIntrinsicHeight",
-        args = {}
-    )
     public void testGetIntrinsicHeight() {
         Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
@@ -426,13 +309,6 @@
         assertEquals(expected, insetDrawable.getIntrinsicHeight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getConstantState",
-        args = {}
-    )
-    @ToBeFixed(bug = "", explanation = "can not assert the inner fields, because the class" +
-            " InsetState is package protected.")
     public void testGetConstantState() {
         Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
         InsetDrawable insetDrawable = new InsetDrawable(d, 0);
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 cb9b7b6..bf688d2 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/LayerDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/LayerDrawableTest.java
@@ -43,21 +43,8 @@
 import android.util.AttributeSet;
 import android.util.StateSet;
 import android.view.View;
-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 {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "LayerDrawable",
-        args = {android.graphics.drawable.Drawable[].class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for constructor is incomplete." +
-            "1. not clear what is supposed to happen if layers is null.")
     @SuppressWarnings("deprecation")
     public void testConstructor() {
         Drawable bitmapDrawable = new BitmapDrawable();
@@ -79,14 +66,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "inflate",
-        args = {android.content.res.Resources.class, org.xmlpull.v1.XmlPullParser.class,
-                android.util.AttributeSet.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for inflate is incomplete." +
-            "1. not clear what is supposed to happen if any parameter is null.")
     public void testInflate() throws XmlPullParserException, IOException {
         Drawable[] array = new Drawable[0];
         LayerDrawable layerDrawable = new LayerDrawable(array);
@@ -141,11 +120,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "findDrawableByLayerId",
-        args = {int.class}
-    )
     @SuppressWarnings("deprecation")
     public void testFindDrawableByLayerId() {
         Drawable bitmapDrawable = new BitmapDrawable();
@@ -170,20 +144,6 @@
         assertNull(layerDrawable.findDrawableByLayerId(30));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setId",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getId",
-            args = {int.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for setId and getId are incomplete." +
-            "1. not clear what is supposed to happen if index is exceptional.")
     @SuppressWarnings("deprecation")
     public void testAccessId() {
         Drawable[] array = new Drawable[] { new BitmapDrawable(), new ColorDrawable(Color.BLUE) };
@@ -224,11 +184,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getNumberOfLayers",
-        args = {}
-    )
     @SuppressWarnings("deprecation")
     public void testGetNumberOfLayers() {
         Drawable[] array = new Drawable[] { new BitmapDrawable(), new ColorDrawable(Color.BLUE) };
@@ -247,20 +202,6 @@
         assertEquals(0, layerDrawable.getNumberOfLayers());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDrawable",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDrawableByLayerId",
-            args = {int.class, android.graphics.drawable.Drawable.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for getDrawable is incomplete." +
-            "1. not clear what is supposed to happen if index is exceptional.")
     @SuppressWarnings("deprecation")
     public void testAccessDrawable() {
         Drawable bitmapDrawable = new BitmapDrawable();
@@ -294,13 +235,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setLayerInset",
-        args = {int.class, int.class, int.class, int.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for setLayerInset is incomplete." +
-            "1. not clear what is supposed to happen if index is exceptional.")
     @SuppressWarnings("deprecation")
     public void testSetLayerInset() {
         Drawable[] array = new Drawable[] { new BitmapDrawable(), new ColorDrawable(Color.BLUE) };
@@ -335,11 +269,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "invalidateDrawable",
-        args = {android.graphics.drawable.Drawable.class}
-    )
     @SuppressWarnings("deprecation")
     public void testInvalidateDrawable() {
         Drawable[] array = new Drawable[0];
@@ -360,11 +289,6 @@
         assertFalse(cb.hasCalledInvalidate());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "scheduleDrawable",
-        args = {android.graphics.drawable.Drawable.class, java.lang.Runnable.class, long.class}
-    )
     @SuppressWarnings("deprecation")
     public void testScheduleDrawable() {
         Drawable[] array = new Drawable[0];
@@ -388,11 +312,6 @@
         assertFalse(cb.hasCalledSchedule());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "unscheduleDrawable",
-        args = {android.graphics.drawable.Drawable.class, java.lang.Runnable.class}
-    )
     @SuppressWarnings("deprecation")
     public void testUnscheduleDrawable() {
         Drawable[] array = new Drawable[0];
@@ -456,11 +375,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "draw",
-        args = {android.graphics.Canvas.class}
-    )
     public void testDraw() {
         MockDrawable mockDrawable1 = new MockDrawable();
         MockDrawable mockDrawable2 = new MockDrawable();
@@ -479,11 +393,6 @@
         assertTrue(mockDrawable2.hasCalledDraw());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getChangingConfigurations",
-        args = {}
-    )
     @SuppressWarnings("deprecation")
     public void testGetChangingConfigurations() {
         final int superConfig = 1;
@@ -504,11 +413,6 @@
         assertEquals(superConfig | childConfig, layerDrawable.getChangingConfigurations());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getPadding",
-        args = {android.graphics.Rect.class}
-    )
     public void testGetPadding() {
         Drawable[] array = new Drawable[] { new ShapeDrawable(), new ShapeDrawable() };
         LayerDrawable layerDrawable = new LayerDrawable(array);
@@ -537,11 +441,6 @@
         assertEquals(padding0.bottom + padding1.bottom, rc.bottom);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setVisible",
-        args = {boolean.class, boolean.class}
-    )
     @SuppressWarnings("deprecation")
     public void testSetVisible() {
         Drawable[] array = new Drawable[] { new BitmapDrawable(), new ColorDrawable(Color.BLUE) };
@@ -560,11 +459,6 @@
         assertTrue(layerDrawable.getDrawable(1).isVisible());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setDither",
-        args = {boolean.class}
-    )
     public void testSetDither() {
         MockDrawable mockDrawable1 = new MockDrawable();
         MockDrawable mockDrawable2 = new MockDrawable();
@@ -582,11 +476,6 @@
         assertTrue(mockDrawable2.hasCalledSetDither());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setAlpha",
-        args = {int.class}
-    )
     public void testSetAlpha() {
         MockDrawable mockDrawable1 = new MockDrawable();
         MockDrawable mockDrawable2 = new MockDrawable();
@@ -604,11 +493,6 @@
         assertTrue(mockDrawable2.hasCalledSetAlpha());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setColorFilter",
-        args = {android.graphics.ColorFilter.class}
-    )
     public void testSetColorFilter() {
         MockDrawable mockDrawable1 = new MockDrawable();
         MockDrawable mockDrawable2 = new MockDrawable();
@@ -626,11 +510,6 @@
         assertTrue(mockDrawable2.hasCalledColorFilter());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getOpacity",
-        args = {}
-    )
     public void testGetOpacity() {
         Drawable[] array = new Drawable[0];
         LayerDrawable layerDrawable = new LayerDrawable(array);
@@ -657,11 +536,6 @@
         assertEquals(PixelFormat.UNKNOWN, layerDrawable.getOpacity());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isStateful",
-        args = {}
-    )
     @SuppressWarnings("deprecation")
     public void testIsStateful() {
         Drawable[] array = new Drawable[0];
@@ -677,11 +551,6 @@
         assertTrue(layerDrawable.isStateful());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onStateChange",
-        args = {int[].class}
-    )
     public void testOnStateChange() {
         MockDrawable mockDrawable1 = new MockDrawable();
         MockDrawable mockDrawable2 = new MockDrawable();
@@ -711,11 +580,6 @@
         assertTrue(layerDrawable.hasCalledOnBoundsChange());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onLevelChange",
-        args = {int.class}
-    )
     public void testOnLevelChange() {
         MockDrawable mockDrawable1 = new MockDrawable();
         MockDrawable mockDrawable2 = new MockDrawable();
@@ -746,11 +610,6 @@
         assertTrue(layerDrawable.hasCalledOnBoundsChange());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onBoundsChange",
-        args = {android.graphics.Rect.class}
-    )
     public void testOnBoundsChange() {
         MockDrawable mockDrawable1 = new MockDrawable();
         MockDrawable mockDrawable2 = new MockDrawable();
@@ -793,11 +652,6 @@
                 mockDrawable2.getBounds().bottom);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getIntrinsicWidth",
-        args = {}
-    )
     public void testGetIntrinsicWidth() {
         MockDrawable mockDrawable1 = new MockDrawable();
         MockDrawable mockDrawable2 = new MockDrawable();
@@ -825,11 +679,6 @@
                 layerDrawable.getIntrinsicWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getIntrinsicHeight",
-        args = {}
-    )
     public void testGetIntrinsicHeight() {
         MockDrawable mockDrawable1 = new MockDrawable();
         MockDrawable mockDrawable2 = new MockDrawable();
@@ -857,11 +706,6 @@
                 layerDrawable.getIntrinsicHeight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getConstantState",
-        args = {}
-    )
     @SuppressWarnings("deprecation")
     public void testGetConstantState() {
         Drawable[] array = new Drawable[] { new BitmapDrawable(), new ColorDrawable(Color.BLUE) };
@@ -1038,11 +882,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "mutate",
-        args = {}
-    )
     public void testMutate() {
         Resources resources = mContext.getResources();
         LayerDrawable d1 = (LayerDrawable) resources.getDrawable(R.drawable.layerdrawable);
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/LevelListDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/LevelListDrawableTest.java
index f15b10e..191e0d3 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/LevelListDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/LevelListDrawableTest.java
@@ -33,12 +33,7 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
-@TestTargetClass(LevelListDrawable.class)
 public class LevelListDrawableTest extends InstrumentationTestCase {
     private MockLevelListDrawable mLevelListDrawable;
 
@@ -54,11 +49,6 @@
         mResources = getInstrumentation().getTargetContext().getResources();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "LevelListDrawable",
-        args = {}
-    )
     public void testLevelListDrawable() {
         new LevelListDrawable();
         // Check the values set in the constructor
@@ -66,11 +56,6 @@
         assertTrue(new MockLevelListDrawable().hasCalledOnLevelChanged());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addLevel",
-        args = {int.class, int.class, android.graphics.drawable.Drawable.class}
-    )
     public void testAddLevel() {
         assertEquals(0, mDrawableContainerState.getChildCount());
 
@@ -92,11 +77,6 @@
         assertTrue(mLevelListDrawable.hasCalledOnLevelChanged());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onLevelChange",
-        args = {int.class}
-    )
     public void testOnLevelChange() {
         mLevelListDrawable.addLevel(0, 0, new MockDrawable());
         mLevelListDrawable.addLevel(0, 0, new MockDrawable());
@@ -129,12 +109,6 @@
         assertNull(mLevelListDrawable.getCurrent());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "inflate",
-        args = {android.content.res.Resources.class, org.xmlpull.v1.XmlPullParser.class,
-                android.util.AttributeSet.class}
-    )
     public void testInflate() throws XmlPullParserException, IOException {
         XmlResourceParser parser = getResourceParser(R.xml.level_list_correct);
 
@@ -168,15 +142,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "inflate",
-        args = {android.content.res.Resources.class, org.xmlpull.v1.XmlPullParser.class,
-                android.util.AttributeSet.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "LevelListDrawable#inflate(Resources, XmlPullParser, AttributeSet) when param r,"
-            + "parser or attrs is out of bounds")
     public void testInflateWithNullParameters() throws XmlPullParserException, IOException{
         XmlResourceParser parser = getResourceParser(R.xml.level_list_correct);
         try {
@@ -198,11 +163,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        method = "mutate",
-        args = {}
-    )
     public void testMutate() throws InterruptedException {
         Resources resources = getInstrumentation().getTargetContext().getResources();
         LevelListDrawable d1 =
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/NinePatchDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/NinePatchDrawableTest.java
index 064c45a..bff80ec 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/NinePatchDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/NinePatchDrawableTest.java
@@ -19,11 +19,6 @@
 import com.android.cts.stub.R;
 
 import dalvik.annotation.KnownFailure;
-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;
@@ -49,7 +44,6 @@
 
 import java.io.IOException;
 
-@TestTargetClass(NinePatchDrawable.class)
 public class NinePatchDrawableTest extends InstrumentationTestCase {
     private static final int MIN_CHUNK_SIZE = 32;
 
@@ -64,18 +58,6 @@
         mNinePatchDrawable = getNinePatchDrawable(R.drawable.ninepatch_0);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "NinePatchDrawable",
-            args = {Bitmap.class, byte[].class, Rect.class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "NinePatchDrawable",
-            args = {android.graphics.NinePatch.class}
-        )
-    })
     @SuppressWarnings("deprecation")
     public void testConstructors() {
         byte[] chunk = new byte[MIN_CHUNK_SIZE];
@@ -100,13 +82,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "draw",
-        args = {android.graphics.Canvas.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "NinePatchDrawable#draw(Canvas) when param canvas is null")
     public void testDraw() {
         Bitmap bmp = Bitmap.createBitmap(9, 9, Config.ARGB_8888);
         Canvas c = new Canvas(bmp);
@@ -141,11 +116,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getChangingConfigurations",
-        args = {}
-    )
     public void testGetChangingConfigurations() {
         ConstantState constantState = mNinePatchDrawable.getConstantState();
 
@@ -168,14 +138,6 @@
         assertEquals(0xffff,  mNinePatchDrawable.getChangingConfigurations());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getPadding",
-        args = {android.graphics.Rect.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "NinePatchDrawable#getPadding(Rect) when param padding is null or "
-            + "the insternal padding field is not set ")
     public void testGetPadding() {
         Rect r = new Rect();
         NinePatchDrawable npd = (NinePatchDrawable) mResources.getDrawable(R.drawable.ninepatch_0);
@@ -194,11 +156,6 @@
         assertTrue(r.bottom > 0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setAlpha",
-        args = {int.class}
-    )
     public void testSetAlpha() {
         assertEquals(0xff, mNinePatchDrawable.getPaint().getAlpha());
 
@@ -212,11 +169,6 @@
         assertEquals(0xfe, mNinePatchDrawable.getPaint().getAlpha());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setColorFilter",
-        args = {android.graphics.ColorFilter.class}
-    )
     public void testSetColorFilter() {
         assertNull(mNinePatchDrawable.getPaint().getColorFilter());
 
@@ -228,11 +180,6 @@
         assertNull(mNinePatchDrawable.getPaint().getColorFilter());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setDither",
-        args = {boolean.class}
-    )
     public void testSetDither() {
         assertTrue(mNinePatchDrawable.getPaint().isDither());
 
@@ -243,11 +190,6 @@
         assertTrue(mNinePatchDrawable.getPaint().isDither());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getPaint",
-        args = {}
-    )
     public void testGetPaint() {
         Paint paint = mNinePatchDrawable.getPaint();
         assertNotNull(paint);
@@ -255,11 +197,6 @@
         assertSame(paint, mNinePatchDrawable.getPaint());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getIntrinsicWidth",
-        args = {}
-    )
     public void testGetIntrinsicWidth() {
         Bitmap bmp = getBitmapUnscaled(R.drawable.ninepatch_0);
         assertEquals(bmp.getWidth(), mNinePatchDrawable.getIntrinsicWidth());
@@ -271,11 +208,6 @@
         assertEquals(9, mNinePatchDrawable.getIntrinsicWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getMinimumWidth",
-        args = {}
-    )
     public void testGetMinimumWidth() {
         Bitmap bmp = getBitmapUnscaled(R.drawable.ninepatch_0);
         assertEquals(bmp.getWidth(), mNinePatchDrawable.getMinimumWidth());
@@ -287,11 +219,6 @@
         assertEquals(9, mNinePatchDrawable.getMinimumWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getIntrinsicHeight",
-        args = {}
-    )
     public void testGetIntrinsicHeight() {
         Bitmap bmp = getBitmapUnscaled(R.drawable.ninepatch_0);
         assertEquals(bmp.getHeight(), mNinePatchDrawable.getIntrinsicHeight());
@@ -303,11 +230,6 @@
         assertEquals(9, mNinePatchDrawable.getIntrinsicHeight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getMinimumHeight",
-        args = {}
-    )
     public void testGetMinimumHeight() {
         Bitmap bmp = getBitmapUnscaled(R.drawable.ninepatch_0);
         assertEquals(bmp.getHeight(), mNinePatchDrawable.getMinimumHeight());
@@ -319,11 +241,6 @@
         assertEquals(9, mNinePatchDrawable.getMinimumHeight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getOpacity",
-        args = {}
-    )
     @KnownFailure("Bug 2834281 - Bitmap#hasAlpha seems to return true for "
         + "images without alpha.")
     public void testGetOpacity() {
@@ -333,11 +250,6 @@
         assertEquals(PixelFormat.TRANSLUCENT, mNinePatchDrawable.getOpacity());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getTransparentRegion",
-        args = {}
-    )
     public void testGetTransparentRegion() {
         // opaque image
         Region r = mNinePatchDrawable.getTransparentRegion();
@@ -358,11 +270,6 @@
         assertEquals(new Rect(1, 1, 7, 7), r.getBounds());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getConstantState",
-        args = {}
-    )
     public void testGetConstantState() {
         assertNotNull(mNinePatchDrawable.getConstantState());
 
@@ -375,11 +282,6 @@
         assertEquals(0xff, constantState.getChangingConfigurations());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "inflate",
-        args = {Resources.class, XmlPullParser.class, AttributeSet.class}
-    )
     public void testInflate() throws XmlPullParserException, IOException {
         final int width = 80;
         final int height = 120;
@@ -403,12 +305,6 @@
         assertTrue(width != ninePatchDrawable.getIntrinsicWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        method = "mutate",
-        args = {}
-    )
-    @ToBeFixed(bug = "", explanation = "mutate() always throw NullPointerException.")
     public void testMutate() {
         NinePatchDrawable d1 =
             (NinePatchDrawable) mResources.getDrawable(R.drawable.ninepatchdrawable);
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/PaintDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/PaintDrawableTest.java
index f2a924d..71fa06c 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/PaintDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/PaintDrawableTest.java
@@ -18,11 +18,6 @@
 
 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;
@@ -38,32 +33,13 @@
 
 import java.io.IOException;
 
-@TestTargetClass(android.graphics.drawable.PaintDrawable.class)
 public class PaintDrawableTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "PaintDrawable",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "PaintDrawable",
-            args = {int.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testConstructor() {
         new PaintDrawable();
         new PaintDrawable(0x0);
         new PaintDrawable(0xffffffff);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setCornerRadius",
-        args = {float.class}
-    )
     public void testSetCornerRadius() {
         PaintDrawable paintDrawable;
 
@@ -88,12 +64,6 @@
         assertNull(paintDrawable.getShape());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setCornerRadii",
-        args = {float[].class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testSetCornerRadii() {
         PaintDrawable paintDrawable;
 
@@ -130,12 +100,6 @@
         assertTrue(paintDrawable.getShape() instanceof RoundRectShape);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "inflateTag",
-        args = {java.lang.String.class, android.content.res.Resources.class,
-                org.xmlpull.v1.XmlPullParser.class, android.util.AttributeSet.class}
-    )
     public void testInflateTag() throws XmlPullParserException, IOException {
         // Test name is not 'corners', and default executing path will load super's method.
         XmlResourceParser parser = getParser();
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/PictureDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/PictureDrawableTest.java
index 9c261b3..514f5d5 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/PictureDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/PictureDrawableTest.java
@@ -16,10 +16,6 @@
 
 package android.graphics.drawable.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
@@ -29,23 +25,12 @@
 import android.graphics.drawable.PictureDrawable;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(android.graphics.drawable.PictureDrawable.class)
 public class PictureDrawableTest extends AndroidTestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "PictureDrawable",
-        args = {android.graphics.Picture.class}
-    )
     public void testConstructor() {
         assertNull((new PictureDrawable(null)).getPicture());
         assertNotNull((new PictureDrawable(new Picture())).getPicture());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "draw",
-        args = {android.graphics.Canvas.class}
-    )
     public void testDraw() {
         PictureDrawable pictureDrawable = new PictureDrawable(null);
 
@@ -72,18 +57,6 @@
         assertEquals(0xff0a0c0b, destBitmap.getPixel(10, 10));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIntrinsicWidth",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIntrinsicHeight",
-            args = {}
-        )
-    })
     public void testGetIntrinsicSize() {
         PictureDrawable pictureDrawable = new PictureDrawable(null);
         // Test with null Picture object
@@ -98,31 +71,16 @@
         assertEquals(101, pictureDrawable.getIntrinsicHeight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getOpacity",
-        args = {}
-    )
     public void testGetOpacity() {
         PictureDrawable pictureDrawable = new PictureDrawable(null);
         assertEquals(PixelFormat.TRANSLUCENT, pictureDrawable.getOpacity());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setAlpha",
-        args = {int.class}
-    )
     public void testSetAlpha() {
         PictureDrawable pictureDrawable = new PictureDrawable(null);
         pictureDrawable.setAlpha(0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setColorFilter",
-        args = {android.graphics.ColorFilter.class}
-    )
     public void testSetColorFilter() {
         PictureDrawable pictureDrawable = new PictureDrawable(null);
 
@@ -130,38 +88,16 @@
         pictureDrawable.setColorFilter(colorFilter);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setDither",
-        args = {boolean.class}
-    )
     public void testSetDither() {
         PictureDrawable pictureDrawable = new PictureDrawable(null);
         pictureDrawable.setDither(true);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setFilterBitmap",
-        args = {boolean.class}
-    )
     public void testSetFilterBitmap() {
         PictureDrawable pictureDrawable = new PictureDrawable(null);
         pictureDrawable.setFilterBitmap(true);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPicture",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPicture",
-            args = {android.graphics.Picture.class}
-        )
-    })
     public void testAccessPicture() {
         PictureDrawable pictureDrawable = new PictureDrawable(null);
         assertNull(pictureDrawable.getPicture());
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 8dde6a3..75838e0 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/RotateDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/RotateDrawableTest.java
@@ -36,13 +36,7 @@
 import android.test.AndroidTestCase;
 import android.util.AttributeSet;
 import android.util.Xml;
-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 {
     private RotateDrawable mRotateDrawable;
 
@@ -54,30 +48,15 @@
         mRotateDrawable = (RotateDrawable) resources.getDrawable(R.drawable.rotatedrawable);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "RotateDrawable",
-        args = {}
-    )
     public void testConstructor() {
         new RotateDrawable();
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        method = "draw",
-        args = {android.graphics.Canvas.class}
-    )
     public void testDraw() {
         Canvas canvas = new Canvas();
         mRotateDrawable.draw(canvas);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getChangingConfigurations",
-        args = {}
-    )
     public void testGetChangingConfigurations() {
         assertEquals(0, mRotateDrawable.getChangingConfigurations());
 
@@ -88,11 +67,6 @@
         assertEquals(Configuration.KEYBOARD_12KEY, mRotateDrawable.getChangingConfigurations());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setAlpha",
-        args = {int.class}
-    )
     public void testSetAlpha() {
         mRotateDrawable.setAlpha(100);
         assertEquals(100, ((BitmapDrawable) mRotateDrawable.getDrawable()).getPaint().getAlpha());
@@ -101,11 +75,6 @@
         assertEquals(255, ((BitmapDrawable) mRotateDrawable.getDrawable()).getPaint().getAlpha());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setColorFilter",
-        args = {android.graphics.ColorFilter.class}
-    )
     public void testSetColorFilter() {
         ColorFilter filter = new ColorFilter();
         mRotateDrawable.setColorFilter(filter);
@@ -116,20 +85,10 @@
         assertNull(((BitmapDrawable) mRotateDrawable.getDrawable()).getPaint().getColorFilter());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getOpacity",
-        args = {}
-    )
     public void testGetOpacity() {
         assertEquals(PixelFormat.OPAQUE, mRotateDrawable.getOpacity());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "invalidateDrawable",
-        args = {android.graphics.drawable.Drawable.class}
-    )
     public void testInvalidateDrawable() {
         Drawable drawable = mContext.getResources().getDrawable(R.drawable.pass);
         MockCallback callback = new MockCallback();
@@ -148,11 +107,6 @@
         assertFalse(callback.hasCalledInvalidate());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "scheduleDrawable",
-        args = {android.graphics.drawable.Drawable.class, java.lang.Runnable.class, long.class}
-    )
     public void testScheduleDrawable() {
         MockCallback callback = new MockCallback();
 
@@ -173,11 +127,6 @@
         assertFalse(callback.hasCalledSchedule());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "unscheduleDrawable",
-        args = {android.graphics.drawable.Drawable.class, java.lang.Runnable.class}
-    )
     public void testUnscheduleDrawable() {
         MockCallback callback = new MockCallback();
 
@@ -198,11 +147,6 @@
         assertFalse(callback.hasCalledUnschedule());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getPadding",
-        args = {android.graphics.Rect.class}
-    )
     public void testGetPadding() {
         Rect rect = new Rect();
         assertFalse(mRotateDrawable.getPadding(rect));
@@ -212,11 +156,6 @@
         assertEquals(0, rect.bottom);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setVisible",
-        args = {boolean.class, boolean.class}
-    )
     public void testSetVisible() {
         assertTrue(mRotateDrawable.isVisible());
 
@@ -230,54 +169,14 @@
         assertTrue(mRotateDrawable.isVisible());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isStateful",
-        args = {}
-    )
     public void testIsStateful() {
         assertFalse(mRotateDrawable.isStateful());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "onStateChange",
-            args = {int[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "onLevelChange",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "onBoundsChange",
-            args = {android.graphics.Rect.class}
-        )
-    })
     public void testMethods() {
         // implementation details, do not test.
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIntrinsicWidth",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIntrinsicHeight",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "inflate",
-            args = {android.content.res.Resources.class, org.xmlpull.v1.XmlPullParser.class,
-                    android.util.AttributeSet.class}
-        )
-    })
     public void testGetIntrinsicWidthAndHeight() throws XmlPullParserException, IOException {
         // testimage is set in res/drawable/rotatedrawable.xml
         Drawable drawable = mContext.getResources().getDrawable(R.drawable.testimage);
@@ -303,29 +202,11 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getConstantState",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testGetConstantState() {
         ConstantState state = mRotateDrawable.getConstantState();
         assertNotNull(state);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "mutate",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDrawable",
-            args = {}
-        )
-    })
     public void testMutate() {
         Resources resources = mContext.getResources();
 
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 c9d9d0a..305f32d 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/ScaleDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/ScaleDrawableTest.java
@@ -36,27 +36,9 @@
 import android.util.DisplayMetrics;
 import android.util.StateSet;
 import android.view.Gravity;
-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 {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ScaleDrawable",
-            args = {android.graphics.drawable.Drawable.class, int.class, float.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDrawable",
-            args = {}
-        )
-    })
     @SuppressWarnings("deprecation")
     public void testConstructor() {
         Drawable d = new BitmapDrawable();
@@ -66,11 +48,6 @@
         new ScaleDrawable(null, -1, Float.MAX_VALUE, Float.MIN_VALUE);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "invalidateDrawable",
-        args = {android.graphics.drawable.Drawable.class}
-    )
     @SuppressWarnings("deprecation")
     public void testInvalidateDrawable() {
         ScaleDrawable scaleDrawable = new ScaleDrawable(new BitmapDrawable(),
@@ -91,11 +68,6 @@
         assertFalse(cb.hasCalledInvalidate());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "scheduleDrawable",
-        args = {android.graphics.drawable.Drawable.class, java.lang.Runnable.class, long.class}
-    )
     @SuppressWarnings("deprecation")
     public void testScheduleDrawable() {
         ScaleDrawable scaleDrawable = new ScaleDrawable(new BitmapDrawable(),
@@ -119,11 +91,6 @@
         assertFalse(cb.hasCalledSchedule());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "unscheduleDrawable",
-        args = {android.graphics.drawable.Drawable.class, java.lang.Runnable.class}
-    )
     @SuppressWarnings("deprecation")
     public void testUnscheduleDrawable() {
         ScaleDrawable scaleDrawable = new ScaleDrawable(new BitmapDrawable(),
@@ -187,11 +154,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "draw",
-        args = {android.graphics.Canvas.class}
-    )
     public void testDraw() {
         MockDrawable mockDrawable = new MockDrawable();
         ScaleDrawable scaleDrawable = new ScaleDrawable(mockDrawable, Gravity.CENTER, 100, 200);
@@ -210,11 +172,6 @@
         assertTrue(mockDrawable.hasCalledDraw());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getChangingConfigurations",
-        args = {}
-    )
     public void testGetChangingConfigurations() {
         final int SUPER_CONFIG = 1;
         final int CONTAINED_DRAWABLE_CONFIG = 2;
@@ -232,13 +189,6 @@
                 scaleDrawable.getChangingConfigurations());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getPadding",
-        args = {android.graphics.Rect.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for getPadding is incomplete." +
-            "1. not clear what is supposed to happen if padding is null.")
     public void testGetPadding() {
         MockDrawable mockDrawable = new MockDrawable();
         ScaleDrawable scaleDrawable = new ScaleDrawable(mockDrawable, Gravity.CENTER, 100, 200);
@@ -255,11 +205,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setVisible",
-        args = {boolean.class, boolean.class}
-    )
     public void testSetVisible() {
         MockDrawable mockDrawable = new MockDrawable();
         ScaleDrawable scaleDrawable = new ScaleDrawable(mockDrawable, Gravity.CENTER, 100, 200);
@@ -280,11 +225,6 @@
         assertTrue(mockDrawable.hasCalledSetVisible());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setAlpha",
-        args = {int.class}
-    )
     public void testSetAlpha() {
         MockDrawable mockDrawable = new MockDrawable();
         ScaleDrawable scaleDrawable = new ScaleDrawable(mockDrawable, Gravity.CENTER, 100, 200);
@@ -302,11 +242,6 @@
         assertTrue(mockDrawable.hasCalledSetAlpha());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setColorFilter",
-        args = {android.graphics.ColorFilter.class}
-    )
     public void testSetColorFilter() {
         MockDrawable mockDrawable = new MockDrawable();
         ScaleDrawable scaleDrawable = new ScaleDrawable(mockDrawable, Gravity.CENTER, 100, 200);
@@ -320,11 +255,6 @@
         assertTrue(mockDrawable.hasCalledSetColorFilter());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getOpacity",
-        args = {}
-    )
     public void testGetOpacity() {
         MockDrawable mockDrawable = new MockDrawable();
         ScaleDrawable scaleDrawable = new ScaleDrawable(mockDrawable, Gravity.CENTER, 100, 200);
@@ -334,11 +264,6 @@
         assertTrue(mockDrawable.hasCalledGetOpacity());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isStateful",
-        args = {}
-    )
     public void testIsStateful() {
         MockDrawable mockDrawable = new MockDrawable();
         ScaleDrawable scaleDrawable = new ScaleDrawable(mockDrawable, Gravity.CENTER, 100, 200);
@@ -348,11 +273,6 @@
         assertTrue(mockDrawable.hasCalledIsStateful());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onStateChange",
-        args = {int[].class}
-    )
     public void testOnStateChange() {
         MockDrawable mockDrawable = new MockDrawable();
         MockScaleDrawable mockScaleDrawable = new MockScaleDrawable(
@@ -369,11 +289,6 @@
         assertTrue(mockScaleDrawable.hasCalledOnBoundsChange());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onLevelChange",
-        args = {int.class}
-    )
     public void testOnLevelChange() {
         MockDrawable mockDrawable = new MockDrawable();
         MockScaleDrawable mockScaleDrawable = new MockScaleDrawable(
@@ -390,11 +305,6 @@
         assertTrue(mockScaleDrawable.hasCalledOnBoundsChange());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onBoundsChange",
-        args = {android.graphics.Rect.class}
-    )
     public void testOnBoundsChange() {
         MockDrawable mockDrawable = new MockDrawable();
         float scaleWidth = 0.3f;
@@ -452,11 +362,6 @@
         assertEquals(bounds.bottom, mockDrawable.getBounds().bottom);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getIntrinsicWidth",
-        args = {}
-    )
     public void testGetIntrinsicWidth() {
         MockDrawable mockDrawable = new MockDrawable();
         ScaleDrawable scaleDrawable = new ScaleDrawable(mockDrawable, Gravity.CENTER, 100, 200);
@@ -466,11 +371,6 @@
         assertTrue(mockDrawable.hasCalledGetIntrinsicWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getIntrinsicHeight",
-        args = {}
-    )
     public void testGetIntrinsicHeight() {
         MockDrawable mockDrawable = new MockDrawable();
         ScaleDrawable scaleDrawable = new ScaleDrawable(mockDrawable, Gravity.CENTER, 100, 200);
@@ -480,11 +380,6 @@
         assertTrue(mockDrawable.hasCalledGetIntrinsicHeight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getConstantState",
-        args = {}
-    )
     @SuppressWarnings("deprecation")
     public void testGetConstantState() {
         ScaleDrawable scaleDrawable = new ScaleDrawable(new BitmapDrawable(),
@@ -500,14 +395,6 @@
         assertEquals(1, constantState.getChangingConfigurations());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "inflate",
-        args = {android.content.res.Resources.class, org.xmlpull.v1.XmlPullParser.class,
-                android.util.AttributeSet.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for inflate is incomplete." +
-            "1. not clear what is supposed to happen if any parameter is null.")
     @SuppressWarnings("deprecation")
     public void testInflate() throws XmlPullParserException, IOException {
         ScaleDrawable scaleDrawable = new ScaleDrawable(new BitmapDrawable(),
@@ -549,11 +436,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "mutate",
-        args = {}
-    )
     public void testMutate() {
         Resources resources = mContext.getResources();
         ScaleDrawable d1 = (ScaleDrawable) resources.getDrawable(R.drawable.scaledrawable);
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/ShapeDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/ShapeDrawableTest.java
index 29c774d..0ce1728 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/ShapeDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/ShapeDrawableTest.java
@@ -18,11 +18,6 @@
 
 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;
@@ -45,20 +40,7 @@
 
 import java.io.IOException;
 
-@TestTargetClass(android.graphics.drawable.ShapeDrawable.class)
 public class ShapeDrawableTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ShapeDrawable",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ShapeDrawable",
-            args = {android.graphics.drawable.shapes.Shape.class}
-        )
-    })
     public void testConstructors() {
         new ShapeDrawable();
 
@@ -67,13 +49,6 @@
         new ShapeDrawable(new RectShape());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "draw",
-        args = {android.graphics.Canvas.class}
-    )
-    @ToBeFixed(bug = "1400249", explanation = "It will be tested by functional test, " +
-            "and NPE is not expected.")
     public void testDraw() {
         ShapeDrawable shapeDrawable = new ShapeDrawable();
 
@@ -84,11 +59,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getChangingConfigurations",
-        args = {}
-    )
     public void testGetChangingConfigurations() {
         ShapeDrawable shapeDrawable = new ShapeDrawable();
         assertEquals(0, shapeDrawable.getChangingConfigurations());
@@ -108,11 +78,6 @@
         assertEquals(3, shapeDrawable.getChangingConfigurations());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getConstantState",
-        args = {}
-    )
     public void testGetConstantState() {
         ShapeDrawable shapeDrawable = new ShapeDrawable();
 
@@ -122,18 +87,6 @@
         assertEquals(1, constantState.getChangingConfigurations());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setIntrinsicHeight",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIntrinsicHeight",
-            args = {}
-        )
-    })
     public void testAccessIntrinsicHeight() {
         ShapeDrawable shapeDrawable = new ShapeDrawable();
         assertEquals(0, shapeDrawable.getIntrinsicHeight());
@@ -148,18 +101,6 @@
         assertEquals(Integer.MAX_VALUE, shapeDrawable.getIntrinsicHeight());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setIntrinsicWidth",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIntrinsicWidth",
-            args = {}
-        )
-    })
     public void testAccessIntrinsicWidth() {
         ShapeDrawable shapeDrawable = new ShapeDrawable();
         assertEquals(0, shapeDrawable.getIntrinsicWidth());
@@ -174,11 +115,6 @@
         assertEquals(Integer.MAX_VALUE, shapeDrawable.getIntrinsicWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getOpacity",
-        args = {}
-    )
     public void testGetOpacity() {
         ShapeDrawable shapeDrawable = new ShapeDrawable(new RectShape());
         assertEquals(PixelFormat.TRANSLUCENT, shapeDrawable.getOpacity());
@@ -194,24 +130,6 @@
         assertEquals(PixelFormat.TRANSLUCENT, shapeDrawable.getOpacity());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPadding",
-            args = {int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPadding",
-            args = {android.graphics.Rect.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPadding",
-            args = {android.graphics.Rect.class}
-        )
-    })
-    @ToBeFixed(bug = "1417734", explanation = "NPE is not expected.")
     public void testAccessPadding() {
         ShapeDrawable shapeDrawable = new ShapeDrawable();
         Rect padding = new Rect();
@@ -256,11 +174,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getPaint",
-        args = {}
-    )
     public void testGetPaint() {
         ShapeDrawable shapeDrawable = new ShapeDrawable();
         assertNotNull(shapeDrawable.getPaint());
@@ -268,18 +181,6 @@
                 shapeDrawable.getPaint().getFlags());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setShaderFactory",
-            args = {android.graphics.drawable.ShapeDrawable.ShaderFactory.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getShaderFactory",
-            args = {}
-        )
-    })
     public void testAccessShaderFactory() {
         ShapeDrawable shapeDrawable = new ShapeDrawable();
         assertNull(shapeDrawable.getShaderFactory());
@@ -298,18 +199,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getShape",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setShape",
-            args = {android.graphics.drawable.shapes.Shape.class}
-        )
-    })
     public void testAccessShape() {
         ShapeDrawable shapeDrawable = new ShapeDrawable();
         assertNull(shapeDrawable.getShape());
@@ -322,20 +211,6 @@
         assertNull(shapeDrawable.getShape());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "inflate",
-            args = {android.content.res.Resources.class, org.xmlpull.v1.XmlPullParser.class,
-                    android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "inflateTag",
-            args = {java.lang.String.class, android.content.res.Resources.class,
-                    org.xmlpull.v1.XmlPullParser.class, android.util.AttributeSet.class}
-        )
-    })
     public void testInflate() throws XmlPullParserException, IOException {
         final Resources res = mContext.getResources();
 
@@ -359,11 +234,6 @@
         assertTrue(shapeDrawable.extendedAttrsSet);
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onBoundsChange",
-        args = {android.graphics.Rect.class}
-    )
     public void testOnBoundsChange() {
         // implementation details, do not test.
     }
@@ -395,13 +265,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onDraw",
-        args = {android.graphics.drawable.shapes.Shape.class, android.graphics.Canvas.class,
-                android.graphics.Paint.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "NPE is not expected.")
     public void testOnDraw() {
         MockShape mockShape = new MockShape();
         MockShapeDrawable shapeDrawable = new MockShapeDrawable(mockShape);
@@ -432,12 +295,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setAlpha",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1386429", explanation = "no getter can not be tested")
     public void testSetAlpha() {
         ShapeDrawable shapeDrawable = new ShapeDrawable();
         shapeDrawable.setAlpha(0);
@@ -446,11 +303,6 @@
         shapeDrawable.setAlpha(256);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setColorFilter",
-        args = {android.graphics.ColorFilter.class}
-    )
     public void testSetColorFilter() {
         ShapeDrawable shapeDrawable = new ShapeDrawable();
 
@@ -462,11 +314,6 @@
         assertNull(shapeDrawable.getPaint().getColorFilter());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setDither",
-        args = {boolean.class}
-    )
     public void testSetDither() {
         ShapeDrawable shapeDrawable = new ShapeDrawable();
 
@@ -477,11 +324,6 @@
         assertFalse(shapeDrawable.getPaint().isDither());
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        method = "mutate",
-        args = {}
-    )
     public void testMutate() {
         // How to load a ShapeDrawable from resources.
     }
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/ShapeDrawable_ShaderFactoryTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/ShapeDrawable_ShaderFactoryTest.java
index c3272e4..b736519 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/ShapeDrawable_ShaderFactoryTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/ShapeDrawable_ShaderFactoryTest.java
@@ -18,19 +18,8 @@
 
 import junit.framework.TestCase;
 import android.graphics.drawable.ShapeDrawable;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(ShapeDrawable.ShaderFactory.class)
 public class ShapeDrawable_ShaderFactoryTest extends TestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test resize(int, int)",
-        method = "resize",
-        args = {int.class, int.class}
-    )
     public void testResize() {
         // resize is an abstract function.
     }
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/StateListDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/StateListDrawableTest.java
index 915453d..0bda619 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/StateListDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/StateListDrawableTest.java
@@ -36,12 +36,7 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
-@TestTargetClass(StateListDrawable.class)
 public class StateListDrawableTest extends InstrumentationTestCase {
     private MockStateListDrawable mStateListDrawable;
 
@@ -57,11 +52,6 @@
         mResources = getInstrumentation().getTargetContext().getResources();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "StateListDrawable",
-        args = {}
-    )
     public void testStateListDrawable() {
         new StateListDrawable();
         // Check the values set in the constructor
@@ -69,11 +59,6 @@
         assertTrue(new MockStateListDrawable().hasCalledOnStateChanged());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addState",
-        args = {int[].class, android.graphics.drawable.Drawable.class}
-    )
     public void testAddState() {
         assertEquals(0, mDrawableContainerState.getChildCount());
 
@@ -103,20 +88,10 @@
         assertTrue(mStateListDrawable.hasCalledOnStateChanged());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isStateful",
-        args = {}
-    )
     public void testIsStateful() {
         assertTrue(new StateListDrawable().isStateful());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onStateChange",
-        args = {int[].class}
-    )
     public void testOnStateChange() {
         mStateListDrawable.addState(new int[] { attr.state_focused, - attr.state_selected },
                 new MockDrawable());
@@ -152,13 +127,6 @@
         assertSame(mStateListDrawable.getCurrent(), mDrawableContainerState.getChildren()[1]);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "If drawable with wild card state is added before any other drawables, "
-                + "this drawable is always matched at first",
-        method = "onStateChange",
-        args = {int[].class}
-    )
     public void testOnStateChangeWithWildCardAtFirst() {
         mStateListDrawable.addState(StateSet.WILD_CARD, new MockDrawable());
         mStateListDrawable.addState(new int[] { attr.state_focused, - attr.state_selected },
@@ -169,13 +137,6 @@
         assertSame(mStateListDrawable.getCurrent(), mDrawableContainerState.getChildren()[0]);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onStateChange",
-        args = {int[].class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "StateListDrawable#onStateChange(int[]) when matching the null state")
     public void testOnStateChangeWithNullStateSet() {
         assertEquals(0, mDrawableContainerState.getChildCount());
         try {
@@ -192,12 +153,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "inflate",
-        args = {android.content.res.Resources.class, org.xmlpull.v1.XmlPullParser.class,
-                android.util.AttributeSet.class}
-    )
     public void testInflate() throws XmlPullParserException, IOException {
         XmlResourceParser parser = getResourceParser(R.xml.selector_correct);
 
@@ -247,15 +202,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "inflate",
-        args = {android.content.res.Resources.class, org.xmlpull.v1.XmlPullParser.class,
-                android.util.AttributeSet.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "StateListDrawable#inflate(Resources, XmlPullParser, AttributeSet) when param r,"
-            + "parser or attrs is out of bounds")
     public void testInflateWithNullParameters() throws XmlPullParserException, IOException{
         XmlResourceParser parser = getResourceParser(R.xml.level_list_correct);
         try {
@@ -277,12 +223,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "mutate",
-        args = {}
-    )
-    @ToBeFixed(bug = "", explanation = "mutate() always throw NullPointerException.")
     public void testMutate() {
         StateListDrawable d1 =
             (StateListDrawable) mResources.getDrawable(R.drawable.statelistdrawable);
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 a60bfe9..aeb21cf 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/TransitionDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/TransitionDrawableTest.java
@@ -25,13 +25,7 @@
 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;
 
-@TestTargetClass(TransitionDrawable.class)
 public class TransitionDrawableTest extends InstrumentationTestCase {
     private static final int COLOR1 = 0xff0000ff;
 
@@ -58,11 +52,6 @@
         mCanvas = new Canvas(mBitmap);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "TransitionDrawable",
-        args = {Drawable[].class}
-    )
     public void testConstructor() {
         Resources resources = getInstrumentation().getTargetContext().getResources();
         Drawable[] drawables = new Drawable[] {
@@ -72,19 +61,6 @@
         new TransitionDrawable(drawables);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startTransition",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "draw",
-            args = {android.graphics.Canvas.class}
-        )
-    })
-    @ToBeFixed(explanation = "The method should not accept negative duration.")
     public void testStartTransition() {
         MockCallBack cb = new MockCallBack();
         mTransitionDrawable.setCallback(cb);
@@ -113,18 +89,6 @@
         mTransitionDrawable.startTransition(-1);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "resetTransition",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "draw",
-            args = {android.graphics.Canvas.class}
-        )
-    })
     public void testResetTransition() {
         MockCallBack cb = new MockCallBack();
         mTransitionDrawable.setCallback(cb);
@@ -151,19 +115,6 @@
         assertTransitionEnd(COLOR0, 2000);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "reverseTransition",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "draw",
-            args = {android.graphics.Canvas.class}
-        )
-    })
-    @ToBeFixed(explanation = "The method should not accept negative duration.")
     public void testReverseTransition() {
         MockCallBack cb = new MockCallBack();
         mTransitionDrawable.setCallback(cb);
@@ -200,15 +151,6 @@
         mTransitionDrawable.reverseTransition(-1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test the method with null canvas. This method is tested in directly with real "
-                + "canvas in other tests of this case.",
-        method = "draw",
-        args = {android.graphics.Canvas.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "TransitionDrawable#draw(Canvas) when param canvas is null")
     public void testDrawWithNUllCanvas() {
         try {
             mTransitionDrawable.draw(null);
@@ -217,18 +159,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setCrossFadeEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isCrossFadeEnabled",
-            args = {}
-        )
-    })
     //  This boolean takes effect when the drawable is drawn and the effect can not be tested.
     public void testAccessCrossFadeEnabled() {
         assertFalse(mTransitionDrawable.isCrossFadeEnabled());
diff --git a/tests/tests/graphics/src/android/graphics/drawable/shapes/cts/ArcShapeTest.java b/tests/tests/graphics/src/android/graphics/drawable/shapes/cts/ArcShapeTest.java
index 1c2ee03..514d9d9 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/shapes/cts/ArcShapeTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/shapes/cts/ArcShapeTest.java
@@ -16,9 +16,6 @@
 
 package android.graphics.drawable.shapes.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
@@ -29,7 +26,6 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(android.graphics.drawable.shapes.ArcShape.class)
 public class ArcShapeTest extends TestCase {
     private static final int TEST_WIDTH  = 100;
     private static final int TEST_HEIGHT = 200;
@@ -39,11 +35,6 @@
 
     private static final int TOLERANCE = 4; // tolerance in pixels
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "ArcShape",
-        args = {float.class, float.class}
-    )
     public void testConstructor() {
         new ArcShape(1f, 5f);
 
@@ -52,11 +43,6 @@
         new ArcShape(-1f, -1f);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "draw",
-        args = {android.graphics.Canvas.class, android.graphics.Paint.class}
-    )
     public void testDraw() {
         // draw completely.
         ArcShape arcShape = new ArcShape(0.0f, 360.0f);
diff --git a/tests/tests/graphics/src/android/graphics/drawable/shapes/cts/OvalShapeTest.java b/tests/tests/graphics/src/android/graphics/drawable/shapes/cts/OvalShapeTest.java
index 363389f..dd440df 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/shapes/cts/OvalShapeTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/shapes/cts/OvalShapeTest.java
@@ -16,9 +16,6 @@
 
 package android.graphics.drawable.shapes.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
@@ -29,7 +26,6 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(android.graphics.drawable.shapes.OvalShape.class)
 public class OvalShapeTest extends TestCase {
     private static final int TEST_WIDTH  = 100;
     private static final int TEST_HEIGHT = 200;
@@ -39,20 +35,10 @@
 
     private static final int TOLERANCE = 4; // tolerance in pixels
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "OvalShape",
-        args = {}
-    )
     public void testConstructor() {
         new OvalShape();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "draw",
-        args = {android.graphics.Canvas.class, android.graphics.Paint.class}
-    )
     public void testDraw() {
         OvalShape ovalShape = new OvalShape();
         Bitmap bitmap = Bitmap.createBitmap(TEST_WIDTH, TEST_HEIGHT, Config.ARGB_8888);
diff --git a/tests/tests/graphics/src/android/graphics/drawable/shapes/cts/PathShapeTest.java b/tests/tests/graphics/src/android/graphics/drawable/shapes/cts/PathShapeTest.java
index b603b96..6da90a6 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/shapes/cts/PathShapeTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/shapes/cts/PathShapeTest.java
@@ -16,10 +16,6 @@
 
 package android.graphics.drawable.shapes.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
@@ -31,18 +27,12 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(android.graphics.drawable.shapes.PathShape.class)
 public class PathShapeTest extends TestCase {
     private static final int TEST_COLOR_1 = 0xFF00FF00;
     private static final int TEST_COLOR_2 = 0xFFFF0000;
 
     private static final int TOLERANCE = 4;
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "PathShape",
-        args = {android.graphics.Path.class, float.class, float.class}
-    )
     public void testConstructor() {
         new PathShape(new Path(), 1f, 5f);
 
@@ -51,18 +41,6 @@
         new PathShape(null, 0f, 0f);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "draw",
-            args = {android.graphics.Canvas.class, android.graphics.Paint.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "onResize",
-            args = {float.class, float.class}
-        )
-    })
     public void testDraw() {
         final int SHAPE_SIZE = 200;
 
@@ -109,11 +87,6 @@
         assertEquals(25, diagonal, TOLERANCE);
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        method = "clone",
-        args = {}
-    )
     public void testClone() throws CloneNotSupportedException {
         PathShape pathShape = new PathShape(new Path(), 1f, 5f);
         pathShape.resize(100f, 200f);
diff --git a/tests/tests/graphics/src/android/graphics/drawable/shapes/cts/RectShapeTest.java b/tests/tests/graphics/src/android/graphics/drawable/shapes/cts/RectShapeTest.java
index 4456c60..e76274d 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/shapes/cts/RectShapeTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/shapes/cts/RectShapeTest.java
@@ -16,10 +16,6 @@
 
 package android.graphics.drawable.shapes.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
@@ -31,7 +27,6 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(android.graphics.drawable.shapes.RectShape.class)
 public class RectShapeTest extends TestCase {
     private static final int TEST_WIDTH  = 100;
     private static final int TEST_HEIGHT = 200;
@@ -39,11 +34,6 @@
     private static final int TEST_COLOR_1 = 0xFF00FF00;
     private static final int TEST_COLOR_2 = 0xFFFF0000;
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "RectShape",
-        args = {}
-    )
     public void testConstructor() {
         new RectShape();
     }
@@ -56,11 +46,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "draw",
-        args = {android.graphics.Canvas.class, android.graphics.Paint.class}
-    )
     public void testDraw() {
         RectShape rectShape = new RectShape();
         Bitmap bitmap = Bitmap.createBitmap(TEST_WIDTH, TEST_HEIGHT, Config.ARGB_8888);
@@ -78,11 +63,6 @@
         assertDrawSuccessfully(bitmap, TEST_WIDTH, TEST_HEIGHT, TEST_COLOR_2);
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        method = "clone",
-        args = {}
-    )
     public void testClone() throws CloneNotSupportedException {
         RectShape rectShape = new RectShape();
         rectShape.resize(100f, 200f);
@@ -95,18 +75,6 @@
         assertEquals(rectShape.getHeight(), clonedShape.getHeight());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "rect",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onResize",
-            args = {float.class, float.class}
-        )
-    })
     public void testRect() {
         MyRectShape rectShape = new MyRectShape();
         RectF rect = rectShape.myRect();
diff --git a/tests/tests/graphics/src/android/graphics/drawable/shapes/cts/RoundRectShapeTest.java b/tests/tests/graphics/src/android/graphics/drawable/shapes/cts/RoundRectShapeTest.java
index ada9d69..7b5ac3a 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/shapes/cts/RoundRectShapeTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/shapes/cts/RoundRectShapeTest.java
@@ -16,11 +16,6 @@
 
 package android.graphics.drawable.shapes.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
@@ -32,7 +27,6 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(android.graphics.drawable.shapes.RoundRectShape.class)
 public class RoundRectShapeTest extends TestCase {
     private static final int TEST_WIDTH  = 100;
     private static final int TEST_HEIGHT = 200;
@@ -40,13 +34,6 @@
     private static final int TEST_COLOR_1 = 0xFF00FF00;
     private static final int TEST_COLOR_2 = 0xFFFF0000;
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "RoundRectShape",
-        args = {float[].class, android.graphics.RectF.class, float[].class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "In some condition, NullPointerException or " +
-            "ArrayIndexOutOfBoundsException will be thrown, which is not mentioned in javadoc.")
     public void testConstructor() {
         new RoundRectShape(new float[8], new RectF(), new float[8]);
 
@@ -71,18 +58,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "draw",
-            args = {android.graphics.Canvas.class, android.graphics.Paint.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "onResize",
-            args = {float.class, float.class}
-        )
-    })
     public void testDraw() {
         float[] outerR = new float[] { 12, 12, 0, 0, 0, 0, 0, 0 };
         RectF   inset = new RectF(6, 6, 6, 6);
@@ -105,11 +80,6 @@
         assertEquals(TEST_COLOR_2, bitmap.getPixel(TEST_WIDTH / 2, 0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        method = "clone",
-        args = {}
-    )
     public void testClone() throws CloneNotSupportedException {
         RoundRectShape roundRectShape = new RoundRectShape(new float[8], new RectF(), new float[8]);
         roundRectShape.resize(100f, 200f);
diff --git a/tests/tests/graphics/src/android/graphics/drawable/shapes/cts/ShapeTest.java b/tests/tests/graphics/src/android/graphics/drawable/shapes/cts/ShapeTest.java
index 99bde2f..d54a698 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/shapes/cts/ShapeTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/shapes/cts/ShapeTest.java
@@ -16,10 +16,6 @@
 
 package android.graphics.drawable.shapes.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
@@ -32,7 +28,6 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(android.graphics.drawable.shapes.Shape.class)
 public class ShapeTest extends TestCase {
     private static final int TEST_WIDTH  = 100;
     private static final int TEST_HEIGHT = 200;
@@ -40,23 +35,6 @@
     private static final int TEST_COLOR_1 = 0xFF00FF00;
     private static final int TEST_COLOR_2 = 0xFFFF0000;
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWidth",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getHeight",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "resize",
-            args = {float.class, float.class}
-        )
-    })
     public void testSize() {
         MockShape mockShape = new MockShape();
         assertFalse(mockShape.hasCalledOnResize());
@@ -79,11 +57,6 @@
         assertEquals(0f, mockShape.getHeight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onResize",
-        args = {float.class, float.class}
-    )
     public void testOnResize() {
         MockShape mockShape = new MockShape();
         assertFalse(mockShape.hasCalledOnResize());
@@ -102,11 +75,6 @@
         assertTrue(mockShape.hasCalledOnResize());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clone",
-        args = {}
-    )
     public void testClone() throws CloneNotSupportedException {
         Shape shape = new MockShape();
         shape.resize(100f, 200f);
@@ -119,21 +87,11 @@
         assertEquals(shape.getHeight(), clonedShape.getHeight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "hasAlpha",
-        args = {}
-    )
     public void testHasAlpha() {
         Shape shape = new MockShape();
         assertTrue(shape.hasAlpha());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "draw",
-        args = {android.graphics.Canvas.class, android.graphics.Paint.class}
-    )
     public void testDraw() {
         Shape shape = new MockShape();
         Bitmap bitmap = Bitmap.createBitmap(TEST_WIDTH, TEST_HEIGHT, Config.ARGB_8888);
diff --git a/tests/tests/graphics/src/android/opengl/cts/CompressedTextureTest.java b/tests/tests/graphics/src/android/opengl/cts/CompressedTextureTest.java
new file mode 100644
index 0000000..3676d66
--- /dev/null
+++ b/tests/tests/graphics/src/android/opengl/cts/CompressedTextureTest.java
@@ -0,0 +1,57 @@
+/*
+ * 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.opengl.cts;
+
+import android.os.Bundle;
+import android.test.ActivityInstrumentationTestCase2;
+
+/**
+ */
+public class CompressedTextureTest extends ActivityInstrumentationTestCase2<CompressedTextureStubActivity> {
+
+    public CompressedTextureTest() {
+        super("com.android.cts.stub", CompressedTextureStubActivity.class);
+    }
+
+    private void launchTest(String format) throws Exception {
+        Bundle extras = new Bundle();
+        extras.putString("TextureFormat", format);
+        CompressedTextureStubActivity activity = launchActivity("com.android.cts.stub",
+                CompressedTextureStubActivity.class, extras);
+        activity.finish();
+    }
+
+    public void testTextureUncompressed() throws Exception {
+        launchTest(CompressedTextureLoader.TEXTURE_UNCOMPRESSED);
+    }
+
+    public void testTextureETC1() throws Exception {
+        launchTest(CompressedTextureLoader.TEXTURE_ETC1);
+    }
+
+    public void testTexturePVRTC() throws Exception {
+        launchTest(CompressedTextureLoader.TEXTURE_PVRTC);
+    }
+
+    public void testTextureS3TC() throws Exception {
+        launchTest(CompressedTextureLoader.TEXTURE_S3TC);
+    }
+
+    /*public void testTextureATC() throws Exception {
+        launchTest(CompressedTextureLoader.TEXTURE_ATC);
+    }*/
+}
diff --git a/tests/tests/graphics/src/android/opengl/cts/GLSurfaceViewTest.java b/tests/tests/graphics/src/android/opengl/cts/GLSurfaceViewTest.java
index 26a90b9..2a8d698 100644
--- a/tests/tests/graphics/src/android/opengl/cts/GLSurfaceViewTest.java
+++ b/tests/tests/graphics/src/android/opengl/cts/GLSurfaceViewTest.java
@@ -16,7 +16,6 @@
 
 package android.opengl.cts;
 
-import dalvik.annotation.TestTargetClass;
 
 import android.opengl.GLSurfaceView;
 import android.test.ActivityInstrumentationTestCase2;
@@ -26,7 +25,6 @@
 /**
  * Tests for the GLSurfaceView class.
  */
-@TestTargetClass(GLSurfaceView.class)
 public class GLSurfaceViewTest extends
         ActivityInstrumentationTestCase2<GLSurfaceViewStubActivity> {
 
diff --git a/tests/tests/graphics2/Android.mk b/tests/tests/graphics2/Android.mk
index d977ee8..9c6d46d 100644
--- a/tests/tests/graphics2/Android.mk
+++ b/tests/tests/graphics2/Android.mk
@@ -31,4 +31,4 @@
 
 LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/hardware/Android.mk b/tests/tests/hardware/Android.mk
index dd3b72f..dd769fa 100644
--- a/tests/tests/hardware/Android.mk
+++ b/tests/tests/hardware/Android.mk
@@ -29,5 +29,4 @@
 # uncomment when dalvik.annotation.Test* are removed or part of SDK
 #LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
-
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/hardware/src/android/hardware/cts/CameraGLTest.java b/tests/tests/hardware/src/android/hardware/cts/CameraGLTest.java
index ebb97d8..825c42e 100644
--- a/tests/tests/hardware/src/android/hardware/cts/CameraGLTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/CameraGLTest.java
@@ -39,8 +39,6 @@
 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;
@@ -62,7 +60,6 @@
  * 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";
diff --git a/tests/tests/hardware/src/android/hardware/cts/CameraTest.java b/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
index 3b29f6a..217042d 100755
--- a/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
@@ -42,16 +42,14 @@
 import android.util.Log;
 import android.view.SurfaceHolder;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
 
@@ -59,7 +57,6 @@
  * This test case must run with hardware. It can't be tested in emulator
  */
 @LargeTest
-@TestTargetClass(Camera.class)
 public class CameraTest extends ActivityInstrumentationTestCase2<CameraStubActivity> {
     private String TAG = "CameraTest";
     private static final String PACKAGE = "com.android.cts.stub";
@@ -305,40 +302,6 @@
      * Test case 1: Take a picture and verify all the callback
      * functions are called properly.
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startPreview",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPreviewDisplay",
-            args = {android.view.SurfaceHolder.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "open",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "takePicture",
-            args = {android.hardware.Camera.ShutterCallback.class,
-                    android.hardware.Camera.PictureCallback.class,
-                    android.hardware.Camera.PictureCallback.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "autoFocus",
-            args = {android.hardware.Camera.AutoFocusCallback.class}
-        )
-    })
     @UiThreadTest
     public void testTakePicture() throws Exception {
         int nCameras = Camera.getNumberOfCameras();
@@ -369,43 +332,6 @@
         assertEquals(pictureSize.height, bmpOptions.outHeight);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stopPreview",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPreviewCallback",
-            args = {android.hardware.Camera.PreviewCallback.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "open",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startPreview",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPreviewDisplay",
-            args = {android.view.SurfaceHolder.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setErrorCallback",
-            args = {android.hardware.Camera.ErrorCallback.class}
-        )
-    })
     @UiThreadTest
     public void testPreviewCallback() throws Exception {
         int nCameras = Camera.getNumberOfCameras();
@@ -450,11 +376,6 @@
         terminateMessageLooper();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setOneShotPreviewCallback",
-        args = {PreviewCallback.class}
-    )
     @UiThreadTest
     public void testSetOneShotPreviewCallback() throws Exception {
         int nCameras = Camera.getNumberOfCameras();
@@ -478,11 +399,6 @@
         assertEquals(PREVIEW_CALLBACK_NOT_RECEIVED, mPreviewCallbackResult);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setPreviewDisplay",
-        args = {SurfaceHolder.class}
-    )
     @UiThreadTest
     public void testSetPreviewDisplay() throws Exception {
         int nCameras = Camera.getNumberOfCameras();
@@ -526,11 +442,6 @@
         assertEquals(PREVIEW_CALLBACK_RECEIVED, mPreviewCallbackResult);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setDisplayOrientation",
-        args = {int.class}
-    )
     @UiThreadTest
     public void testDisplayOrientation() throws Exception {
         int nCameras = Camera.getNumberOfCameras();
@@ -569,18 +480,6 @@
         terminateMessageLooper();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getParameters",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setParameters",
-            args = {android.hardware.Camera.Parameters.class}
-        )
-    })
     @UiThreadTest
     public void testParameters() throws Exception {
         int nCameras = Camera.getNumberOfCameras();
@@ -788,23 +687,6 @@
                 || (format == ImageFormat.JPEG) || (format == ImageFormat.YUY2);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setJpegThumbnailSize",
-            args = {android.hardware.Camera.Size.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getJpegThumbnailSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getJpegSupportedThumbnailSizes",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testJpegThumbnailSize() throws Exception {
         int nCameras = Camera.getNumberOfCameras();
@@ -869,12 +751,21 @@
         Camera.Parameters parameters = mCamera.getParameters();
         if (!recording) mCamera.startPreview();
         double focalLength = parameters.getFocalLength();
+        Date date = new Date(System.currentTimeMillis());
+        String localDatetime = new SimpleDateFormat("yyyy:MM:dd HH:").format(date);
+
         mCamera.takePicture(mShutterCallback, mRawPictureCallback, mJpegPictureCallback);
         waitForSnapshotDone();
+
+        // Test various exif tags.
         ExifInterface exif = new ExifInterface(JPEG_PATH);
         assertNotNull(exif.getAttribute(ExifInterface.TAG_MAKE));
         assertNotNull(exif.getAttribute(ExifInterface.TAG_MODEL));
-        assertNotNull(exif.getAttribute(ExifInterface.TAG_DATETIME));
+        String datetime = exif.getAttribute(ExifInterface.TAG_DATETIME);
+        assertNotNull(datetime);
+        // Datetime should be local time.
+        assertTrue(datetime.startsWith(localDatetime));
+        assertTrue(datetime.length() == 19); // EXIF spec is "YYYY:MM:DD HH:MM:SS".
         assertTrue(exif.getAttributeInt(ExifInterface.TAG_IMAGE_WIDTH, 0) != 0);
         assertTrue(exif.getAttributeInt(ExifInterface.TAG_IMAGE_LENGTH, 0) != 0);
         checkGpsDataNull(exif);
@@ -935,18 +826,6 @@
         assertNull(exif.getAttribute(ExifInterface.TAG_GPS_PROCESSING_METHOD));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "lock",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unlock",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testLockUnlock() throws Exception {
         int nCameras = Camera.getNumberOfCameras();
@@ -1058,18 +937,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addCallbackBuffer",
-            args = {byte[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPreviewCallbackWithBuffer",
-            args = {android.hardware.Camera.PreviewCallback.class}
-        )
-    })
     @UiThreadTest
     public void testPreviewCallbackWithBuffer() throws Exception {
         int nCameras = Camera.getNumberOfCameras();
@@ -1221,23 +1088,6 @@
         terminateMessageLooper();
     }
 
-    @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();
@@ -1471,13 +1321,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "cancelAutofocus",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testCancelAutofocus() throws Exception {
         int nCameras = Camera.getNumberOfCameras();
@@ -1555,23 +1398,6 @@
                      distances2[Parameters.FOCUS_DISTANCE_FAR_INDEX]);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getNumberOfCameras",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCameraInfo",
-            args = {int.class, CameraInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "open",
-            args = {int.class}
-        )
-    })
     @UiThreadTest
     public void testMultipleCameras() throws Exception {
         int nCameras = Camera.getNumberOfCameras();
diff --git a/tests/tests/hardware/src/android/hardware/cts/Camera_ParametersTest.java b/tests/tests/hardware/src/android/hardware/cts/Camera_ParametersTest.java
index 0edc290..b37959e 100644
--- a/tests/tests/hardware/src/android/hardware/cts/Camera_ParametersTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/Camera_ParametersTest.java
@@ -18,118 +18,9 @@
 
 import junit.framework.TestCase;
 import android.hardware.Camera.Parameters;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(Parameters.class)
 public class Camera_ParametersTest extends TestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            notes = "tested indirectly",
-            method = "get",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            notes = "tested indirectly",
-            method = "set",
-            args = {java.lang.String.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            notes = "tested indirectly",
-            method = "getInt",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            notes = "tested indirectly",
-            method = "set",
-            args = {java.lang.String.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "getPictureFormat",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setPictureFormat",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "getPictureSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setPictureSize",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "getPreviewFormat",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setPreviewFormat",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "getPreviewFrameRate",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setPreviewFrameRate",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "getPreviewSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setPreviewSize",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            notes = "tested indirectly",
-            method = "flatten",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            notes = "tested indirectly",
-            method = "unflatten",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.TODO,
-            notes = "test removed due to invalid assumptions",
-            method = "remove",
-            args = {java.lang.String.class}
-        )
-    })
     public void testAccessMethods() {
         // Camera.Parameters methods are tested in CameraTest#testAccessParameters().
     }
diff --git a/tests/tests/hardware/src/android/hardware/cts/Camera_SizeTest.java b/tests/tests/hardware/src/android/hardware/cts/Camera_SizeTest.java
index 0b7b69f..72d4ba3 100644
--- a/tests/tests/hardware/src/android/hardware/cts/Camera_SizeTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/Camera_SizeTest.java
@@ -16,9 +16,6 @@
 
 package android.hardware.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.hardware.Camera;
 import android.hardware.Camera.Parameters;
@@ -26,7 +23,6 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(Camera.Size.class)
 @LargeTest
 public class Camera_SizeTest extends TestCase {
 
@@ -37,11 +33,6 @@
     private final int HEIGHT3 = 640;
     private final int WIDTH3 = 480;
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "Camera.Size",
-        args = {int.class, int.class}
-    )
     public void testConstructor() {
         if (Camera.getNumberOfCameras() < 1) {
             return;
diff --git a/tests/tests/hardware/src/android/hardware/cts/GeomagneticFieldTest.java b/tests/tests/hardware/src/android/hardware/cts/GeomagneticFieldTest.java
index d98d2d5..dc927b6 100644
--- a/tests/tests/hardware/src/android/hardware/cts/GeomagneticFieldTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/GeomagneticFieldTest.java
@@ -16,17 +16,12 @@
 
 package android.hardware.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.hardware.GeomagneticField;
 import android.test.AndroidTestCase;
 
 import java.util.GregorianCalendar;
 
-@TestTargetClass(GeomagneticField.class)
 public class GeomagneticFieldTest extends AndroidTestCase {
     // Chengdu: Latitude 30d 40' 12", Longitude 104d 3' 36"
     private static final float LATITUDE_OF_CHENGDU = 30.67f;
@@ -34,48 +29,6 @@
     private static final float ALTITUDE_OF_CHENGDU = 500f;
     private static final long TEST_TIME = new GregorianCalendar(2010, 5, 1).getTimeInMillis();
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "GeomagneticField",
-            args = {float.class, float.class, float.class, long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDeclination",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInclination",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFieldStrength",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getHorizontalStrength",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getX",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getY",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getZ",
-            args = {}
-        )
-    })
     public void testGeomagneticField() {
         GeomagneticField geomagneticField = new GeomagneticField(LATITUDE_OF_CHENGDU,
                 LONGITUDE_OF_CHENGDU, ALTITUDE_OF_CHENGDU, TEST_TIME);
diff --git a/tests/tests/hardware/src/android/hardware/cts/SensorTest.java b/tests/tests/hardware/src/android/hardware/cts/SensorTest.java
index 5ae2ee9..be18634 100644
--- a/tests/tests/hardware/src/android/hardware/cts/SensorTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/SensorTest.java
@@ -23,51 +23,9 @@
 import android.hardware.Sensor;
 import android.hardware.SensorManager;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(Sensor.class)
 public class SensorTest extends AndroidTestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getType",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "getName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "getPower",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "getResolution",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "getVendor",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "getVersion",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "getMaximumRange",
-            args = {}
-        )
-    })
     public void testSensorOperations() {
         // Because we can't know every sensors unit details, so we can't assert
         // get values with specified values.
diff --git a/tests/tests/holo/Android.mk b/tests/tests/holo/Android.mk
index 22afc85..513fb20 100644
--- a/tests/tests/holo/Android.mk
+++ b/tests/tests/holo/Android.mk
@@ -32,4 +32,4 @@
 
 LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/holo/src/android/holo/cts/LayoutAdapter.java b/tests/tests/holo/src/android/holo/cts/LayoutAdapter.java
index d7732a9..8b974e7 100644
--- a/tests/tests/holo/src/android/holo/cts/LayoutAdapter.java
+++ b/tests/tests/holo/src/android/holo/cts/LayoutAdapter.java
@@ -22,6 +22,7 @@
 import android.holo.cts.modifiers.SearchViewModifier;
 import android.holo.cts.modifiers.TabHostModifier;
 import android.holo.cts.modifiers.TimePickerModifier;
+import android.holo.cts.modifiers.ViewPressedModifier;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -106,8 +107,8 @@
         addLayout(R.string.button, "button",
                 R.layout.button, null, NO_TIMEOUT_MS);
 
-//        addLayout(R.string.button_pressed, "button_pressed",
-//                R.layout.button, new ViewPressedModifier(), LONG_TIMEOUT_MS);
+        addLayout(R.string.button_pressed, "button_pressed",
+                R.layout.button, new ViewPressedModifier(), LONG_TIMEOUT_MS);
 
         addCalendarLayouts(adapterMode);
 
@@ -166,14 +167,14 @@
         addLayout(R.string.ratingbar_5, "ratingbar_5",
                 R.layout.ratingbar_5, null, NO_TIMEOUT_MS);
 
-//        addLayout(R.string.ratingbar_0_pressed, "ratingbar_0_pressed",
-//                R.layout.ratingbar_0, new ViewPressedModifier(), LONG_TIMEOUT_MS);
+        addLayout(R.string.ratingbar_0_pressed, "ratingbar_0_pressed",
+                R.layout.ratingbar_0, new ViewPressedModifier(), LONG_TIMEOUT_MS);
 
-//        addLayout(R.string.ratingbar_2point5_pressed, "ratingbar_2point5_pressed",
-//                R.layout.ratingbar_2point5, new ViewPressedModifier(), LONG_TIMEOUT_MS);
+        addLayout(R.string.ratingbar_2point5_pressed, "ratingbar_2point5_pressed",
+                R.layout.ratingbar_2point5, new ViewPressedModifier(), LONG_TIMEOUT_MS);
 
-//        addLayout(R.string.ratingbar_5_pressed, "ratingbar_5_pressed",
-//                R.layout.ratingbar_5, new ViewPressedModifier(), LONG_TIMEOUT_MS);
+        addLayout(R.string.ratingbar_5_pressed, "ratingbar_5_pressed",
+                R.layout.ratingbar_5, new ViewPressedModifier(), LONG_TIMEOUT_MS);
 
         addLayout(R.string.searchview, "searchview",
                 R.layout.searchview, null, NO_TIMEOUT_MS);
diff --git a/tests/tests/jni/Android.mk b/tests/tests/jni/Android.mk
index 0f9f88b..c8c92fd 100644
--- a/tests/tests/jni/Android.mk
+++ b/tests/tests/jni/Android.mk
@@ -34,7 +34,7 @@
 
 LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_PACKAGE)
 
 # Include the associated library's makefile.
-include $(LOCAL_PATH)/libjnitest/Android.mk
\ No newline at end of file
+include $(LOCAL_PATH)/libjnitest/Android.mk
diff --git a/tests/tests/jni/libjnitest/helper.c b/tests/tests/jni/libjnitest/helper.c
index f974a59..831d5b5 100644
--- a/tests/tests/jni/libjnitest/helper.c
+++ b/tests/tests/jni/libjnitest/helper.c
@@ -58,7 +58,7 @@
 
         JniTestFunction *function = va_arg(args, JniTestFunction *);
 
-        LOGI("running %s", name);
+        ALOGI("running %s", name);
 
         char *oneResult = function(env);
         if (oneResult != NULL) {
diff --git a/tests/tests/jni/libjnitest/register.c b/tests/tests/jni/libjnitest/register.c
index d68b536..66eb265 100644
--- a/tests/tests/jni/libjnitest/register.c
+++ b/tests/tests/jni/libjnitest/register.c
@@ -32,25 +32,25 @@
 
     extern int register_InstanceNonce(JNIEnv *);
     if (register_InstanceNonce(env)) {
-        LOGE("failed to register InstanceNonce");
+        ALOGE("failed to register InstanceNonce");
         return JNI_ERR;
     }
 
     extern int register_StaticNonce(JNIEnv *);
     if (register_StaticNonce(env)) {
-        LOGE("failed to register StaticNonce");
+        ALOGE("failed to register StaticNonce");
         return JNI_ERR;
     }
 
     extern int register_JniCTest(JNIEnv *);
     if (register_JniCTest(env)) {
-        LOGE("failed to register JniCTest");
+        ALOGE("failed to register JniCTest");
         return JNI_ERR;
     }
 
     extern int register_JniCppTest(JNIEnv *);
     if (register_JniCppTest(env)) {
-        LOGE("failed to register JniCppTest");
+        ALOGE("failed to register JniCppTest");
         return JNI_ERR;
     }
 
diff --git a/tests/tests/location/Android.mk b/tests/tests/location/Android.mk
index d63d911..b53aaa0 100644
--- a/tests/tests/location/Android.mk
+++ b/tests/tests/location/Android.mk
@@ -32,5 +32,4 @@
 # uncomment when dalvik.annotation.Test* are removed or part of SDK
 #LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
-
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/location/src/android/location/cts/AddressTest.java b/tests/tests/location/src/android/location/cts/AddressTest.java
index 5c77d94..66e4fad 100644
--- a/tests/tests/location/src/android/location/cts/AddressTest.java
+++ b/tests/tests/location/src/android/location/cts/AddressTest.java
@@ -23,23 +23,11 @@
 import android.os.Bundle;
 import android.os.Parcel;
 import android.os.Parcelable;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
 /**
  * Test the main functionalities of the AddressTest.
  */
-@TestTargetClass(Address.class)
 public class AddressTest extends TestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor",
-        method = "Address",
-        args = {java.util.Locale.class}
-    )
     public void testConstructor() {
         new Address(Locale.ENGLISH);
 
@@ -48,12 +36,6 @@
         new Address(null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test describeContents()",
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
         Address address = new Address(Locale.GERMAN);
 
@@ -66,20 +48,6 @@
         assertEquals(extras.describeContents(), address.describeContents());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setAdminArea(String) and getAdminArea()",
-            method = "setAdminArea",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setAdminArea(String) and getAdminArea()",
-            method = "getAdminArea",
-            args = {}
-        )
-    })
     public void testAccessAdminArea() {
         Address address = new Address(Locale.ITALY);
 
@@ -91,20 +59,6 @@
         assertNull(address.getAdminArea());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setCountryCode(String) and getCountryCode()",
-            method = "setCountryCode",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setCountryCode(String) and getCountryCode()",
-            method = "getCountryCode",
-            args = {}
-        )
-    })
     public void testAccessCountryCode() {
         Address address = new Address(Locale.JAPAN);
 
@@ -116,20 +70,6 @@
         assertNull(address.getCountryCode());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setCountryName(String) and getCountryName()",
-            method = "setCountryName",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setCountryName(String) and getCountryName()",
-            method = "getCountryName",
-            args = {}
-        )
-    })
     public void testAccessCountryName() {
         Address address = new Address(Locale.KOREA);
 
@@ -141,20 +81,6 @@
         assertNull(address.getCountryName());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setExtras(Bundle) and getExtras()",
-            method = "setExtras",
-            args = {android.os.Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setExtras(Bundle) and getExtras()",
-            method = "getExtras",
-            args = {}
-        )
-    })
     public void testAccessExtras() {
         Address address = new Address(Locale.TAIWAN);
 
@@ -172,20 +98,6 @@
         assertNull(address.getExtras());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setFeatureName(String) and getFeatureName()",
-            method = "setFeatureName",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setFeatureName(String) and getFeatureName()",
-            method = "getFeatureName",
-            args = {}
-        )
-    })
     public void testAccessFeatureName() {
         Address address = new Address(Locale.SIMPLIFIED_CHINESE);
 
@@ -197,32 +109,6 @@
         assertNull(address.getFeatureName());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setLatitude(double) and getLatitude(), clearLatitude(), hasLatitude()",
-            method = "setLatitude",
-            args = {double.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setLatitude(double) and getLatitude(), clearLatitude(), hasLatitude()",
-            method = "getLatitude",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setLatitude(double) and getLatitude(), clearLatitude(), hasLatitude()",
-            method = "clearLatitude",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setLatitude(double) and getLatitude(), clearLatitude(), hasLatitude()",
-            method = "hasLatitude",
-            args = {}
-        )
-    })
     public void testAccessLatitude() {
         Address address = new Address(Locale.CHINA);
         assertFalse(address.hasLatitude());
@@ -241,32 +127,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setLongitude",
-            args = {double.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "getLongitude",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "clearLongitude",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "hasLongitude",
-            args = {}
-        )
-    })
     public void testAccessLongitude() {
         Address address = new Address(Locale.CHINA);
         assertFalse(address.hasLongitude());
@@ -285,22 +145,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setPhone(String) and getPhone()",
-            method = "setPhone",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setPhone(String) and getPhone()",
-            method = "getPhone",
-            args = {}
-        )
-    })
-    @ToBeFixed(bug = "", explanation = "getPhone() should never throw IllegalStateException. " +
-            "Should remove @throws clause from its javadoc")
     public void testAccessPhone() {
         Address address = new Address(Locale.CHINA);
 
@@ -312,20 +156,6 @@
         assertNull(address.getPhone());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setPostalCode(String) and getPostalCode()",
-            method = "setPostalCode",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setPostalCode(String) and getPostalCode()",
-            method = "getPostalCode",
-            args = {}
-        )
-    })
     public void testAccessPostalCode() {
         Address address = new Address(Locale.CHINA);
 
@@ -337,20 +167,6 @@
         assertNull(address.getPostalCode());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setThoroughfare(String) and getThoroughfare()",
-            method = "setThoroughfare",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setThoroughfare(String) and getThoroughfare()",
-            method = "getThoroughfare",
-            args = {}
-        )
-    })
     public void testAccessThoroughfare() {
         Address address = new Address(Locale.CHINA);
 
@@ -362,20 +178,6 @@
         assertNull(address.getThoroughfare());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setUrl(String) and getUrl()",
-            method = "setUrl",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setUrl(String) and getUrl()",
-            method = "getUrl",
-            args = {}
-        )
-    })
     public void testAccessUrl() {
         Address address = new Address(Locale.CHINA);
 
@@ -387,20 +189,6 @@
         assertNull(address.getUrl());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setSubAdminArea(String) and getSubAdminArea()",
-            method = "setSubAdminArea",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setSubAdminArea(String) and getSubAdminArea()",
-            method = "getSubAdminArea",
-            args = {}
-        )
-    })
     public void testAccessSubAdminArea() {
         Address address = new Address(Locale.CHINA);
 
@@ -412,12 +200,6 @@
         assertNull(address.getSubAdminArea());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test toString()",
-        method = "toString",
-        args = {}
-    )
     public void testToString() {
         Address address = new Address(Locale.CHINA);
 
@@ -430,26 +212,6 @@
         assertEquals(expected, address.toString());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setAddressLine",
-            args = {int.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "getMaxAddressLineIndex",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "getAddressLine",
-            args = {int.class}
-        )
-    })
     public void testAddressLine() {
         Address address = new Address(Locale.CHINA);
 
@@ -484,12 +246,6 @@
         assertEquals(5, address.getMaxAddressLineIndex());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getLocale()",
-        method = "getLocale",
-        args = {}
-    )
     public void testGetLocale() {
         Locale locale = Locale.US;
         Address address = new Address(locale);
@@ -503,20 +259,6 @@
         assertNull(address.getLocale());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setLocality(String) and getLocality()",
-            method = "setLocality",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setLocality(String) and getLocality()",
-            method = "getLocality",
-            args = {}
-        )
-    })
     public void testAccessLocality() {
         Address address = new Address(Locale.PRC);
 
@@ -528,12 +270,6 @@
         assertNull(address.getLocality());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test writeToParcel(Parcel, int), this function ignores the parameter 'flag'.",
-        method = "writeToParcel",
-        args = {android.os.Parcel.class, int.class}
-    )
     public void testWriteToParcel() {
         Locale locale = Locale.KOREA;
         Address address = new Address(locale);
diff --git a/tests/tests/location/src/android/location/cts/CriteriaTest.java b/tests/tests/location/src/android/location/cts/CriteriaTest.java
index 4345e2a..d812965 100644
--- a/tests/tests/location/src/android/location/cts/CriteriaTest.java
+++ b/tests/tests/location/src/android/location/cts/CriteriaTest.java
@@ -16,32 +16,12 @@
 
 package android.location.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.location.Criteria;
 import android.os.Parcel;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(Criteria.class)
 public class CriteriaTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Criteria",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Criteria",
-            args = {android.location.Criteria.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, " +
-            "should add @throw NullPointerException into javadoc when the parameter is null.")
     public void testConstructor() {
         new Criteria();
 
@@ -68,30 +48,11 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
         Criteria criteria = new Criteria();
         criteria.describeContents();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAccuracy",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAccuracy",
-            args = {}
-        )
-    })
-    @ToBeFixed(bug = "1728526", explanation = "setAccuracy did not throw " +
-            "IllegalArgumentException when argument is negative.")
     public void testAccessAccuracy() {
         Criteria criteria = new Criteria();
 
@@ -118,20 +79,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPowerRequirement",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPowerRequirement",
-            args = {}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws IllegalArgumentException " +
-            "clause into javadoc of setPowerRequirement() when input is valid.")
     public void testAccessPowerRequirement() {
         Criteria criteria = new Criteria();
 
@@ -156,18 +103,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAltitudeRequired",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isAltitudeRequired",
-            args = {}
-        )
-    })
     public void testAccessAltitudeRequired() {
         Criteria criteria = new Criteria();
 
@@ -178,18 +113,6 @@
         assertTrue(criteria.isAltitudeRequired());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setBearingRequired",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isBearingRequired",
-            args = {}
-        )
-    })
     public void testAccessBearingRequired() {
         Criteria criteria = new Criteria();
 
@@ -200,18 +123,6 @@
         assertTrue(criteria.isBearingRequired());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setCostAllowed",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isCostAllowed",
-            args = {}
-        )
-    })
     public void testAccessCostAllowed() {
         Criteria criteria = new Criteria();
 
@@ -222,18 +133,6 @@
         assertTrue(criteria.isCostAllowed());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSpeedRequired",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isSpeedRequired",
-            args = {}
-        )
-    })
     public void testAccessSpeedRequired() {
         Criteria criteria = new Criteria();
 
@@ -244,12 +143,6 @@
         assertTrue(criteria.isSpeedRequired());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "this function does not read parameter 'flag'.",
-        method = "writeToParcel",
-        args = {android.os.Parcel.class, int.class}
-    )
     public void testWriteToParcel() {
         Criteria criteria = new Criteria();
         criteria.setAltitudeRequired(true);
diff --git a/tests/tests/location/src/android/location/cts/GeocoderTest.java b/tests/tests/location/src/android/location/cts/GeocoderTest.java
index c212732..6f5b00b 100644
--- a/tests/tests/location/src/android/location/cts/GeocoderTest.java
+++ b/tests/tests/location/src/android/location/cts/GeocoderTest.java
@@ -16,11 +16,6 @@
 
 package android.location.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.location.Address;
 import android.location.Geocoder;
@@ -30,20 +25,7 @@
 import java.util.List;
 import java.util.Locale;
 
-@TestTargetClass(Geocoder.class)
 public class GeocoderTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Geocoder",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Geocoder",
-            args = {android.content.Context.class, java.util.Locale.class}
-        )
-    })
     public void testConstructor() {
         new Geocoder(getContext());
 
@@ -57,11 +39,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getFromLocation",
-        args = {double.class, double.class, int.class}
-    )
     public void testGetFromLocation() throws IOException {
         Geocoder geocoder = new Geocoder(getContext());
 
@@ -101,20 +78,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFromLocationName",
-            args = {String.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFromLocationName",
-            args = {String.class, int.class, double.class, double.class, double.class,
-                    double.class}
-        )
-    })
-    @ToBeFixed(bug = "", explanation = "getFromLocationName always returns a empty List.")
     public void testGetFromLocationName() throws IOException {
         Geocoder geocoder = new Geocoder(getContext(), Locale.US);
 
diff --git a/tests/tests/location/src/android/location/cts/GpsSatelliteTest.java b/tests/tests/location/src/android/location/cts/GpsSatelliteTest.java
index 50dea91..c79bb8b 100644
--- a/tests/tests/location/src/android/location/cts/GpsSatelliteTest.java
+++ b/tests/tests/location/src/android/location/cts/GpsSatelliteTest.java
@@ -16,9 +16,6 @@
 
 package android.location.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.content.Context;
 import android.location.GpsSatellite;
@@ -28,7 +25,6 @@
 
 import java.util.Iterator;
 
-@TestTargetClass(GpsSatellite.class)
 public class GpsSatelliteTest extends AndroidTestCase {
     private GpsSatellite mGpsSatellite;
 
@@ -45,33 +41,18 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getAzimuth",
-        args = {}
-    )
     public void testGetAzimuth() {
         if (mGpsSatellite != null) {
             assertTrue(mGpsSatellite.getAzimuth() >= 0 && mGpsSatellite.getAzimuth() <= 360);
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getElevation",
-        args = {}
-    )
     public void testGetElevation() {
         if (mGpsSatellite != null) {
             assertTrue(mGpsSatellite.getElevation() >= 0 && mGpsSatellite.getElevation() <= 90);
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getPrn",
-        args = {}
-    )
     public void testGetPrn() {
         if (mGpsSatellite != null) {
             // make sure there is no exception.
@@ -79,11 +60,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSnr",
-        args = {}
-    )
     public void testGetSnr() {
         if (mGpsSatellite != null) {
             // make sure there is no exception.
@@ -91,11 +67,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "hasAlmanac",
-        args = {}
-    )
     public void testHasAlmanac() {
         if (mGpsSatellite != null) {
             // make sure there is no exception.
@@ -103,11 +74,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "hasEphemeris",
-        args = {}
-    )
     public void testHasEphemeris() {
         if (mGpsSatellite != null) {
             // make sure there is no exception.
@@ -115,11 +81,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "usedInFix",
-        args = {}
-    )
     public void testUsedInFix() {
         if (mGpsSatellite != null) {
             // make sure there is no exception.
diff --git a/tests/tests/location/src/android/location/cts/GpsStatusTest.java b/tests/tests/location/src/android/location/cts/GpsStatusTest.java
index ad95262..92ec137 100644
--- a/tests/tests/location/src/android/location/cts/GpsStatusTest.java
+++ b/tests/tests/location/src/android/location/cts/GpsStatusTest.java
@@ -16,10 +16,6 @@
 
 package android.location.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.Context;
 import android.location.GpsSatellite;
@@ -29,7 +25,6 @@
 
 import java.util.Iterator;
 
-@TestTargetClass(GpsStatus.class)
 public class GpsStatusTest extends AndroidTestCase {
     private GpsStatus mGpsStatus;
 
@@ -41,18 +36,6 @@
         mGpsStatus = lm.getGpsStatus(null);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSatellites",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMaxSatellites",
-            args = {}
-        )
-    })
     public void testGetSatellites() {
         Iterable<GpsSatellite> satellites = mGpsStatus.getSatellites();
         assertNotNull(satellites);
@@ -70,11 +53,6 @@
         assertTrue(count <= maxSatellites);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getTimeToFirstFix",
-        args = {}
-    )
     public void testGetTimeToFirstFix() {
         // make sure there is no exception.
         mGpsStatus.getTimeToFirstFix();
diff --git a/tests/tests/location/src/android/location/cts/LocationManagerTest.java b/tests/tests/location/src/android/location/cts/LocationManagerTest.java
index 620ee82..07091cc 100755
--- a/tests/tests/location/src/android/location/cts/LocationManagerTest.java
+++ b/tests/tests/location/src/android/location/cts/LocationManagerTest.java
@@ -16,11 +16,6 @@
 
 package android.location.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
@@ -50,7 +45,6 @@
  * android.permission.ACCESS_FINE_LOCATION to access GPS provider
  * android.permission.ACCESS_LOCATION_EXTRA_COMMANDS to send extra commands to GPS provider
  */
-@TestTargetClass(LocationManager.class)
 public class LocationManagerTest extends InstrumentationTestCase {
     private static final long TEST_TIME_OUT = 5000;
 
@@ -120,19 +114,6 @@
         super.tearDown();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeTestProvider",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addTestProvider",
-            args = {String.class, boolean.class, boolean.class, boolean.class, boolean.class,
-                    boolean.class, boolean.class, boolean.class, int.class, int.class}
-        )
-    })
     public void testRemoveTestProvider() {
         // this test assumes TEST_MOCK_PROVIDER_NAME was created in setUp.
         LocationProvider provider = mManager.getProvider(TEST_MOCK_PROVIDER_NAME);
@@ -165,23 +146,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAllProviders",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getProviders",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTestProviderEnabled",
-            args = {String.class, boolean.class}
-        )
-    })
     public void testGetProviders() {
         List<String> providers = mManager.getAllProviders();
         assertTrue(providers.size() >= 2);
@@ -237,11 +201,6 @@
         return false;
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getProvider",
-        args = {String.class}
-    )
     public void testGetProvider() {
         LocationProvider p = mManager.getProvider(TEST_MOCK_PROVIDER_NAME);
         assertNotNull(p);
@@ -266,18 +225,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getProviders",
-            args = {Criteria.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBestProvider",
-            args = {Criteria.class, boolean.class}
-        )
-    })
     public void testGetProvidersWithCriteria() {
         Criteria criteria = new Criteria();
         List<String> providers = mManager.getProviders(criteria, true);
@@ -306,29 +253,6 @@
         assertNotNull(p);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requestLocationUpdates",
-            args = {String.class, long.class, float.class, LocationListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeUpdates",
-            args = {LocationListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTestProviderLocation",
-            args = {String.class, Location.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            notes = "Cannot determine whether location has been cleared",
-            method = "clearTestProviderLocation",
-            args = {String.class}
-        )
-    })
     public void testLocationUpdatesWithLocationListener() throws InterruptedException {
         doLocationUpdatesWithLocationListener(TEST_MOCK_PROVIDER_NAME);
 
@@ -426,23 +350,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requestLocationUpdates",
-            args = {String.class, long.class, float.class, LocationListener.class, Looper.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeUpdates",
-            args = {LocationListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTestProviderLocation",
-            args = {String.class, Location.class}
-        )
-    })
     public void testLocationUpdatesWithLocationListenerAndLooper() throws InterruptedException {
         double latitude1 = 60;
         double longitude1 = 20;
@@ -492,23 +399,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requestLocationUpdates",
-            args = {String.class, long.class, float.class, PendingIntent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeUpdates",
-            args = {PendingIntent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTestProviderLocation",
-            args = {String.class, Location.class}
-        )
-    })
     public void testLocationUpdatesWithPendingIntent() throws InterruptedException {
         double latitude1 = 20;
         double longitude1 = 40;
@@ -557,18 +447,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addProximityAlert",
-            args = {double.class, double.class, float.class, long.class, PendingIntent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeProximityAlert",
-            args = {PendingIntent.class}
-        )
-    })
     public void testAddProximityAlert() {
         Intent i = new Intent();
         i.setAction("android.location.cts.TEST_GET_GPS_STATUS_ACTION");
@@ -578,23 +456,6 @@
         mManager.removeProximityAlert(pi);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isProviderEnabled",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTestProviderEnabled",
-            args = {String.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "clearTestProviderEnabled",
-            args = {String.class}
-        )
-    })
     public void testIsProviderEnabled() {
         // this test assumes enabled TEST_MOCK_PROVIDER_NAME was created in setUp.
         assertNotNull(mManager.getProvider(TEST_MOCK_PROVIDER_NAME));
@@ -628,11 +489,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLastKnownLocation",
-        args = {String.class}
-    )
     public void testGetLastKnownLocation() throws InterruptedException {
         double latitude1 = 20;
         double longitude1 = 40;
@@ -668,20 +524,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addGpsStatusListener",
-            args = {GpsStatus.Listener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeGpsStatusListener",
-            args = {GpsStatus.Listener.class}
-        )
-    })
-    @ToBeFixed(bug = "", explanation = "The callbacks of LocationListener can not be tested "
-            + "because there is no simulation of GPS events on the emulator")
     public void testGpsStatusListener() {
         MockGpsStatusListener listener = new MockGpsStatusListener();
         mManager.addGpsStatusListener(listener);
@@ -691,25 +533,12 @@
         mManager.removeGpsStatusListener(null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getGpsStatus",
-        args = {GpsStatus.class}
-    )
-    @ToBeFixed(bug = "", explanation = "The callbacks of LocationListener can not be tested "
-            + "because there is no simulation of GPS events on the emulator")
     public void testGetGpsStatus() {
         GpsStatus status = mManager.getGpsStatus(null);
         assertNotNull(status);
         assertSame(status, mManager.getGpsStatus(status));
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        notes = "Cannot rely on any specific extra command to be implemented.",
-        method = "sendExtraCommand",
-        args = {String.class, String.class, Bundle.class}
-    )
     public void testSendExtraCommand() {
         // this test assumes TEST_MOCK_PROVIDER_NAME was created in setUp.
         assertNotNull(mManager.getProvider(TEST_MOCK_PROVIDER_NAME));
@@ -720,24 +549,6 @@
         assertFalse(mManager.sendExtraCommand(UNKNOWN_PROVIDER_NAME, "unknown", new Bundle()));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requestLocationUpdates",
-            args = {String.class, long.class, float.class, LocationListener.class, Looper.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTestProviderStatus",
-            args = {String.class, int.class, Bundle.class, long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            notes = "Cannot determine whether status has been cleared",
-            method = "clearTestProviderStatus",
-            args = {String.class}
-        )
-    })
     public void testSetTestProviderStatus() throws InterruptedException {
         final int status = LocationProvider.TEMPORARILY_UNAVAILABLE;
         final long updateTime = 1000;
@@ -775,11 +586,6 @@
     /**
      * Tests basic proximity alert when entering proximity
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addProximityAlert",
-        args = {double.class, double.class, float.class, long.class, PendingIntent.class}
-    )
     public void testEnterProximity() throws Exception {
         doTestEnterProximity(10000);
     }
@@ -787,11 +593,6 @@
     /**
      * Tests proximity alert when entering proximity, with no expiration
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addProximityAlert",
-        args = {double.class, double.class, float.class, long.class, PendingIntent.class}
-    )
     public void testEnterProximity_noexpire() throws Exception {
         doTestEnterProximity(-1);
     }
@@ -799,11 +600,6 @@
     /**
      * Tests basic proximity alert when exiting proximity
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addProximityAlert",
-        args = {double.class, double.class, float.class, long.class, PendingIntent.class}
-    )
     public void testExitProximity() throws Exception {
         // first do enter proximity scenario
         doTestEnterProximity(-1);
diff --git a/tests/tests/location/src/android/location/cts/LocationProviderTest.java b/tests/tests/location/src/android/location/cts/LocationProviderTest.java
index 9e53583..60c9fb4 100644
--- a/tests/tests/location/src/android/location/cts/LocationProviderTest.java
+++ b/tests/tests/location/src/android/location/cts/LocationProviderTest.java
@@ -16,9 +16,6 @@
 
 package android.location.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.content.Context;
 import android.location.Criteria;
@@ -26,7 +23,6 @@
 import android.location.LocationProvider;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(LocationProvider.class)
 public class LocationProviderTest extends AndroidTestCase {
     private static final String PROVIDER_NAME = "location_provider_test";
 
@@ -64,21 +60,11 @@
         mLocationManager.setTestProviderEnabled(providerName, true);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getName",
-        args = {}
-    )
     public void testGetName() {
         LocationProvider locationProvider = mLocationManager.getProvider(PROVIDER_NAME);
         assertEquals(PROVIDER_NAME, locationProvider.getName());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "meetsCriteria",
-        args = {android.location.Criteria.class}
-    )
     public void testMeetsCriteria() {
         LocationProvider locationProvider = mLocationManager.getProvider(PROVIDER_NAME);
 
diff --git a/tests/tests/location/src/android/location/cts/LocationTest.java b/tests/tests/location/src/android/location/cts/LocationTest.java
index 2855436..f037109 100644
--- a/tests/tests/location/src/android/location/cts/LocationTest.java
+++ b/tests/tests/location/src/android/location/cts/LocationTest.java
@@ -16,11 +16,6 @@
 
 package android.location.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.location.Location;
 import android.os.Bundle;
@@ -31,7 +26,6 @@
 
 import java.text.DecimalFormat;
 
-@TestTargetClass(Location.class)
 public class LocationTest extends AndroidTestCase {
     private static final float DELTA = 0.1f;
     private final float TEST_ACCURACY = 1.0f;
@@ -47,20 +41,6 @@
     private final boolean TEST_KEY1VALUE = false;
     private final byte TEST_KEY2VALUE = 10;
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Location",
-            args = {android.location.Location.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Location",
-            args = {java.lang.String.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, " +
-            "should add @throw NullPointerException into javadoc")
     public void testConstructor() {
         new Location("LocationProvider");
 
@@ -76,11 +56,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dump",
-        args = {Printer.class, String.class}
-    )
     public void testDump() {
         StringBuilder sb = new StringBuilder();
         StringBuilderPrinter printer = new StringBuilderPrinter(sb);
@@ -89,14 +64,6 @@
         assertNotNull(sb.toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test bearingTo(Location)",
-        method = "bearingTo",
-        args = {android.location.Location.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws IllegalArgumentException " +
-            "clause into javadoc of setPowerRequirement() when input is valid.")
     public void testBearingTo() {
         Location location = new Location("");
         Location dest = new Location("");
@@ -137,11 +104,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "convert",
-        args = {double.class, int.class}
-    )
     public void testConvert_CoordinateToRepresentation() {
         DecimalFormat df = new DecimalFormat("###.#####");
         String result;
@@ -186,11 +148,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "convert",
-        args = {java.lang.String.class}
-    )
     public void testConvert_RepresentationToCoordinate() {
         double result;
 
@@ -242,22 +199,11 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "this function always returns 0",
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
         Location location = new Location("");
         location.describeContents();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "distanceBetween",
-        args = {double.class, double.class, double.class, double.class, float[].class}
-    )
     public void testDistanceBetween() {
         float[] result = new float[3];
         Location.distanceBetween(0, 0, 0, 0, result);
@@ -285,11 +231,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "distanceTo",
-        args = {android.location.Location.class}
-    )
     public void testDistanceTo() {
         float distance;
         Location zeroLocation = new Location("");
@@ -307,28 +248,6 @@
         assertEquals(6244139.0, distance, 1);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAccuracy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasAccuracy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAccuracy",
-            args = {float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeAccuracy",
-            args = {}
-        )
-    })
     public void testAccessAccuracy() {
         Location location = new Location("");
         assertFalse(location.hasAccuracy());
@@ -342,28 +261,6 @@
         assertFalse(location.hasAccuracy());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAltitude",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasAltitude",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeAltitude",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAltitude",
-            args = {double.class}
-        )
-    })
     public void testAccessAltitude() {
         Location location = new Location("");
         assertFalse(location.hasAltitude());
@@ -377,28 +274,6 @@
         assertFalse(location.hasAltitude());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBearing",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasBearing",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeBearing",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setBearing",
-            args = {float.class}
-        )
-    })
     public void testAccessBearing() {
         Location location = new Location("");
         assertFalse(location.hasBearing());
@@ -420,18 +295,6 @@
         assertFalse(location.hasBearing());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getExtras",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setExtras",
-            args = {android.os.Bundle.class}
-        )
-    })
     public void testAccessExtras() {
         Location location = createTestLocation();
 
@@ -441,18 +304,6 @@
         assertNull(location.getExtras());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLatitude",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setLatitude",
-            args = {double.class}
-        )
-    })
     public void testAccessLatitude() {
         Location location = new Location("");
 
@@ -466,18 +317,6 @@
         assertEquals(-90, location.getLatitude(), DELTA);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLongitude",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setLongitude",
-            args = {double.class}
-        )
-    })
     public void testAccessLongitude() {
         Location location = new Location("");
 
@@ -491,18 +330,6 @@
         assertEquals(-180, location.getLongitude(), DELTA);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getProvider",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProvider",
-            args = {java.lang.String.class}
-        )
-    })
     public void testAccessProvider() {
         Location location = new Location("");
 
@@ -514,28 +341,6 @@
         assertNull(location.getProvider());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSpeed",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasSpeed",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeSpeed",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSpeed",
-            args = {float.class}
-        )
-    })
     public void testAccessSpeed() {
         Location location = new Location("");
         assertFalse(location.hasSpeed());
@@ -549,18 +354,6 @@
         assertFalse(location.hasSpeed());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTime",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTime",
-            args = {long.class}
-        )
-    })
     public void testAccessTime() {
         Location location = new Location("");
 
@@ -574,18 +367,6 @@
         assertEquals(12000, location.getTime());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "reset",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "set",
-            args = {android.location.Location.class}
-        )
-    })
     public void testSet() {
         Location location = new Location("");
 
@@ -610,22 +391,12 @@
         assertNull(location.getExtras());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "toString",
-        args = {}
-    )
     public void testToString() {
         Location location = createTestLocation();
 
         assertNotNull(location.toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {android.os.Parcel.class, int.class}
-    )
     public void testWriteToParcel() {
         Location location = createTestLocation();
 
diff --git a/tests/tests/media/Android.mk b/tests/tests/media/Android.mk
index df1de12..1a14f83 100644
--- a/tests/tests/media/Android.mk
+++ b/tests/tests/media/Android.mk
@@ -32,5 +32,4 @@
 # uncomment when dalvik.annotation.Test* are removed or part of SDK
 #LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
-
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/media/res/raw/john_cage.ogg b/tests/tests/media/res/raw/john_cage.ogg
deleted file mode 100644
index 62d2335..0000000
--- a/tests/tests/media/res/raw/john_cage.ogg
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/src/android/media/cts/AsyncPlayerTest.java b/tests/tests/media/src/android/media/cts/AsyncPlayerTest.java
index 8a43887..08e1d67 100644
--- a/tests/tests/media/src/android/media/cts/AsyncPlayerTest.java
+++ b/tests/tests/media/src/android/media/cts/AsyncPlayerTest.java
@@ -22,31 +22,9 @@
 import android.net.Uri;
 import android.provider.Settings;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(AsyncPlayer.class)
 public class AsyncPlayerTest extends AndroidTestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AsyncPlayer",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "play",
-            args = {Context.class, Uri.class, boolean.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stop",
-            args = {}
-        )
-    })
     public void testAsyncPlayer() throws Exception {
         final Uri PLAY_URI = Settings.System.DEFAULT_NOTIFICATION_URI;
         AsyncPlayer asyncPlayer = new AsyncPlayer(null);
diff --git a/tests/tests/media/src/android/media/cts/AudioEffectTest.java b/tests/tests/media/src/android/media/cts/AudioEffectTest.java
index c40f169..1d85af3 100644
--- a/tests/tests/media/src/android/media/cts/AudioEffectTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioEffectTest.java
@@ -33,13 +33,8 @@
 import android.os.Looper;
 import android.test.AndroidTestCase;
 import android.util.Log;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 import java.util.UUID;
 
-@TestTargetClass(AudioEffect.class)
 public class AudioEffectTest extends AndroidTestCase {
 
     private String TAG = "AudioEffectTest";
@@ -75,13 +70,6 @@
 
     //Test case 0.0: test queryEffects() and platfrom at least provides Equalizer, Bass Boost,
     // Virtualizer, Environmental reverb and Preset reverb effects
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "queryEffects",
-            args = {}
-        )
-    })
     public void test0_0QueryEffects() throws Exception {
 
         AudioEffect.Descriptor[] desc = AudioEffect.queryEffects();
@@ -139,23 +127,6 @@
     }
 
     //Test case 1.0: test constructor from effect type and get effect ID
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioEffect",
-            args = {UUID.class, UUID.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        )
-    })
     public void test1_0ConstructorFromType() throws Exception {
         AudioEffect.Descriptor[] desc = AudioEffect.queryEffects();
         assertTrue("no effects found", (desc.length != 0));
@@ -196,23 +167,6 @@
     }
 
     //Test case 1.1: test constructor from effect uuid
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioEffect",
-            args = {UUID.class, UUID.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        )
-    })
     public void test1_1ConstructorFromUuid() throws Exception {
         AudioEffect.Descriptor[] desc = AudioEffect.queryEffects();
         assertTrue("no effects found", (desc.length != 0));
@@ -250,18 +204,6 @@
     }
 
     //Test case 1.2: test constructor failure from unknown type
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioEffect",
-            args = {UUID.class, UUID.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        )
-    })
     public void test1_2ConstructorUnknownType() throws Exception {
 
         try {
@@ -281,23 +223,6 @@
     }
 
     //Test case 1.3: test getEnabled() failure when called on released effect
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioEffect",
-            args = {UUID.class, UUID.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getEnabled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        )
-    })
     public void test1_3GetEnabledAfterRelease() throws Exception {
 
         try {
@@ -321,18 +246,6 @@
     }
 
     //Test case 1.4: test contructor on mediaPlayer audio session
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "MediaPlayer.getAudioSessionId",
-            args = {}
-        )
-    })
     public void test1_4InsertOnMediaPlayer() throws Exception {
         MediaPlayer mp = new MediaPlayer();
         assertNotNull("could not create mediaplayer", mp);
@@ -352,23 +265,6 @@
     }
 
     //Test case 1.5: test auxiliary effect attachement on MediaPlayer
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "MediaPlayer.attachAuxEffect",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "MediaPlayer.setAuxEffectSendLevel",
-            args = {}
-        )
-    })
     public void test1_5AuxiliaryOnMediaPlayer() throws Exception {
         createMediaPlayerLooper();
         synchronized(mLock) {
@@ -406,23 +302,6 @@
     }
 
     //Test case 1.6: test auxiliary effect attachement failure before setDatasource
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "MediaPlayer.attachAuxEffect",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "MediaPlayer.setAuxEffectSendLevel",
-            args = {}
-        )
-    })
     public void test1_6AuxiliaryOnMediaPlayerFailure() throws Exception {
         createMediaPlayerLooper();
         synchronized(mLock) {
@@ -457,23 +336,6 @@
 
 
     //Test case 1.7: test auxiliary effect attachement on AudioTrack
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack.attachAuxEffect",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack.setAuxEffectSendLevel",
-            args = {}
-        )
-    })
     public void test1_7AuxiliaryOnAudioTrack() throws Exception {
         AudioTrack track = null;
         getEffect(AudioEffect.EFFECT_TYPE_PRESET_REVERB, 0);
@@ -515,18 +377,6 @@
 
 
     //Test case 2.0: test setEnabled() and getEnabled() in valid state
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getEnabled",
-            args = {}
-        )
-    })
     public void test2_0SetEnabledGetEnabled() throws Exception {
 
         try {
@@ -555,18 +405,6 @@
     }
 
     //Test case 2.1: test setEnabled() throws exception after release
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getEnabled",
-            args = {}
-        )
-    })
     public void test2_1SetEnabledAfterRelease() throws Exception {
 
         try {
@@ -594,18 +432,6 @@
     //----------------------------------
 
     //Test case 3.0: test setParameter(byte[], byte[]) / getParameter(byte[], byte[])
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setParameter",
-            args = {byte[].class, byte[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getParameter",
-            args = {byte[].class, byte[].class}
-        )
-    })
     public void test3_0SetParameterByteArrayByteArray() throws Exception {
         getEffect(AudioEffect.EFFECT_TYPE_PRESET_REVERB, 0);
         try {
@@ -637,18 +463,6 @@
     }
 
     //Test case 3.1: test setParameter(int, int) / getParameter(int, int[])
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setParameter",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getParameter",
-            args = {int.class, int[].class}
-        )
-    })
     public void test3_1SetParameterIntInt() throws Exception {
         getEffect(AudioEffect.EFFECT_TYPE_ENV_REVERB, 0);
         try {
@@ -680,18 +494,6 @@
     }
 
     //Test case 3.2: test setParameter(int, short) / getParameter(int, short[])
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setParameter",
-            args = {int.class, short.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getParameter",
-            args = {int.class, short[].class}
-        )
-    })
     public void test3_2SetParameterIntShort() throws Exception {
         getEffect(AudioEffect.EFFECT_TYPE_PRESET_REVERB, 0);
         try {
@@ -721,18 +523,6 @@
     }
 
     //Test case 3.3: test setParameter(int, byte[]) / getParameter(int, byte[])
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setParameter",
-            args = {int.class, byte[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getParameter",
-            args = {int.class, byte[].class}
-        )
-    })
     public void test3_3SetParameterIntByteArray() throws Exception {
         getEffect(AudioEffect.EFFECT_TYPE_ENV_REVERB, 0);
         try {
@@ -766,18 +556,6 @@
     }
 
     //Test case 3.4: test setParameter(int[], int[]) / getParameter(int[], int[])
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setParameter",
-            args = {int[].class, int[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getParameter",
-            args = {int[].class, int[].class}
-        )
-    })
     public void test3_4SetParameterIntArrayIntArray() throws Exception {
         getEffect(AudioEffect.EFFECT_TYPE_ENV_REVERB, 0);
         try {
@@ -811,18 +589,6 @@
     }
 
     //Test case 3.5: test setParameter(int[], short[]) / getParameter(int[], short[])
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setParameter",
-            args = {int[].class, short[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getParameter",
-            args = {int[].class, short[].class}
-        )
-    })
 
     public void test3_5SetParameterIntArrayShortArray() throws Exception {
         getEffect(AudioEffect.EFFECT_TYPE_PRESET_REVERB, 0);
@@ -855,18 +621,6 @@
     }
 
     //Test case 3.6: test setParameter(int[], byte[]) / getParameter(int[], byte[])
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setParameter",
-            args = {int[].class, byte[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getParameter",
-            args = {int[].class, byte[].class}
-        )
-    })
     public void test3_6SetParameterIntArrayByteArray() throws Exception {
         getEffect(AudioEffect.EFFECT_TYPE_ENV_REVERB, 0);
         try {
@@ -901,13 +655,6 @@
     }
 
     //Test case 3.7: test setParameter() throws exception after release()
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setParameter",
-            args = {int.class, short.class}
-        )
-    })
     public void test3_7SetParameterAfterRelease() throws Exception {
         AudioEffect effect = null;
         try {
@@ -933,13 +680,6 @@
     }
 
     //Test case 3.8: test getParameter() throws exception after release()
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setParameter",
-            args = {int.class, short[].class}
-        )
-    })
     public void test3_8GetParameterAfterRelease() throws Exception {
         AudioEffect effect = null;
         try {
@@ -970,23 +710,6 @@
     //----------------------------------
 
     //Test case 4.0: test control passed to higher priority client
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasControl",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getEnabled",
-            args = {}
-        )
-    })
     public void test4_0setEnabledLowerPriority() throws Exception {
         AudioEffect effect1 = null;
         AudioEffect effect2 = null;
@@ -1024,18 +747,6 @@
     }
 
     //Test case 4.1: test control passed to higher priority client
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setParameter",
-            args = {int.class, short.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getParameter",
-            args = {int.class, short[].class}
-        )
-    })
     public void test4_1setParameterLowerPriority() throws Exception {
         AudioEffect effect1 = null;
         AudioEffect effect2 = null;
@@ -1085,13 +796,6 @@
     }
 
     //Test case 4.2: test control status listener
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setControlStatusListener",
-            args = {AudioEffect.OnControlStatusChangeListener.class}
-        )
-    })
     public void test4_2ControlStatusListener() throws Exception {
 
         mHasControl = true;
@@ -1119,23 +823,6 @@
     }
 
     //Test case 4.3: test enable status listener
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEnableStatusListener",
-            args = {AudioEffect.OnEnableStatusChangeListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getEnabled",
-            args = {}
-        )
-    })
     public void test4_3EnableStatusListener() throws Exception {
 
         createListenerLooper(false, true, false);
@@ -1167,18 +854,6 @@
     }
 
     //Test case 4.4: test parameter changed listener
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setParameterListener",
-            args = {AudioEffect.OnParameterChangeListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setParameter",
-            args = {int.class, short.class}
-        )
-    })
     public void test4_4ParameterChangedListener() throws Exception {
 
         createListenerLooper(false, false, true);
@@ -1218,13 +893,6 @@
 
 
     //Test case 5.0: test command method
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "command",
-            args = {int.class, byte[].class, byte[].class}
-        )
-    })
     public void test5_0Command() throws Exception {
         getEffect(AudioEffect.EFFECT_TYPE_PRESET_REVERB, 0);
         try {
diff --git a/tests/tests/media/src/android/media/cts/AudioManagerTest.java b/tests/tests/media/src/android/media/cts/AudioManagerTest.java
index 74e4cc0..ffdb3d2 100644
--- a/tests/tests/media/src/android/media/cts/AudioManagerTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioManagerTest.java
@@ -39,11 +39,6 @@
 
 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 android.content.Context;
 import android.media.AudioManager;
@@ -54,7 +49,6 @@
 import android.view.SoundEffectConstants;
 
 
-@TestTargetClass(AudioManager.class)
 public class AudioManagerTest extends AndroidTestCase {
 
     private final static int MP3_TO_PLAY = R.raw.testmp3;
@@ -67,18 +61,6 @@
         mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setMicrophoneMute",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isMicrophoneMute",
-            args = {}
-        )
-    })
     public void testMicrophoneMute() throws Exception {
         mAudioManager.setMicrophoneMute(true);
         assertTrue(mAudioManager.isMicrophoneMute());
@@ -86,33 +68,6 @@
         assertFalse(mAudioManager.isMicrophoneMute());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unloadSoundEffects",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "playSoundEffect",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "playSoundEffect",
-            args = {int.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "loadSoundEffects",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRingerMode",
-            args = {int.class}
-        )
-    })
     public void testSoundEffects() throws Exception {
         // set relative setting
         mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
@@ -147,13 +102,6 @@
         mAudioManager.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_RIGHT, volume);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isMusicActive",
-            args = {}
-        )
-    })
     public void testMusicActive() throws Exception {
         MediaPlayer mp = MediaPlayer.create(mContext, MP3_TO_PLAY);
         mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
@@ -167,18 +115,6 @@
         assertFalse(mAudioManager.isMusicActive());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setMode",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMode",
-            args = {}
-        )
-    })
     public void testAccessMode() throws Exception {
         mAudioManager.setMode(MODE_RINGTONE);
         assertEquals(MODE_RINGTONE, mAudioManager.getMode());
@@ -191,50 +127,6 @@
     }
 
     @SuppressWarnings("deprecation")
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setBluetoothA2dpOn",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setBluetoothScoOn",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRouting",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isBluetoothA2dpOn",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isBluetoothScoOn",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "setRouting",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSpeakerphoneOn",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isSpeakerphoneOn",
-            args = {}
-        )
-    })
-    @ToBeFixed(bug="1713090", explanation="setRouting() has not only been deprecated, but is no"
-        + " longer having any effect.")
     public void testRouting() throws Exception {
         // setBluetoothA2dpOn is a no-op, and getRouting should always return -1
         // AudioManager.MODE_CURRENT
@@ -273,28 +165,6 @@
         assertEquals(AudioManager.MODE_CURRENT, mAudioManager.getRouting(MODE_IN_COMMUNICATION));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "shouldVibrate",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVibrateSetting",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getVibrateSetting",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRingerMode",
-            args = {int.class}
-        )
-    })
     public void testVibrateNotification() throws Exception {
         // VIBRATE_SETTING_ON
         mAudioManager.setVibrateSetting(VIBRATE_TYPE_NOTIFICATION, VIBRATE_SETTING_ON);
@@ -350,28 +220,6 @@
                 mAudioManager.getVibrateSetting(VIBRATE_TYPE_NOTIFICATION));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "shouldVibrate",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVibrateSetting",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getVibrateSetting",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRingerMode",
-            args = {int.class}
-        )
-    })
     public void testVibrateRinger() throws Exception {
         // VIBRATE_TYPE_RINGER
         mAudioManager.setVibrateSetting(VIBRATE_TYPE_RINGER, VIBRATE_SETTING_ON);
@@ -426,23 +274,6 @@
                 mAudioManager.getVibrateSetting(VIBRATE_TYPE_RINGER));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unloadSoundEffects",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRingerMode",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRingerMode",
-            args = {int.class}
-        )
-    })
     public void testAccessRingMode() throws Exception {
         mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
         assertEquals(RINGER_MODE_NORMAL, mAudioManager.getRingerMode());
@@ -454,38 +285,6 @@
         assertEquals(RINGER_MODE_VIBRATE, mAudioManager.getRingerMode());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setStreamVolume",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStreamMaxVolume",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStreamVolume",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-             method = "adjustStreamVolume",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "adjustSuggestedStreamVolume",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "adjustVolume",
-            args = {int.class, int.class}
-        )
-    })
     public void testVolume() throws Exception {
         int[] streams = { AudioManager.STREAM_ALARM,
                           AudioManager.STREAM_MUSIC,
diff --git a/tests/tests/media/src/android/media/cts/AudioRecordTest.java b/tests/tests/media/src/android/media/cts/AudioRecordTest.java
index a07c704..ab7c775 100644
--- a/tests/tests/media/src/android/media/cts/AudioRecordTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioRecordTest.java
@@ -27,12 +27,7 @@
 import android.os.Looper;
 import android.os.Message;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(AudioRecord.class)
 public class AudioRecordTest extends AndroidTestCase {
 
     private AudioRecord mAudioRecord;
@@ -50,6 +45,7 @@
         if (!hasMicrophone()) {
             return;
         }
+
         /*
          * InstrumentationTestRunner.onStart() calls Looper.prepare(), which creates a looper
          * for the current thread. However, since we don't actually call loop() in the test,
@@ -96,53 +92,6 @@
         mIsHandleMessageCalled = false;
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioRecord",
-            args = {int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAudioFormat",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAudioSource",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSampleRate",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRecordingState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinBufferSize",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getChannelCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getChannelConfiguration",
-            args = {}
-        )
-    })
     public void testAudioRecordProperties() throws Exception {
         if (!hasMicrophone()) {
             return;
@@ -161,78 +110,6 @@
         assertTrue(bufferSize > 0);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioRecord",
-            args = {int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startRecording",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setNotificationMarkerPosition",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPositionNotificationPeriod",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getNotificationMarkerPosition",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPositionNotificationPeriod",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "read",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "read",
-            args = {short[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "read",
-            args = {ByteBuffer.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRecordingState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRecordPositionUpdateListener",
-            args = {OnRecordPositionUpdateListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRecordPositionUpdateListener",
-            args = {OnRecordPositionUpdateListener.class, Handler.class}
-        )
-    })
     public void testAudioRecordOP() throws Exception {
         if (!hasMicrophone()) {
             return;
diff --git a/tests/tests/media/src/android/media/cts/AudioRecord_BufferSizeTest.java b/tests/tests/media/src/android/media/cts/AudioRecord_BufferSizeTest.java
index 504a304..e597827 100644
--- a/tests/tests/media/src/android/media/cts/AudioRecord_BufferSizeTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioRecord_BufferSizeTest.java
@@ -17,12 +17,12 @@
 package android.media.cts;
 
 import android.content.pm.PackageManager;
+import android.cts.util.PollingCheck;
 import android.media.AudioFormat;
 import android.media.AudioRecord;
 import android.media.MediaRecorder.AudioSource;
 import android.test.AndroidTestCase;
 import android.util.Log;
-import android.view.animation.cts.DelayedCheck;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -85,7 +85,7 @@
     }
 
     private void checkRecordingState(final int state) {
-        new DelayedCheck() {
+        new PollingCheck() {
             @Override
             protected boolean check() {
                 return mAudioRecord.getRecordingState() == state;
diff --git a/tests/tests/media/src/android/media/cts/AudioTrackTest.java b/tests/tests/media/src/android/media/cts/AudioTrackTest.java
index 0316ef9..20004f4 100644
--- a/tests/tests/media/src/android/media/cts/AudioTrackTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioTrackTest.java
@@ -21,12 +21,7 @@
 import android.media.AudioTrack;
 import android.test.AndroidTestCase;
 import android.util.Log;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(AudioTrack.class)
 public class AudioTrackTest extends AndroidTestCase {
     private String TAG = "AudioTrackTest";
     private final long WAIT_MSEC = 200;
@@ -116,13 +111,6 @@
 
     // Test case 1: constructor for streaming AudioTrack, mono, 16bit at misc
     // valid sample rates
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        )
-    })
     public void testConstructorMono16MusicStream() throws Exception {
 
         TestResults res = constructorTestMultiSampleRate(AudioManager.STREAM_MUSIC,
@@ -134,13 +122,6 @@
 
     // Test case 2: constructor for streaming AudioTrack, stereo, 16bit at misc
     // valid sample rates
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        )
-    })
     public void testConstructorStereo16MusicStream() throws Exception {
 
         TestResults res = constructorTestMultiSampleRate(AudioManager.STREAM_MUSIC,
@@ -152,13 +133,6 @@
 
     // Test case 3: constructor for static AudioTrack, mono, 16bit at misc valid
     // sample rates
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        )
-    })
     public void testConstructorMono16MusicStatic() throws Exception {
 
         TestResults res = constructorTestMultiSampleRate(AudioManager.STREAM_MUSIC,
@@ -170,13 +144,6 @@
 
     // Test case 4: constructor for static AudioTrack, stereo, 16bit at misc
     // valid sample rates
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        )
-    })
     public void testConstructorStereo16MusicStatic() throws Exception {
 
         TestResults res = constructorTestMultiSampleRate(AudioManager.STREAM_MUSIC,
@@ -192,13 +159,6 @@
 
     // Test case 1: constructor for streaming AudioTrack, mono, 8bit at misc
     // valid sample rates
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        )
-    })
     public void testConstructorMono8MusicStream() throws Exception {
 
         TestResults res = constructorTestMultiSampleRate(AudioManager.STREAM_MUSIC,
@@ -210,13 +170,6 @@
 
     // Test case 2: constructor for streaming AudioTrack, stereo, 8bit at misc
     // valid sample rates
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        )
-    })
     public void testConstructorStereo8MusicStream() throws Exception {
 
         TestResults res = constructorTestMultiSampleRate(AudioManager.STREAM_MUSIC,
@@ -228,13 +181,6 @@
 
     // Test case 3: constructor for static AudioTrack, mono, 8bit at misc valid
     // sample rates
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        )
-    })
     public void testConstructorMono8MusicStatic() throws Exception {
 
         TestResults res = constructorTestMultiSampleRate(AudioManager.STREAM_MUSIC,
@@ -246,13 +192,6 @@
 
     // Test case 4: constructor for static AudioTrack, stereo, 8bit at misc
     // valid sample rates
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        )
-    })
     public void testConstructorStereo8MusicStatic() throws Exception {
 
         TestResults res = constructorTestMultiSampleRate(AudioManager.STREAM_MUSIC,
@@ -267,13 +206,6 @@
     // ----------------------------------
 
     // Test case 1: constructor for all stream types
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        )
-    })
     public void testConstructorStreamType() throws Exception {
         // constants for test
         final int TYPE_TEST_SR = 22050;
@@ -323,23 +255,6 @@
     // ----------------------------------
 
     // Test case 1: getPlaybackHeadPosition() at 0 after initialization
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class,int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPlaybackHeadPosition",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        )
-    })
     public void testPlaybackHeadPositionAfterInit() throws Exception {
         // constants for test
         final String TEST_NAME = "testPlaybackHeadPositionAfterInit";
@@ -360,28 +275,6 @@
     }
 
     // Test case 2: getPlaybackHeadPosition() increases after play()
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPlaybackHeadPosition",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        )
-    })
     public void testPlaybackHeadPositionIncrease() throws Exception {
         // constants for test
         final String TEST_NAME = "testPlaybackHeadPositionIncrease";
@@ -409,38 +302,6 @@
     }
 
     // Test case 3: getPlaybackHeadPosition() is 0 after flush();
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPlaybackHeadPosition",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "flush",
-            args = {}
-        )
-    })
     public void testPlaybackHeadPositionAfterFlush() throws Exception {
         // constants for test
         final String TEST_NAME = "testPlaybackHeadPositionAfterFlush";
@@ -470,43 +331,6 @@
     }
 
     // Test case 3: getPlaybackHeadPosition() is 0 after stop();
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPlaybackHeadPosition",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "play",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stop",
-            args = {}
-        )
-    })
     public void testPlaybackHeadPositionAfterStop() throws Exception {
         // constants for test
         final String TEST_NAME = "testPlaybackHeadPositionAfterStop";
@@ -537,43 +361,6 @@
     }
 
     // Test case 4: getPlaybackHeadPosition() is > 0 after play(); pause();
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPlaybackHeadPosition",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "play",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "pause",
-            args = {}
-        )
-    })
     public void testPlaybackHeadPositionAfterPause() throws Exception {
         // constants for test
         final String TEST_NAME = "testPlaybackHeadPositionAfterPause";
@@ -607,48 +394,6 @@
     // ----------------------------------
 
     // Test case 1: setStereoVolume() with max volume returns SUCCESS
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPlaybackHeadPosition",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "play",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setStereoVolume",
-            args = {float.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMaxVolume",
-            args = {}
-        )
-    })
     public void testSetStereoVolumeMax() throws Exception {
         // constants for test
         final String TEST_NAME = "testSetStereoVolumeMax";
@@ -674,48 +419,6 @@
     }
 
     // Test case 2: setStereoVolume() with min volume returns SUCCESS
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPlaybackHeadPosition",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "play",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setStereoVolume",
-            args = {float.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinVolume",
-            args = {}
-        )
-    })
     public void testSetStereoVolumeMin() throws Exception {
         // constants for test
         final String TEST_NAME = "testSetStereoVolumeMin";
@@ -741,43 +444,6 @@
     }
 
     // Test case 3: setStereoVolume() with mid volume returns SUCCESS
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "play",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setStereoVolume",
-            args = {float.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinVolume",
-            args = {}
-        )
-    })
     public void testSetStereoVolumeMid() throws Exception {
         // constants for test
         final String TEST_NAME = "testSetStereoVolumeMid";
@@ -804,38 +470,6 @@
     }
 
     // Test case 4: setPlaybackRate() with half the content rate returns SUCCESS
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "play",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPlaybackRate",
-            args = {int.class}
-        )
-    })
     public void testSetPlaybackRate() throws Exception {
         // constants for test
         final String TEST_NAME = "testSetPlaybackRate";
@@ -861,38 +495,6 @@
     }
 
     // Test case 5: setPlaybackRate(0) returns bad value error
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "play",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPlaybackRate",
-            args = {int.class}
-        )
-    })
     public void testSetPlaybackRateZero() throws Exception {
         // constants for test
         final String TEST_NAME = "testSetPlaybackRateZero";
@@ -915,43 +517,6 @@
 
     // Test case 6: setPlaybackRate() accepts values twice the output sample
     // rate
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getNativeOutputSampleRate",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "play",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPlaybackRate",
-            args = {int.class}
-        )
-    })
     public void testSetPlaybackRateTwiceOutputSR() throws Exception {
         // constants for test
         final String TEST_NAME = "testSetPlaybackRateTwiceOutputSR";
@@ -979,43 +544,6 @@
 
     // Test case 7: setPlaybackRate() and retrieve value, should be the same for
     // half the content SR
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPlaybackRate",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "play",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPlaybackRate",
-            args = {}
-        )
-    })
     public void testSetGetPlaybackRate() throws Exception {
         // constants for test
         final String TEST_NAME = "testSetGetPlaybackRate";
@@ -1042,38 +570,6 @@
     }
 
     // Test case 8: setPlaybackRate() invalid operation if track not initialized
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPlaybackRate",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPlaybackRate",
-            args = {int.class}
-        )
-    })
     public void testSetPlaybackRateUninit() throws Exception {
         // constants for test
         final String TEST_NAME = "testSetPlaybackRateUninit";
@@ -1100,38 +596,6 @@
     // ----------------------------------
 
     // Test case 1: setPlaybackHeadPosition() on playing track
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "play",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPlaybackHeadPosition",
-            args = {int.class}
-        )
-    })
     public void testSetPlaybackHeadPositionPlaying() throws Exception {
         // constants for test
         final String TEST_NAME = "testSetPlaybackHeadPositionPlaying";
@@ -1158,53 +622,6 @@
     }
 
     // Test case 2: setPlaybackHeadPosition() on stopped track
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "play",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinBufferSize",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPlayState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPlaybackHeadPosition",
-            args = {int.class}
-        )
-    })
     public void testSetPlaybackHeadPositionStopped() throws Exception {
         // constants for test
         final String TEST_NAME = "testSetPlaybackHeadPositionStopped";
@@ -1232,53 +649,6 @@
     }
 
     // Test case 3: setPlaybackHeadPosition() on paused track
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPlayState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "play",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "pause",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinBufferSize",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPlaybackHeadPosition",
-            args = {int.class}
-        )
-    })
     public void testSetPlaybackHeadPositionPaused() throws Exception {
         // constants for test
         final String TEST_NAME = "testSetPlaybackHeadPositionPaused";
@@ -1306,53 +676,6 @@
     }
 
     // Test case 4: setPlaybackHeadPosition() beyond what has been written
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPlayState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "play",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinBufferSize",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPlaybackHeadPosition",
-            args = {int.class}
-        )
-    })
     public void testSetPlaybackHeadPositionTooFar() throws Exception {
         // constants for test
         final String TEST_NAME = "testSetPlaybackHeadPositionTooFar";
@@ -1385,38 +708,6 @@
     }
 
     // Test case 5: setLoopPoints() fails for MODE_STREAM
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setLoopPoints",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinBufferSize",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        )
-    })
     public void testSetLoopPointsStream() throws Exception {
         // constants for test
         final String TEST_NAME = "testSetLoopPointsStream";
@@ -1440,38 +731,6 @@
     }
 
     // Test case 6: setLoopPoints() fails start > end
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setLoopPoints",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinBufferSize",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        )
-    })
     public void testSetLoopPointsStartAfterEnd() throws Exception {
         // constants for test
         final String TEST_NAME = "testSetLoopPointsStartAfterEnd";
@@ -1495,38 +754,6 @@
     }
 
     // Test case 6: setLoopPoints() success
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setLoopPoints",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinBufferSize",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        )
-    })
     public void testSetLoopPointsSuccess() throws Exception {
         // constants for test
         final String TEST_NAME = "testSetLoopPointsSuccess";
@@ -1550,38 +777,6 @@
     }
 
     // Test case 7: setLoopPoints() fails with loop length bigger than content
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setLoopPoints",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinBufferSize",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        )
-    })
     public void testSetLoopPointsLoopTooLong() throws Exception {
         // constants for test
         final String TEST_NAME = "testSetLoopPointsLoopTooLong";
@@ -1609,38 +804,6 @@
 
     // Test case 8: setLoopPoints() fails with start beyond what can be written
     // for the track
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setLoopPoints",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinBufferSize",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        )
-    })
     public void testSetLoopPointsStartTooFar() throws Exception {
         // constants for test
         final String TEST_NAME = "testSetLoopPointsStartTooFar";
@@ -1669,38 +832,6 @@
 
     // Test case 9: setLoopPoints() fails with end beyond what can be written
     // for the track
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setLoopPoints",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinBufferSize",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        )
-    })
     public void testSetLoopPointsEndTooFar() throws Exception {
         // constants for test
         final String TEST_NAME = "testSetLoopPointsEndTooFar";
@@ -1733,33 +864,6 @@
     // ----------------------------------
 
     // Test case 1: write() fails when supplying less data (bytes) than declared
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinBufferSize",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        )
-    })
     public void testWriteByteOffsetTooBig() throws Exception {
         // constants for test
         final String TEST_NAME = "testWriteByteOffsetTooBig";
@@ -1784,33 +888,6 @@
 
     // Test case 2: write() fails when supplying less data (shorts) than
     // declared
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {short[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinBufferSize",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        )
-    })
     public void testWriteShortOffsetTooBig() throws Exception {
         // constants for test
         final String TEST_NAME = "testWriteShortOffsetTooBig";
@@ -1835,33 +912,6 @@
     }
 
     // Test case 3: write() fails when supplying less data (bytes) than declared
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinBufferSize",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        )
-    })
     public void testWriteByteSizeTooBig() throws Exception {
         // constants for test
         final String TEST_NAME = "testWriteByteSizeTooBig";
@@ -1886,33 +936,6 @@
 
     // Test case 4: write() fails when supplying less data (shorts) than
     // declared
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {short[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinBufferSize",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        )
-    })
     public void testWriteShortSizeTooBig() throws Exception {
         // constants for test
         final String TEST_NAME = "testWriteShortSizeTooBig";
@@ -1936,33 +959,6 @@
     }
 
     // Test case 5: write() fails with negative offset
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinBufferSize",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        )
-    })
     public void testWriteByteNegativeOffset() throws Exception {
         // constants for test
         final String TEST_NAME = "testWriteByteNegativeOffset";
@@ -1986,33 +982,6 @@
     }
 
     // Test case 6: write() fails with negative offset
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {short[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinBufferSize",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        )
-    })
     public void testWriteShortNegativeOffset() throws Exception {
         // constants for test
         final String TEST_NAME = "testWriteShortNegativeOffset";
@@ -2036,33 +1005,6 @@
     }
 
     // Test case 7: write() fails with negative size
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinBufferSize",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        )
-    })
     public void testWriteByteNegativeSize() throws Exception {
         // constants for test
         final String TEST_NAME = "testWriteByteNegativeSize";
@@ -2087,33 +1029,6 @@
     }
 
     // Test case 8: write() fails with negative size
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {short[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinBufferSize",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        )
-    })
     public void testWriteShortNegativeSize() throws Exception {
         // constants for test
         final String TEST_NAME = "testWriteShortNegativeSize";
@@ -2139,33 +1054,6 @@
 
     // Test case 9: write() succeeds and returns the size that was written for
     // 16bit
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinBufferSize",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        )
-    })
     public void testWriteByte() throws Exception {
         // constants for test
         final String TEST_NAME = "testWriteByte";
@@ -2189,38 +1077,6 @@
 
     // Test case 10: write() succeeds and returns the size that was written for
     // 16bit
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {short[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinBufferSize",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "flush",
-            args = {}
-        )
-    })
     public void testWriteShort() throws Exception {
         // constants for test
         final String TEST_NAME = "testWriteShort";
@@ -2245,33 +1101,6 @@
 
     // Test case 11: write() succeeds and returns the size that was written for
     // 8bit
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {byte[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinBufferSize",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        )
-    })
     public void testWriteByte8bit() throws Exception {
         // constants for test
         final String TEST_NAME = "testWriteByte8bit";
@@ -2295,33 +1124,6 @@
 
     // Test case 12: write() succeeds and returns the size that was written for
     // 8bit
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AudioTrack",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "write",
-            args = {short[].class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinBufferSize",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        )
-    })
     public void testWriteShort8bit() throws Exception {
         // constants for test
         final String TEST_NAME = "testWriteShort8bit";
@@ -2348,13 +1150,6 @@
     // ----------------------------------
 
     // Test case 1: getMinBufferSize() return ERROR_BAD_VALUE if SR < 4000
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinBufferSize",
-            args = {int.class, int.class, int.class}
-        )
-    })
     public void testGetMinBufferSizeTooLowSR() throws Exception {
         // constant for test
         final String TEST_NAME = "testGetMinBufferSizeTooLowSR";
@@ -2368,13 +1163,6 @@
     }
 
     // Test case 2: getMinBufferSize() return ERROR_BAD_VALUE if SR > 48000
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinBufferSize",
-            args = {int.class, int.class, int.class}
-        )
-    })
     public void testGetMinBufferSizeTooHighSR() throws Exception {
         // constant for test
         final String TEST_NAME = "testGetMinBufferSizeTooHighSR";
@@ -2387,68 +1175,6 @@
             AudioTrack.ERROR_BAD_VALUE);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinBufferSize",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAudioFormat",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getChannelConfiguration",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSampleRate",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStreamType",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getChannelCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getNotificationMarkerPosition",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setNotificationMarkerPosition",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPositionNotificationPeriod",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPositionNotificationPeriod",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setState",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getNativeFrameCount",
-            args = {}
-        )
-    })
     public void testAudioTrackProperties() throws Exception {
         // constants for test
         final String TEST_NAME = "testAudioTrackProperties";
@@ -2495,23 +1221,6 @@
         assertTrue(TEST_NAME, track.getNativeFrameCount() >= frameCount);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "reloadStaticData",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "play",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stop",
-            args = {}
-        )
-    })
     public void testReloadStaticData() throws Exception {
         // constants for test
         final String TEST_NAME = "testReloadStaticData";
@@ -2562,11 +1271,6 @@
         return vai;
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "write",
-        args = {short[].class, int.class, int.class}
-    )
     public void testPlayStreamData() throws Exception {
         // constants for test
         final String TEST_NAME = "testPlayStreamData";
diff --git a/tests/tests/media/src/android/media/cts/AudioTrack_ListenerTest.java b/tests/tests/media/src/android/media/cts/AudioTrack_ListenerTest.java
index d9e4bc0..26841da 100644
--- a/tests/tests/media/src/android/media/cts/AudioTrack_ListenerTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioTrack_ListenerTest.java
@@ -16,11 +16,6 @@
 
 package android.media.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.media.AudioFormat;
 import android.media.AudioManager;
@@ -30,7 +25,6 @@
 import android.os.Message;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(AudioTrack.class)
 public class AudioTrack_ListenerTest extends AndroidTestCase {
     private boolean mOnMarkerReachedCalled;
     private boolean mOnPeriodicNotificationCalled;
@@ -53,37 +47,11 @@
     private OnPlaybackPositionUpdateListener mListener =
                                 new MockOnPlaybackPositionUpdateListener();
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinBufferSize",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPlaybackPositionUpdateListener",
-            args = {OnPlaybackPositionUpdateListener.class}
-        )
-    })
     public void testAudioTrackCallback() throws Exception {
         mAudioTrack.setPlaybackPositionUpdateListener(mListener);
         doTest();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinBufferSize",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPlaybackPositionUpdateListener",
-            args = {OnPlaybackPositionUpdateListener.class, Handler.class}
-        )
-    })
-    @ToBeFixed(explanation="The handler argument is only used to find the correct Looper." +
-            "The AudioTrack instance creates its own handler instance internally.")
     public void testAudioTrackCallbackWithHandler() throws Exception {
         mAudioTrack.setPlaybackPositionUpdateListener(mListener, mHandler);
         doTest();
diff --git a/tests/tests/media/src/android/media/cts/BassBoostTest.java b/tests/tests/media/src/android/media/cts/BassBoostTest.java
index 9cea0b0..e68bcde 100644
--- a/tests/tests/media/src/android/media/cts/BassBoostTest.java
+++ b/tests/tests/media/src/android/media/cts/BassBoostTest.java
@@ -23,12 +23,7 @@
 import android.os.Looper;
 import android.test.AndroidTestCase;
 import android.util.Log;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(BassBoost.class)
 public class BassBoostTest extends AndroidTestCase {
 
     private String TAG = "BassBoostTest";
@@ -55,23 +50,6 @@
     //----------------------------------
 
     //Test case 0.0: test constructor and release
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "BassBoost",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        )
-    })
     public void test0_0ConstructorAndRelease() throws Exception {
         BassBoost eq = null;
         try {
@@ -100,23 +78,6 @@
     //----------------------------------
 
     //Test case 1.0: test strength
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStrengthSupported",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setStrength",
-            args = {short.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRoundedStrength",
-            args = {}
-        )
-    })
     public void test1_0Strength() throws Exception {
         getBassBoost(0);
         try {
@@ -146,18 +107,6 @@
     }
 
     //Test case 1.1: test properties
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getProperties",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProperties",
-            args = {BassBoost.Settings.class}
-        )
-    })
     public void test1_1Properties() throws Exception {
         getBassBoost(0);
         try {
@@ -192,18 +141,6 @@
     }
 
     //Test case 1.2: test setStrength() throws exception after release
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setStrength",
-            args = {short.class}
-        )
-    })
     public void test1_2SetStrengthAfterRelease() throws Exception {
         getBassBoost(0);
         mBassBoost.release();
@@ -222,18 +159,6 @@
     //----------------------------------
 
     //Test case 2.0: test setEnabled() and getEnabled() in valid state
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getEnabled",
-            args = {}
-        )
-    })
     public void test2_0SetEnabledGetEnabled() throws Exception {
         getBassBoost(0);
         try {
@@ -250,18 +175,6 @@
     }
 
     //Test case 2.1: test setEnabled() throws exception after release
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEnabled",
-            args = {boolean.class}
-        )
-    })
     public void test2_1SetEnabledAfterRelease() throws Exception {
         getBassBoost(0);
         mBassBoost.release();
@@ -280,13 +193,6 @@
     //----------------------------------
 
     //Test case 3.0: test control status listener
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setControlStatusListener",
-            args = {AudioEffect.OnControlStatusChangeListener.class}
-        )
-    })
     public void test3_0ControlStatusListener() throws Exception {
         mHasControl = true;
         createListenerLooper(true, false, false);
@@ -313,13 +219,6 @@
     }
 
     //Test case 3.1: test enable status listener
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEnableStatusListener",
-            args = {AudioEffect.OnEnableStatusChangeListener.class}
-        )
-    })
     public void test3_1EnableStatusListener() throws Exception {
         createListenerLooper(false, true, false);
         synchronized(mLock) {
@@ -348,13 +247,6 @@
     }
 
     //Test case 3.2: test parameter changed listener
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setParameterListener",
-            args = {BassBoost.OnParameterChangeListener.class}
-        )
-    })
     public void test3_2ParameterChangedListener() throws Exception {
         createListenerLooper(false, false, true);
         synchronized(mLock) {
diff --git a/tests/tests/media/src/android/media/cts/CamcorderProfileTest.java b/tests/tests/media/src/android/media/cts/CamcorderProfileTest.java
index e34856c..3f28218 100644
--- a/tests/tests/media/src/android/media/cts/CamcorderProfileTest.java
+++ b/tests/tests/media/src/android/media/cts/CamcorderProfileTest.java
@@ -16,10 +16,6 @@
 
 package android.media.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.pm.PackageManager;
 import android.hardware.Camera;
@@ -31,7 +27,6 @@
 
 import java.util.List;
 
-@TestTargetClass(CamcorderProfile.class)
 public class CamcorderProfileTest extends AndroidTestCase {
 
     private static final String TAG = "CamcorderProfileTest";
@@ -230,13 +225,6 @@
                 specificTimeLapseProfileQualities, null);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "get",
-            args = {int.class}
-        )
-    })
     public void testGet() {
         /*
          * Device may not have rear camera for checkGet(-1).
@@ -251,13 +239,6 @@
         checkGet(-1);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "get",
-            args = {int.class, int.class}
-        )
-    })
     public void testGetWithId() {
         int nCamera = Camera.getNumberOfCameras();
         for (int cameraId = 0; cameraId < nCamera; cameraId++) {
diff --git a/tests/tests/media/src/android/media/cts/CameraProfileTest.java b/tests/tests/media/src/android/media/cts/CameraProfileTest.java
index 72cd296..62228c6 100644
--- a/tests/tests/media/src/android/media/cts/CameraProfileTest.java
+++ b/tests/tests/media/src/android/media/cts/CameraProfileTest.java
@@ -16,10 +16,6 @@
 
 package android.media.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.hardware.Camera;
 import android.media.CameraProfile;
@@ -28,7 +24,6 @@
 
 import java.util.List;
 
-@TestTargetClass(CameraProfile.class)
 public class CameraProfileTest extends AndroidTestCase {
 
     private static final String TAG = "CameraProfileTest";
@@ -41,13 +36,6 @@
         assertTrue(low <= mid && mid <= high);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getJpegEncodingQualityParameter",
-            args = {int.class}
-        )
-    })
     public void testGetImageEncodingQualityParameter() {
         int low = CameraProfile.getJpegEncodingQualityParameter(CameraProfile.QUALITY_LOW);
         int mid = CameraProfile.getJpegEncodingQualityParameter(CameraProfile.QUALITY_MEDIUM);
@@ -55,13 +43,6 @@
         checkQuality(low, mid, high);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getJpegEncodingQualityParameter",
-            args = {int.class, int.class}
-        )
-    })
     public void testGetWithId() {
         int nCamera = Camera.getNumberOfCameras();
         for (int id = 0; id < nCamera; id++) {
diff --git a/tests/tests/media/src/android/media/cts/EnvReverbTest.java b/tests/tests/media/src/android/media/cts/EnvReverbTest.java
index fe7baf9..ad77b31 100644
--- a/tests/tests/media/src/android/media/cts/EnvReverbTest.java
+++ b/tests/tests/media/src/android/media/cts/EnvReverbTest.java
@@ -23,12 +23,7 @@
 import android.os.Looper;
 import android.test.AndroidTestCase;
 import android.util.Log;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(EnvironmentalReverb.class)
 public class EnvReverbTest extends AndroidTestCase {
 
     private String TAG = "EnvReverbTest";
@@ -56,23 +51,6 @@
     //----------------------------------
 
     //Test case 0.0: test constructor and release
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "EnvironmentalReverb",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        )
-    })
     public void test0_0ConstructorAndRelease() throws Exception {
         EnvironmentalReverb envReverb = null;
          try {
@@ -100,28 +78,6 @@
     //----------------------------------
 
     //Test case 1.0: test room level and room HF level
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRoomLevel",
-            args = {short.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRoomLevel",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRoomHFLevel",
-            args = {short.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRoomHFLevel",
-            args = {}
-        )
-    })
     public void test1_0Room() throws Exception {
         getReverb(0);
         try {
@@ -153,28 +109,6 @@
     }
 
     //Test case 1.1: test decay time and ratio
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDecayTime",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDecayTime",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDecayHFRatio",
-            args = {short.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDecayHFRatio",
-            args = {}
-        )
-    })
     public void test1_1Decay() throws Exception {
         getReverb(0);
         try {
@@ -206,28 +140,6 @@
 
 
     //Test case 1.2: test reverb level and delay
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setReverbLevel",
-            args = {short.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getReverbLevel",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setReverbDelay",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getReverbDelay",
-            args = {}
-        )
-    })
     public void test1_2Reverb() throws Exception {
         getReverb(0);
         try {
@@ -261,28 +173,6 @@
     }
 
     //Test case 1.3: test early reflections level and delay
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setReflectionsLevel",
-            args = {short.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getReflectionsLevel",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setReflectionsDelay",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getReflectionsDelay",
-            args = {}
-        )
-    })
     public void test1_3Reflections() throws Exception {
         getReverb(0);
         try {
@@ -321,28 +211,6 @@
     }
 
     //Test case 1.4: test diffusion and density
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDiffusion",
-            args = {short.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDiffusion",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDensity",
-            args = {short.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDensity",
-            args = {}
-        )
-    })
     public void test1_4DiffusionAndDensity() throws Exception {
         getReverb(0);
         try {
@@ -374,18 +242,6 @@
     }
 
     //Test case 1.5: test properties
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getProperties",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProperties",
-            args = {EnvironmentalReverb.Settings.class}
-        )
-    })
     public void test1_5Properties() throws Exception {
         getReverb(0);
         try {
@@ -415,18 +271,6 @@
     //----------------------------------
 
     //Test case 2.0: test setEnabled() and getEnabled() in valid state
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getEnabled",
-            args = {}
-        )
-    })
     public void test2_0SetEnabledGetEnabled() throws Exception {
         getReverb(0);
         try {
@@ -442,18 +286,6 @@
     }
 
     //Test case 2.1: test setEnabled() throws exception after release
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEnabled",
-            args = {boolean.class}
-        )
-    })
     public void test2_1SetEnabledAfterRelease() throws Exception {
         getReverb(0);
         mReverb.release();
@@ -472,13 +304,6 @@
     //----------------------------------
 
     //Test case 3.0: test control status listener
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setControlStatusListener",
-            args = {AudioEffect.OnControlStatusChangeListener.class}
-        )
-    })
     public void test3_0ControlStatusListener() throws Exception {
         mHasControl = true;
         createListenerLooper(true, false, false);
@@ -505,13 +330,6 @@
     }
 
     //Test case 3.1: test enable status listener
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEnableStatusListener",
-            args = {AudioEffect.OnEnableStatusChangeListener.class}
-        )
-    })
     public void test3_1EnableStatusListener() throws Exception {
         createListenerLooper(false, true, false);
         synchronized(mLock) {
@@ -540,13 +358,6 @@
     }
 
     //Test case 3.2: test parameter changed listener
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setParameterListener",
-            args = {EnvironmentalReverb.OnParameterChangeListener.class}
-        )
-    })
     public void test3_2ParameterChangedListener() throws Exception {
         createListenerLooper(false, false, true);
         synchronized(mLock) {
diff --git a/tests/tests/media/src/android/media/cts/EqualizerTest.java b/tests/tests/media/src/android/media/cts/EqualizerTest.java
index 955986e..7b3f2ad 100644
--- a/tests/tests/media/src/android/media/cts/EqualizerTest.java
+++ b/tests/tests/media/src/android/media/cts/EqualizerTest.java
@@ -23,12 +23,7 @@
 import android.os.Looper;
 import android.test.AndroidTestCase;
 import android.util.Log;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(Equalizer.class)
 public class EqualizerTest extends AndroidTestCase {
 
     private String TAG = "EqualizerTest";
@@ -59,23 +54,6 @@
     //----------------------------------
 
     //Test case 0.0: test constructor and release
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Equalizer",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        )
-    })
     public void test0_0ConstructorAndRelease() throws Exception {
         Equalizer eq = null;
         try {
@@ -103,28 +81,6 @@
     //----------------------------------
 
     //Test case 1.0: test setBandLevel() and getBandLevel()
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getNumberOfBands",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBandLevelRange",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setBandLevel",
-            args = {short.class, short.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBandLevel",
-            args = {short.class}
-        )
-    })
     public void test1_0BandLevel() throws Exception {
         getEqualizer(0);
         try {
@@ -154,23 +110,6 @@
     }
 
     //Test case 1.1: test band frequency
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBand",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBandFreqRange",
-            args = {short.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCenterFreq",
-            args = {short.class}
-        )
-    })
     public void test1_1BandFrequency() throws Exception {
         getEqualizer(0);
         try {
@@ -196,28 +135,6 @@
     }
 
     //Test case 1.2: test presets
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getNumberOfPresets",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "usePreset",
-            args = {short.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrentPreset",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPresetName",
-            args = {short.class}
-        )
-    })
     public void test1_2Presets() throws Exception {
         getEqualizer(0);
         try {
@@ -243,18 +160,6 @@
     }
 
     //Test case 1.3: test properties
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getProperties",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProperties",
-            args = {Equalizer.Settings.class}
-        )
-    })
     public void test1_3Properties() throws Exception {
         getEqualizer(0);
         try {
@@ -286,18 +191,6 @@
     }
 
     //Test case 1.4: test setBandLevel() throws exception after release
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setBandLevel",
-            args = {short.class, short.class}
-        )
-    })
     public void test1_4SetBandLevelAfterRelease() throws Exception {
 
         getEqualizer(0);
@@ -316,18 +209,6 @@
     //----------------------------------
 
     //Test case 2.0: test setEnabled() and getEnabled() in valid state
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getEnabled",
-            args = {}
-        )
-    })
     public void test2_0SetEnabledGetEnabled() throws Exception {
         getEqualizer(0);
         try {
@@ -344,18 +225,6 @@
     }
 
     //Test case 2.1: test setEnabled() throws exception after release
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEnabled",
-            args = {boolean.class}
-        )
-    })
     public void test2_1SetEnabledAfterRelease() throws Exception {
 
         getEqualizer(0);
@@ -374,13 +243,6 @@
     //----------------------------------
 
     //Test case 3.0: test control status listener
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setControlStatusListener",
-            args = {AudioEffect.OnControlStatusChangeListener.class}
-        )
-    })
     public void test3_0ControlStatusListener() throws Exception {
         mHasControl = true;
         createListenerLooper(true, false, false);
@@ -407,13 +269,6 @@
     }
 
     //Test case 3.1: test enable status listener
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEnableStatusListener",
-            args = {AudioEffect.OnEnableStatusChangeListener.class}
-        )
-    })
     public void test3_1EnableStatusListener() throws Exception {
         createListenerLooper(false, true, false);
         synchronized(mLock) {
@@ -442,13 +297,6 @@
     }
 
     //Test case 3.2: test parameter changed listener
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setParameterListener",
-            args = {Equalizer.OnParameterChangeListener.class}
-        )
-    })
     public void test3_2ParameterChangedListener() throws Exception {
         createListenerLooper(false, false, true);
         synchronized(mLock) {
diff --git a/tests/tests/media/src/android/media/cts/FaceDetectorTest.java b/tests/tests/media/src/android/media/cts/FaceDetectorTest.java
index 7f4e567..3d98ddc 100644
--- a/tests/tests/media/src/android/media/cts/FaceDetectorTest.java
+++ b/tests/tests/media/src/android/media/cts/FaceDetectorTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.Intent;
 import android.graphics.Bitmap;
@@ -29,7 +25,6 @@
 import android.media.FaceDetector.Face;
 import android.test.InstrumentationTestCase;
 
-@TestTargetClass(FaceDetector.class)
 public class FaceDetectorTest extends InstrumentationTestCase {
 
     private FaceDetectorStub mActivity;
@@ -50,18 +45,6 @@
         mActivity.finish();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "findFaces",
-            args = {Bitmap.class, Face[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "FaceDetector",
-            args = {int.class, int.class, int.class}
-        )
-    })
     public void testFindFaces() throws Exception {
         long waitMsec = 5000;
         Thread.sleep(waitMsec);
diff --git a/tests/tests/media/src/android/media/cts/FaceDetector_FaceTest.java b/tests/tests/media/src/android/media/cts/FaceDetector_FaceTest.java
index 5f767ad..709a4be 100644
--- a/tests/tests/media/src/android/media/cts/FaceDetector_FaceTest.java
+++ b/tests/tests/media/src/android/media/cts/FaceDetector_FaceTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.Intent;
 import android.graphics.PointF;
@@ -31,7 +27,6 @@
 
 import java.util.List;
 
-@TestTargetClass(Face.class)
 public class FaceDetector_FaceTest extends InstrumentationTestCase {
     private FaceDetectorStub mActivity;
 
@@ -51,29 +46,6 @@
         mActivity.finish();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "eyesDistance",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "confidence",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMidPoint",
-            args = {PointF.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            notes = "This method is not currently implemented (returns 0)",
-            method = "pose",
-            args = {int.class}
-        )
-    })
     public void testFaceProperties() throws Exception {
         long waitMsec = 5000;
         Thread.sleep(waitMsec);
diff --git a/tests/tests/media/src/android/media/cts/JetPlayerTest.java b/tests/tests/media/src/android/media/cts/JetPlayerTest.java
index 83f6cdf..848d395 100644
--- a/tests/tests/media/src/android/media/cts/JetPlayerTest.java
+++ b/tests/tests/media/src/android/media/cts/JetPlayerTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.res.AssetFileDescriptor;
 import android.media.JetPlayer;
@@ -36,7 +32,6 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 
-@TestTargetClass(JetPlayer.class)
 public class JetPlayerTest extends AndroidTestCase {
     private OnJetEventListener mOnJetEventListener;
     private boolean mOnJetUserIdUpdateCalled;
@@ -73,79 +68,6 @@
         super.tearDown();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEventListener",
-            args = {OnJetEventListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "loadJetFile",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "play",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            notes = "if call release , process will crash.",
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "pause",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "clearQueue",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "closeJetFile",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setMuteArray",
-            args = {boolean[].class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setMuteFlag",
-            args = {int.class, boolean.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setMuteFlags",
-            args = {int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "queueJetSegment",
-            args = {int.class, int.class, int.class, int.class, int.class, byte.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "triggerClip",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMaxTracks",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getJetPlayer",
-            args = {}
-        )
-    })
     public void testLoadJetFromPath() throws Throwable {
         mJetPlayer.clearQueue();
         prepareFile();
@@ -154,79 +76,6 @@
         runJet();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEventListener",
-            args = {OnJetEventListener.class, Handler.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "loadJetFile",
-            args = {AssetFileDescriptor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "play",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            notes = "if call release , process will crash.",
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "pause",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "clearQueue",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "closeJetFile",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setMuteArray",
-            args = {boolean[].class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setMuteFlag",
-            args = {int.class, boolean.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setMuteFlags",
-            args = {int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "queueJetSegment",
-            args = {int.class, int.class, int.class, int.class, int.class, byte.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "triggerClip",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMaxTracks",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getJetPlayer",
-            args = {}
-        )
-    })
     public void testLoadJetFromFd() throws Throwable {
         mJetPlayer.clearQueue();
         mJetPlayer.setEventListener(mOnJetEventListener, mHandler);
@@ -234,11 +83,6 @@
         runJet();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "queueJetSegmentMuteArray",
-        args = {int.class, int.class, int.class, int.class, boolean[].class, byte.class}
-    )
     public void testQueueJetSegmentMuteArray() throws Throwable {
         mJetPlayer.clearQueue();
         mJetPlayer.setEventListener(mOnJetEventListener, mHandler);
@@ -319,11 +163,6 @@
         assertTrue(mOnJetUserIdUpdateCalled);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clone",
-        args = {}
-    )
     public void testClone() throws Exception {
         try {
             mJetPlayer.clone();
diff --git a/tests/tests/media/src/android/media/cts/MediaPlayerFlakyNetworkTest.java b/tests/tests/media/src/android/media/cts/MediaPlayerFlakyNetworkTest.java
new file mode 100644
index 0000000..63822f2
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/MediaPlayerFlakyNetworkTest.java
@@ -0,0 +1,327 @@
+/*
+ * 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.media.cts;
+
+import android.media.MediaPlayer;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.os.SystemClock;
+import android.webkit.cts.CtsTestServer;
+
+import org.apache.http.HttpServerConnection;
+
+import org.apache.http.impl.DefaultHttpServerConnection;
+import org.apache.http.impl.io.SocketOutputBuffer;
+import org.apache.http.io.SessionOutputBuffer;
+import org.apache.http.params.HttpParams;
+import org.apache.http.util.CharArrayBuffer;
+
+import java.io.IOException;
+
+import java.net.Socket;
+import java.util.Random;
+import java.util.concurrent.Callable;
+import java.util.concurrent.FutureTask;
+
+/**
+ * Executes a range of tests on MediaPlayer while streaming a video
+ * from an HTTP server over a simulated "flaky" network.
+ */
+public class MediaPlayerFlakyNetworkTest extends MediaPlayerTestBase {
+
+    private static final String[] TEST_VIDEOS = {
+        "raw/video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz",
+        "raw/video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz",
+        "raw/video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_128kbps_44100hz",
+        "raw/video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz",
+        "raw/video_176x144_3gp_h263_300kbps_25fps_aac_stereo_128kbps_22050hz"
+    };
+
+    // Allow operations to block for 2500ms before assuming they will ANR.
+    // We don't allow the full 5s because cpu load, etc, reduces the budget.
+    private static final int ANR_TIMEOUT_MILLIS = 2500;
+
+    private CtsTestServer mServer;
+
+    @Override
+    public void tearDown() throws Exception {
+        releaseMediaPlayer();
+        releaseHttpServer();
+        super.tearDown();
+    }
+
+    public void test_S0P0() throws Throwable {
+        doPlayStreams(0, 0);
+    }
+
+    public void test_S1P000005() throws Throwable {
+        doPlayStreams(1, 0.000005f);
+    }
+
+    public void test_S2P00001() throws Throwable {
+        doPlayStreams(2, 0.00001f);
+    }
+
+    public void test_S3P00001() throws Throwable {
+        doPlayStreams(3, 0.00001f);
+    }
+
+    public void test_S4P00001() throws Throwable {
+        doPlayStreams(4, 0.00001f);
+    }
+
+    public void test_S5P00001() throws Throwable {
+        doPlayStreams(5, 0.00001f);
+    }
+
+    public void test_S6P00002() throws Throwable {
+        doPlayStreams(6, 0.00002f);
+    }
+
+   private void doPlayStreams(int seed, float probability) throws Throwable {
+        Random random = new Random(seed);
+        createHttpServer(seed, probability);
+        for (int i = 0; i < 10; i++) {
+            String video = getRandomTestVideo(random);
+            doPlayMp4Stream(video, 20000, 5000);
+            doAsyncPrepareAndRelease(video);
+            doRandomOperations(video);
+        }
+        doPlayMp4Stream(getRandomTestVideo(random), 30000, 20000);
+        releaseHttpServer();
+    }
+
+    private String getRandomTestVideo(Random random) {
+        return TEST_VIDEOS[random.nextInt(TEST_VIDEOS.length)];
+    }
+
+    private void doPlayMp4Stream(String video, int millisToPrepare, int millisToPlay)
+            throws Throwable {
+        createMediaPlayer();
+        localHttpStreamTest(video);
+
+        mOnPrepareCalled.waitForSignal(millisToPrepare);
+        if (mOnPrepareCalled.isSignalled()) {
+            mMediaPlayer.start();
+            Thread.sleep(millisToPlay);
+        } else {
+            // This could be because the "connection" was too slow.  Assume ok.
+        }
+
+        releaseMediaPlayerAndFailIfAnr();
+    }
+
+    private void doAsyncPrepareAndRelease(String video) throws Throwable {
+        Random random = new Random(1);
+        for (int i = 0; i < 10; i++) {
+            createMediaPlayer();
+            localHttpStreamTest(video);
+            Thread.sleep(random.nextInt(500));
+            releaseMediaPlayerAndFailIfAnr();
+        }
+    }
+
+    private void doRandomOperations(String video) throws Throwable {
+        Random random = new Random(1);
+        createMediaPlayer();
+        localHttpStreamTest(video);
+        mOnPrepareCalled.waitForSignal(10000);
+        if (mOnPrepareCalled.isSignalled()) {
+            mMediaPlayer.start();
+            for (int i = 0; i < 50; i++) {
+                Thread.sleep(random.nextInt(100));
+                switch (random.nextInt(3)) {
+                    case 0:
+                        mMediaPlayer.start();
+                        assertTrue(mMediaPlayer.isPlaying());
+                        break;
+                    case 1:
+                        mMediaPlayer.pause();
+                        assertFalse(mMediaPlayer.isPlaying());
+                        break;
+                    case 2:
+                        mMediaPlayer.seekTo(random.nextInt(10000));
+                        break;
+                }
+            }
+        } else {
+          // Prepare took more than 10s, give up.
+          // This could be because the "connection" was too slow
+        }
+        releaseMediaPlayerAndFailIfAnr();
+    }
+
+    private void releaseMediaPlayerAndFailIfAnr() throws Throwable {
+        final Monitor releaseThreadRunning = new Monitor();
+        Thread releaseThread = new Thread() {
+            public void run() {
+                releaseThreadRunning.signal();
+                releaseMediaPlayer();
+            }
+        };
+        releaseThread.start();
+        releaseThreadRunning.waitForSignal();
+        releaseThread.join(ANR_TIMEOUT_MILLIS);
+        assertFalse("release took longer than " + ANR_TIMEOUT_MILLIS, releaseThread.isAlive());
+    }
+
+    private void createMediaPlayer() throws Throwable {
+        if (mMediaPlayer == null) {
+            mMediaPlayer = createMediaPlayerOnMainThread();
+        }
+    }
+
+    private void releaseMediaPlayer() {
+        MediaPlayer old = mMediaPlayer;
+        mMediaPlayer = null;
+        if (old != null) {
+            old.release();
+        }
+    }
+
+    private MediaPlayer createMediaPlayerOnMainThread() throws Throwable {
+        Callable<MediaPlayer> callable = new Callable<MediaPlayer>() {
+            @Override
+            public MediaPlayer call() throws Exception {
+                return new MediaPlayer();
+            }
+        };
+        FutureTask<MediaPlayer> future = new FutureTask<MediaPlayer>(callable);
+        getInstrumentation().runOnMainSync(future);
+        return future.get();
+    }
+
+
+    private void createHttpServer(int seed, final float probability) throws Throwable {
+        final Random random = new Random(seed);
+        mServer = new CtsTestServer(mContext) {
+            @Override
+            protected DefaultHttpServerConnection createHttpServerConnection() {
+                return new FlakyHttpServerConnection(random, probability);
+            }
+        };
+    }
+
+    private void releaseHttpServer() {
+        if (mServer != null) {
+            mServer.shutdown();
+            mServer = null;
+        }
+    }
+
+    private void localHttpStreamTest(final String name)
+            throws Throwable {
+        String stream_url = mServer.getAssetUrl(name);
+        mMediaPlayer.setDataSource(stream_url);
+
+        mMediaPlayer.setDisplay(getActivity().getSurfaceHolder());
+        mMediaPlayer.setScreenOnWhilePlaying(true);
+
+        mOnPrepareCalled.reset();
+        mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
+            @Override
+            public void onPrepared(MediaPlayer mp) {
+                mOnPrepareCalled.signal();
+            }
+        });
+
+        mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
+            @Override
+            public boolean onError(MediaPlayer mp, int what, int extra) {
+                fail("Media player had error " + what + " playing " + name);
+                return true;
+            }
+        });
+
+        mMediaPlayer.prepareAsync();
+    }
+
+    private class FlakyHttpServerConnection extends DefaultHttpServerConnection {
+
+        private final Random mRandom;
+        private final float mProbability;
+
+        public FlakyHttpServerConnection(Random random, float probability) {
+            mRandom = random;
+            mProbability = probability;
+        }
+
+        @Override
+        protected SessionOutputBuffer createHttpDataTransmitter(
+                Socket socket, int buffersize, HttpParams params) throws IOException {
+            return createSessionOutputBuffer(socket, buffersize, params);
+        }
+
+        SessionOutputBuffer createSessionOutputBuffer(
+                Socket socket, int buffersize, HttpParams params) throws IOException {
+            return new SocketOutputBuffer(socket, buffersize, params) {
+                @Override
+                public void write(byte[] b) throws IOException {
+                    write(b, 0, b.length);
+                }
+
+                @Override
+                public void write(byte[] b, int off, int len) throws IOException {
+                    while (len-- > 0) {
+                        write(b[off++]);
+                    }
+                }
+
+                @Override
+                public void writeLine(String s) throws IOException {
+                    maybeDelayHeader(mProbability);
+                    super.writeLine(s);
+                }
+
+                @Override
+                public void writeLine(CharArrayBuffer buffer) throws IOException {
+                    maybeDelayHeader(mProbability);
+                    super.writeLine(buffer);
+                }
+
+                @Override
+                public void write(int b) throws IOException {
+                    maybeDelay(mProbability);
+                    super.write(b);
+                }
+
+                private void maybeDelayHeader(float probability) throws IOException {
+                    // Increase probability of delay when writing headers to simulate
+                    // slow initial connection / server response.
+                    maybeDelay(probability * 50);
+                }
+
+                private void maybeDelay(float probability) throws IOException {
+                    try {
+                        float random = mRandom.nextFloat();
+                        if (random < probability) {
+                            int sleepTimeMs = 1000 + mRandom.nextInt(5000);
+                            Thread.sleep(sleepTimeMs);
+                            flush();
+                        } else if (random < probability * 100) {
+                            Thread.sleep(1);
+                            flush();
+                        }
+                    } catch (InterruptedException e) {
+                        // Ignored
+                    }
+                }
+
+            };
+        }
+    }
+}
diff --git a/tests/tests/media/src/android/media/cts/MediaPlayerTest.java b/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
index ff43e27..a3769aa 100644
--- a/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
@@ -38,6 +38,14 @@
  */
 public class MediaPlayerTest extends MediaPlayerTestBase {
 
+    private static final String RECORDED_FILE =
+                new File(Environment.getExternalStorageDirectory(),
+                "record.out").getAbsolutePath();
+
+    private static final int  RECORDED_VIDEO_WIDTH  = 176;
+    private static final int  RECORDED_VIDEO_HEIGHT = 144;
+    private static final long RECORDED_DURATION_MS  = 3000;
+
     public void testPlayNullSource() throws Exception {
         try {
             mMediaPlayer.setDataSource((String) null);
@@ -161,6 +169,79 @@
         Thread.sleep(SLEEP_TIME);
     }
 
+    public void testRecordedVideoPlayback0() throws Exception {
+        testRecordedVideoPlaybackWithAngle(0);
+    }
+
+    public void testRecordedVideoPlayback90() throws Exception {
+        testRecordedVideoPlaybackWithAngle(90);
+    }
+
+    public void testRecordedVideoPlayback180() throws Exception {
+        testRecordedVideoPlaybackWithAngle(180);
+    }
+
+    public void testRecordedVideoPlayback270() throws Exception {
+        testRecordedVideoPlaybackWithAngle(270);
+    }
+
+    private boolean hasCamera() {
+        return getActivity().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);
+    }
+
+    private void testRecordedVideoPlaybackWithAngle(int angle) throws Exception {
+        final int width = RECORDED_VIDEO_WIDTH;
+        final int height = RECORDED_VIDEO_HEIGHT;
+        final String file = RECORDED_FILE;
+        final long durationMs = RECORDED_DURATION_MS;
+
+        if (!hasCamera()) {
+            return;
+        }
+        checkOrientation(angle);
+        recordVideo(width, height, angle, file, durationMs);
+        checkDisplayedVideoSize(width, height, angle, file);
+    }
+
+    private void checkOrientation(int angle) throws Exception {
+        assertTrue(angle >= 0);
+        assertTrue(angle < 360);
+        assertTrue((angle % 90) == 0);
+    }
+
+    private void recordVideo(
+            int w, int h, int angle, String file, long durationMs) throws Exception {
+
+        MediaRecorder recorder = new MediaRecorder();
+        recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
+        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
+        recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
+        recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
+        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
+        recorder.setOutputFile(file);
+        recorder.setOrientationHint(angle);
+        recorder.setVideoSize(w, h);
+        recorder.setPreviewDisplay(getActivity().getSurfaceHolder2().getSurface());
+        recorder.prepare();
+        recorder.start();
+        Thread.sleep(durationMs);
+        recorder.stop();
+        recorder.release();
+        recorder = null;
+    }
+
+    private void checkDisplayedVideoSize(
+            int w, int h, int angle, String file) throws Exception {
+
+        int displayWidth  = w;
+        int displayHeight = h;
+        if ((angle % 180) != 0) {
+            displayWidth  = h;
+            displayHeight = w;
+        }
+        playVideoTest(file, displayWidth, displayHeight);
+    }
+
     public void testLocalVideo_MP4_H264_480x360_500kbps_25fps_AAC_Stereo_128kbps_44110Hz()
             throws Exception {
         playVideoTest(
diff --git a/tests/tests/media/src/android/media/cts/MediaPlayerTestBase.java b/tests/tests/media/src/android/media/cts/MediaPlayerTestBase.java
index 59a50d5..2d9b4c1 100644
--- a/tests/tests/media/src/android/media/cts/MediaPlayerTestBase.java
+++ b/tests/tests/media/src/android/media/cts/MediaPlayerTestBase.java
@@ -52,6 +52,22 @@
             }
         }
 
+        public synchronized void waitForSignal(long millis) throws InterruptedException {
+            if (millis == 0) {
+                waitForSignal();
+                return;
+            }
+
+            long deadline = System.currentTimeMillis() + millis;
+            while (!signalled) {
+                long delay = deadline - System.currentTimeMillis();
+                if (delay <= 0) {
+                    break;
+                }
+                wait(delay);
+            }
+        }
+
         public synchronized boolean isSignalled() {
             return signalled;
         }
diff --git a/tests/tests/media/src/android/media/cts/MediaRecorderTest.java b/tests/tests/media/src/android/media/cts/MediaRecorderTest.java
index 65d17c1..455ea1c 100644
--- a/tests/tests/media/src/android/media/cts/MediaRecorderTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaRecorderTest.java
@@ -15,10 +15,6 @@
  */
 package android.media.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.pm.PackageManager;
 import android.hardware.Camera;
@@ -37,7 +33,6 @@
 import java.io.FileDescriptor;
 import java.io.FileOutputStream;
 
-@TestTargetClass(MediaRecorder.class)
 public class MediaRecorderTest extends ActivityInstrumentationTestCase2<MediaStubActivity> {
     private final String TAG = "MediaRecorderTest";
     private final String OUTPUT_PATH;
@@ -46,6 +41,11 @@
     private static final int RECORD_TIME = 3000;
     private static final int VIDEO_WIDTH = 176;
     private static final int VIDEO_HEIGHT = 144;
+    private static final int VIDEO_BIT_RATE_IN_BPS = 128000;
+    private static final double VIDEO_TIMELAPSE_CAPTURE_RATE_FPS = 1.0;
+    private static final int AUDIO_BIT_RATE_IN_BPS = 12200;
+    private static final int AUDIO_NUM_CHANNELS = 1;
+    private static final int AUDIO_SAMPLE_RATE_HZ = 8000;
     private static final long MAX_FILE_SIZE = 5000;
     private static final int MAX_DURATION_MSEC = 200;
     private static final float LATITUDE = 0.0000f;
@@ -108,48 +108,6 @@
         super.tearDown();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "MediaRecorder",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOutputFormat",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVideoEncoder",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVideoSize",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVideoSource",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOutputFile",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "reset",
-            args = {}
-        )
-    })
     public void testRecorderCamera() throws Exception {
         if (!hasCamera()) {
             return;
@@ -158,6 +116,7 @@
         mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
         mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
         mMediaRecorder.setVideoSize(VIDEO_WIDTH, VIDEO_HEIGHT);
+        mMediaRecorder.setVideoEncodingBitRate(VIDEO_BIT_RATE_IN_BPS);
         mMediaRecorder.setPreviewDisplay(getActivity().getSurfaceHolder().getSurface());
         mMediaRecorder.prepare();
         mMediaRecorder.start();
@@ -166,23 +125,6 @@
         checkOutputExist();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVideoFrameRate",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setLocation",
-            args = {float.class,float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setCamera",
-            args = {Camera.class}
-        )
-    })
     @UiThreadTest
     public void testSetCamera() throws Exception {
         int nCamera = Camera.getNumberOfCameras();
@@ -251,64 +193,15 @@
         assertTrue(mOutFile.delete());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "MediaRecorder",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "prepare",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOutputFile",
-            args = {FileDescriptor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOutputFormat",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPreviewDisplay",
-            args = {Surface.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVideoEncoder",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVideoSize",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVideoSource",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "start",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setMaxFileSize",
-            args = {long.class}
-        )
-    })
+    public void testRecorderTimelapsedVideo() throws Exception {
+        testRecorderVideo(true);
+    }
+
     public void testRecorderVideo() throws Exception {
+        testRecorderVideo(false);
+    }
+
+    private void testRecorderVideo(boolean isTimelapsed) throws Exception {
         if (!hasCamera()) {
             return;
         }
@@ -318,6 +211,11 @@
         mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
         mMediaRecorder.setPreviewDisplay(getActivity().getSurfaceHolder().getSurface());
         mMediaRecorder.setVideoSize(VIDEO_WIDTH, VIDEO_HEIGHT);
+
+        if (isTimelapsed) {
+            mMediaRecorder.setCaptureRate(VIDEO_TIMELAPSE_CAPTURE_RATE_FPS);
+        }
+
         FileOutputStream fos = new FileOutputStream(OUTPUT_PATH2);
         FileDescriptor fd = fos.getFD();
         mMediaRecorder.setOutputFile(fd);
@@ -326,58 +224,45 @@
         assertFalse(checkLocationInFile(OUTPUT_PATH2));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "MediaRecorder",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMaxAmplitude",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "prepare",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAudioEncoder",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAudioSource",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOutputFile",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOutputFormat",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "start",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setMaxFileSize",
-            args = {long.class}
-        )
-    })
+    public void testRecordingAudioInRawFormats() throws Exception {
+        testRecordAudioInRawFormat(
+                MediaRecorder.OutputFormat.AMR_NB,
+                MediaRecorder.AudioEncoder.AMR_NB);
+
+        testRecordAudioInRawFormat(
+                MediaRecorder.OutputFormat.AMR_WB,
+                MediaRecorder.AudioEncoder.AMR_WB);
+
+        testRecordAudioInRawFormat(
+                MediaRecorder.OutputFormat.AAC_ADTS,
+                MediaRecorder.AudioEncoder.AAC);
+    }
+
+    private void testRecordAudioInRawFormat(
+            int fileFormat, int codec) throws Exception {
+
+        if (!hasMicrophone()) {
+            return;
+        }
+        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
+        mMediaRecorder.setOutputFormat(fileFormat);
+        mMediaRecorder.setOutputFile(OUTPUT_PATH);
+        mMediaRecorder.setAudioEncoder(codec);
+        recordMedia(MAX_FILE_SIZE, mOutFile);
+    }
+
+    public void testGetAudioSourceMax() throws Exception {
+        final int max = MediaRecorder.getAudioSourceMax();
+        assertTrue(MediaRecorder.AudioSource.DEFAULT <= max);
+        assertTrue(MediaRecorder.AudioSource.MIC <= max);
+        assertTrue(MediaRecorder.AudioSource.CAMCORDER <= max);
+        assertTrue(MediaRecorder.AudioSource.VOICE_CALL <= max);
+        assertTrue(MediaRecorder.AudioSource.VOICE_COMMUNICATION <= max);
+        assertTrue(MediaRecorder.AudioSource.VOICE_DOWNLINK <= max);
+        assertTrue(MediaRecorder.AudioSource.VOICE_RECOGNITION <= max);
+        assertTrue(MediaRecorder.AudioSource.VOICE_UPLINK <= max);
+    }
+
     public void testRecorderAudio() throws Exception {
         if (!hasMicrophone()) {
             return;
@@ -387,56 +272,12 @@
         mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
         mMediaRecorder.setOutputFile(OUTPUT_PATH);
         mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
+        mMediaRecorder.setAudioChannels(AUDIO_NUM_CHANNELS);
+        mMediaRecorder.setAudioSamplingRate(AUDIO_SAMPLE_RATE_HZ);
+        mMediaRecorder.setAudioEncodingBitRate(AUDIO_BIT_RATE_IN_BPS);
         recordMedia(MAX_FILE_SIZE, mOutFile);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "MediaRecorder",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "prepare",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAudioEncoder",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAudioSource",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOutputFormat",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "start",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setMaxDuration",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOnInfoListener",
-            args = {OnInfoListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOnErrorListener",
-            args = {OnErrorListener.class}
-        )
-    })
     public void testOnInfoListener() throws Exception {
         if (!hasMicrophone()) {
             return;
@@ -451,11 +292,6 @@
         assertTrue(mOnInfoCalled);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setMaxDuration",
-        args = {int.class}
-    )
     public void testSetMaxDuration() throws Exception {
         if (!hasMicrophone()) {
             return;
@@ -471,11 +307,6 @@
         checkOutputExist();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setMaxFileSize",
-        args = {int.class}
-    )
     public void testSetMaxFileSize() throws Exception {
         if (!hasMicrophone()) {
             return;
@@ -491,53 +322,6 @@
         checkOutputExist();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "MediaRecorder",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "prepare",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAudioEncoder",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAudioSource",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOutputFormat",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "start",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOnErrorListener",
-            args = {OnErrorListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setMaxFileSize",
-            args = {long.class}
-        )
-    })
     public void testOnErrorListener() throws Exception {
         if (!hasMicrophone()) {
             return;
diff --git a/tests/tests/media/src/android/media/cts/MediaScannerConnectionTest.java b/tests/tests/media/src/android/media/cts/MediaScannerConnectionTest.java
index cc25d07..8c8325b 100644
--- a/tests/tests/media/src/android/media/cts/MediaScannerConnectionTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaScannerConnectionTest.java
@@ -18,26 +18,21 @@
 
 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 android.content.ComponentName;
 import android.content.Context;
+import android.cts.util.PollingCheck;
 import android.media.MediaScannerConnection;
 import android.media.MediaScannerConnection.MediaScannerConnectionClient;
 import android.net.Uri;
 import android.os.IBinder;
+import android.provider.cts.FileCopyHelper;
 import android.test.AndroidTestCase;
-import android.view.animation.cts.DelayedCheck;
 
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.InputStream;
 
-@TestTargetClass(MediaScannerConnection.class)
 public class MediaScannerConnectionTest extends AndroidTestCase {
 
     private static final String MEDIA_TYPE = "audio/mpeg";
@@ -50,27 +45,11 @@
     protected void setUp() throws Exception {
         super.setUp();
         // prepare the media file.
-        InputStream in = null;
-        FileOutputStream fOut = null;
+        
+        FileCopyHelper copier = new FileCopyHelper(mContext);
         String fileName = "test" + System.currentTimeMillis();
-        try {
-            fOut = getContext().openFileOutput(fileName, Context.MODE_WORLD_READABLE);
-            in = getContext().getResources().openRawResource(R.raw.testmp3);
-            byte[] bs = new byte[1024];
-            int size = in.read(bs);
-            while (size != -1) {
-                fOut.write(bs, 0, size);
-                size = in.read(bs);
-            }
-        } finally {
-            if (in != null) {
-                in.close();
-            }
-            if (fOut != null) {
-                fOut.flush();
-                fOut.close();
-            }
-        }
+        copier.copy(R.raw.testmp3, fileName);
+
         File dir = getContext().getFilesDir();
         mMediaFile = new File(dir, fileName);
         assertTrue(mMediaFile.exists());
@@ -88,44 +67,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "MediaScannerConnection",
-            args = {Context.class, MediaScannerConnectionClient.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "connect",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "disconnect",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isConnected",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onServiceConnected",
-            args = {ComponentName.class, IBinder.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "onServiceDisconnected",
-            args = {ComponentName.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "scanFile",
-            args = {String.class, String.class}
-        )
-    })
-    @ToBeFixed(bug = "1567087", explanation = "onServiceDisconnected is not called")
     public void testMediaScannerConnection() throws InterruptedException {
         mMediaScannerConnectionClient = new MockMediaScannerConnectionClient();
         mMediaScannerConnection = new MockMediaScannerConnection(getContext(),
@@ -157,12 +98,12 @@
     }
 
     private void checkMediaScannerConnection() {
-        new DelayedCheck(TIME_OUT) {
+        new PollingCheck(TIME_OUT) {
             protected boolean check() {
                 return mMediaScannerConnectionClient.isOnMediaScannerConnectedCalled;
             }
         }.run();
-        new DelayedCheck(TIME_OUT) {
+        new PollingCheck(TIME_OUT) {
             protected boolean check() {
                 return mMediaScannerConnectionClient.mediaPath != null;
             }
@@ -170,7 +111,7 @@
     }
 
     private void checkConnectionState(final boolean expected) {
-        new DelayedCheck(TIME_OUT) {
+        new PollingCheck(TIME_OUT) {
             protected boolean check() {
                 return mMediaScannerConnection.isConnected() == expected;
             }
diff --git a/tests/tests/media/src/android/media/cts/MediaScannerNotificationTest.java b/tests/tests/media/src/android/media/cts/MediaScannerNotificationTest.java
index f6ceacf..f714a07 100644
--- a/tests/tests/media/src/android/media/cts/MediaScannerNotificationTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaScannerNotificationTest.java
@@ -16,18 +16,12 @@
 
 package android.media.cts;
 
-import android.content.BroadcastReceiver;
-import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.net.Uri;
 import android.os.Environment;
 import android.test.AndroidTestCase;
 
-import java.io.File;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
 public class MediaScannerNotificationTest extends AndroidTestCase {
 
     public void testMediaScannerNotification() throws Exception {
@@ -50,46 +44,4 @@
         startedReceiver.waitForBroadcast();
         finishedReceiver.waitForBroadcast();
     }
-
-    static class ScannerNotificationReceiver extends BroadcastReceiver {
-
-        private static final int TIMEOUT_MS = 4 * 60 * 1000;
-
-        private final String mAction;
-        private final CountDownLatch mLatch = new CountDownLatch(1);
-
-        ScannerNotificationReceiver(String action) {
-            mAction = action;
-        }
-
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            if (intent.getAction().equals(mAction)) {
-                mLatch.countDown();
-            }
-        }
-
-        public void waitForBroadcast() throws InterruptedException {
-            if (!mLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
-                int numFiles = countFiles(Environment.getExternalStorageDirectory());
-                fail("Failed to receive broadcast in " + TIMEOUT_MS + "ms for " + mAction
-                        + " while trying to scan " + numFiles + " files!");
-            }
-        }
-
-        private int countFiles(File dir) {
-            int count = 0;
-            File[] files = dir.listFiles();
-            if (files != null) {
-                for (File file : files) {
-                    if (file.isDirectory()) {
-                        count += countFiles(file);
-                    } else {
-                        count++;
-                    }
-                }
-            }
-            return count;
-        }
-    }
 }
diff --git a/tests/tests/media/src/android/media/cts/MediaScannerTest.java b/tests/tests/media/src/android/media/cts/MediaScannerTest.java
new file mode 100644
index 0000000..d58528d
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/MediaScannerTest.java
@@ -0,0 +1,290 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.cts;
+
+import com.android.cts.stub.R;
+
+import android.content.ComponentName;
+import android.content.ContentResolver;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.cts.util.PollingCheck;
+import android.database.Cursor;
+import android.media.MediaScannerConnection;
+import android.media.MediaScannerConnection.MediaScannerConnectionClient;
+import android.mtp.MtpConstants;
+import android.net.Uri;
+import android.os.Environment;
+import android.os.IBinder;
+import android.os.SystemClock;
+import android.provider.MediaStore;
+import android.provider.cts.FileCopyHelper;
+import android.test.AndroidTestCase;
+
+import java.io.File;
+import java.io.IOException;
+
+public class MediaScannerTest extends AndroidTestCase {
+
+    private static final String MEDIA_TYPE = "audio/mpeg";
+    private File mMediaFile;
+    private static final int TIME_OUT = 2000;
+    private MockMediaScannerConnection mMediaScannerConnection;
+    private MockMediaScannerConnectionClient mMediaScannerConnectionClient;
+    private String mFileDir;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        // prepare the media file.
+
+        mFileDir = Environment.getExternalStorageDirectory() + "/" + getClass().getCanonicalName();
+        String fileName = mFileDir + "/test" + System.currentTimeMillis() + ".mp3";
+        writeFile(R.raw.testmp3, fileName);
+
+        mMediaFile = new File(fileName);
+        assertTrue(mMediaFile.exists());
+    }
+
+    private void writeFile(int resid, String path) throws IOException {
+        File out = new File(path);
+        File dir = out.getParentFile();
+        dir.mkdirs();
+        FileCopyHelper copier = new FileCopyHelper(mContext);
+        copier.copyToExternalStorage(resid, out);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        if (mMediaFile != null) {
+            mMediaFile.delete();
+        }
+        if (mFileDir != null) {
+            new File(mFileDir + "/testmp3.mp3").delete();
+            new File(mFileDir + "/testmp3_2.mp3").delete();
+            new File(mFileDir + "/ctsmediascanplaylist1.pls").delete();
+            new File(mFileDir + "/ctsmediascanplaylist2.m3u").delete();
+            new File(mFileDir).delete();
+        }
+
+        if (mMediaScannerConnection != null) {
+            mMediaScannerConnection.disconnect();
+            mMediaScannerConnection = null;
+        }
+    }
+
+    public void testMediaScanner() throws InterruptedException, IOException {
+        mMediaScannerConnectionClient = new MockMediaScannerConnectionClient();
+        mMediaScannerConnection = new MockMediaScannerConnection(getContext(),
+                                    mMediaScannerConnectionClient);
+
+        assertFalse(mMediaScannerConnection.isConnected());
+
+        // start connection and wait until connected
+        mMediaScannerConnection.connect();
+        checkConnectionState(true);
+
+        // start and wait for scan
+        mMediaScannerConnection.scanFile(mMediaFile.getAbsolutePath(), MEDIA_TYPE);
+        checkMediaScannerConnection();
+
+        Uri insertUri = mMediaScannerConnectionClient.mediaUri;
+        long id = Long.valueOf(insertUri.getLastPathSegment());
+        ContentResolver res = mContext.getContentResolver();
+
+        // check that the file ended up in the audio view
+        Uri audiouri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id);
+        Cursor c = res.query(audiouri, null, null, null, null);
+        assertEquals(1, c.getCount());
+        c.close();
+
+        // add nomedia file and insert into database, file should no longer be in audio view
+        File nomedia = new File(mMediaFile.getParent() + "/.nomedia");
+        nomedia.createNewFile();
+        ContentValues values = new ContentValues();
+        values.put(MediaStore.MediaColumns.DATA, nomedia.getAbsolutePath());
+        values.put(MediaStore.Files.FileColumns.FORMAT, MtpConstants.FORMAT_UNDEFINED);
+        Uri nomediauri = res.insert(MediaStore.Files.getContentUri("external"), values);
+        // clean up nomedia file
+        nomedia.delete();
+
+        // entry should not be in audio view anymore
+        c = res.query(audiouri, null, null, null, null);
+        assertEquals(0, c.getCount());
+        c.close();
+
+        // with nomedia file removed, do media scan and check that entry is in audio table again
+        startMediaScanAndWait();
+
+        // Give the 2nd stage scan that makes the unhidden files visible again
+        // a little more time
+        SystemClock.sleep(10000);
+        // entry should be in audio view again
+        c = res.query(audiouri, null, null, null, null);
+        assertEquals(1, c.getCount());
+        c.close();
+
+        // ensure that we don't currently have playlists named ctsmediascanplaylist*
+        res.delete(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI,
+                MediaStore.Audio.PlaylistsColumns.NAME + "=?",
+                new String[] { "ctsmediascanplaylist1"});
+        res.delete(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI,
+                MediaStore.Audio.PlaylistsColumns.NAME + "=?",
+                new String[] { "ctsmediascanplaylist2"});
+        // delete the playlist file entries, if they exist
+        res.delete(MediaStore.Files.getContentUri("external"),
+                MediaStore.Files.FileColumns.DATA + "=?",
+                new String[] { mFileDir + "/ctsmediascanplaylist1.pls"});
+        res.delete(MediaStore.Files.getContentUri("external"),
+                MediaStore.Files.FileColumns.DATA + "=?",
+                new String[] { mFileDir + "/ctsmediascanplaylist2.m3u"});
+
+        // write some more files
+        writeFile(R.raw.testmp3, mFileDir + "/testmp3.mp3");
+        writeFile(R.raw.testmp3_2, mFileDir + "/testmp3_2.mp3");
+        writeFile(R.raw.playlist1, mFileDir + "/ctsmediascanplaylist1.pls");
+        writeFile(R.raw.playlist2, mFileDir + "/ctsmediascanplaylist2.m3u");
+
+        startMediaScanAndWait();
+
+        // verify that the two playlists were created correctly;
+        c = res.query(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, null,
+                MediaStore.Audio.PlaylistsColumns.NAME + "=?",
+                new String[] { "ctsmediascanplaylist1"}, null);
+        assertEquals(1, c.getCount());
+        c.moveToFirst();
+        long playlistid = c.getLong(c.getColumnIndex(MediaStore.MediaColumns._ID));
+        c.close();
+
+        c = res.query(MediaStore.Audio.Playlists.Members.getContentUri("external", playlistid),
+                null, null, null, MediaStore.Audio.Playlists.Members.PLAY_ORDER);
+        assertEquals(2, c.getCount());
+        c.moveToNext();
+        long song1a = c.getLong(c.getColumnIndex(MediaStore.Audio.Playlists.Members.AUDIO_ID));
+        c.moveToNext();
+        long song1b = c.getLong(c.getColumnIndex(MediaStore.Audio.Playlists.Members.AUDIO_ID));
+        c.close();
+        assertTrue("song id should not be 0", song1a != 0);
+        assertTrue("song id should not be 0", song1b != 0);
+
+        // 2nd playlist should have the same songs, in reverse order
+        c = res.query(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, null,
+                MediaStore.Audio.PlaylistsColumns.NAME + "=?",
+                new String[] { "ctsmediascanplaylist2"}, null);
+        assertEquals(1, c.getCount());
+        c.moveToFirst();
+        playlistid = c.getLong(c.getColumnIndex(MediaStore.MediaColumns._ID));
+        c.close();
+
+        c = res.query(MediaStore.Audio.Playlists.Members.getContentUri("external", playlistid),
+                null, null, null, MediaStore.Audio.Playlists.Members.PLAY_ORDER);
+        assertEquals(2, c.getCount());
+        c.moveToNext();
+        long song2a = c.getLong(c.getColumnIndex(MediaStore.Audio.Playlists.Members.AUDIO_ID));
+        c.moveToNext();
+        long song2b = c.getLong(c.getColumnIndex(MediaStore.Audio.Playlists.Members.AUDIO_ID));
+        c.close();
+        assertEquals("mismatched song ids", song1a, song2b);
+        assertEquals("mismatched song ids", song2a, song1b);
+
+        mMediaScannerConnection.disconnect();
+
+        checkConnectionState(false);
+    }
+
+    private void startMediaScanAndWait() throws InterruptedException {
+        ScannerNotificationReceiver finishedReceiver = new ScannerNotificationReceiver(
+                Intent.ACTION_MEDIA_SCANNER_FINISHED);
+        IntentFilter finishedIntentFilter = new IntentFilter(Intent.ACTION_MEDIA_SCANNER_FINISHED);
+        finishedIntentFilter.addDataScheme("file");
+        mContext.registerReceiver(finishedReceiver, finishedIntentFilter);
+        mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"
+                + Environment.getExternalStorageDirectory())));
+        finishedReceiver.waitForBroadcast();
+        mContext.unregisterReceiver(finishedReceiver);
+    }
+
+    private void checkMediaScannerConnection() {
+        new PollingCheck(TIME_OUT) {
+            protected boolean check() {
+                return mMediaScannerConnectionClient.isOnMediaScannerConnectedCalled;
+            }
+        }.run();
+        new PollingCheck(TIME_OUT) {
+            protected boolean check() {
+                return mMediaScannerConnectionClient.mediaPath != null;
+            }
+        }.run();
+    }
+
+    private void checkConnectionState(final boolean expected) {
+        new PollingCheck(TIME_OUT) {
+            protected boolean check() {
+                return mMediaScannerConnection.isConnected() == expected;
+            }
+        }.run();
+    }
+
+    class MockMediaScannerConnection extends MediaScannerConnection {
+
+        public boolean mIsOnServiceConnectedCalled;
+        public boolean mIsOnServiceDisconnectedCalled;
+        public MockMediaScannerConnection(Context context, MediaScannerConnectionClient client) {
+            super(context, client);
+        }
+
+        @Override
+        public void onServiceConnected(ComponentName className, IBinder service) {
+            super.onServiceConnected(className, service);
+            mIsOnServiceConnectedCalled = true;
+        }
+
+        @Override
+        public void onServiceDisconnected(ComponentName className) {
+            super.onServiceDisconnected(className);
+            mIsOnServiceDisconnectedCalled = true;
+            // this is not called.
+        }
+    }
+
+    class MockMediaScannerConnectionClient implements MediaScannerConnectionClient {
+
+        public boolean isOnMediaScannerConnectedCalled;
+        public String mediaPath;
+        public Uri mediaUri;
+        public void onMediaScannerConnected() {
+            isOnMediaScannerConnectedCalled = true;
+        }
+
+        public void onScanCompleted(String path, Uri uri) {
+            mediaPath = path;
+            if (uri != null) {
+                mediaUri = uri;
+            }
+        }
+
+        public void reset() {
+            mediaPath = null;
+            mediaUri = null;
+        }
+    }
+
+}
diff --git a/tests/tests/media/src/android/media/cts/PresetReverbTest.java b/tests/tests/media/src/android/media/cts/PresetReverbTest.java
index a1b05bd..b384bd7 100644
--- a/tests/tests/media/src/android/media/cts/PresetReverbTest.java
+++ b/tests/tests/media/src/android/media/cts/PresetReverbTest.java
@@ -23,12 +23,7 @@
 import android.os.Looper;
 import android.test.AndroidTestCase;
 import android.util.Log;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(PresetReverb.class)
 public class PresetReverbTest extends AndroidTestCase {
 
     private String TAG = "PresetReverbTest";
@@ -54,23 +49,6 @@
     //----------------------------------
 
     //Test case 0.0: test constructor and release
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "PresetReverb",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        )
-    })
     public void test0_0ConstructorAndRelease() throws Exception {
         PresetReverb reverb = null;
         try {
@@ -97,18 +75,6 @@
     //----------------------------------
 
     //Test case 1.0: test presets
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPreset",
-            args = {short.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPreset",
-            args = {}
-        )
-    })
     public void test1_0Presets() throws Exception {
         getReverb(0);
         try {
@@ -130,18 +96,6 @@
     }
 
     //Test case 1.1: test properties
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getProperties",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProperties",
-            args = {PresetReverb.Settings.class}
-        )
-    })
     public void test1_1Properties() throws Exception {
         getReverb(0);
         try {
@@ -170,18 +124,6 @@
     //----------------------------------
 
     //Test case 2.0: test setEnabled() and getEnabled() in valid state
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getEnabled",
-            args = {}
-        )
-    })
     public void test2_0SetEnabledGetEnabled() throws Exception {
         getReverb(0);
         try {
@@ -197,18 +139,6 @@
     }
 
     //Test case 2.1: test setEnabled() throws exception after release
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEnabled",
-            args = {boolean.class}
-        )
-    })
     public void test2_1SetEnabledAfterRelease() throws Exception {
         getReverb(0);
         mReverb.release();
@@ -226,13 +156,6 @@
     //----------------------------------
 
     //Test case 3.0: test control status listener
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setControlStatusListener",
-            args = {AudioEffect.OnControlStatusChangeListener.class}
-        )
-    })
     public void test3_0ControlStatusListener() throws Exception {
         mHasControl = true;
         createListenerLooper(true, false, false);
@@ -259,13 +182,6 @@
     }
 
     //Test case 3.1: test enable status listener
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEnableStatusListener",
-            args = {AudioEffect.OnEnableStatusChangeListener.class}
-        )
-    })
     public void test3_1EnableStatusListener() throws Exception {
         createListenerLooper(false, true, false);
         synchronized(mLock) {
@@ -294,13 +210,6 @@
     }
 
     //Test case 3.2: test parameter changed listener
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setParameterListener",
-            args = {PresetReverb.OnParameterChangeListener.class}
-        )
-    })
     public void test3_2ParameterChangedListener() throws Exception {
         createListenerLooper(false, false, true);
         synchronized(mLock) {
diff --git a/tests/tests/media/src/android/media/cts/RingtoneManagerTest.java b/tests/tests/media/src/android/media/cts/RingtoneManagerTest.java
index dcc45c3..e667516 100644
--- a/tests/tests/media/src/android/media/cts/RingtoneManagerTest.java
+++ b/tests/tests/media/src/android/media/cts/RingtoneManagerTest.java
@@ -17,10 +17,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.app.Activity;
 import android.app.Instrumentation;
@@ -33,7 +29,6 @@
 import android.provider.Settings;
 import android.test.ActivityInstrumentationTestCase2;
 
-@TestTargetClass(RingtoneManager.class)
 public class RingtoneManagerTest
         extends ActivityInstrumentationTestCase2<RingtonePickerActivity> {
 
@@ -79,90 +74,11 @@
         super.tearDown();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "RingtoneManager",
-            args = {Activity.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "RingtoneManager",
-            args = {Context.class}
-        )
-    })
     public void testConstructors() {
         new RingtoneManager(mActivity);
         new RingtoneManager(mContext);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setIncludeDrm",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIncludeDrm",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRingtoneUri",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRingtone",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRingtone",
-            args = {Context.class, Uri.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCursor",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRingtonePosition",
-            args = {Uri.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getActualDefaultRingtoneUri",
-            args = {Context.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setActualDefaultRingtoneUri",
-            args = {Context.class, int.class, Uri.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDefaultType",
-            args = {Uri.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getValidRingtoneUri",
-            args = {Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isDefault",
-            args = {Uri.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDefaultUri",
-            args = {int.class}
-        )
-    })
     public void testAccessMethods() {
         Cursor c = mRingtoneManager.getCursor();
         assertTrue("Must have at least one ring tone available", c.getCount() > 0);
@@ -194,18 +110,6 @@
         assertTrue(RingtoneManager.isDefault(Settings.System.DEFAULT_RINGTONE_URI));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setType",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "inferStreamType",
-            args = {}
-        )
-    })
     public void testSetType() {
         mRingtoneManager.setType(RingtoneManager.TYPE_ALARM);
         assertEquals(AudioManager.STREAM_ALARM, mRingtoneManager.inferStreamType());
@@ -215,23 +119,6 @@
         assertEquals(RingtoneManager.TYPE_ALARM, r.getStreamType());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stopPreviousRingtone",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setStopPreviousRingtone",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStopPreviousRingtone",
-            args = {}
-        )
-    })
     public void testStopPreviousRingtone() {
         Cursor c = mRingtoneManager.getCursor();
         assertTrue("Must have at least one ring tone available", c.getCount() > 0);
diff --git a/tests/tests/media/src/android/media/cts/RingtoneTest.java b/tests/tests/media/src/android/media/cts/RingtoneTest.java
index 1ae652e..024f44d 100644
--- a/tests/tests/media/src/android/media/cts/RingtoneTest.java
+++ b/tests/tests/media/src/android/media/cts/RingtoneTest.java
@@ -16,10 +16,6 @@
 
 package android.media.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.Context;
 import android.media.AudioManager;
@@ -28,7 +24,6 @@
 import android.provider.Settings;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(Ringtone.class)
 public class RingtoneTest extends AndroidTestCase {
 
     private Context mContext;
@@ -71,38 +66,6 @@
         super.tearDown();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isPlaying",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "play",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setStreamType",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStreamType",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitle",
-            args = {Context.class}
-        )
-    })
     public void testRingtone() {
 
         assertNotNull(mRingtone.getTitle(mContext));
diff --git a/tests/tests/media/src/android/media/cts/ScannerNotificationReceiver.java b/tests/tests/media/src/android/media/cts/ScannerNotificationReceiver.java
new file mode 100644
index 0000000..4357bee
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/ScannerNotificationReceiver.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.cts;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Environment;
+
+import java.io.File;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+class ScannerNotificationReceiver extends BroadcastReceiver {
+
+    private static final int TIMEOUT_MS = 4 * 60 * 1000;
+
+    private final String mAction;
+    private final CountDownLatch mLatch = new CountDownLatch(1);
+
+    ScannerNotificationReceiver(String action) {
+        mAction = action;
+    }
+
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        if (intent.getAction().equals(mAction)) {
+            mLatch.countDown();
+        }
+    }
+
+    public void waitForBroadcast() throws InterruptedException {
+        if (!mLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
+            int numFiles = countFiles(Environment.getExternalStorageDirectory());
+            MediaScannerTest.fail("Failed to receive broadcast in " + TIMEOUT_MS + "ms for "
+                    + mAction + " while trying to scan " + numFiles + " files!");
+        }
+    }
+
+    private int countFiles(File dir) {
+        int count = 0;
+        File[] files = dir.listFiles();
+        if (files != null) {
+            for (File file : files) {
+                if (file.isDirectory()) {
+                    count += countFiles(file);
+                } else {
+                    count++;
+                }
+            }
+        }
+        return count;
+    }
+}
\ No newline at end of file
diff --git a/tests/tests/media/src/android/media/cts/SoundPoolTest.java b/tests/tests/media/src/android/media/cts/SoundPoolTest.java
index d5b33b4..c0ab192 100644
--- a/tests/tests/media/src/android/media/cts/SoundPoolTest.java
+++ b/tests/tests/media/src/android/media/cts/SoundPoolTest.java
@@ -18,11 +18,6 @@
 
 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 android.content.Context;
 import android.content.res.AssetFileDescriptor;
@@ -35,7 +30,6 @@
 import java.io.FileOutputStream;
 import java.io.InputStream;
 
-@TestTargetClass(SoundPool.class)
 abstract class SoundPoolTest extends AndroidTestCase {
 
     private static final int SOUNDPOOL_STREAMS = 4;
@@ -91,39 +85,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "load",
-            args = {AssetFileDescriptor.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "load",
-            args = {Context.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "load",
-            args = {FileDescriptor.class, long.class, long.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "load",
-            args = {String.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "unload",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        )
-    })
-    @ToBeFixed(explanation = "unload() does not return true as specified")
     public void testLoad() throws Exception {
         int srcQuality = 100;
         mSoundPool = new SoundPool(SOUNDPOOL_STREAMS, AudioManager.STREAM_MUSIC, srcQuality);
@@ -173,58 +134,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "load",
-            args = {Context.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "pause",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "play",
-            args = {int.class, float.class, float.class, int.class, int.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "resume",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setLoop",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPriority",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRate",
-            args = {int.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVolume",
-            args = {int.class, float.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "SoundPool",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stop",
-            args = {int.class}
-        )
-    })
     public void testSoundPoolOp() throws Exception {
         int srcQuality = 100;
         mSoundPool = new SoundPool(SOUNDPOOL_STREAMS, AudioManager.STREAM_MUSIC, srcQuality);
@@ -268,28 +177,6 @@
         mSoundPool.unload(sampleID);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "load",
-            args = {Context.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "play",
-            args = {int.class, float.class, float.class, int.class, int.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "SoundPool",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stop",
-            args = {int.class}
-        )
-    })
     public void testMultiSound() throws Exception {
         int srcQuality = 100;
         mSoundPool = new SoundPool(SOUNDPOOL_STREAMS, AudioManager.STREAM_MUSIC, srcQuality);
@@ -320,18 +207,6 @@
         mSoundPool = null;
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "load",
-            args = {Context.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "SoundPool",
-            args = {int.class, int.class, int.class}
-        )
-    })
     public void testLoadMore() throws Exception {
         mSoundPool = new SoundPool(SOUNDPOOL_STREAMS, AudioManager.STREAM_MUSIC, 0);
         int[] sounds = getSounds();
diff --git a/tests/tests/media/src/android/media/cts/ToneGeneratorTest.java b/tests/tests/media/src/android/media/cts/ToneGeneratorTest.java
index 4cf1170..23ee39c 100644
--- a/tests/tests/media/src/android/media/cts/ToneGeneratorTest.java
+++ b/tests/tests/media/src/android/media/cts/ToneGeneratorTest.java
@@ -19,36 +19,9 @@
 import android.media.AudioManager;
 import android.media.ToneGenerator;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(ToneGenerator.class)
 public class ToneGeneratorTest extends AndroidTestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ToneGenerator",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startTone",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stopTone",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        )
-    })
     public void testSyncGenerate() throws Exception {
         ToneGenerator toneGen = new ToneGenerator(AudioManager.STREAM_RING,
                                                   ToneGenerator.MAX_VOLUME);
diff --git a/tests/tests/media/src/android/media/cts/VirtualizerTest.java b/tests/tests/media/src/android/media/cts/VirtualizerTest.java
index 0a82f09..53320b8 100644
--- a/tests/tests/media/src/android/media/cts/VirtualizerTest.java
+++ b/tests/tests/media/src/android/media/cts/VirtualizerTest.java
@@ -23,12 +23,7 @@
 import android.os.Looper;
 import android.test.AndroidTestCase;
 import android.util.Log;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(Virtualizer.class)
 public class VirtualizerTest extends AndroidTestCase {
 
     private String TAG = "VirtualizerTest";
@@ -55,23 +50,6 @@
     //----------------------------------
 
     //Test case 0.0: test constructor and release
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Virtualizer",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        )
-    })
     public void test0_0ConstructorAndRelease() throws Exception {
         Virtualizer eq = null;
         try {
@@ -99,23 +77,6 @@
     //----------------------------------
 
     //Test case 1.0: test strength
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStrengthSupported",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setStrength",
-            args = {short.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRoundedStrength",
-            args = {}
-        )
-    })
     public void test1_0Strength() throws Exception {
         getVirtualizer(0);
         try {
@@ -144,18 +105,6 @@
     }
 
     //Test case 1.1: test properties
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getProperties",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProperties",
-            args = {Virtualizer.Settings.class}
-        )
-    })
     public void test1_1Properties() throws Exception {
         getVirtualizer(0);
         try {
@@ -189,18 +138,6 @@
     }
 
     //Test case 1.2: test setStrength() throws exception after release
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setStrength",
-            args = {short.class}
-        )
-    })
     public void test1_2SetStrengthAfterRelease() throws Exception {
         getVirtualizer(0);
         mVirtualizer.release();
@@ -218,18 +155,6 @@
     //----------------------------------
 
     //Test case 2.0: test setEnabled() and getEnabled() in valid state
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getEnabled",
-            args = {}
-        )
-    })
     public void test2_0SetEnabledGetEnabled() throws Exception {
         getVirtualizer(0);
         try {
@@ -245,18 +170,6 @@
     }
 
     //Test case 2.1: test setEnabled() throws exception after release
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEnabled",
-            args = {boolean.class}
-        )
-    })
     public void test2_1SetEnabledAfterRelease() throws Exception {
         getVirtualizer(0);
         mVirtualizer.release();
@@ -274,13 +187,6 @@
     //----------------------------------
 
     //Test case 3.0: test control status listener
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setControlStatusListener",
-            args = {AudioEffect.OnControlStatusChangeListener.class}
-        )
-    })
     public void test3_0ControlStatusListener() throws Exception {
         mHasControl = true;
         createListenerLooper(true, false, false);
@@ -307,13 +213,6 @@
     }
 
     //Test case 3.1: test enable status listener
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEnableStatusListener",
-            args = {AudioEffect.OnEnableStatusChangeListener.class}
-        )
-    })
     public void test3_1EnableStatusListener() throws Exception {
         createListenerLooper(false, true, false);
         synchronized(mLock) {
@@ -342,13 +241,6 @@
     }
 
     //Test case 3.2: test parameter changed listener
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setParameterListener",
-            args = {Virtualizer.OnParameterChangeListener.class}
-        )
-    })
     public void test3_2ParameterChangedListener() throws Exception {
         createListenerLooper(false, false, true);
         synchronized(mLock) {
diff --git a/tests/tests/media/src/android/media/cts/VisualizerTest.java b/tests/tests/media/src/android/media/cts/VisualizerTest.java
index 6b29948..689b06b 100644
--- a/tests/tests/media/src/android/media/cts/VisualizerTest.java
+++ b/tests/tests/media/src/android/media/cts/VisualizerTest.java
@@ -23,12 +23,7 @@
 import android.os.Looper;
 import android.test.AndroidTestCase;
 import android.util.Log;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(Visualizer.class)
 public class VisualizerTest extends AndroidTestCase {
 
     private String TAG = "VisualizerTest";
@@ -55,18 +50,6 @@
     //----------------------------------
 
     //Test case 0.0: test constructor and release
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Visualizer",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        )
-    })
     public void test0_0ConstructorAndRelease() throws Exception {
         Visualizer visualizer = null;
          try {
@@ -89,18 +72,6 @@
     //----------------------------------
 
     //Test case 1.0: capture rates
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMaxCaptureRate",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSamplingRate",
-            args = {}
-        )
-    })
     public void test1_0CaptureRates() throws Exception {
         getVisualizer(0);
         try {
@@ -120,23 +91,6 @@
     }
 
     //Test case 1.1: test capture size
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCaptureSizeRange",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setCaptureSize",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCaptureSize",
-            args = {}
-        )
-    })
     public void test1_1CaptureSize() throws Exception {
         getVisualizer(0);
         try {
@@ -167,28 +121,6 @@
     //----------------------------------
 
     //Test case 2.0: test cature in polling mode
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getEnabled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWaveForm",
-            args = {byte[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFft",
-            args = {byte[].class}
-        )
-    })
     public void test2_0PollingCapture() throws Exception {
         try {
             getVisualizer(0);
@@ -221,24 +153,6 @@
     }
 
     //Test case 2.1: test capture with listener
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getEnabled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDataCaptureListener",
-            args = {Visualizer.OnDataCaptureListener.class,
-                    int.class, boolean.class, boolean.class}
-        )
-    })
     public void test2_1ListenerCapture() throws Exception {
         try {
             getVisualizer(0);
diff --git a/tests/tests/mediastress/Android.mk b/tests/tests/mediastress/Android.mk
index 4fa7fdb..505d123 100644
--- a/tests/tests/mediastress/Android.mk
+++ b/tests/tests/mediastress/Android.mk
@@ -22,10 +22,15 @@
 
 LOCAL_JAVA_LIBRARIES := android.test.runner
 
+LOCAL_JNI_SHARED_LIBRARIES := libctsmediastress_jni
+
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
 LOCAL_PACKAGE_NAME := CtsMediaStressTestCases
 
 LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_PACKAGE)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
+
diff --git a/tests/tests/mediastress/AndroidManifest.xml b/tests/tests/mediastress/AndroidManifest.xml
index 5a4569c..1ee4104 100644
--- a/tests/tests/mediastress/AndroidManifest.xml
+++ b/tests/tests/mediastress/AndroidManifest.xml
@@ -34,6 +34,8 @@
                 <category android:name="android.intent.category.LAUNCHER"/>
             </intent-filter>
         </activity>
+        <activity android:name="android.mediastress.cts.NativeMediaActivity"
+                  android:label="NativeMedia" />
     </application>
     <instrumentation android:name="android.test.InstrumentationTestRunner"
             android:targetPackage="com.android.cts.mediastress"
diff --git a/tests/tests/mediastress/jni/Android.mk b/tests/tests/mediastress/jni/Android.mk
new file mode 100644
index 0000000..3913b54
--- /dev/null
+++ b/tests/tests/mediastress/jni/Android.mk
@@ -0,0 +1,31 @@
+# Copyright (C) 2012 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE    := libctsmediastress_jni
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := native-media-jni.cpp
+
+LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
+
+LOCAL_CFLAGS += -Isystem/media/wilhelm/include
+
+LOCAL_SHARED_LIBRARIES := libandroid libnativehelper liblog libOpenMAXAL
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/tests/tests/mediastress/jni/native-media-jni.cpp b/tests/tests/mediastress/jni/native-media-jni.cpp
new file mode 100644
index 0000000..8df937f
--- /dev/null
+++ b/tests/tests/mediastress/jni/native-media-jni.cpp
@@ -0,0 +1,284 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* Original code copied from NDK Native-media sample code */
+
+
+#include <assert.h>
+#include <jni.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <string.h>
+
+// for __android_log_print(ANDROID_LOG_INFO, "YourApp", "formatted message");
+#include <android/log.h>
+#define TAG "NativeMedia"
+#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)
+#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)
+// for native media
+#include <OMXAL/OpenMAXAL.h>
+#include <OMXAL/OpenMAXAL_Android.h>
+
+// for native window JNI
+#include <android/native_window_jni.h>
+
+// engine interfaces
+static XAObjectItf engineObject = NULL;
+static XAEngineItf engineEngine = NULL;
+
+// output mix interfaces
+static XAObjectItf outputMixObject = NULL;
+
+// streaming media player interfaces
+static XAObjectItf             playerObj = NULL;
+static XAPlayItf               playerPlayItf = NULL;
+static XAAndroidBufferQueueItf playerBQItf = NULL;
+static XAStreamInformationItf  playerStreamInfoItf = NULL;
+static XAVolumeItf             playerVolItf = NULL;
+
+// number of required interfaces for the MediaPlayer creation
+#define NB_MAXAL_INTERFACES 3 // XAAndroidBufferQueueItf, XAStreamInformationItf and XAPlayItf
+
+// video sink for the player
+static ANativeWindow* theNativeWindow = NULL;
+
+/**
+ * Macro to clean-up already created stuffs and return JNI_FALSE when cond is not true
+ */
+#define RETURN_ON_ASSERTION_FAILURE(cond, env, clazz)                                   \
+        if (!(cond)) {                                                                  \
+            LOGE("assertion failure at file %s line %d", __FILE__, __LINE__);           \
+            Java_android_mediastress_cts_NativeMediaActivity_shutdown((env), (clazz));  \
+            return JNI_FALSE;                                                           \
+        }
+
+// callback invoked whenever there is new or changed stream information
+static void StreamChangeCallback(XAStreamInformationItf caller,
+        XAuint32 eventId,
+        XAuint32 streamIndex,
+        void * pEventData,
+        void * pContext )
+{
+    LOGV("StreamChangeCallback called for stream %u", streamIndex);
+    // pContext was specified as NULL at RegisterStreamChangeCallback and is unused here
+    assert(NULL == pContext);
+    switch (eventId) {
+      case XA_STREAMCBEVENT_PROPERTYCHANGE: {
+        /** From spec 1.0.1:
+            "This event indicates that stream property change has occurred.
+            The streamIndex parameter identifies the stream with the property change.
+            The pEventData parameter for this event is not used and shall be ignored."
+         */
+        XAresult res;
+        XAuint32 domain;
+        res = (*caller)->QueryStreamType(caller, streamIndex, &domain);
+        assert(XA_RESULT_SUCCESS == res);
+        switch (domain) {
+          case XA_DOMAINTYPE_VIDEO: {
+            XAVideoStreamInformation videoInfo;
+            res = (*caller)->QueryStreamInformation(caller, streamIndex, &videoInfo);
+            assert(XA_RESULT_SUCCESS == res);
+            LOGV("Found video size %u x %u, codec ID=%u, frameRate=%u, bitRate=%u, duration=%u ms",
+                        videoInfo.width, videoInfo.height, videoInfo.codecId, videoInfo.frameRate,
+                        videoInfo.bitRate, videoInfo.duration);
+          } break;
+          default:
+              LOGE("Unexpected domain %u\n", domain);
+            break;
+        }
+      } break;
+      default:
+          LOGE("Unexpected stream event ID %u\n", eventId);
+        break;
+    }
+}
+
+// shut down the native media system
+// force C naming convention for JNI interfaces to avoid registering manually
+extern "C" void Java_android_mediastress_cts_NativeMediaActivity_shutdown(JNIEnv* env,
+        jclass clazz)
+{
+    // destroy streaming media player object, and invalidate all associated interfaces
+    if (playerObj != NULL) {
+        if (playerPlayItf != NULL) {
+            (*playerPlayItf)->SetPlayState(playerPlayItf, XA_PLAYSTATE_STOPPED);
+        }
+        (*playerObj)->Destroy(playerObj);
+        playerObj = NULL;
+        playerPlayItf = NULL;
+        playerBQItf = NULL;
+        playerStreamInfoItf = NULL;
+        playerVolItf = NULL;
+    }
+
+    // destroy output mix object, and invalidate all associated interfaces
+    if (outputMixObject != NULL) {
+        (*outputMixObject)->Destroy(outputMixObject);
+        outputMixObject = NULL;
+    }
+
+    // destroy engine object, and invalidate all associated interfaces
+    if (engineObject != NULL) {
+        (*engineObject)->Destroy(engineObject);
+        engineObject = NULL;
+        engineEngine = NULL;
+    }
+
+    // make sure we don't leak native windows
+    if (theNativeWindow != NULL) {
+        ANativeWindow_release(theNativeWindow);
+        theNativeWindow = NULL;
+    }
+}
+
+// create the engine and output mix objects
+extern "C" jboolean Java_android_mediastress_cts_NativeMediaActivity_createEngine(JNIEnv* env,
+        jclass clazz)
+{
+    XAresult res;
+
+    // create engine
+    res = xaCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL);
+    RETURN_ON_ASSERTION_FAILURE((XA_RESULT_SUCCESS == res), env, clazz);
+
+    // realize the engine
+    res = (*engineObject)->Realize(engineObject, XA_BOOLEAN_FALSE);
+    RETURN_ON_ASSERTION_FAILURE((XA_RESULT_SUCCESS == res), env, clazz);
+
+    // get the engine interface, which is needed in order to create other objects
+    res = (*engineObject)->GetInterface(engineObject, XA_IID_ENGINE, &engineEngine);
+    RETURN_ON_ASSERTION_FAILURE((XA_RESULT_SUCCESS == res), env, clazz);
+
+    // create output mix
+    res = (*engineEngine)->CreateOutputMix(engineEngine, &outputMixObject, 0, NULL, NULL);
+    RETURN_ON_ASSERTION_FAILURE((XA_RESULT_SUCCESS == res), env, clazz);
+
+    // realize the output mix
+    res = (*outputMixObject)->Realize(outputMixObject, XA_BOOLEAN_FALSE);
+    RETURN_ON_ASSERTION_FAILURE((XA_RESULT_SUCCESS == res), env, clazz);
+
+    return JNI_TRUE;
+}
+
+
+// create streaming media player
+extern "C" jboolean Java_android_mediastress_cts_NativeMediaActivity_createMediaPlayer(JNIEnv* env,
+        jclass clazz, jstring fileUri)
+{
+    XAresult res;
+
+    // convert Java string to UTF-8
+    const char *utf8 = env->GetStringUTFChars(fileUri, NULL);
+    RETURN_ON_ASSERTION_FAILURE((NULL != utf8), env, clazz);
+
+    XADataLocator_URI uri = {XA_DATALOCATOR_URI, (XAchar*) utf8};
+    XADataFormat_MIME format_mime = {
+            XA_DATAFORMAT_MIME, XA_ANDROID_MIME_MP2TS, XA_CONTAINERTYPE_MPEG_TS };
+    XADataSource dataSrc = {&uri, &format_mime};
+
+    // configure audio sink
+    XADataLocator_OutputMix loc_outmix = { XA_DATALOCATOR_OUTPUTMIX, outputMixObject };
+    XADataSink audioSnk = { &loc_outmix, NULL };
+
+    // configure image video sink
+    XADataLocator_NativeDisplay loc_nd = {
+            XA_DATALOCATOR_NATIVEDISPLAY,        // locatorType
+            // the video sink must be an ANativeWindow created from a Surface or SurfaceTexture
+            (void*)theNativeWindow,              // hWindow
+            // must be NULL
+            NULL                                 // hDisplay
+    };
+    XADataSink imageVideoSink = {&loc_nd, NULL};
+
+    // declare interfaces to use
+    XAboolean     required[NB_MAXAL_INTERFACES]
+                           = {XA_BOOLEAN_TRUE, XA_BOOLEAN_TRUE, XA_BOOLEAN_TRUE};
+    XAInterfaceID iidArray[NB_MAXAL_INTERFACES]
+                           = {XA_IID_PLAY,
+                              XA_IID_ANDROIDBUFFERQUEUESOURCE,
+                              XA_IID_STREAMINFORMATION};
+
+    // create media player
+    res = (*engineEngine)->CreateMediaPlayer(engineEngine, &playerObj, &dataSrc,
+            NULL, &audioSnk, &imageVideoSink, NULL, NULL,
+            NB_MAXAL_INTERFACES /*XAuint32 numInterfaces*/,
+            iidArray /*const XAInterfaceID *pInterfaceIds*/,
+            required /*const XAboolean *pInterfaceRequired*/);
+    RETURN_ON_ASSERTION_FAILURE((XA_RESULT_SUCCESS == res), env, clazz);
+
+    // release the Java string and UTF-8
+    env->ReleaseStringUTFChars(fileUri, utf8);
+
+    // realize the player
+    res = (*playerObj)->Realize(playerObj, XA_BOOLEAN_FALSE);
+    RETURN_ON_ASSERTION_FAILURE((XA_RESULT_SUCCESS == res), env, clazz);
+
+    // get the play interface
+    res = (*playerObj)->GetInterface(playerObj, XA_IID_PLAY, &playerPlayItf);
+    RETURN_ON_ASSERTION_FAILURE((XA_RESULT_SUCCESS == res), env, clazz);
+
+    // get the stream information interface (for video size)
+    res = (*playerObj)->GetInterface(playerObj, XA_IID_STREAMINFORMATION, &playerStreamInfoItf);
+    RETURN_ON_ASSERTION_FAILURE((XA_RESULT_SUCCESS == res), env, clazz);
+
+    // get the volume interface
+    res = (*playerObj)->GetInterface(playerObj, XA_IID_VOLUME, &playerVolItf);
+    RETURN_ON_ASSERTION_FAILURE((XA_RESULT_SUCCESS == res), env, clazz);
+
+    // we want to be notified of the video size once it's found, so we register a callback for that
+    res = (*playerStreamInfoItf)->RegisterStreamChangeCallback(playerStreamInfoItf,
+            StreamChangeCallback, NULL);
+    RETURN_ON_ASSERTION_FAILURE((XA_RESULT_SUCCESS == res), env, clazz);
+
+    // prepare the player
+    res = (*playerPlayItf)->SetPlayState(playerPlayItf, XA_PLAYSTATE_PAUSED);
+    RETURN_ON_ASSERTION_FAILURE((XA_RESULT_SUCCESS == res), env, clazz);
+
+    // set the volume
+    res = (*playerVolItf)->SetVolumeLevel(playerVolItf, 0);
+    RETURN_ON_ASSERTION_FAILURE((XA_RESULT_SUCCESS == res), env, clazz);
+
+    // start the playback
+    res = (*playerPlayItf)->SetPlayState(playerPlayItf, XA_PLAYSTATE_PLAYING);
+    RETURN_ON_ASSERTION_FAILURE((XA_RESULT_SUCCESS == res), env, clazz);
+
+    return JNI_TRUE;
+}
+
+
+// set the playing state for the streaming media player
+extern "C" jboolean Java_android_mediastress_cts_NativeMediaActivity_playOrPauseMediaPlayer(
+        JNIEnv* env, jclass clazz, jboolean play)
+{
+    XAresult res;
+
+    // make sure the streaming media player was created
+    RETURN_ON_ASSERTION_FAILURE((NULL != playerPlayItf), env, clazz);
+    // set the player's state
+    res = (*playerPlayItf)->SetPlayState(playerPlayItf, play ?
+        XA_PLAYSTATE_PLAYING : XA_PLAYSTATE_PAUSED);
+    RETURN_ON_ASSERTION_FAILURE((XA_RESULT_SUCCESS == res), env, clazz);
+    return JNI_TRUE;
+}
+
+// set the surface
+extern "C" jboolean Java_android_mediastress_cts_NativeMediaActivity_setSurface(JNIEnv *env,
+        jclass clazz, jobject surface)
+{
+    // obtain a native window from a Java surface
+    theNativeWindow = ANativeWindow_fromSurface(env, surface);
+    return JNI_TRUE;
+}
diff --git a/tests/tests/mediastress/src/android/mediastress/cts/NativeMediaActivity.java b/tests/tests/mediastress/src/android/mediastress/cts/NativeMediaActivity.java
new file mode 100644
index 0000000..6a34f88
--- /dev/null
+++ b/tests/tests/mediastress/src/android/mediastress/cts/NativeMediaActivity.java
@@ -0,0 +1,182 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* Original code copied from NDK Native-media sample code */
+package android.mediastress.cts;
+
+import android.app.Activity;
+import android.graphics.SurfaceTexture;
+import android.media.CamcorderProfile;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.Surface;
+
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+
+import junit.framework.Assert;
+
+public class NativeMediaActivity extends Activity implements OnSurfaceChangedListener {
+    public static final String EXTRA_VIDEO_QUALITY = "videoQuality";
+    // should be long enough. time-out can be treated as error
+    public static final long NATIVE_MEDIA_LIFECYCLE_TIMEOUT_MS = 10000;
+    static final String TAG = "NativeMedia";
+    static final String[] MEDIA = {
+        "bbb_short/480x360/mp4_libx264_libfaac/" +
+        "bbb_short.ffmpeg.480x360.mp4.libx264_1000kbps_30fps.libfaac_stereo_192kbps_44100Hz.ts",
+        "bbb_short/720x480/mp4_libx264_libfaac/" +
+        "bbb_short.ffmpeg.720x480.mp4.libx264_1000kbps_30fps.libfaac_stereo_192kbps_44100Hz.ts",
+        "bbb_short/1280x720/mp4_libx264_libfaac/" +
+        "bbb_short.ffmpeg.1280x720.mp4.libx264_1000kbps_30fps.libfaac_stereo_192kbps_44100Hz.ts",
+        "bbb_short/1920x1080/mp4_libx264_libfaac/" +
+        "bbb_short.ffmpeg.1920x1080.mp4.libx264_5000kbps_30fps.libfaac_stereo_192kbps_48000Hz.ts"
+    };
+
+    private SurfaceTextureGLSurfaceView mGLView;
+    private volatile boolean mNativeCreated = false;
+    /** 0 for default (480x360), other value can be CamcorderProfile.QUALITY_480P / 720P / 1080P */
+    private int mVideoQuality = 0;
+    // native media status queued whenever there is a change in life.
+    private final BlockingQueue<Boolean> mNativeWaitQ = new LinkedBlockingQueue<Boolean>();
+
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        mVideoQuality = getIntent().getIntExtra(EXTRA_VIDEO_QUALITY, mVideoQuality);
+        mGLView = new SurfaceTextureGLSurfaceView(this, this);
+        setContentView(mGLView);
+    }
+
+    /**
+     * should be called by GLThread after GlSurface is created.
+     */
+    @Override
+    public void onSurfaceCreated() {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                Log.i(TAG, "onSurfaceCreated create engine");
+                // initialize native media system
+                Assert.assertTrue(createEngine());
+                Assert.assertTrue(setSurfaceForNative());
+                String fileName = getMediaString();
+                Log.i(TAG, "start playing " + fileName);
+                Assert.assertTrue(createMediaPlayer("file:///" + fileName));
+                mNativeCreated = true;
+                mNativeWaitQ.add(mNativeCreated);
+            }
+        });
+    }
+
+    /**
+     * should be called inside main thread
+     */
+    @Override
+    public void onSurfaceDestroyed() {
+        shutdownIfActive();
+    }
+
+    /**
+     * check if native media is alive. If it does not become alive
+     * for more than certain time, assertion fail will happen.
+     * @return the status of native media, true if it is alive, null if timed-out
+     * @throws InterruptedException
+     */
+    public Boolean waitForNativeMediaLifeCycle() throws InterruptedException {
+        return mNativeWaitQ.poll(NATIVE_MEDIA_LIFECYCLE_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+    }
+
+    @Override
+    protected void onPause() {
+        //GLSurfaceView destroys surface on pause. so shutdown should be done.
+        shutdownIfActive();
+        mGLView.onPause();
+        super.onPause();
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        mGLView.onResume();
+        if (mNativeCreated) {
+            Assert.assertTrue(playOrPauseMediaPlayer(true));
+        }
+    }
+
+    @Override
+    protected void onDestroy() {
+        if (mNativeCreated) {
+            shutdown();
+        }
+        super.onDestroy();
+    }
+
+    private void shutdownIfActive() {
+        if (mNativeCreated) {
+            Log.i(TAG, "shutdownIfActive shutdown");
+            // surface no longer available, so just shutdown
+            shutdown();
+            mNativeCreated = false;
+            mNativeWaitQ.add(mNativeCreated);
+        }
+    }
+
+    private boolean setSurfaceForNative() {
+        SurfaceTexture st = mGLView.getSurfaceTexture();
+        Assert.assertNotNull(st);
+        Surface s = new Surface(st);
+        boolean res = setSurface(s);
+        s.release();
+        return res;
+    }
+
+    private String getMediaString() {
+        int mediaIndex = 0; // default: 480x360
+        switch(mVideoQuality) {
+        case CamcorderProfile.QUALITY_1080P:
+            mediaIndex = 3;
+            break;
+        case CamcorderProfile.QUALITY_720P:
+            mediaIndex = 2;
+            break;
+        case CamcorderProfile.QUALITY_480P:
+            mediaIndex = 1;
+            break;
+        }
+        return WorkDir.getMediaDirString() + MEDIA[mediaIndex];
+    }
+
+    /**
+     * creates OpenMaxAl Engine
+    */
+    public static native boolean createEngine();
+    /**
+     * set surface to render. should be called before creating Media player
+     * @param surface
+     */
+    public static native boolean setSurface(Surface surface);
+
+    public static native boolean createMediaPlayer(String fileUri);
+    public static native boolean playOrPauseMediaPlayer(boolean play);
+    public static native void shutdown();
+
+    /** Load jni on initialization */
+    static {
+         System.loadLibrary("ctsmediastress_jni");
+    }
+
+}
diff --git a/tests/tests/mediastress/src/android/mediastress/cts/NativeMediaTest.java b/tests/tests/mediastress/src/android/mediastress/cts/NativeMediaTest.java
new file mode 100644
index 0000000..f3bbc40
--- /dev/null
+++ b/tests/tests/mediastress/src/android/mediastress/cts/NativeMediaTest.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.mediastress.cts;
+
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.media.CamcorderProfile;
+import android.media.MediaRecorder.AudioEncoder;
+import android.media.MediaRecorder.VideoEncoder;
+import android.os.Environment;
+import android.test.ActivityInstrumentationTestCase2;
+
+import junit.framework.Assert;
+
+public class NativeMediaTest extends ActivityInstrumentationTestCase2<NativeMediaActivity> {
+    private static final int NUMBER_PLAY_PAUSE_REPEATITIONS = 10;
+    private static final long PLAY_WAIT_TIME_MS = 4000;
+
+    public NativeMediaTest() {
+        super(NativeMediaActivity.class);
+    }
+
+    public void test1080pPlay() throws InterruptedException {
+        runPlayTest(CamcorderProfile.QUALITY_1080P);
+    }
+
+    public void test720pPlay() throws InterruptedException {
+        runPlayTest(CamcorderProfile.QUALITY_720P);
+    }
+
+    public void test480pPlay() throws InterruptedException {
+        runPlayTest(CamcorderProfile.QUALITY_480P);
+    }
+
+    public void testDefaultPlay() throws InterruptedException {
+        runPlayTest(0);
+    }
+
+    private void runPlayTest(int quality) throws InterruptedException {
+        if (quality != 0) {
+            if (!isResolutionSupported(quality)) {
+                return;
+            }
+        }
+        Intent intent = new Intent();
+        intent.putExtra(NativeMediaActivity.EXTRA_VIDEO_QUALITY,
+                quality);
+        setActivityIntent(intent);
+        final NativeMediaActivity activity = getActivity();
+        final Instrumentation instrumentation = getInstrumentation();
+        waitForNativeMediaLifeCycle(activity, true);
+        Thread.sleep(PLAY_WAIT_TIME_MS); // let it play for some time
+        for (int i = 0; i < NUMBER_PLAY_PAUSE_REPEATITIONS; i++) {
+            instrumentation.callActivityOnPause(activity);
+            instrumentation.waitForIdleSync();
+            waitForNativeMediaLifeCycle(activity, false);
+            instrumentation.callActivityOnResume(activity);
+            waitForNativeMediaLifeCycle(activity, true);
+            Thread.sleep(PLAY_WAIT_TIME_MS); // let it play for some time
+        }
+    }
+
+    /**
+     * wait until life cycle change and checks if the current status is in line with expectation
+     * @param activity
+     * @param expectAlive expected status, true if it should be alive.
+     * @throws InterruptedException
+     */
+    private void waitForNativeMediaLifeCycle(NativeMediaActivity activity, boolean expectAlive)
+            throws InterruptedException {
+        Boolean status = activity.waitForNativeMediaLifeCycle();
+        Assert.assertNotNull(status); // null means time-out
+        Assert.assertEquals(expectAlive, status.booleanValue());
+    }
+
+    private boolean isResolutionSupported(int quality) {
+        Assert.assertEquals(Environment.getExternalStorageState(), Environment.MEDIA_MOUNTED);
+        if (!CamcorderProfile.hasProfile(quality)) {
+            return false;
+        }
+        CamcorderProfile profile = CamcorderProfile.get(quality);
+        if ((profile != null) && (profile.videoCodec == VideoEncoder.H264) &&
+                (profile.audioCodec == AudioEncoder.AAC)) {
+            return true;
+        }
+        return false;
+    }
+}
diff --git a/tests/tests/mediastress/src/android/mediastress/cts/OnSurfaceChangedListener.java b/tests/tests/mediastress/src/android/mediastress/cts/OnSurfaceChangedListener.java
new file mode 100644
index 0000000..f4a2c0d
--- /dev/null
+++ b/tests/tests/mediastress/src/android/mediastress/cts/OnSurfaceChangedListener.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.mediastress.cts;
+
+interface OnSurfaceChangedListener {
+    void onSurfaceCreated();
+    void onSurfaceDestroyed();
+}
diff --git a/tests/tests/mediastress/src/android/mediastress/cts/SurfaceTextureGLSurfaceView.java b/tests/tests/mediastress/src/android/mediastress/cts/SurfaceTextureGLSurfaceView.java
new file mode 100644
index 0000000..6d89652
--- /dev/null
+++ b/tests/tests/mediastress/src/android/mediastress/cts/SurfaceTextureGLSurfaceView.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* Original code copied from NDK Native-media sample code */
+
+package android.mediastress.cts;
+
+import android.content.Context;
+import android.graphics.SurfaceTexture;
+import android.opengl.GLSurfaceView;
+import android.util.AttributeSet;
+import android.view.SurfaceHolder;
+
+public class SurfaceTextureGLSurfaceView extends GLSurfaceView {
+
+    private SurfaceTextureRenderer mRenderer;
+    private final OnSurfaceChangedListener mListener;
+
+    public SurfaceTextureGLSurfaceView(Context context, OnSurfaceChangedListener listener) {
+        this(context, null, listener);
+    }
+
+    public SurfaceTextureGLSurfaceView(Context context, AttributeSet attributeSet,
+            OnSurfaceChangedListener listener) {
+        super(context, attributeSet);
+        mListener = listener;
+        init(listener);
+    }
+
+    private void init(OnSurfaceChangedListener listener) {
+        setEGLContextClientVersion(2);
+        mRenderer = new SurfaceTextureRenderer(listener);
+        setRenderer(mRenderer);
+    }
+
+    public SurfaceTexture getSurfaceTexture() {
+        return mRenderer.getSurfaceTexture();
+    }
+
+    @Override
+    public void surfaceDestroyed(SurfaceHolder holder) {
+        // ugly but renderer has no notification for surfaceDestroyed.
+        if (mListener != null) {
+            // surface destroyed long time ago, but let existing stuffs cleared
+            mListener.onSurfaceDestroyed();
+        }
+        super.surfaceDestroyed(holder);
+    }
+}
+
diff --git a/tests/tests/mediastress/src/android/mediastress/cts/SurfaceTextureRenderer.java b/tests/tests/mediastress/src/android/mediastress/cts/SurfaceTextureRenderer.java
new file mode 100644
index 0000000..4c2af8b
--- /dev/null
+++ b/tests/tests/mediastress/src/android/mediastress/cts/SurfaceTextureRenderer.java
@@ -0,0 +1,301 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* Original code copied from NDK Native-media sample code */
+package android.mediastress.cts;
+
+import android.graphics.SurfaceTexture;
+import android.opengl.GLES20;
+import android.opengl.GLSurfaceView;
+import android.opengl.Matrix;
+import android.util.Log;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+
+import javax.microedition.khronos.egl.EGLConfig;
+import javax.microedition.khronos.opengles.GL10;
+
+import junit.framework.Assert;
+
+class SurfaceTextureRenderer implements GLSurfaceView.Renderer, SurfaceTexture.OnFrameAvailableListener {
+    private static final String TAG = "SurfaceTextureRenderer";
+    // Magic key
+    private static final int GL_TEXTURE_EXTERNAL_OES = 0x8D65;
+    private static final int FLOAT_SIZE_BYTES = 4;
+    private static final int VERTICES_DATA_STRIDE_BYTES = 5 * FLOAT_SIZE_BYTES;
+    private static final int VERTICES_DATA_POS_OFFSET = 0;
+    private static final int VERTICES_DATA_UV_OFFSET = 3;
+    private final float[] mVerticesData = {
+        // 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 mVertices;
+
+    private final String mVertexShader =
+        "uniform mat4 uMVPMatrix;\n" +
+        "uniform mat4 uSTMatrix;\n" +
+        "attribute vec4 aPosition;\n" +
+        "attribute vec4 aTextureCoord;\n" +
+        "varying vec2 vTextureCoord;\n" +
+        "void main() {\n" +
+        "  gl_Position = 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 maPositionHandle;
+    private int maTextureHandle;
+
+    private float mRatio = 1.0f;
+    private SurfaceTexture mSurface = null;
+    private boolean updateSurface = false;
+
+    private final OnSurfaceChangedListener mListener;
+
+    public SurfaceTextureRenderer(OnSurfaceChangedListener listener) {
+        mListener = listener;
+        mVertices = ByteBuffer.allocateDirect(mVerticesData.length
+                * FLOAT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asFloatBuffer();
+        mVertices.put(mVerticesData).position(0);
+
+        Matrix.setIdentityM(mSTMatrix, 0);
+        Matrix.setIdentityM(mMMatrix, 0);
+        Matrix.rotateM(mMMatrix, 0, 20, 0, 1, 0);
+    }
+
+    public void onDrawFrame(GL10 glUnused) {
+        synchronized(this) {
+            if (updateSurface) {
+                mSurface.updateTexImage();
+
+                mSurface.getTransformMatrix(mSTMatrix);
+                updateSurface = false;
+            }
+        }
+
+        // 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);
+
+        mVertices.position(VERTICES_DATA_POS_OFFSET);
+        GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false,
+                VERTICES_DATA_STRIDE_BYTES, mVertices);
+        checkGlError("glVertexAttribPointer maPosition");
+        GLES20.glEnableVertexAttribArray(maPositionHandle);
+        checkGlError("glEnableVertexAttribArray maPositionHandle");
+
+        mVertices.position(VERTICES_DATA_UV_OFFSET);
+        GLES20.glVertexAttribPointer(maTextureHandle, 3, GLES20.GL_FLOAT, false,
+                VERTICES_DATA_STRIDE_BYTES, mVertices);
+        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.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
+        checkGlError("glDrawArrays");
+    }
+
+    public void onSurfaceChanged(GL10 glUnused, int width, int height) {
+        // 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) {
+        String extensions = GLES20.glGetString(GLES20.GL_EXTENSIONS);
+        Log.i(TAG, "Gl extensions: " + extensions);
+        Assert.assertTrue(extensions.contains("OES_EGL_image_external"));
+
+        /* Set up alpha blending and an Android background color */
+        GLES20.glEnable(GLES20.GL_BLEND);
+        GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);
+        GLES20.glClearColor(0.643f, 0.776f, 0.223f, 1.0f);
+
+        /* 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");
+        }
+
+        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");
+
+        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");
+
+        if (mSurface != null) {
+            mSurface.release();
+        }
+        mSurface = new SurfaceTexture(mTextureID);
+        mSurface.setOnFrameAvailableListener(this);
+
+        Matrix.setLookAtM(mVMatrix, 0, 0, 0, 4f, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
+
+        synchronized(this) {
+            updateSurface = false;
+        }
+        if (mListener != null) {
+            mListener.onSurfaceCreated();
+        }
+    }
+
+    synchronized public void onFrameAvailable(SurfaceTexture surface) {
+        /* For simplicity, SurfaceTexture calls here when it has new
+         * data available.  Call may come in from some random thread,
+         * so let's be safe and use synchronize. No OpenGL calls can be done here.
+         */
+        updateSurface = true;
+    }
+
+    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);
+        }
+    }
+
+    public SurfaceTexture getSurfaceTexture() {
+        return mSurface;
+    }
+}
diff --git a/tests/tests/nativemedia/Android.mk b/tests/tests/nativemedia/Android.mk
index 94bc83e..5053e7d 100644
--- a/tests/tests/nativemedia/Android.mk
+++ b/tests/tests/nativemedia/Android.mk
@@ -1,35 +1 @@
-# Build the unit tests.
-
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_C_INCLUDES:= \
-    bionic \
-    bionic/libstdc++/include \
-    external/gtest/include \
-    system/media/wilhelm/include \
-    external/stlport/stlport \
-    system/media/wilhelm/src/ut
-
-LOCAL_SRC_FILES:= \
-    src/SLObjectCreationTest.cpp
-
-LOCAL_SHARED_LIBRARIES := \
-  libutils \
-  libOpenSLES \
-  libstlport
-
-LOCAL_STATIC_LIBRARIES := \
-    libOpenSLESUT \
-    libgtest
-
-LOCAL_CFLAGS += -DXP_UNIX
-
-LOCAL_MODULE := CtsNativeMediaTestCases
-
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA)/nativetest
-
-LOCAL_CTS_TEST_PACKAGE := android.nativemedia
-include $(BUILD_CTS_EXECUTABLE)
+include $(call all-subdir-makefiles)
diff --git a/tests/tests/nativemedia/sl/Android.mk b/tests/tests/nativemedia/sl/Android.mk
new file mode 100644
index 0000000..9c1476b
--- /dev/null
+++ b/tests/tests/nativemedia/sl/Android.mk
@@ -0,0 +1,33 @@
+# Build the unit tests.
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_C_INCLUDES:= \
+    bionic \
+    bionic/libstdc++/include \
+    external/gtest/include \
+    system/media/wilhelm/include \
+    external/stlport/stlport \
+    system/media/wilhelm/src/ut
+
+LOCAL_SRC_FILES:= \
+    src/SLObjectCreationTest.cpp
+
+LOCAL_SHARED_LIBRARIES := \
+  libutils \
+  libOpenSLES \
+  libstlport
+
+LOCAL_STATIC_LIBRARIES := \
+    libOpenSLESUT \
+    libgtest
+
+LOCAL_MODULE:= NativeMediaTest_SL
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA)/nativetest
+
+LOCAL_CTS_TEST_PACKAGE := android.nativemedia.sl
+include $(BUILD_CTS_EXECUTABLE)
diff --git a/tests/tests/nativemedia/sl/src/SLObjectCreationTest.cpp b/tests/tests/nativemedia/sl/src/SLObjectCreationTest.cpp
new file mode 100644
index 0000000..450b32e
--- /dev/null
+++ b/tests/tests/nativemedia/sl/src/SLObjectCreationTest.cpp
@@ -0,0 +1,370 @@
+/*
+ * 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.
+ */
+
+/**
+ * Test for testing the creation of OpenSL ES objects under various configurations (determined
+ * by their data source and sink types) that are expected to be supported.
+ * The tests verify the creation and completion of the call to Realize() for the following objects:
+ *   - Engine
+ *   - OutputMix
+ *   - AudioPlayer:
+ *       * source is URI
+ *       * source is FD
+ *       * source is BufferQueue of PCM buffers
+ *       * source is AndroidBufferQueue of MP2TS buffers
+ *       * source is URI, sink is BufferQueue of PCM buffers
+ *       * source is FD, sink is BufferQueue of PCM buffers
+ *       * source is AndroidBufferQueue of AAC ADTS buffers, sink is BufferQueue of PCM buffers
+ *   - AudioRecorder
+ *       * source is IO device, sink is BufferQueue of PCM buffers
+ */
+
+#define LOG_NDEBUG 0
+#define LOG_TAG "SLObjectCreationTest"
+
+#include <utils/Log.h>
+#include "SLES/OpenSLES.h"
+#include "SLES/OpenSLES_Android.h"
+#include "OpenSLESUT.h"
+#include <gtest/gtest.h>
+
+//-----------------------------------------------------------------
+/* Checks for error and displays the error code if any */
+bool IsOk(SLresult res) {
+    if (SL_RESULT_SUCCESS != res) {
+        const char *str = slesutResultToString(res);
+        if (NULL == str)
+            str = "unknown";
+        fprintf(stderr, "IsOk failure: %s (0x%x), exiting\n", str, res);
+        return false;
+    }
+    return true;
+}
+
+//-----------------------------------------------------------------
+class SLObjectCreationTest : public ::testing::Test {
+
+protected:
+    SLresult res;
+    SLObjectItf engineObj, outputMixObj, audioPlayerObj;
+    SLEngineItf engineItf;
+
+    SLDataSource audioSource;
+    SLDataSink   audioSink;
+    SLDataLocator_URI locatorUriSrc;
+    SLDataLocator_AndroidBufferQueue locatorAbqSrc;
+    SLDataLocator_AndroidFD locatorFdSrc;
+    SLDataFormat_MIME formatMimeSrc;
+
+    SLDataLocator_OutputMix locatorOutputmixSnk;
+    SLDataLocator_AndroidSimpleBufferQueue locatorBqSnk;
+    SLDataFormat_PCM formatPcmSnk;
+
+    SLObjectCreationTest() { }
+
+    virtual ~SLObjectCreationTest() { }
+
+    /* Test setup*/
+    virtual void SetUp() {
+        ALOGV("Test Setup()");
+        res = SL_RESULT_UNKNOWN_ERROR;
+        engineItf = NULL;
+        engineObj = NULL;
+        outputMixObj = NULL;
+        audioPlayerObj = NULL;
+        // Engine creation
+        res = slCreateEngine(&engineObj, 0, NULL, 0, NULL, NULL);
+        ASSERT_TRUE(IsOk(res));
+        res = (*engineObj)->Realize(engineObj, SL_BOOLEAN_FALSE);
+        ASSERT_TRUE(IsOk(res));
+        res = (*engineObj)->GetInterface(engineObj, SL_IID_ENGINE, &engineItf);
+        ASSERT_TRUE(IsOk(res));
+        ASSERT_TRUE(NULL != engineItf);
+    }
+
+    virtual void TearDown() {
+        ALOGV("Test TearDown()");
+        if (audioPlayerObj) {
+            (*audioPlayerObj)->Destroy(audioPlayerObj);
+            audioPlayerObj = NULL;
+        }
+        if (outputMixObj) {
+            (*outputMixObj)->Destroy(outputMixObj);
+            outputMixObj = NULL;
+        }
+        if (engineObj){
+            (*engineObj)->Destroy(engineObj);
+            engineObj = NULL;
+        }
+    }
+
+    //---------------------------------------------------------------------------------------------
+    // Test implementation convenience methods (to avoid code duplication)
+
+    void AudioPlayerCreation() {
+        res = (*engineItf)->CreateAudioPlayer(engineItf, &audioPlayerObj,
+                &audioSource, &audioSink, 0, NULL/*iidArray*/, NULL/*required*/);
+        ASSERT_TRUE(IsOk(res));
+        ASSERT_TRUE(NULL != audioPlayerObj);
+        res = (*audioPlayerObj)->Realize(audioPlayerObj, SL_BOOLEAN_FALSE);
+        ASSERT_TRUE(IsOk(res));
+    }
+
+    void OutputMixSinkInitialization() {
+        locatorOutputmixSnk.locatorType = SL_DATALOCATOR_OUTPUTMIX;
+        locatorOutputmixSnk.outputMix = outputMixObj; // created in OutputMixCreation()
+        audioSink.pLocator = &locatorOutputmixSnk;
+        audioSink.pFormat = NULL;
+    }
+
+    void UriSourceInitialization() {
+        locatorUriSrc.locatorType = SL_DATALOCATOR_URI;
+        locatorUriSrc.URI = (SLchar*) "/dummyPath/dummyFile.mp3";
+        formatMimeSrc.formatType = SL_DATAFORMAT_MIME;
+        formatMimeSrc.mimeType = (SLchar *) NULL;
+        formatMimeSrc.containerType = SL_CONTAINERTYPE_UNSPECIFIED;
+        audioSource.pLocator = &locatorUriSrc;
+        audioSource.pFormat = &formatMimeSrc;
+    }
+
+    void FdSourceInitialization() {
+        locatorFdSrc.locatorType = SL_DATALOCATOR_ANDROIDFD;
+        locatorFdSrc.fd = (SLint32) 1;// a positive value to fake a valid FD
+        locatorFdSrc.length = 10;
+        locatorFdSrc.offset = 0;
+        formatMimeSrc.formatType = SL_DATAFORMAT_MIME;
+        formatMimeSrc.mimeType = (SLchar *) NULL;
+        formatMimeSrc.containerType = SL_CONTAINERTYPE_UNSPECIFIED;
+        audioSource.pLocator = &locatorFdSrc;
+        audioSource.pFormat = &formatMimeSrc;
+    }
+
+    void PcmBqSinkInitialization() {
+        locatorBqSnk.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE;
+        locatorBqSnk.numBuffers = 16;
+        formatPcmSnk.formatType = SL_DATAFORMAT_PCM;
+        formatPcmSnk.numChannels = 1;
+        formatPcmSnk.samplesPerSec = SL_SAMPLINGRATE_8;
+        formatPcmSnk.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16;
+        formatPcmSnk.containerSize = 16;
+        formatPcmSnk.channelMask = SL_SPEAKER_FRONT_LEFT;
+        formatPcmSnk.endianness = SL_BYTEORDER_LITTLEENDIAN;
+        audioSink.pLocator = (void *) &locatorBqSnk;
+        audioSink.pFormat  = (void *) &formatPcmSnk;
+    }
+
+    //---------------------------------------------------------------------------------------------
+    // Tests
+
+    /* Test case for creating an AudioPlayer object */
+    void OutputMixCreation() {
+        res = (*engineItf)->CreateOutputMix(engineItf, &outputMixObj,
+                0, NULL/*iidArray*/, NULL/*required*/);
+        ASSERT_TRUE(IsOk(res));
+        ASSERT_TRUE(NULL != outputMixObj);
+        res = (*outputMixObj)->Realize(outputMixObj, SL_BOOLEAN_FALSE);
+        ASSERT_TRUE(IsOk(res));
+    }
+
+    /* Test case for creating an AudioPlayer object that plays from a URI */
+    void AudioPlayerFromUriCreation() {
+        // source: URI
+        UriSourceInitialization();
+        // sink: OutputMix
+        OutputMixSinkInitialization();
+        // AudioPlayer creation
+        AudioPlayerCreation();
+    }
+
+    /* Test case for creating an AudioPlayer object that plays from a FD */
+    void AudioPlayerFromFdCreation() {
+        // source: FD
+        FdSourceInitialization();
+        // sink: OutputMix
+        OutputMixSinkInitialization();
+        // AudioPlayer creation
+        AudioPlayerCreation();
+    }
+
+    /* Test case for creating an AudioPlayer object that plays from a PCM BufferQueue */
+    void AudioPlayerFromPcmBqCreation() {
+        // source: PCM BufferQueue
+        SLDataLocator_BufferQueue locatorBufferQueue;
+        locatorBufferQueue.locatorType = SL_DATALOCATOR_BUFFERQUEUE;
+        locatorBufferQueue.numBuffers = 16;
+        SLDataFormat_PCM pcm;
+        pcm.formatType = SL_DATAFORMAT_PCM;
+        pcm.numChannels = 2;
+        pcm.samplesPerSec = SL_SAMPLINGRATE_44_1;
+        pcm.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16;
+        pcm.containerSize = 16;
+        pcm.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT;
+        pcm.endianness  = SL_BYTEORDER_LITTLEENDIAN;
+        audioSource.pLocator = &locatorBufferQueue;
+        audioSource.pFormat = &pcm;
+
+        // sink: OutputMix
+        OutputMixSinkInitialization();
+        // AudioPlayer creation
+        AudioPlayerCreation();
+    }
+
+    /* Test case for creating an AudioPlayer object that plays from Transport Stream ABQ */
+    void AudioPlayerFromTsAbqCreation() {
+        // source: transport stream in an AndroidBufferQueue
+        locatorAbqSrc.locatorType  = SL_DATALOCATOR_ANDROIDBUFFERQUEUE;
+        locatorAbqSrc.numBuffers   = 16;
+        formatMimeSrc.formatType    = SL_DATAFORMAT_MIME;
+        formatMimeSrc.mimeType      = (SLchar *) "video/mp2ts";
+        formatMimeSrc.containerType = SL_CONTAINERTYPE_MPEG_TS;
+        audioSource.pFormat  = (void *)&formatMimeSrc;
+        audioSource.pLocator = (void *)&locatorAbqSrc;
+
+        // sink: OutputMix
+        OutputMixSinkInitialization();
+        // AudioPlayer creation
+        AudioPlayerCreation();
+    }
+
+    /* Test case for creating an AudioPlayer object that decodes from a URI to a PCM BQ */
+    void AudioPlayerFromUriToPcmBqCreation() {
+        // source: URI
+        UriSourceInitialization();
+        // sink: PCM BufferQueue
+        PcmBqSinkInitialization();
+        // AudioPlayer creation
+        AudioPlayerCreation();
+    }
+
+    /* Test case for creating an AudioPlayer object that decodes from a FD to a PCM BQ */
+    void AudioPlayerFromFdToPcmBqCreation() {
+        // source: FD
+        FdSourceInitialization();
+        // sink: PCM BufferQueue
+        PcmBqSinkInitialization();
+        // AudioPlayer creation
+        AudioPlayerCreation();
+    }
+
+    /* Test case for creating an AudioPlayer object that decodes from a ADTS ABQ to a PCM BQ */
+    void AudioPlayerFromAdtsAbqToPcmBqCreation() {
+        // source: ADTS AndroidBufferQueue
+        locatorAbqSrc.locatorType = SL_DATALOCATOR_ANDROIDBUFFERQUEUE;
+        locatorAbqSrc.numBuffers  = 16;
+        formatMimeSrc.formatType    =  SL_DATAFORMAT_MIME;
+        formatMimeSrc.mimeType      = (SLchar *)"audio/aac-adts";
+        formatMimeSrc.containerType = SL_CONTAINERTYPE_RAW;
+        audioSource.pLocator = (void *) &locatorAbqSrc;
+        audioSource.pFormat  = (void *) &formatMimeSrc;
+
+        // sink: PCM BufferQueue
+        PcmBqSinkInitialization();
+        // AudioPlayer creation
+        AudioPlayerCreation();
+    }
+
+    /* Test case for creating an AudioRecorder object */
+    void AudioRecorderCreation() {
+        // source: IO device
+        SLDataLocator_IODevice locatorIoDeviceSrc;
+        locatorIoDeviceSrc.locatorType = SL_DATALOCATOR_IODEVICE;
+        locatorIoDeviceSrc.deviceType = SL_IODEVICE_AUDIOINPUT;
+        locatorIoDeviceSrc.deviceID = SL_DEFAULTDEVICEID_AUDIOINPUT;
+        locatorIoDeviceSrc.device = NULL;
+        audioSource.pLocator = (void *) &locatorIoDeviceSrc;
+        audioSource.pFormat  = NULL;
+
+        // sink: PCM BufferQueue
+        PcmBqSinkInitialization();
+
+        // AudioRecorder creation
+        SLObjectItf audioRecorderObj = NULL;
+        res = (*engineItf)->CreateAudioRecorder(engineItf, &audioRecorderObj,
+                &audioSource, &audioSink, 0, NULL/*iidArray*/, NULL/*required*/);
+        ASSERT_TRUE(IsOk(res));
+        ASSERT_TRUE(NULL != audioRecorderObj);
+        res = (*audioRecorderObj)->Realize(audioRecorderObj, SL_BOOLEAN_FALSE);
+        ASSERT_TRUE(IsOk(res));
+
+        // AudioRecorder destruction
+        (*audioRecorderObj)->Destroy(audioRecorderObj);
+    }
+};
+
+//-------------------------------------------------------------------------------------------------
+TEST_F(SLObjectCreationTest, testEngineCreation) {
+    ALOGV("Test Fixture: EngineCreation");
+    // nothing to do here that isn't done in SetUp()
+}
+
+TEST_F(SLObjectCreationTest, testOutputMixCreation) {
+    ALOGV("Test Fixture: OutputMixCreation");
+    OutputMixCreation();
+}
+
+TEST_F(SLObjectCreationTest, testAudioPlayerFromUriCreation) {
+    ALOGV("Test Fixture: AudioPlayerFromUriCreation");
+    // required for AudioPlayer creation
+    OutputMixCreation();
+    AudioPlayerFromUriCreation();
+}
+
+TEST_F(SLObjectCreationTest, testAudioPlayerFromFdCreation) {
+    ALOGV("Test Fixture: AudioPlayerFromFdCreation");
+    // required for AudioPlayer creation
+    OutputMixCreation();
+    AudioPlayerFromFdCreation();
+}
+
+TEST_F(SLObjectCreationTest, testAudioPlayerFromPcmBqCreation) {
+    ALOGV("Test Fixture: AudioPlayerFromPcmBqCreation");
+    // required for AudioPlayer creation
+    OutputMixCreation();
+    AudioPlayerFromPcmBqCreation();
+}
+
+TEST_F(SLObjectCreationTest, testAudioPlayerFromTsAbqCreation) {
+    ALOGV("Test Fixture: AudioPlayerFromTsAbqCreation");
+    // required for AudioPlayer creation
+    OutputMixCreation();
+    AudioPlayerFromTsAbqCreation();
+}
+
+TEST_F(SLObjectCreationTest, testAudioPlayerFromUriToPcmBqCreation) {
+    ALOGV("Test Fixture: AudioPlayerFromUriToPcmBqCreation");
+    AudioPlayerFromUriToPcmBqCreation();
+}
+
+TEST_F(SLObjectCreationTest, testAudioPlayerFromFdToPcmBqCreation) {
+    ALOGV("Test Fixture: AudioPlayerFromFdToPcmBqCreation");
+    AudioPlayerFromFdToPcmBqCreation();
+}
+
+TEST_F(SLObjectCreationTest, testAudioPlayerFromAdtsAbqToPcmBqCreation) {
+    ALOGV("Test Fixture: AudioPlayerFromAdtsAbqToPcmBqCreation");
+    AudioPlayerFromAdtsAbqToPcmBqCreation();
+}
+
+TEST_F(SLObjectCreationTest, testAudioRecorderCreation) {
+    ALOGV("Test Fixture: AudioRecorderCreation");
+    AudioRecorderCreation();
+}
+
+int main(int argc, char **argv) {
+    testing::InitGoogleTest(&argc, argv);
+
+    return RUN_ALL_TESTS();
+}
diff --git a/tests/tests/nativemedia/src/SLObjectCreationTest.cpp b/tests/tests/nativemedia/src/SLObjectCreationTest.cpp
deleted file mode 100644
index e2f32c7..0000000
--- a/tests/tests/nativemedia/src/SLObjectCreationTest.cpp
+++ /dev/null
@@ -1,365 +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.
- */
-
-/**
- * Test for testing the creation of OpenSL ES objects under various configurations (determined
- * by their data source and sink types) that are expected to be supported.
- * The tests verify the creation and completion of the call to Realize() for the following objects:
- *   - Engine
- *   - OutputMix
- *   - AudioPlayer:
- *       * source is URI
- *       * source is FD
- *       * source is BufferQueue of PCM buffers
- *       * source is AndroidBufferQueue of MP2TS buffers
- *       * source is URI, sink is BufferQueue of PCM buffers
- *       * source is FD, sink is BufferQueue of PCM buffers
- *       * source is AndroidBufferQueue of AAC ADTS buffers, sink is BufferQueue of PCM buffers
- *   - AudioRecorder
- *       * source is IO device, sink is BufferQueue of PCM buffers
- */
-
-#define LOG_NDEBUG 0
-#define LOG_TAG "SLObjectCreationTest"
-
-#include <utils/Log.h>
-#include "SLES/OpenSLES.h"
-#include "SLES/OpenSLES_Android.h"
-#include "OpenSLESUT.h"
-#include <gtest/gtest.h>
-
-//-----------------------------------------------------------------
-/* Checks for error and displays the error code if any */
-bool IsOk(SLresult res) {
-    if (SL_RESULT_SUCCESS != res) {
-        const char *str = slesutResultToString(res);
-        if (NULL == str)
-            str = "unknown";
-        fprintf(stderr, "IsOk failure: %s (0x%x), exiting\n", str, res);
-        return false;
-    }
-    return true;
-}
-
-//-----------------------------------------------------------------
-class SLObjectCreationTest : public ::testing::Test {
-
-protected:
-    SLresult res;
-    SLObjectItf engineObj, outputMixObj, audioPlayerObj;
-    SLEngineItf engineItf;
-
-    SLDataSource audioSource;
-    SLDataSink   audioSink;
-    SLDataLocator_URI locatorUriSrc;
-    SLDataLocator_AndroidBufferQueue locatorAbqSrc;
-    SLDataLocator_AndroidFD locatorFdSrc;
-    SLDataFormat_MIME formatMimeSrc;
-
-    SLDataLocator_OutputMix locatorOutputmixSnk;
-    SLDataLocator_AndroidSimpleBufferQueue locatorBqSnk;
-    SLDataFormat_PCM formatPcmSnk;
-
-    SLObjectCreationTest() { }
-
-    virtual ~SLObjectCreationTest() { }
-
-    /* Test setup*/
-    virtual void SetUp() {
-        LOGV("Test Setup()");
-        res = SL_RESULT_UNKNOWN_ERROR;
-        engineItf = NULL;
-        engineObj = NULL;
-        outputMixObj = NULL;
-        audioPlayerObj = NULL;
-        // Engine creation
-        res = slCreateEngine(&engineObj, 0, NULL, 0, NULL, NULL);
-        ASSERT_TRUE(IsOk(res));
-        res = (*engineObj)->Realize(engineObj, SL_BOOLEAN_FALSE);
-        ASSERT_TRUE(IsOk(res));
-        res = (*engineObj)->GetInterface(engineObj, SL_IID_ENGINE, &engineItf);
-        ASSERT_TRUE(IsOk(res));
-        ASSERT_TRUE(NULL != engineItf);
-    }
-
-    virtual void TearDown() {
-        LOGV("Test TearDown()");
-        if (audioPlayerObj) {
-            (*audioPlayerObj)->Destroy(audioPlayerObj);
-            audioPlayerObj = NULL;
-        }
-        if (outputMixObj) {
-            (*outputMixObj)->Destroy(outputMixObj);
-            outputMixObj = NULL;
-        }
-        if (engineObj){
-            (*engineObj)->Destroy(engineObj);
-            engineObj = NULL;
-        }
-    }
-
-    //---------------------------------------------------------------------------------------------
-    // Test implementation convenience methods (to avoid code duplication)
-
-    void AudioPlayerCreation() {
-        res = (*engineItf)->CreateAudioPlayer(engineItf, &audioPlayerObj,
-                &audioSource, &audioSink, 0, NULL/*iidArray*/, NULL/*required*/);
-        ASSERT_TRUE(IsOk(res));
-        ASSERT_TRUE(NULL != audioPlayerObj);
-        res = (*audioPlayerObj)->Realize(audioPlayerObj, SL_BOOLEAN_FALSE);
-        ASSERT_TRUE(IsOk(res));
-    }
-
-    void OutputMixSinkInitialization() {
-        locatorOutputmixSnk.locatorType = SL_DATALOCATOR_OUTPUTMIX;
-        locatorOutputmixSnk.outputMix = outputMixObj; // created in OutputMixCreation()
-        audioSink.pLocator = &locatorOutputmixSnk;
-        audioSink.pFormat = NULL;
-    }
-
-    void UriSourceInitialization() {
-        locatorUriSrc.locatorType = SL_DATALOCATOR_URI;
-        locatorUriSrc.URI = (SLchar*) "/dummyPath/dummyFile.mp3";
-        formatMimeSrc.formatType = SL_DATAFORMAT_MIME;
-        formatMimeSrc.mimeType = (SLchar *) NULL;
-        formatMimeSrc.containerType = SL_CONTAINERTYPE_UNSPECIFIED;
-        audioSource.pLocator = &locatorUriSrc;
-        audioSource.pFormat = &formatMimeSrc;
-    }
-
-    void FdSourceInitialization() {
-        locatorFdSrc.locatorType = SL_DATALOCATOR_ANDROIDFD;
-        locatorFdSrc.fd = (SLint32) 1;// a positive value to fake a valid FD
-        locatorFdSrc.length = 10;
-        locatorFdSrc.offset = 0;
-        formatMimeSrc.formatType = SL_DATAFORMAT_MIME;
-        formatMimeSrc.mimeType = (SLchar *) NULL;
-        formatMimeSrc.containerType = SL_CONTAINERTYPE_UNSPECIFIED;
-        audioSource.pLocator = &locatorFdSrc;
-        audioSource.pFormat = &formatMimeSrc;
-    }
-
-    void PcmBqSinkInitialization() {
-        locatorBqSnk.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE;
-        locatorBqSnk.numBuffers = 16;
-        formatPcmSnk.formatType = SL_DATAFORMAT_PCM;
-        formatPcmSnk.numChannels = 1;
-        formatPcmSnk.samplesPerSec = SL_SAMPLINGRATE_8;
-        formatPcmSnk.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16;
-        formatPcmSnk.containerSize = 16;
-        formatPcmSnk.channelMask = SL_SPEAKER_FRONT_LEFT;
-        formatPcmSnk.endianness = SL_BYTEORDER_LITTLEENDIAN;
-        audioSink.pLocator = (void *) &locatorBqSnk;
-        audioSink.pFormat  = (void *) &formatPcmSnk;
-    }
-
-    //---------------------------------------------------------------------------------------------
-    // Tests
-
-    /* Test case for creating an AudioPlayer object */
-    void OutputMixCreation() {
-        res = (*engineItf)->CreateOutputMix(engineItf, &outputMixObj,
-                0, NULL/*iidArray*/, NULL/*required*/);
-        ASSERT_TRUE(IsOk(res));
-        ASSERT_TRUE(NULL != outputMixObj);
-        res = (*outputMixObj)->Realize(outputMixObj, SL_BOOLEAN_FALSE);
-        ASSERT_TRUE(IsOk(res));
-    }
-
-    /* Test case for creating an AudioPlayer object that plays from a URI */
-    void AudioPlayerFromUriCreation() {
-        // source: URI
-        UriSourceInitialization();
-        // sink: OutputMix
-        OutputMixSinkInitialization();
-        // AudioPlayer creation
-        AudioPlayerCreation();
-    }
-
-    /* Test case for creating an AudioPlayer object that plays from a FD */
-    void AudioPlayerFromFdCreation() {
-        // source: FD
-        FdSourceInitialization();
-        // sink: OutputMix
-        OutputMixSinkInitialization();
-        // AudioPlayer creation
-        AudioPlayerCreation();
-    }
-
-    /* Test case for creating an AudioPlayer object that plays from a PCM BufferQueue */
-    void AudioPlayerFromPcmBqCreation() {
-        // source: PCM BufferQueue
-        SLDataLocator_BufferQueue locatorBufferQueue;
-        locatorBufferQueue.locatorType = SL_DATALOCATOR_BUFFERQUEUE;
-        locatorBufferQueue.numBuffers = 16;
-        SLDataFormat_PCM pcm;
-        pcm.formatType = SL_DATAFORMAT_PCM;
-        pcm.numChannels = 2;
-        pcm.samplesPerSec = SL_SAMPLINGRATE_44_1;
-        pcm.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16;
-        pcm.containerSize = 16;
-        pcm.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT;
-        pcm.endianness  = SL_BYTEORDER_LITTLEENDIAN;
-        audioSource.pLocator = &locatorBufferQueue;
-        audioSource.pFormat = &pcm;
-
-        // sink: OutputMix
-        OutputMixSinkInitialization();
-        // AudioPlayer creation
-        AudioPlayerCreation();
-    }
-
-    /* Test case for creating an AudioPlayer object that plays from Transport Stream ABQ */
-    void AudioPlayerFromTsAbqCreation() {
-        // source: transport stream in an AndroidBufferQueue
-        locatorAbqSrc.locatorType  = SL_DATALOCATOR_ANDROIDBUFFERQUEUE;
-        locatorAbqSrc.numBuffers   = 16;
-        formatMimeSrc.formatType    = SL_DATAFORMAT_MIME;
-        formatMimeSrc.mimeType      = (SLchar *) "video/mp2ts";
-        formatMimeSrc.containerType = SL_CONTAINERTYPE_MPEG_TS;
-        audioSource.pFormat  = (void *)&formatMimeSrc;
-        audioSource.pLocator = (void *)&locatorAbqSrc;
-
-        // sink: OutputMix
-        OutputMixSinkInitialization();
-        // AudioPlayer creation
-        AudioPlayerCreation();
-    }
-
-    /* Test case for creating an AudioPlayer object that decodes from a URI to a PCM BQ */
-    void AudioPlayerFromUriToPcmBqCreation() {
-        // source: URI
-        UriSourceInitialization();
-        // sink: PCM BufferQueue
-        PcmBqSinkInitialization();
-        // AudioPlayer creation
-        AudioPlayerCreation();
-    }
-
-    /* Test case for creating an AudioPlayer object that decodes from a FD to a PCM BQ */
-    void AudioPlayerFromFdToPcmBqCreation() {
-        // source: FD
-        FdSourceInitialization();
-        // sink: PCM BufferQueue
-        PcmBqSinkInitialization();
-        // AudioPlayer creation
-        AudioPlayerCreation();
-    }
-
-    /* Test case for creating an AudioPlayer object that decodes from a ADTS ABQ to a PCM BQ */
-    void AudioPlayerFromAdtsAbqToPcmBqCreation() {
-        // source: ADTS AndroidBufferQueue
-        locatorAbqSrc.locatorType = SL_DATALOCATOR_ANDROIDBUFFERQUEUE;
-        locatorAbqSrc.numBuffers  = 16;
-        formatMimeSrc.formatType    =  SL_DATAFORMAT_MIME;
-        formatMimeSrc.mimeType      = (SLchar *)"audio/aac-adts";
-        formatMimeSrc.containerType = SL_CONTAINERTYPE_RAW;
-        audioSource.pLocator = (void *) &locatorAbqSrc;
-        audioSource.pFormat  = (void *) &formatMimeSrc;
-
-        // sink: PCM BufferQueue
-        PcmBqSinkInitialization();
-        // AudioPlayer creation
-        AudioPlayerCreation();
-    }
-
-    /* Test case for creating an AudioRecorder object */
-    void AudioRecorderCreation() {
-        // source: IO device
-        SLDataLocator_IODevice locatorIoDeviceSrc;
-        locatorIoDeviceSrc.locatorType = SL_DATALOCATOR_IODEVICE;
-        locatorIoDeviceSrc.deviceType = SL_IODEVICE_AUDIOINPUT;
-        locatorIoDeviceSrc.deviceID = SL_DEFAULTDEVICEID_AUDIOINPUT;
-        locatorIoDeviceSrc.device = NULL;
-        audioSource.pLocator = (void *) &locatorIoDeviceSrc;
-        audioSource.pFormat  = NULL;
-
-        // sink: PCM BufferQueue
-        PcmBqSinkInitialization();
-
-        // AudioRecorder creation
-        SLObjectItf audioRecorderObj = NULL;
-        res = (*engineItf)->CreateAudioRecorder(engineItf, &audioRecorderObj,
-                &audioSource, &audioSink, 0, NULL/*iidArray*/, NULL/*required*/);
-        ASSERT_TRUE(IsOk(res));
-        ASSERT_TRUE(NULL != audioRecorderObj);
-        res = (*audioRecorderObj)->Realize(audioRecorderObj, SL_BOOLEAN_FALSE);
-        ASSERT_TRUE(IsOk(res));
-
-        // AudioRecorder destruction
-        (*audioRecorderObj)->Destroy(audioRecorderObj);
-    }
-};
-
-//-------------------------------------------------------------------------------------------------
-TEST_F(SLObjectCreationTest, testEngineCreation) {
-    LOGV("Test Fixture: EngineCreation");
-    // nothing to do here that isn't done in SetUp()
-}
-
-TEST_F(SLObjectCreationTest, testOutputMixCreation) {
-    LOGV("Test Fixture: OutputMixCreation");
-    OutputMixCreation();
-}
-
-TEST_F(SLObjectCreationTest, testAudioPlayerFromUriCreation) {
-    LOGV("Test Fixture: AudioPlayerFromUriCreation");
-    // required for AudioPlayer creation
-    OutputMixCreation();
-    AudioPlayerFromUriCreation();
-}
-
-TEST_F(SLObjectCreationTest, testAudioPlayerFromFdCreation) {
-    LOGV("Test Fixture: AudioPlayerFromFdCreation");
-    // required for AudioPlayer creation
-    OutputMixCreation();
-    AudioPlayerFromFdCreation();
-}
-
-TEST_F(SLObjectCreationTest, testAudioPlayerFromPcmBqCreation) {
-    LOGV("Test Fixture: AudioPlayerFromPcmBqCreation");
-    // required for AudioPlayer creation
-    OutputMixCreation();
-    AudioPlayerFromPcmBqCreation();
-}
-
-TEST_F(SLObjectCreationTest, testAudioPlayerFromTsAbqCreation) {
-    LOGV("Test Fixture: AudioPlayerFromTsAbqCreation");
-    // required for AudioPlayer creation
-    OutputMixCreation();
-    AudioPlayerFromTsAbqCreation();
-}
-
-TEST_F(SLObjectCreationTest, testAudioPlayerFromUriToPcmBqCreation) {
-    LOGV("Test Fixture: AudioPlayerFromUriToPcmBqCreation");
-    AudioPlayerFromUriToPcmBqCreation();
-}
-
-TEST_F(SLObjectCreationTest, testAudioPlayerFromFdToPcmBqCreation) {
-    LOGV("Test Fixture: AudioPlayerFromFdToPcmBqCreation");
-    AudioPlayerFromFdToPcmBqCreation();
-}
-
-TEST_F(SLObjectCreationTest, testAudioPlayerFromAdtsAbqToPcmBqCreation) {
-    LOGV("Test Fixture: AudioPlayerFromAdtsAbqToPcmBqCreation");
-    AudioPlayerFromAdtsAbqToPcmBqCreation();
-}
-
-int main(int argc, char **argv) {
-    testing::InitGoogleTest(&argc, argv);
-
-    return RUN_ALL_TESTS();
-}
diff --git a/tests/tests/nativemedia/xa/Android.mk b/tests/tests/nativemedia/xa/Android.mk
new file mode 100644
index 0000000..da6e5eb
--- /dev/null
+++ b/tests/tests/nativemedia/xa/Android.mk
@@ -0,0 +1,32 @@
+# Build the unit tests.
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_C_INCLUDES:= \
+    bionic \
+    bionic/libstdc++/include \
+    external/gtest/include \
+    system/media/wilhelm/include \
+    external/stlport/stlport \
+    system/media/wilhelm/src/ut
+
+LOCAL_SRC_FILES:= \
+    src/XAObjectCreationTest.cpp
+
+LOCAL_SHARED_LIBRARIES := \
+  libutils \
+  libOpenMAXAL \
+  libstlport
+
+LOCAL_STATIC_LIBRARIES := \
+    libgtest
+
+LOCAL_MODULE:= NativeMediaTest_XA
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA)/nativetest
+
+LOCAL_CTS_TEST_PACKAGE := android.nativemedia.xa
+include $(BUILD_CTS_EXECUTABLE)
diff --git a/tests/tests/nativemedia/xa/src/XAObjectCreationTest.cpp b/tests/tests/nativemedia/xa/src/XAObjectCreationTest.cpp
new file mode 100644
index 0000000..3ff84c2
--- /dev/null
+++ b/tests/tests/nativemedia/xa/src/XAObjectCreationTest.cpp
@@ -0,0 +1,135 @@
+/*
+ * 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.
+ */
+
+/**
+ * Test for testing the creation of OpenMAX AL objects.
+ * The tests verify the creation and completion of the call to Realize() for the following objects:
+ *   - Engine
+ *   - OutputMix
+ */
+
+#define LOG_NDEBUG 0
+#define LOG_TAG "XAObjectCreationTest"
+
+#include <utils/Log.h>
+#include "OMXAL/OpenMAXAL.h"
+#include "OMXAL/OpenMAXAL_Android.h"
+//#include <android/native_window_jni.h>
+#include <gtest/gtest.h>
+
+//-----------------------------------------------------------------
+/* Checks for error and displays the error code if any */
+bool IsOk(XAresult res) {
+    if (XA_RESULT_SUCCESS != res) {
+        fprintf(stderr, "IsOk failure: 0x%x, exiting\n", res);
+        return false;
+    }
+    return true;
+}
+
+//-----------------------------------------------------------------
+class XAObjectCreationTest : public ::testing::Test {
+
+protected:
+    XAresult res;
+    XAObjectItf engineObj, outputMixObj, mediaPlayerObj;
+    XAEngineItf engineItf;
+
+    XADataSource mediaSource;
+    XADataSink   audioSink;
+    XADataLocator_URI locatorUriSrc;
+    XADataLocator_AndroidBufferQueue locatorAbqSrc;
+    XADataLocator_AndroidFD locatorFdSrc;
+    XADataFormat_MIME formatMimeSrc;
+
+    XADataLocator_OutputMix locatorOutputmixSink;
+    XADataFormat_PCM formatPcmSink;
+
+    XADataLocator_NativeDisplay locatorVideoSink;
+    XADataSink imageSink;
+
+    //ANativeWindow* pNativeWindow;
+
+    XAObjectCreationTest() { }
+
+    virtual ~XAObjectCreationTest() { }
+
+    /* Test setup*/
+    virtual void SetUp() {
+        ALOGV("Test Setup()");
+        res = XA_RESULT_UNKNOWN_ERROR;
+        engineItf = NULL;
+        engineObj = NULL;
+        outputMixObj = NULL;
+        mediaPlayerObj = NULL;
+        // Engine creation
+        res = xaCreateEngine(&engineObj, 0, NULL, 0, NULL, NULL);
+        ASSERT_TRUE(IsOk(res));
+        res = (*engineObj)->Realize(engineObj, XA_BOOLEAN_FALSE);
+        ASSERT_TRUE(IsOk(res));
+        res = (*engineObj)->GetInterface(engineObj, XA_IID_ENGINE, &engineItf);
+        ASSERT_TRUE(IsOk(res));
+        ASSERT_TRUE(NULL != engineItf);
+    }
+
+    virtual void TearDown() {
+        ALOGV("Test TearDown()");
+        if (mediaPlayerObj) {
+            (*mediaPlayerObj)->Destroy(mediaPlayerObj);
+            mediaPlayerObj = NULL;
+        }
+        if (outputMixObj) {
+            (*outputMixObj)->Destroy(outputMixObj);
+            outputMixObj = NULL;
+        }
+        if (engineObj){
+            (*engineObj)->Destroy(engineObj);
+            engineObj = NULL;
+        }
+    }
+
+    //---------------------------------------------------------------------------------------------
+    // Tests
+
+    /* Test case for creating an MediaPlayer object */
+    void OutputMixCreation() {
+        res = (*engineItf)->CreateOutputMix(engineItf, &outputMixObj,
+                0, NULL/*iidArray*/, NULL/*required*/);
+        ASSERT_TRUE(IsOk(res));
+        ASSERT_TRUE(NULL != outputMixObj);
+        res = (*outputMixObj)->Realize(outputMixObj, XA_BOOLEAN_FALSE);
+        ASSERT_TRUE(IsOk(res));
+    }
+
+};
+
+//-------------------------------------------------------------------------------------------------
+TEST_F(XAObjectCreationTest, testEngineCreation) {
+    ALOGV("Test Fixture: EngineCreation");
+    // nothing to do here that isn't done in SetUp()
+}
+
+TEST_F(XAObjectCreationTest, testOutputMixCreation) {
+    ALOGV("Test Fixture: OutputMixCreation");
+    OutputMixCreation();
+}
+
+int main(int argc, char **argv) {
+    testing::InitGoogleTest(&argc, argv);
+
+    return RUN_ALL_TESTS();
+}
+
diff --git a/tests/tests/ndef/Android.mk b/tests/tests/ndef/Android.mk
index 4cb0b78..13e5624 100644
--- a/tests/tests/ndef/Android.mk
+++ b/tests/tests/ndef/Android.mk
@@ -31,4 +31,4 @@
 
 LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/ndef/src/android/ndef/cts/BasicNdefTest.java b/tests/tests/ndef/src/android/ndef/cts/BasicNdefTest.java
deleted file mode 100644
index 6e2ac3c..0000000
--- a/tests/tests/ndef/src/android/ndef/cts/BasicNdefTest.java
+++ /dev/null
@@ -1,61 +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 android.ndef.cts;
-
-import android.nfc.NdefMessage;
-import android.nfc.NdefRecord;
-import android.nfc.FormatException;
-
-import junit.framework.TestCase;
-
-public class BasicNdefTest extends TestCase {
-    /**
-     * A Smart Poster containing a URL and no text.
-     */
-    public static final byte[] SMART_POSTER_URL_NO_TEXT = new byte[] {
-            (byte) 0xd1, (byte) 0x02, (byte) 0x0f, (byte) 0x53, (byte) 0x70, (byte) 0xd1,
-            (byte) 0x01, (byte) 0x0b, (byte) 0x55, (byte) 0x01, (byte) 0x67, (byte) 0x6f,
-            (byte) 0x6f, (byte) 0x67, (byte) 0x6c, (byte) 0x65, (byte) 0x2e, (byte) 0x63,
-            (byte) 0x6f, (byte) 0x6d
-    };
-
-    public void test_parseSmartPoster() throws FormatException {
-        NdefMessage msg = new NdefMessage(SMART_POSTER_URL_NO_TEXT);
-        NdefRecord[] records = msg.getRecords();
-
-        assertEquals(1, records.length);
-
-        assertEquals(0, records[0].getId().length);
-
-        assertEquals(NdefRecord.TNF_WELL_KNOWN, records[0].getTnf());
-
-        assertByteArrayEquals(NdefRecord.RTD_SMART_POSTER, records[0].getType());
-
-        assertByteArrayEquals(new byte[] {
-                (byte) 0xd1, (byte) 0x01, (byte) 0x0b, (byte) 0x55, (byte) 0x01,
-                (byte) 0x67, (byte) 0x6f, (byte) 0x6f, (byte) 0x67, (byte) 0x6c,
-                (byte) 0x65, (byte) 0x2e, (byte) 0x63, (byte) 0x6f, (byte) 0x6d},
-                records[0].getPayload());
-    }
-
-    private static void assertByteArrayEquals(byte[] b1, byte[] b2) {
-        assertEquals(b1.length, b2.length);
-        for (int i = 0; i < b1.length; i++) {
-            assertEquals(b1[i], b2[i]);
-        }
-    }
-}
diff --git a/tests/tests/ndef/src/android/ndef/cts/NdefTest.java b/tests/tests/ndef/src/android/ndef/cts/NdefTest.java
new file mode 100644
index 0000000..c17ff1c
--- /dev/null
+++ b/tests/tests/ndef/src/android/ndef/cts/NdefTest.java
@@ -0,0 +1,549 @@
+/*
+ * 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.ndef.cts;
+
+import java.nio.charset.Charset;
+import java.util.Arrays;
+
+import android.net.Uri;
+import android.nfc.NdefMessage;
+import android.nfc.NdefRecord;
+import android.nfc.FormatException;
+
+import junit.framework.TestCase;
+
+/**
+ * NDEF is a NFC-Forum defined data format.<p>
+ * NDEF is often used with NFC, but it is just a data format and no NFC
+ * hardware is required, so these API's are mandatory even on Android
+ * devices without NFC hardware.
+ */
+public class NdefTest extends TestCase {
+    static final Charset ASCII = Charset.forName("US-ASCII");
+    static final Charset UTF8 = Charset.forName("UTF-8");
+
+    public void testConstructor() {
+        NdefRecord r;
+
+        r = new NdefRecord(NdefRecord.TNF_EMPTY, null, null, null);
+        assertEquals(new byte[0], r.getId());
+        assertEquals(new byte[0], r.getType());
+        assertEquals(new byte[0], r.getPayload());
+        assertEquals(NdefRecord.TNF_EMPTY, r.getTnf());
+    }
+
+    public void testEquals() {
+        assertEquals(new NdefRecord(NdefRecord.TNF_EMPTY, null, null, null),
+                new NdefRecord(NdefRecord.TNF_EMPTY, null, null, null));
+        assertEquals(
+                new NdefRecord(NdefRecord.TNF_EXTERNAL_TYPE,
+                new byte[] {1,2,3}, new byte[] {4,5,6}, new byte[] {7,8,9}),
+                new NdefRecord(NdefRecord.TNF_EXTERNAL_TYPE,
+                new byte[] {1,2,3}, new byte[] {4,5,6}, new byte[] {7,8,9}));
+        assertNotEquals(
+                new NdefRecord(NdefRecord.TNF_EXTERNAL_TYPE,
+                new byte[] {1,2,3}, new byte[] {4,5,6}, new byte[] {7,8,9}),
+                new NdefRecord(NdefRecord.TNF_EXTERNAL_TYPE,
+                new byte[] {1,2,3}, new byte[] {4,5,6}, new byte[] {7,8,9,10}));
+        assertEquals(
+                new NdefMessage(new NdefRecord(NdefRecord.TNF_EXTERNAL_TYPE,
+                new byte[] {1,2,3}, new byte[] {4,5,6}, new byte[] {7,8,9})),
+                new NdefMessage(new NdefRecord(NdefRecord.TNF_EXTERNAL_TYPE,
+                new byte[] {1,2,3}, new byte[] {4,5,6}, new byte[] {7,8,9})));
+        assertNotEquals(
+                new NdefMessage(new NdefRecord(NdefRecord.TNF_EXTERNAL_TYPE,
+                new byte[] {1,2,3}, new byte[] {4,5,6}, new byte[] {7,8,9})),
+                new NdefMessage(new NdefRecord(NdefRecord.TNF_EXTERNAL_TYPE,
+                new byte[] {1,2,3}, new byte[] {4,5,6}, new byte[] {7,8,9,10})));
+        assertNotEquals(
+                new NdefMessage(new NdefRecord(NdefRecord.TNF_EXTERNAL_TYPE,
+                new byte[] {1,2,3}, new byte[] {4,5,6}, new byte[] {7,8,9})),
+                new NdefMessage(new NdefRecord(NdefRecord.TNF_EXTERNAL_TYPE,
+                new byte[] {1,2,3}, new byte[] {4,5,6}, new byte[] {7,8,9}),
+                new NdefRecord(NdefRecord.TNF_EMPTY, null, null, null)));
+
+        // test hashCode
+        assertEquals(new NdefRecord(NdefRecord.TNF_EMPTY, null, null, null).hashCode(),
+                new NdefRecord(NdefRecord.TNF_EMPTY, null, null, null).hashCode());
+        assertEquals(
+                new NdefMessage(new NdefRecord(NdefRecord.TNF_EXTERNAL_TYPE,
+                new byte[] {1,2,3}, new byte[] {4,5,6}, new byte[] {7,8,9})).hashCode(),
+                new NdefMessage(new NdefRecord(NdefRecord.TNF_EXTERNAL_TYPE,
+                new byte[] {1,2,3}, new byte[] {4,5,6}, new byte[] {7,8,9})).hashCode());
+    }
+
+    public void testInvalidParsing() throws FormatException {
+        final byte[][] invalidNdefMessages = {
+            {},                                    // too short
+            {(byte)0xD0},                          // too short
+            {(byte)0xD0, 0},                       // too short
+            {(byte)0xD0, 0, 0, 0, 0},              // too long
+            {(byte)0x50, 0, 0},                    // missing MB
+            {(byte)0x90, 0, 0},                    // missing ME
+            {(byte)0xC0, 0, 0, 0},                 // long record, too short
+            {(byte)0xC0, 0, 0, 0, 0},              // long record, too short
+            {(byte)0xC0, 0, 0, 0, 0, 0, 0},        // long record, too long
+            {(byte)0xD8, 1, 3, 1, 0, 0, 0, 0},     // SR w/ payload&type&id, too short
+            {(byte)0xD8, 1, 3, 1, 0, 0, 0, 0, 0, 0}, // SR w/ payload&type&id, too long
+            {(byte)0xD8, 0, 0, 1, 0},              // TNF_EMPTY cannot have id field
+            {(byte)0x90, 0, 0, (byte)0x10, 0, 0},  // 2 records, missing ME
+            {(byte)0xF5, 0, 0},                    // CF and ME set
+            {(byte)0xD6, 0, 0},                    // TNF_UNCHANGED without chunking
+            {(byte)0xB6, 0, 1, 1, (byte)0x56, 0, 1, 2}, // TNF_UNCHANGED in first chunk
+            {(byte)0xC5, 0, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF},  // heap-smash check
+        };
+
+        for (byte[] b : invalidNdefMessages) {
+            try {
+                new NdefMessage(b);
+                fail("expected FormatException for input " + bytesToString(b));
+            } catch (FormatException e) { }
+        }
+    }
+
+    public void testValidParsing() throws FormatException {
+        // short record
+        assertEquals(new NdefMessage(new NdefRecord(NdefRecord.TNF_EMPTY, null, null, null)),
+                new NdefMessage(new byte[] {(byte)0xD0, 0, 0}));
+
+        // full length record
+        assertEquals(new NdefMessage(new NdefRecord(NdefRecord.TNF_EMPTY, null, null, null)),
+                new NdefMessage(new byte[] {(byte)0xC0, 0, 0, 0, 0, 0}));
+
+        // SR with ID flag and 0-length id
+        assertEquals(new NdefMessage(new NdefRecord(NdefRecord.TNF_EMPTY, null, null, null)),
+                new NdefMessage(new byte[] {(byte)0xD8, 0, 0, 0}));
+
+        // SR with ID flag and 1-length id
+        assertEquals(new NdefMessage(
+                new NdefRecord(NdefRecord.TNF_WELL_KNOWN, null, new byte[] {0}, null)),
+                new NdefMessage(new byte[] {(byte)0xD9, 0, 0, 1, 0}));
+
+        // ID flag and 1-length id
+        assertEquals(new NdefMessage(
+                new NdefRecord(NdefRecord.TNF_WELL_KNOWN, null, new byte[] {0}, null)),
+                new NdefMessage(new byte[] {(byte)0xC9, 0, 0, 0, 0, 0, 1, 0}));
+
+        // SR with payload
+        assertEquals(new NdefMessage(
+                new NdefRecord(NdefRecord.TNF_WELL_KNOWN, null, null, new byte[] {1, 2, 3})),
+                new NdefMessage(new byte[] {(byte)0xD1, 0, 3, 1, 2, 3}));
+
+        // SR with payload and type
+        assertEquals(new NdefMessage(new NdefRecord(
+                NdefRecord.TNF_WELL_KNOWN, new byte[] {9}, null, new byte[] {1, 2, 3})),
+                new NdefMessage(new byte[] {(byte)0xD1, 1, 3, 9, 1, 2, 3}));
+
+        // SR with payload, type and id
+        assertEquals(new NdefMessage(new NdefRecord(
+                NdefRecord.TNF_WELL_KNOWN, new byte[] {8}, new byte[] {9}, new byte[] {1, 2, 3})),
+                new NdefMessage(new byte[] {(byte)0xD9, 1, 3, 1, 8, 9, 1, 2, 3}));
+
+        // payload, type and id
+        assertEquals(new NdefMessage(new NdefRecord(
+                NdefRecord.TNF_WELL_KNOWN, new byte[] {8}, new byte[] {9}, new byte[] {1, 2, 3})),
+                new NdefMessage(new byte[] {(byte)0xC9, 1, 0, 0, 0, 3, 1, 8, 9, 1, 2, 3}));
+
+        // 2 records
+        assertEquals(new NdefMessage(
+                new NdefRecord(NdefRecord.TNF_EMPTY, null, null, null),
+                new NdefRecord(NdefRecord.TNF_EMPTY, null, null, null)),
+                new NdefMessage(new byte[] {(byte)0x90, 0, 0, (byte)0x50, 0, 0}));
+
+        // 3 records
+        assertEquals(new NdefMessage(
+                new NdefRecord(NdefRecord.TNF_EMPTY, null, null, null),
+                new NdefRecord(NdefRecord.TNF_EMPTY, null, null, null),
+                new NdefRecord(NdefRecord.TNF_EMPTY, null, null, null)),
+                new NdefMessage(new byte[] {(byte)0x90, 0, 0, (byte)0x10, 0, 0, (byte)0x50, 0, 0}));
+
+        // chunked record (2 chunks)
+        assertEquals(new NdefMessage(
+                new NdefRecord(NdefRecord.TNF_UNKNOWN, null, null, new byte[] {1, 2})),
+                new NdefMessage(new byte[] {(byte)0xB5, 0, 1, 1, (byte)0x56, 0, 1, 2}));
+
+        // chunked record (3 chunks)
+        assertEquals(new NdefMessage(new NdefRecord(
+                NdefRecord.TNF_UNKNOWN, null, null, new byte[] {1, 2})),
+                new NdefMessage(
+                        new byte[] {(byte)0xB5, 0, 0, (byte)0x36, 0, 1, 1, (byte)0x56, 0, 1, 2}));
+
+        // chunked with id and type
+        assertEquals(new NdefMessage(new NdefRecord(
+                NdefRecord.TNF_MIME_MEDIA, new byte[] {8}, new byte[] {9}, new byte[] {1, 2})),
+                new NdefMessage(new byte[] {(byte)0xBA, 1, 0, 1, 8, 9, (byte)0x36, 0, 1, 1,
+                        (byte)0x56, 0, 1, 2}));
+
+        // 3 records, 7 chunks
+        assertEquals(new NdefMessage(
+                new NdefRecord(NdefRecord.TNF_EXTERNAL_TYPE, null, null, new byte[] {1,2,3,4}),
+                new NdefRecord(NdefRecord.TNF_EMPTY, null, null, null),
+                new NdefRecord(NdefRecord.TNF_MIME_MEDIA, null, null, new byte[] {11,12,13,14})),
+                new NdefMessage(new byte[] {
+                        (byte)0xB4, 0, 1, 1, (byte)0x36, 0, 2, 2, 3, (byte)0x16, 0, 1, 4,
+                        (byte)0x10, 0, 0,
+                        (byte)0x32, 0, 2, 11, 12, (byte)0x36, 0, 1, 13, (byte)0x56, 0, 1, 14
+                }));
+
+        // 255 byte payload
+        assertEquals(new NdefMessage(
+                new NdefRecord(NdefRecord.TNF_UNKNOWN, null, null, new byte[] {
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7})),
+                new NdefMessage(new byte[] {(byte)0xC5, 0, 0, 0, 0, (byte)0xFF,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7}));
+
+        // 256 byte payload
+        assertEquals(new NdefMessage(
+                new NdefRecord(NdefRecord.TNF_UNKNOWN, null, null, new byte[] {
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,})),
+                new NdefMessage(new byte[] {(byte)0xC5, 0, 0, 0, 1, 0,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,}));
+
+        // 255 byte type
+        assertEquals(new NdefMessage(
+                new NdefRecord(NdefRecord.TNF_MIME_MEDIA, new byte[] {
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7},
+                        null, null)),
+                new NdefMessage(new byte[] {(byte)0xD2, (byte)0xFF, 0,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,}));
+
+        // 255 byte id
+        assertEquals(new NdefMessage(
+                new NdefRecord(NdefRecord.TNF_MIME_MEDIA, null, new byte[] {
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7},
+                        null)),
+                new NdefMessage(new byte[] {(byte)0xDA, 0, 0, (byte)0xFF,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                        1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,}));
+                // NdefRecord parsing ignores incorrect MB
+        assertEquals(new NdefRecord(NdefRecord.TNF_EMPTY, null, null, null),
+                new NdefRecord(new byte[] {(byte)0x50, 0, 0}));
+
+        // NdefRecord parsing ignores incorrect ME
+        assertEquals(new NdefRecord(NdefRecord.TNF_EMPTY, null, null, null),
+                new NdefRecord(new byte[] {(byte)0x90, 0, 0}));
+
+        // NdefRecord parsing can handle chunking with incorrect MB, ME
+        assertEquals(new NdefRecord(NdefRecord.TNF_UNKNOWN, null, null, new byte[] {1, 2}),
+                new NdefRecord(new byte[] {(byte)0x35, 0, 1, 1, (byte)0x16, 0, 1, 2}));
+
+        //A Smart Poster containing a URL and no text (nested NDEF Messages) */
+        assertEquals(new NdefMessage(new NdefRecord(
+                NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_SMART_POSTER, null,
+                new NdefMessage(NdefRecord.createUri("http://www.google.com")).toByteArray())),
+                new NdefMessage(new byte[] {
+                (byte) 0xd1, (byte) 0x02, (byte) 0x0f, (byte) 0x53, (byte) 0x70, (byte) 0xd1,
+                (byte) 0x01, (byte) 0x0b, (byte) 0x55, (byte) 0x01, (byte) 0x67, (byte) 0x6f,
+                (byte) 0x6f, (byte) 0x67, (byte) 0x6c, (byte) 0x65, (byte) 0x2e, (byte) 0x63,
+                (byte) 0x6f, (byte) 0x6d}));
+    }
+
+    public void testCreateUri() {
+        assertEquals(new byte[] {
+                (byte)0xD1, 1, 8, 'U', (byte)0x01, 'n', 'f', 'c', '.', 'c', 'o', 'm'},
+                new NdefMessage(
+                        NdefRecord.createUri(Uri.parse("http://www.nfc.com"))).toByteArray());
+
+        assertEquals(new byte[] {(byte)0xD1, 1, 13, 'U', (byte)0x05,
+                '+', '3', '5', '8', '9', '1', '2', '3', '4', '5', '6', '7'},
+                new NdefMessage(NdefRecord.createUri("tel:+35891234567")).toByteArray());
+
+        assertEquals(new byte[] {
+                (byte)0xD1, 1, 4, 'U', (byte)0x00, 'f', 'o', 'o'},
+                new NdefMessage(NdefRecord.createUri("foo")).toByteArray());
+
+        // make sure UTF-8 encoding is used
+        assertEquals(new byte[] {
+                (byte)0xD1, 1, 3, 'U', (byte)0x00, (byte)0xC2, (byte)0xA2},
+                new NdefMessage(NdefRecord.createUri("\u00A2")).toByteArray());
+    }
+
+    public void testCreateMime() {
+        assertEquals(
+                new NdefRecord(NdefRecord.TNF_MIME_MEDIA, "text/plain".getBytes(ASCII), null,
+                        "foo".getBytes()),
+                NdefRecord.createMime("text/plain",  "foo".getBytes()));
+
+        try {
+            NdefRecord.createMime("", null);
+            fail("IllegalArgumentException not throw");
+        } catch (IllegalArgumentException e) { }
+
+        try {
+            NdefRecord.createMime("/", null);
+            fail("IllegalArgumentException not throw");
+        } catch (IllegalArgumentException e) { }
+
+        try {
+            NdefRecord.createMime("a/", null);
+            fail("IllegalArgumentException not throw");
+        } catch (IllegalArgumentException e) { }
+
+        try {
+            NdefRecord.createMime("/b", null);
+            fail("IllegalArgumentException not throw");
+        } catch (IllegalArgumentException e) { }
+
+        // The following are valid MIME types and should not throw
+        NdefRecord.createMime("foo/bar", null);
+        NdefRecord.createMime("   ^@#/*   ", null);
+        NdefRecord.createMime("text/plain; charset=us_ascii", null);
+    }
+
+    public void testCreateExternal() {
+        try {
+            NdefRecord.createExternal("", "c", null);
+            fail("IllegalArgumentException not throw");
+        } catch (IllegalArgumentException e) { }
+
+        try {
+            NdefRecord.createExternal("a", "", null);
+            fail("IllegalArgumentException not throw");
+        } catch (IllegalArgumentException e) { }
+
+        try {
+            NdefRecord.createExternal("   ", "c", null);
+            fail("IllegalArgumentException not throw");
+        } catch (IllegalArgumentException e) { }
+
+        assertEquals(
+                new NdefRecord(NdefRecord.TNF_EXTERNAL_TYPE, "a.b:c".getBytes(ASCII), null, null),
+                NdefRecord.createExternal("a.b", "c", null));
+
+        // test force lowercase
+        assertEquals(
+                new NdefRecord(NdefRecord.TNF_EXTERNAL_TYPE, "a.b:c!".getBytes(ASCII), null, null),
+                NdefRecord.createExternal("A.b", "C!", null));
+    }
+
+    public void testCreateApplicationRecord() throws FormatException {
+        NdefMessage m;
+        NdefRecord r;
+
+        // some failure cases
+        try {
+            NdefRecord.createApplicationRecord(null);
+            fail("NullPointerException not thrown");
+        } catch (NullPointerException e) {}
+        try {
+            NdefRecord.createApplicationRecord("");
+            fail("IllegalArgumentException not thrown");
+        } catch (IllegalArgumentException e) {}
+
+        // create an AAR
+        r = NdefRecord.createApplicationRecord("com.foo.bar");
+        assertEquals(new byte[] {
+                (byte)0xd4, (byte)0x0f, (byte)0x0b, (byte)0x61,
+                (byte)0x6e, (byte)0x64, (byte)0x72, (byte)0x6f,
+                (byte)0x69, (byte)0x64, (byte)0x2e, (byte)0x63,
+                (byte)0x6f, (byte)0x6d, (byte)0x3a, (byte)0x70,
+                (byte)0x6b, (byte)0x67, (byte)0x63, (byte)0x6f,
+                (byte)0x6d, (byte)0x2e, (byte)0x66, (byte)0x6f,
+                (byte)0x6f, (byte)0x2e, (byte)0x62, (byte)0x61,
+                (byte)0x72,},
+                r.toByteArray());
+
+        // parse an AAR
+        m = new NdefMessage(new byte[] {
+                (byte)0xd4, (byte)0x0f, (byte)0x0b, (byte)0x61,
+                (byte)0x6e, (byte)0x64, (byte)0x72, (byte)0x6f,
+                (byte)0x69, (byte)0x64, (byte)0x2e, (byte)0x63,
+                (byte)0x6f, (byte)0x6d, (byte)0x3a, (byte)0x70,
+                (byte)0x6b, (byte)0x67, (byte)0x63, (byte)0x6f,
+                (byte)0x6d, (byte)0x2e, (byte)0x66, (byte)0x6f,
+                (byte)0x6f, (byte)0x2e, (byte)0x62, (byte)0x61,
+                (byte)0x72});
+        NdefRecord[] rs = m.getRecords();
+        assertEquals(1, rs.length);
+        r = rs[0];
+        assertEquals(NdefRecord.TNF_EXTERNAL_TYPE, r.getTnf());
+        assertEquals("android.com:pkg".getBytes(), r.getType());
+        assertEquals(new byte[] {}, r.getId());
+        assertEquals("com.foo.bar".getBytes(), r.getPayload());
+    }
+
+    public void testToByteArray() throws FormatException {
+        NdefRecord r;
+
+        // single short record
+        assertEquals(new byte[] {(byte)0xD0, 0, 0},
+                new NdefMessage(
+                        new NdefRecord(NdefRecord.TNF_EMPTY, null, null, null)).toByteArray());
+
+        // with id
+        assertEquals(new byte[] {(byte)0xDD, 0, 0, 1, 9},
+                new NdefMessage(new NdefRecord(
+                        NdefRecord.TNF_UNKNOWN, null, new byte[] {9}, null)).toByteArray());
+
+        // with type
+        assertEquals(new byte[] {(byte)0xD4, 1, 0, 9},
+                new NdefMessage(new NdefRecord(
+                        NdefRecord.TNF_EXTERNAL_TYPE, new byte[] {9}, null, null)).toByteArray());
+
+        // with payload
+        assertEquals(new byte[] {(byte)0xD5, 0, 1, 9},
+                new NdefMessage(new NdefRecord(
+                        NdefRecord.TNF_UNKNOWN, null, null, new byte[] {9})).toByteArray());
+
+        // 3 records
+        r = new NdefRecord(NdefRecord.TNF_EMPTY, null, null, null);
+        assertEquals(new byte[] {(byte)0x90, 0, 0, (byte)0x10, 0, 0, (byte)0x50, 0, 0},
+                new NdefMessage(r, r, r).toByteArray());
+
+        // 256 byte payload
+        assertEquals(new byte[] {(byte)0xC5, 0, 0, 0, 1, 0,
+                1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,},
+                new NdefMessage(new NdefRecord(NdefRecord.TNF_UNKNOWN, null, null, new byte[] {
+                1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
+                1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,})).toByteArray());
+    }
+
+    public void testToUri() {
+        // absolute uri
+        assertEquals(Uri.parse("http://www.android.com"),
+                new NdefRecord(NdefRecord.TNF_ABSOLUTE_URI,
+                "http://www.android.com".getBytes(), null, null).toUri());
+        // wkt uri
+        assertEquals(Uri.parse("http://www.android.com"),
+                NdefRecord.createUri("http://www.android.com").toUri());
+        // smart poster with absolute uri
+        assertEquals(Uri.parse("http://www.android.com"),
+                new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_SMART_POSTER, null,
+                new NdefMessage(new NdefRecord(NdefRecord.TNF_ABSOLUTE_URI,
+                "http://www.android.com".getBytes(), null, null)).toByteArray()).toUri());
+        // smart poster with wkt uri
+        assertEquals(Uri.parse("http://www.android.com"),
+                new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_SMART_POSTER, null,
+                new NdefMessage(
+                NdefRecord.createUri("http://www.android.com")).toByteArray()).toUri());
+        // smart poster with text and wkt uri
+        assertEquals(Uri.parse("http://www.android.com"),
+                new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_SMART_POSTER, null,
+                new NdefMessage(new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, null,
+                null), NdefRecord.createUri("http://www.android.com")).toByteArray()).toUri());
+        // external type
+        assertEquals(Uri.parse("vnd.android.nfc://ext/com.foo.bar:type"),
+                NdefRecord.createExternal("com.foo.bar", "type", null).toUri());
+        // check normalization
+        assertEquals(Uri.parse("http://www.android.com"),
+                new NdefRecord(NdefRecord.TNF_ABSOLUTE_URI, "HTTP://WWW.ANDROID.COM".getBytes(),
+                null, null).toUri());
+
+        // not uri's
+        assertEquals(null, NdefRecord.createMime("text/plain", null).toUri());
+        assertEquals(null, new NdefRecord(NdefRecord.TNF_EMPTY, null, null, null).toUri());
+    }
+
+    public void testToMimeType() {
+        assertEquals(null, NdefRecord.createUri("http://www.android.com").toMimeType());
+        assertEquals(null, new NdefRecord(NdefRecord.TNF_EMPTY, null, null, null).toMimeType());
+        assertEquals(null, NdefRecord.createExternal("com.foo.bar", "type", null).toMimeType());
+
+        assertEquals("a/b", NdefRecord.createMime("a/b", null).toMimeType());
+        assertEquals("text/plain", new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT,
+                null, null).toMimeType());
+        assertEquals("a/b", NdefRecord.createMime("A/B", null).toMimeType());
+        assertEquals("a/b", new NdefRecord(NdefRecord.TNF_MIME_MEDIA, " A/B ".getBytes(),
+                null, null).toMimeType());
+    }
+
+    static void assertEquals(byte[] expected, byte[] actual) {
+        assertTrue("expected equals:<" + bytesToString(expected) + "> was:<" +
+                bytesToString(actual) + ">", Arrays.equals(expected, actual));
+    }
+
+    static void assertNotEquals(Object expected, Object actual) {
+        assertFalse("expected not equals:<" + expected + "> was:<" + actual + ">",
+                expected.equals(actual));
+    }
+
+    static String bytesToString(byte[] bs) {
+        StringBuilder s = new StringBuilder();
+        for (byte b : bs) {
+            s.append(String.format("%02X ", b));
+        }
+        return s.toString();
+    }
+}
\ No newline at end of file
diff --git a/tests/tests/net/Android.mk b/tests/tests/net/Android.mk
index 1fd9ba0..1f1e387 100644
--- a/tests/tests/net/Android.mk
+++ b/tests/tests/net/Android.mk
@@ -32,5 +32,4 @@
 # uncomment when dalvik.annotation.Test* are removed or part of SDK
 #LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
-
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/net/src/android/net/cts/ConnectivityManagerTest.java b/tests/tests/net/src/android/net/cts/ConnectivityManagerTest.java
index cd80be2..99d2e43 100644
--- a/tests/tests/net/src/android/net/cts/ConnectivityManagerTest.java
+++ b/tests/tests/net/src/android/net/cts/ConnectivityManagerTest.java
@@ -16,11 +16,6 @@
 
 package android.net.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -40,7 +35,6 @@
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
-@TestTargetClass(ConnectivityManager.class)
 public class ConnectivityManagerTest extends AndroidTestCase {
 
     private static final String TAG = ConnectivityManagerTest.class.getSimpleName();
@@ -66,11 +60,6 @@
         mPackageManager = getContext().getPackageManager();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getNetworkInfo",
-        args = {int.class}
-    )
     public void testGetNetworkInfo() {
         assertTrue(mCm.getAllNetworkInfo().length >= MIN_NUM_NETWORK_TYPES);
         NetworkInfo ni = mCm.getNetworkInfo(TYPE_WIFI);
@@ -95,18 +84,6 @@
         assertNull(ni);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isNetworkTypeValid",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAllNetworkInfo",
-            args = {}
-        )
-    })
     public void testIsNetworkTypeValid() {
 
         NetworkInfo[] ni = mCm.getAllNetworkInfo();
@@ -117,29 +94,11 @@
         assertFalse(ConnectivityManager.isNetworkTypeValid(-1));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getAllNetworkInfo().",
-        method = "getAllNetworkInfo",
-        args = {}
-    )
     public void testGetAllNetworkInfo() {
         NetworkInfo[] ni = mCm.getAllNetworkInfo();
         assertTrue(ni.length >= MIN_NUM_NETWORK_TYPES);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startUsingNetworkFeature",
-            args = {int.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stopUsingNetworkFeature",
-            args = {int.class, java.lang.String.class}
-        )
-    })
     public void testStartUsingNetworkFeature() {
 
         final String invalidateFeature = "invalidateFeature";
@@ -166,11 +125,6 @@
         assertEquals(failureCode, mCm.stopUsingNetworkFeature(TYPE_WIFI, mmsFeature));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "requestRouteToHost",
-        args = {int.class, int.class}
-    )
     public void testRequestRouteToHost() {
         Set<Integer> exceptionFreeTypes = new HashSet<Integer>();
         exceptionFreeTypes.add(ConnectivityManager.TYPE_BLUETOOTH);
@@ -192,12 +146,6 @@
         assertFalse(mCm.requestRouteToHost(-1, HOST_ADDRESS));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getActiveNetworkInfo",
-        args = {}
-    )
-    @ToBeFixed(bug="1695243", explanation="No Javadoc")
     public void testGetActiveNetworkInfo() {
         NetworkInfo ni = mCm.getActiveNetworkInfo();
 
@@ -206,11 +154,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        method = "getBackgroundDataSetting",
-        args = {}
-    )
     public void testTest() {
         mCm.getBackgroundDataSetting();
     }
diff --git a/tests/tests/net/src/android/net/cts/CredentialsTest.java b/tests/tests/net/src/android/net/cts/CredentialsTest.java
index 6cf8c23..91c3621 100644
--- a/tests/tests/net/src/android/net/cts/CredentialsTest.java
+++ b/tests/tests/net/src/android/net/cts/CredentialsTest.java
@@ -18,36 +18,9 @@
 
 import android.net.Credentials;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(android.net.Credentials.class)
 public class CredentialsTest extends AndroidTestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Credentials",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getGid",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPid",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getUid",
-            args = {}
-        )
-    })
     public void testCredentials() {
         // new the Credentials instance
         // Test with zero inputs
diff --git a/tests/tests/net/src/android/net/cts/DhcpInfoTest.java b/tests/tests/net/src/android/net/cts/DhcpInfoTest.java
index 97bd27a..085fdd9 100644
--- a/tests/tests/net/src/android/net/cts/DhcpInfoTest.java
+++ b/tests/tests/net/src/android/net/cts/DhcpInfoTest.java
@@ -18,29 +18,13 @@
 
 import android.net.DhcpInfo;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(DhcpInfo.class)
 public class DhcpInfoTest extends AndroidTestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test DhcpInfo's constructor.",
-        method = "DhcpInfo",
-        args = {}
-    )
     public void testConstructor() {
         new DhcpInfo();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test toString function.",
-        method = "toString",
-        args = {}
-    )
     public void testToString() {
         String expectedDefault = "ipaddr 0.0.0.0 gateway 0.0.0.0 netmask 0.0.0.0 dns1 0.0.0.0 "
                 + "dns2 0.0.0.0 DHCP server 0.0.0.0 lease 0 seconds";
diff --git a/tests/tests/net/src/android/net/cts/ListeningPortsTest.java b/tests/tests/net/src/android/net/cts/ListeningPortsTest.java
deleted file mode 100644
index bcec0fe..0000000
--- a/tests/tests/net/src/android/net/cts/ListeningPortsTest.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * 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 android.net.cts;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Scanner;
-import java.util.regex.Pattern;
-
-import junit.framework.AssertionFailedError;
-import junit.framework.TestCase;
-
-public class ListeningPortsTest extends TestCase {
-
-    /** Address patterns used to check whether we're checking the right column in /proc/net. */
-    private static final List<String> ADDRESS_PATTERNS = new ArrayList<String>(2);
-
-    static {
-        ADDRESS_PATTERNS.add("[0-9A-F]{8}:[0-9A-F]{4}");
-        ADDRESS_PATTERNS.add("[0-9A-F]{32}:[0-9A-F]{4}");
-    }
-
-    /** Ports that are allowed to be listening on the emulator. */
-    private static final List<String> EXCEPTION_PATTERNS = new ArrayList<String>(6);
-
-    static {
-        // IPv4 exceptions
-        EXCEPTION_PATTERNS.add("00000000:15B3"); // 0.0.0.0:5555   - emulator port
-        EXCEPTION_PATTERNS.add("0F02000A:15B3"); // 10.0.2.15:5555 - net forwarding for emulator
-        EXCEPTION_PATTERNS.add("[0-9A-F]{6}7F:[0-9A-F]{4}"); // IPv4 Loopback
-
-        // IPv6 exceptions
-        EXCEPTION_PATTERNS.add("[0]{25}1[0]{6}:[0-9A-F]{4}"); // IPv6 Loopback
-        EXCEPTION_PATTERNS.add("[0]{16}[0]{4}[0]{4}[0-9A-F]{6}7F:[0-9A-F]{4}"); // IPv4-6 Conversion
-        EXCEPTION_PATTERNS.add("[0]{16}[F]{4}[0]{4}[0-9A-F]{6}7F:[0-9A-F]{4}"); // IPv4-6 Conversion
-    }
-
-    public void testNoListeningTcpPorts() {
-        assertNoListeningPorts("/proc/net/tcp", true);
-    }
-
-    public void testNoListeningTcp6Ports() {
-        assertNoListeningPorts("/proc/net/tcp6", true);
-    }
-
-    public void testNoListeningUdpPorts() throws Exception {
-        assertNoListeningUdpPorts("/proc/net/udp");
-    }
-
-    public void testNoListeningUdp6Ports() throws Exception {
-        assertNoListeningUdpPorts("/proc/net/udp6");
-    }
-
-    private static final int RETRIES_MAX = 6;
-
-    /**
-     * UDP tests can be flaky due to DNS lookups.  Compensate.
-     */
-    private static void assertNoListeningUdpPorts(String procFilePath) throws Exception {
-        for (int i = 0; i < RETRIES_MAX; i++) {
-            try {
-                assertNoListeningPorts(procFilePath, false);
-                return;
-            } catch (ListeningPortsAssertionError e) {
-                if (i == RETRIES_MAX - 1) {
-                    throw e;
-                }
-                Thread.sleep(2 * 1000 * i);
-            }
-        }
-        throw new IllegalStateException("unreachable");
-    }
-
-    private static void assertNoListeningPorts(String procFilePath, boolean isTcp) {
-
-        /*
-         * Sample output of "cat /proc/net/tcp" on emulator:
-         *
-         * sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  ...
-         * 0: 0100007F:13AD 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0   ...
-         * 1: 00000000:15B3 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0   ...
-         * 2: 0F02000A:15B3 0202000A:CE8A 01 00000000:00000000 00:00000000 00000000     0   ...
-         *
-         */
-
-        File procFile = new File(procFilePath);
-        Scanner scanner = null;
-        try {
-            scanner = new Scanner(procFile);
-            while (scanner.hasNextLine()) {
-                String line = scanner.nextLine().trim();
-
-                // Skip column headers
-                if (line.startsWith("sl")) {
-                    continue;
-                }
-
-                String[] fields = line.split("\\s+");
-                final int expectedNumColumns = 12;
-                assertTrue(procFilePath + " should have at least " + expectedNumColumns
-                        + " columns of output " + fields, fields.length >= expectedNumColumns);
-
-                String localAddress = fields[1];
-                String state = fields[3];
-                String uid = fields[7];
-
-                assertTrue(procFilePath + " should have an IP address in the second column",
-                        isAddress(localAddress));
-
-                String localIp = localAddress.split(":")[0];
-                int localPort = Integer.parseInt(localAddress.split(":")[1], 16);
-
-                if (!isException(localAddress) && isPortListening(state, isTcp)) {
-                    throw new ListeningPortsAssertionError(
-                            "Found port listening on addr=" + localIp + ", port="
-                                + localPort + ", UID=" + uid + " in " + procFilePath);
-                }
-            }
-        } catch (FileNotFoundException notFound) {
-            fail("Could not open file " + procFilePath + " to check for listening ports.");
-        } finally {
-            if (scanner != null) {
-                scanner.close();
-            }
-        }
-    }
-
-    private static boolean isAddress(String localAddress) {
-        return isPatternMatch(ADDRESS_PATTERNS, localAddress);
-    }
-
-    private static boolean isException(String localAddress) {
-        return isPatternMatch(EXCEPTION_PATTERNS, localAddress);
-    }
-
-    private static boolean isPatternMatch(List<String> patterns, String input) {
-        for (String pattern : patterns) {
-            if (Pattern.matches(pattern, input)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private static boolean isPortListening(String state, boolean isTcp) {
-        // 0A = TCP_LISTEN from include/net/tcp_states.h
-        String listeningState = isTcp ? "0A" : "07";
-        return listeningState.equals(state);
-    }
-
-    private static class ListeningPortsAssertionError extends AssertionFailedError {
-        private ListeningPortsAssertionError(String msg) {
-            super(msg);
-        }
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/LocalServerSocketTest.java b/tests/tests/net/src/android/net/cts/LocalServerSocketTest.java
index 21c7d5e..dc7be1f 100644
--- a/tests/tests/net/src/android/net/cts/LocalServerSocketTest.java
+++ b/tests/tests/net/src/android/net/cts/LocalServerSocketTest.java
@@ -22,49 +22,9 @@
 import android.net.LocalSocket;
 import android.net.LocalSocketAddress;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
-@TestTargetClass(LocalServerSocket.class)
 public class LocalServerSocketTest extends AndroidTestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "accept",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "close",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFileDescriptor",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLocalSocketAddress",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "LocalServerSocket",
-            args = {java.io.FileDescriptor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "LocalServerSocket",
-            args = {java.lang.String.class}
-        )
-    })
-    @ToBeFixed(bug = "1520987", explanation = "Cannot find a proper FileDescriptor for " +
-            "android.net.LocalServerSocket constructor")
     public void testLocalServerSocket() throws IOException {
         LocalServerSocket localServerSocket = new LocalServerSocket(LocalSocketTest.mSockAddr);
         assertNotNull(localServerSocket.getLocalSocketAddress());
diff --git a/tests/tests/net/src/android/net/cts/LocalSocketAddressTest.java b/tests/tests/net/src/android/net/cts/LocalSocketAddressTest.java
index e3141d5..6ef003b 100644
--- a/tests/tests/net/src/android/net/cts/LocalSocketAddressTest.java
+++ b/tests/tests/net/src/android/net/cts/LocalSocketAddressTest.java
@@ -19,40 +19,9 @@
 import android.net.LocalSocketAddress;
 import android.net.LocalSocketAddress.Namespace;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(LocalSocketAddress.class)
 public class LocalSocketAddressTest extends AndroidTestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test LocalSocketAddress",
-            method = "LocalSocketAddress",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test LocalSocketAddress",
-            method = "LocalSocketAddress",
-            args = {java.lang.String.class, android.net.LocalSocketAddress.Namespace.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test LocalSocketAddress",
-            method = "getName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test LocalSocketAddress",
-            method = "getNamespace",
-            args = {}
-        )
-    })
     public void testNewLocalSocketAddressWithDefaultNamespace() {
         // default namespace
         LocalSocketAddress localSocketAddress = new LocalSocketAddress("name");
diff --git a/tests/tests/net/src/android/net/cts/LocalSocketAddress_NamespaceTest.java b/tests/tests/net/src/android/net/cts/LocalSocketAddress_NamespaceTest.java
index fc9de5b..97dfa43 100644
--- a/tests/tests/net/src/android/net/cts/LocalSocketAddress_NamespaceTest.java
+++ b/tests/tests/net/src/android/net/cts/LocalSocketAddress_NamespaceTest.java
@@ -18,31 +18,15 @@
 
 import android.net.LocalSocketAddress.Namespace;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(Namespace.class)
 public class LocalSocketAddress_NamespaceTest extends AndroidTestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test valueOf(String name).",
-        method = "valueOf",
-        args = {java.lang.String.class}
-    )
     public void testValueOf() {
         assertEquals(Namespace.ABSTRACT, Namespace.valueOf("ABSTRACT"));
         assertEquals(Namespace.RESERVED, Namespace.valueOf("RESERVED"));
         assertEquals(Namespace.FILESYSTEM, Namespace.valueOf("FILESYSTEM"));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test values().",
-        method = "values",
-        args = {}
-    )
     public void testValues() {
         Namespace[] expected = Namespace.values();
         assertEquals(Namespace.ABSTRACT, expected[0]);
diff --git a/tests/tests/net/src/android/net/cts/LocalSocketTest.java b/tests/tests/net/src/android/net/cts/LocalSocketTest.java
index 8e3cd67..0a4bc0d 100644
--- a/tests/tests/net/src/android/net/cts/LocalSocketTest.java
+++ b/tests/tests/net/src/android/net/cts/LocalSocketTest.java
@@ -25,89 +25,10 @@
 import android.net.LocalSocket;
 import android.net.LocalSocketAddress;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(LocalSocket.class)
 public class LocalSocketTest extends AndroidTestCase{
     public final static String mSockAddr = "com.android.net.LocalSocketTest";
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test core functions of LocalSocket",
-            method = "LocalSocket",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test core functions of LocalSocket",
-            method = "close",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test core functions of LocalSocket",
-            method = "connect",
-            args = {android.net.LocalSocketAddress.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test core functions of LocalSocket",
-            method = "getAncillaryFileDescriptors",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test core functions of LocalSocket",
-            method = "getFileDescriptor",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test core functions of LocalSocket",
-            method = "getInputStream",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test core functions of LocalSocket",
-            method = "getOutputStream",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test core functions of LocalSocket",
-            method = "getPeerCredentials",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test core functions of LocalSocket",
-            method = "isConnected",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test core functions of LocalSocket",
-            method = "setFileDescriptorsForSend",
-            args = {java.io.FileDescriptor[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test core functions of LocalSocket",
-            method = "shutdownInput",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test core functions of LocalSocket",
-            method = "shutdownOutput",
-            args = {}
-        )
-    })
     public void testLocalConnections() throws IOException{
         // create client and server socket
         LocalServerSocket localServerSocket = new LocalServerSocket(mSockAddr);
@@ -190,98 +111,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test secondary functions of LocalSocket",
-            method = "bind",
-            args = {android.net.LocalSocketAddress.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test secondary functions of LocalSocket",
-            method = "connect",
-            args = {android.net.LocalSocketAddress.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test secondary functions of LocalSocket",
-            method = "getLocalSocketAddress",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test secondary functions of LocalSocket",
-            method = "getReceiveBufferSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test secondary functions of LocalSocket",
-            method = "getRemoteSocketAddress",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test secondary functions of LocalSocket",
-            method = "getSendBufferSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test secondary functions of LocalSocket",
-            method = "getSoTimeout",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test secondary functions of LocalSocket",
-            method = "isBound",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test secondary functions of LocalSocket",
-            method = "isClosed",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test secondary functions of LocalSocket",
-            method = "isInputShutdown",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test secondary functions of LocalSocket",
-            method = "isOutputShutdown",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test secondary functions of LocalSocket",
-            method = "setReceiveBufferSize",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test secondary functions of LocalSocket",
-            method = "setSendBufferSize",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test secondary functions of LocalSocket",
-            method = "setSoTimeout",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test secondary functions of LocalSocket",
-            method = "toString",
-            args = {}
-        )
-    })
     public void testAccessors() throws IOException{
         LocalSocket socket = new LocalSocket();
         LocalSocketAddress addr = new LocalSocketAddress("secondary");
diff --git a/tests/tests/net/src/android/net/cts/MailToTest.java b/tests/tests/net/src/android/net/cts/MailToTest.java
index 01ede1a..e454d20 100644
--- a/tests/tests/net/src/android/net/cts/MailToTest.java
+++ b/tests/tests/net/src/android/net/cts/MailToTest.java
@@ -19,12 +19,7 @@
 import android.net.MailTo;
 import android.test.AndroidTestCase;
 import android.util.Log;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(MailTo.class)
 public class MailToTest extends AndroidTestCase {
     private static final String MAILTOURI_1 = "mailto:chris@example.com";
     private static final String MAILTOURI_2 = "mailto:infobot@example.com?subject=current-issue";
@@ -42,56 +37,6 @@
         super.setUp();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test parse mailto URI.",
-            method = "parse",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test parse mailto URI.",
-            method = "isMailTo",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test parse mailto URI.",
-            method = "getTo",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test parse mailto URI.",
-            method = "getSubject",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test parse mailto URI.",
-            method = "getBody",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test parse mailto URI.",
-            method = "getCc",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test parse mailto URI.",
-            method = "toString",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test parse mailto URI.",
-            method = "getHeaders",
-            args = {}
-        )
-    })
     public void testParseMailToURI() {
         assertFalse(MailTo.isMailTo(null));
         assertFalse(MailTo.isMailTo(""));
diff --git a/tests/tests/net/src/android/net/cts/NetworkInfoTest.java b/tests/tests/net/src/android/net/cts/NetworkInfoTest.java
index 6800c43..e53614b 100644
--- a/tests/tests/net/src/android/net/cts/NetworkInfoTest.java
+++ b/tests/tests/net/src/android/net/cts/NetworkInfoTest.java
@@ -16,7 +16,6 @@
 
 package android.net.cts;
 
-import dalvik.annotation.TestTargetClass;
 
 import android.content.Context;
 import android.net.ConnectivityManager;
@@ -25,7 +24,6 @@
 import android.net.NetworkInfo.State;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(NetworkInfo.class)
 public class NetworkInfoTest extends AndroidTestCase {
 
     public static final int TYPE_MOBILE = ConnectivityManager.TYPE_MOBILE;
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 6b9b985..3eeb1c5 100644
--- a/tests/tests/net/src/android/net/cts/NetworkInfo_DetailedStateTest.java
+++ b/tests/tests/net/src/android/net/cts/NetworkInfo_DetailedStateTest.java
@@ -16,22 +16,12 @@
 
 package android.net.cts;
 
-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 {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test valueOf(String name).",
-        method = "valueOf",
-        args = {java.lang.String.class}
-    )
     public void testValueOf() {
         assertEquals(DetailedState.AUTHENTICATING, DetailedState.valueOf("AUTHENTICATING"));
         assertEquals(DetailedState.CONNECTED, DetailedState.valueOf("CONNECTED"));
@@ -45,12 +35,6 @@
         assertEquals(DetailedState.SUSPENDED, DetailedState.valueOf("SUSPENDED"));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test values().",
-        method = "values",
-        args = {}
-    )
     public void testValues() {
         DetailedState[] expected = DetailedState.values();
         assertEquals(11, expected.length);
diff --git a/tests/tests/net/src/android/net/cts/NetworkInfo_StateTest.java b/tests/tests/net/src/android/net/cts/NetworkInfo_StateTest.java
index 1a51acd..5303ef1 100644
--- a/tests/tests/net/src/android/net/cts/NetworkInfo_StateTest.java
+++ b/tests/tests/net/src/android/net/cts/NetworkInfo_StateTest.java
@@ -18,19 +18,9 @@
 
 import android.net.NetworkInfo.State;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(State.class)
 public class NetworkInfo_StateTest extends AndroidTestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test valueOf(String name).",
-        method = "valueOf",
-        args = {java.lang.String.class}
-    )
     public void testValueOf() {
         assertEquals(State.CONNECTED, State.valueOf("CONNECTED"));
         assertEquals(State.CONNECTING, State.valueOf("CONNECTING"));
@@ -40,12 +30,6 @@
         assertEquals(State.UNKNOWN, State.valueOf("UNKNOWN"));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test values().",
-        method = "values",
-        args = {}
-    )
     public void testValues() {
         State[] expected = State.values();
         assertEquals(6, expected.length);
diff --git a/tests/tests/net/src/android/net/cts/ProxyTest.java b/tests/tests/net/src/android/net/cts/ProxyTest.java
index 0c0586e..467d12f 100644
--- a/tests/tests/net/src/android/net/cts/ProxyTest.java
+++ b/tests/tests/net/src/android/net/cts/ProxyTest.java
@@ -16,38 +16,16 @@
 
 package android.net.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.net.Proxy;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(Proxy.class)
 public class ProxyTest extends AndroidTestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "Proxy",
-        args = {}
-    )
     public void testConstructor() {
         new Proxy();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDefaultPort",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDefaultHost",
-            args = {}
-        )
-    })
     public void testAccessProperties() {
         final int minValidPort = 0;
         final int maxValidPort = 65535;
diff --git a/tests/tests/net/src/android/net/cts/SSLCertificateSocketFactoryTest.java b/tests/tests/net/src/android/net/cts/SSLCertificateSocketFactoryTest.java
index f125550..70ab54d 100644
--- a/tests/tests/net/src/android/net/cts/SSLCertificateSocketFactoryTest.java
+++ b/tests/tests/net/src/android/net/cts/SSLCertificateSocketFactoryTest.java
@@ -27,13 +27,7 @@
 import android.test.AndroidTestCase;
 
 import dalvik.annotation.BrokenTest;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
-@TestTargetClass(SSLCertificateSocketFactory.class)
 public class SSLCertificateSocketFactoryTest extends AndroidTestCase {
     private SSLCertificateSocketFactory mFactory;
     private int mTimeout;
@@ -45,24 +39,6 @@
         mFactory = (SSLCertificateSocketFactory) SSLCertificateSocketFactory.getDefault(mTimeout);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "getSupportedCipherSuites",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDefault",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "getDefaultCipherSuites",
-            args = {}
-        )
-    })
-    @ToBeFixed(bug="1695243", explanation="Android API javadocs are incomplete")
     public void testAccessProperties() throws Exception {
         mFactory.getSupportedCipherSuites();
         mFactory.getDefaultCipherSuites();
@@ -70,38 +46,6 @@
         assertNotNull(sf);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createSocket",
-            args = {java.net.InetAddress.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createSocket",
-            args = {java.net.Socket.class, java.lang.String.class, int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createSocket",
-            args = {java.lang.String.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "createSocket",
-            args = {java.lang.String.class, int.class, java.net.InetAddress.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createSocket",
-            args = {java.net.InetAddress.class, int.class, java.net.InetAddress.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "SSLCertificateSocketFactory",
-            args = {int.class}
-        )
-    })
     public void testCreateSocket() throws Exception {
         new SSLCertificateSocketFactory(100);
         int port = 443;
@@ -153,11 +97,6 @@
      *
      * NOTE: Test will fail if external server is not available.
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "createSocket",
-        args = {String.class, int.class}
-    )
     public void test_createSocket_simple() throws Exception {
         try {
             mFactory.createSocket(TEST_CREATE_SOCKET_HOST, TEST_CREATE_SOCKET_PORT);
@@ -174,11 +113,6 @@
      *
      * NOTE: Test will fail if external server is not available.
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "createSocket",
-        args = {Socket.class, String.class, int.class, boolean.class}
-    )
     public void test_createSocket_wrapping() throws Exception {
         try {
             Socket underlying = new Socket(TEST_CREATE_SOCKET_HOST, TEST_CREATE_SOCKET_PORT);
@@ -197,11 +131,6 @@
      *
      * NOTE: Test will fail if external server is not available.
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "createSocket",
-        args = {String.class, int.class, InetAddress.class, int.class}
-    )
     public void test_createSocket_bind() throws Exception {
         try {
             mFactory.createSocket(TEST_CREATE_SOCKET_HOST, TEST_CREATE_SOCKET_PORT, null, 0);
diff --git a/tests/tests/net/src/android/net/cts/TrafficStatsTest.java b/tests/tests/net/src/android/net/cts/TrafficStatsTest.java
index 183f891..a5bbd98 100644
--- a/tests/tests/net/src/android/net/cts/TrafficStatsTest.java
+++ b/tests/tests/net/src/android/net/cts/TrafficStatsTest.java
@@ -16,10 +16,6 @@
 
 package android.net.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.net.TrafficStats;
 import android.os.Process;
@@ -31,14 +27,7 @@
 import java.net.ServerSocket;
 import java.net.Socket;
 
-@TestTargetClass(TrafficStats.class)
 public class TrafficStatsTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(level = TestLevel.SUFFICIENT, method = "getMobileTxPackets"),
-        @TestTargetNew(level = TestLevel.SUFFICIENT, method = "getMobileRxPackets"),
-        @TestTargetNew(level = TestLevel.SUFFICIENT, method = "getMobileTxBytes"),
-        @TestTargetNew(level = TestLevel.SUFFICIENT, method = "getMobileRxBytes")
-    })
     public void testGetMobileStats() {
         // We can't assume a mobile network is even present in this test, so
         // we simply assert that a valid value is returned.
@@ -53,18 +42,6 @@
                    TrafficStats.getMobileRxBytes() >= 0);
     }
 
-    @TestTargets({
-        @TestTargetNew(level = TestLevel.PARTIAL_COMPLETE, method = "getMobileTxPackets"),
-        @TestTargetNew(level = TestLevel.PARTIAL_COMPLETE, method = "getMobileRxPackets"),
-        @TestTargetNew(level = TestLevel.PARTIAL_COMPLETE, method = "getMobileTxBytes"),
-        @TestTargetNew(level = TestLevel.PARTIAL_COMPLETE, method = "getMobileRxBytes"),
-        @TestTargetNew(level = TestLevel.PARTIAL_COMPLETE, method = "getTotalTxPackets"),
-        @TestTargetNew(level = TestLevel.PARTIAL_COMPLETE, method = "getTotalRxPackets"),
-        @TestTargetNew(level = TestLevel.PARTIAL_COMPLETE, method = "getTotalTxBytes"),
-        @TestTargetNew(level = TestLevel.PARTIAL_COMPLETE, method = "getTotalRxBytes"),
-        @TestTargetNew(level = TestLevel.PARTIAL_COMPLETE, method = "getUidTxBytes"),
-        @TestTargetNew(level = TestLevel.PARTIAL_COMPLETE, method = "getUidRxBytes")
-    })
     public void testTrafficStatsForLocalhost() throws IOException {
         long mobileTxPacketsBefore = TrafficStats.getTotalTxPackets();
         long mobileRxPacketsBefore = TrafficStats.getTotalRxPackets();
diff --git a/tests/tests/net/src/android/net/cts/UriTest.java b/tests/tests/net/src/android/net/cts/UriTest.java
index 067ce52..3bf8049 100644
--- a/tests/tests/net/src/android/net/cts/UriTest.java
+++ b/tests/tests/net/src/android/net/cts/UriTest.java
@@ -16,10 +16,6 @@
 
 package android.net.cts;
 
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 import android.content.ContentUris;
 import android.net.Uri;
 import android.os.Parcel;
@@ -27,14 +23,7 @@
 import java.io.File;
 import java.util.Arrays;
 
-@TestTargetClass(Uri.class)
 public class UriTest extends AndroidTestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test write to and read frome parcel.",
-        method = "writeToParcel",
-        args = {android.os.Parcel.class, android.net.Uri.class}
-    )
     public void testParcelling() {
         parcelAndUnparcel(Uri.parse("foo:bob%20lee"));
         parcelAndUnparcel(Uri.fromParts("foo", "bob lee", "fragment"));
@@ -60,12 +49,6 @@
         assertEquals(u, Uri.CREATOR.createFromParcel(p));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test buildUpon",
-        method = "buildUpon",
-        args = {}
-    )
     public void testBuildUpon() {
         Uri u = Uri.parse("bob:lee").buildUpon().scheme("robert").build();
         assertEquals("robert", u.getScheme());
@@ -92,80 +75,6 @@
         assertEquals("foo", b.getScheme());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test string uri.",
-            method = "getSchemeSpecificPart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test string uri.",
-            method = "getEncodedSchemeSpecificPart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test string uri.",
-            method = "getEncodedPath",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test string uri.",
-            method = "getPath",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test string uri.",
-            method = "getEncodedQuery",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test string uri.",
-            method = "getQuery",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test string uri.",
-            method = "getEncodedFragment",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test string uri.",
-            method = "getHost",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test string uri.",
-            method = "getPort",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test string uri.",
-            method = "getUserInfo",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test string uri.",
-            method = "getEncodedUserInfo",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test string uri.",
-            method = "parse",
-            args = {java.lang.String.class}
-        )
-    })
     public void testStringUri() {
         assertEquals("bob lee",
                 Uri.parse("foo:bob%20lee").getSchemeSpecificPart());
@@ -202,12 +111,6 @@
         assertEquals(-1, uri.getPort());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test compareTo",
-        method = "compareTo",
-        args = {android.net.Uri.class}
-    )
     public void testCompareTo() {
         Uri a = Uri.parse("foo:a");
         Uri b = Uri.parse("foo:b");
@@ -218,20 +121,6 @@
         assertEquals(0, b.compareTo(b2));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test equals and hashCode.",
-            method = "equals",
-            args = {java.lang.Object.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test equals and hashCode.",
-            method = "hashCode",
-            args = {}
-        )
-    })
     public void testEqualsAndHashCode() {
         Uri a = Uri.parse("http://crazybob.org/test/?foo=bar#tee");
 
@@ -260,26 +149,6 @@
         assertEquals(b.hashCode(), c.hashCode());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test encode and decode.",
-            method = "encode",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test encode and decode.",
-            method = "encode",
-            args = {java.lang.String.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test encode and decode.",
-            method = "decode",
-            args = {java.lang.String.class}
-        )
-    })
     public void testEncodeAndDecode() {
         String encoded = Uri.encode("Bob:/", "/");
         assertEquals(-1, encoded.indexOf(':'));
@@ -300,12 +169,6 @@
         assertEquals(s, Uri.decode(Uri.encode(s, null)));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test fromFile.",
-        method = "fromFile",
-        args = {java.io.File.class}
-    )
     public void testFromFile() {
         File f = new File("/tmp/bob");
         Uri uri = Uri.fromFile(f);
@@ -316,20 +179,6 @@
             } catch (NullPointerException e) {}
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test get query parameters.",
-            method = "getQueryParameter",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test get query parameters.",
-            method = "getQueryParameters",
-            args = {java.lang.String.class}
-        )
-    })
     public void testQueryParameters() {
         Uri uri = Uri.parse("content://user");
         assertEquals(null, uri.getQueryParameter("a"));
@@ -345,26 +194,6 @@
         assertEquals("d", uri.getQueryParameter("c"));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "getPathSegments",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "getLastPathSegment",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "withAppendedPath",
-            args = {android.net.Uri.class, java.lang.String.class}
-        )
-    })
     public void testPathOperations() {
         Uri uri = Uri.parse("content://user/a/b");
 
@@ -402,62 +231,6 @@
         assertEquals("/a/b/c", withC.getPath());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test opaque uri.",
-            method = "isAbsolute",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test opaque uri.",
-            method = "isOpaque",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test opaque uri.",
-            method = "isRelative",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test opaque uri.",
-            method = "getHost",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test opaque uri.",
-            method = "getPort",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test opaque uri.",
-            method = "getScheme",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test opaque uri.",
-            method = "getSchemeSpecificPart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test opaque uri.",
-            method = "fromParts",
-            args = {java.lang.String.class, java.lang.String.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test opaque uri.",
-            method = "toString",
-            args = {}
-        )
-    })
     public void testOpaqueUri() {
         Uri uri = Uri.parse("mailto:nobody");
         testOpaqueUri(uri);
@@ -512,98 +285,6 @@
         assertEquals("mailto:nobody#top", withFragment.toString());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test hierarchical uris.",
-            method = "getAuthority",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test hierarchical uris.",
-            method = "getScheme",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test hierarchical uris.",
-            method = "getEncodedAuthority",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test hierarchical uris.",
-            method = "getPath",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test hierarchical uris.",
-            method = "getEncodedPath",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test hierarchical uris.",
-            method = "getQuery",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test hierarchical uris.",
-            method = "getEncodedQuery",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test hierarchical uris.",
-            method = "getFragment",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test hierarchical uris.",
-            method = "getEncodedFragment",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test hierarchical uris.",
-            method = "getSchemeSpecificPart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test hierarchical uris.",
-            method = "isAbsolute",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test hierarchical uris.",
-            method = "isHierarchical",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test hierarchical uris.",
-            method = "isOpaque",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test hierarchical uris.",
-            method = "isRelative",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test hierarchical uris.",
-            method = "toString",
-            args = {}
-        )
-    })
     public void testHierarchicalUris() {
         testHierarchical("http", "google.com", "/p1/p2", "query", "fragment");
         testHierarchical("file", null, "/p1/p2", null, null);
@@ -724,4 +405,12 @@
         assertTrue(uri.isHierarchical());
         assertEquals(uriString, uri.toString());
     }
+
+    public void testNormalize() {
+        assertEquals(Uri.parse(""), Uri.parse("").normalize());
+        assertEquals(Uri.parse("http://www.android.com"),
+                Uri.parse("http://www.android.com").normalize());
+        assertEquals(Uri.parse("http://USER@WWW.ANDROID.COM:100/ABOUT?foo=blah@bar=bleh#c"),
+                Uri.parse("HTTP://USER@WWW.ANDROID.COM:100/ABOUT?foo=blah@bar=bleh#c").normalize());
+    }
 }
diff --git a/tests/tests/net/src/android/net/cts/Uri_BuilderTest.java b/tests/tests/net/src/android/net/cts/Uri_BuilderTest.java
index 66bdb07..4088d82 100644
--- a/tests/tests/net/src/android/net/cts/Uri_BuilderTest.java
+++ b/tests/tests/net/src/android/net/cts/Uri_BuilderTest.java
@@ -17,119 +17,10 @@
 package android.net.cts;
 
 import junit.framework.TestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 import android.net.Uri.Builder;
 import android.net.Uri;
 
-@TestTargetClass(Uri.Builder.class)
 public class Uri_BuilderTest extends TestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Builder operations.",
-            method = "Uri.Builder",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Builder operations.",
-            method = "build",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Builder operations.",
-            method = "scheme",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Builder operations.",
-            method = "authority",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Builder operations.",
-            method = "path",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Builder operations.",
-            method = "query",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Builder operations.",
-            method = "opaquePart",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Builder operations.",
-            method = "fragment",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Builder operations.",
-            method = "appendEncodedPath",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Builder operations.",
-            method = "appendPath",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Builder operations.",
-            method = "appendQueryParameter",
-            args = {java.lang.String.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Builder operations.",
-            method = "encodedAuthority",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Builder operations.",
-            method = "encodedFragment",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Builder operations.",
-            method = "encodedPath",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Builder operations.",
-            method = "encodedQuery",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Builder operations.",
-            method = "encodedOpaquePart",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Builder operations.",
-            method = "toString",
-            args = {}
-        )
-    })
     public void testBuilderOperations() {
         Uri uri = Uri.parse("http://google.com/p1?query#fragment");
         Builder builder = uri.buildUpon();
diff --git a/tests/tests/net/src/android/net/cts/UrlQuerySanitizerTest.java b/tests/tests/net/src/android/net/cts/UrlQuerySanitizerTest.java
index 0dd5db1..7076ea2 100644
--- a/tests/tests/net/src/android/net/cts/UrlQuerySanitizerTest.java
+++ b/tests/tests/net/src/android/net/cts/UrlQuerySanitizerTest.java
@@ -23,12 +23,7 @@
 import android.net.UrlQuerySanitizer.ParameterValuePair;
 import android.net.UrlQuerySanitizer.ValueSanitizer;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(UrlQuerySanitizer.class)
 public class UrlQuerySanitizerTest extends AndroidTestCase {
     private static final int ALL_OK = IllegalCharacterValueSanitizer.ALL_OK;
 
@@ -46,173 +41,6 @@
     private static final String AGE = "age";
     private static final String HEIGHT = "height";
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "UrlQuerySanitizer",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "UrlQuerySanitizer",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "parseUrl",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "parseQuery",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "parseEntry",
-            args = {String.class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getValue",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addSanitizedEntry",
-            args = {String.class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasParameter",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getParameterSet",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getParameterList",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setUnregisteredParameterValueSanitizer",
-            args = {ValueSanitizer.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getUnregisteredParameterValueSanitizer",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAllButNulAndAngleBracketsLegal",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAllButNulLegal",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAllButWhitespaceLegal",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAllIllegal",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAmpAndSpaceLegal",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAmpLegal",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSpaceLegal",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getUrlAndSpaceLegal",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getUrlLegal",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unescape",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isHexDigit",
-            args = {char.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "decodeHexDigit",
-            args = {char.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAllowUnregisteredParamaters",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAllowUnregisteredParamaters",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "registerParameter",
-            args = {String.class, ValueSanitizer.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "registerParameters",
-            args = {String[].class, ValueSanitizer.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getEffectiveValueSanitizer",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getValueSanitizer",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "clear",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPreferFirstRepeatedParameter",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPreferFirstRepeatedParameter",
-            args = {}
-        )
-    })
     public void testUrlQuerySanitizer() {
         MockUrlQuerySanitizer uqs = new MockUrlQuerySanitizer();
         assertFalse(uqs.getAllowUnregisteredParamaters());
diff --git a/tests/tests/net/src/android/net/cts/UrlQuerySanitizer_IllegalCharacterValueSanitizerTest.java b/tests/tests/net/src/android/net/cts/UrlQuerySanitizer_IllegalCharacterValueSanitizerTest.java
index f85a534..f86af31 100644
--- a/tests/tests/net/src/android/net/cts/UrlQuerySanitizer_IllegalCharacterValueSanitizerTest.java
+++ b/tests/tests/net/src/android/net/cts/UrlQuerySanitizer_IllegalCharacterValueSanitizerTest.java
@@ -19,28 +19,9 @@
 import android.net.UrlQuerySanitizer;
 import android.net.UrlQuerySanitizer.IllegalCharacterValueSanitizer;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(UrlQuerySanitizer.IllegalCharacterValueSanitizer.class)
 public class UrlQuerySanitizer_IllegalCharacterValueSanitizerTest extends AndroidTestCase {
     static final int SPACE_OK = IllegalCharacterValueSanitizer.SPACE_OK;
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link IllegalCharacterValueSanitizer}",
-            method = "IllegalCharacterValueSanitizer",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: sanitize",
-            method = "sanitize",
-            args = {String.class}
-        )
-    })
     public void testSanitize() {
         IllegalCharacterValueSanitizer sanitizer =  new IllegalCharacterValueSanitizer(SPACE_OK);
         assertEquals("Joe User", sanitizer.sanitize("Joe<User"));
diff --git a/tests/tests/net/src/android/net/cts/UrlQuerySanitizer_ParameterValuePairTest.java b/tests/tests/net/src/android/net/cts/UrlQuerySanitizer_ParameterValuePairTest.java
index 32de90d..077cdaf 100644
--- a/tests/tests/net/src/android/net/cts/UrlQuerySanitizer_ParameterValuePairTest.java
+++ b/tests/tests/net/src/android/net/cts/UrlQuerySanitizer_ParameterValuePairTest.java
@@ -19,18 +19,8 @@
 import android.net.UrlQuerySanitizer;
 import android.net.UrlQuerySanitizer.ParameterValuePair;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(UrlQuerySanitizer.ParameterValuePair.class)
 public class UrlQuerySanitizer_ParameterValuePairTest extends AndroidTestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor(s) of {@link ParameterValuePair}",
-        method = "ParameterValuePair",
-        args = {String.class, String.class}
-    )
     public void testConstructor() {
         final String parameter = "name";
         final String vaule = "Joe_user";
diff --git a/tests/tests/net/src/android/net/http/cts/SslCertificateTest.java b/tests/tests/net/src/android/net/http/cts/SslCertificateTest.java
index 8bc8498..70ae496 100644
--- a/tests/tests/net/src/android/net/http/cts/SslCertificateTest.java
+++ b/tests/tests/net/src/android/net/http/cts/SslCertificateTest.java
@@ -33,32 +33,12 @@
 import java.util.Set;
 
 import junit.framework.TestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 import android.net.http.SslCertificate;
 import android.net.http.SslCertificate.DName;
 import android.os.Bundle;
 
-@TestTargetClass(SslCertificate.class)
 public class SslCertificateTest extends TestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of SslCertificate.",
-            method = "SslCertificate",
-            args = {java.lang.String.class, java.lang.String.class, java.lang.String.class, 
-                    java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of SslCertificate.",
-            method = "SslCertificate",
-            args = {java.security.cert.X509Certificate.class}
-        )
-    })
     public void testConstructor() {
         // new the SslCertificate instance
         String date = DateFormat.getInstance().format(new Date());
@@ -204,20 +184,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test saveState and restoreState(SslCertificate certificate).",
-            method = "saveState",
-            args = {android.net.http.SslCertificate.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test saveState and restoreState(SslCertificate certificate).",
-            method = "restoreState",
-            args = {android.os.Bundle.class}
-        )
-    })
     public void testState() {
         // set the expected value
 
@@ -238,38 +204,6 @@
         assertEquals(ssl.getValidNotBefore(), restored.getValidNotBefore());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getIssuedTo().",
-            method = "getIssuedTo",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getIssuedTo().",
-            method = "getIssuedBy",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getIssuedTo().",
-            method = "getValidNotAfterDate",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getIssuedTo().",
-            method = "getValidNotBeforeDate",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getIssuedTo().",
-            method = "toString",
-            args = {}
-        )
-    })
     public void testSslCertificate() {
 
         final String TO = "c=ccc,o=testOName,ou=testUName,cn=testCName";
diff --git a/tests/tests/net/src/android/net/http/cts/SslCertificate_DNameTest.java b/tests/tests/net/src/android/net/http/cts/SslCertificate_DNameTest.java
index 848bf7b..b0c71e8 100644
--- a/tests/tests/net/src/android/net/http/cts/SslCertificate_DNameTest.java
+++ b/tests/tests/net/src/android/net/http/cts/SslCertificate_DNameTest.java
@@ -20,48 +20,11 @@
 import java.util.Date;
 
 import junit.framework.TestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 import android.net.http.SslCertificate;
 import android.net.http.SslCertificate.DName;
 
-@TestTargetClass(DName.class)
 public class SslCertificate_DNameTest extends TestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test DName.",
-            method = "SslCertificate.DName",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test DName.",
-            method = "getCName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test DName.",
-            method = "getDName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test DName.",
-            method = "getOName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test DName.",
-            method = "getUName",
-            args = {}
-        )
-    })
     public void testDName() {
         final String TO = "c=ccc,o=testOName,ou=testUName,cn=testCName";
         final String BY = "e=aeei,c=adb,o=testOName,ou=testUName,cn=testCName";
diff --git a/tests/tests/net/src/android/net/http/cts/SslErrorTest.java b/tests/tests/net/src/android/net/http/cts/SslErrorTest.java
index d186f0e..850a8b6 100755
--- a/tests/tests/net/src/android/net/http/cts/SslErrorTest.java
+++ b/tests/tests/net/src/android/net/http/cts/SslErrorTest.java
@@ -19,15 +19,11 @@
 import android.net.http.SslCertificate;
 import android.net.http.SslError;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
 import java.util.Date;
 
 import junit.framework.TestCase;
 
-@TestTargetClass(SslError.class)
 public class SslErrorTest extends TestCase {
     private SslCertificate mCertificate;
 
@@ -37,22 +33,12 @@
         mCertificate = new SslCertificate("foo", "bar", new Date(42), new Date(43));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "hasError",
-        args = {int.class}
-    )
     public void testHasError() {
         SslError error = new SslError(SslError.SSL_EXPIRED, mCertificate);
         assertTrue(error.hasError(SslError.SSL_EXPIRED));
         assertFalse(error.hasError(SslError.SSL_UNTRUSTED));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addError",
-        args = {int.class}
-    )
     public void testAddError() {
         SslError error = new SslError(SslError.SSL_EXPIRED, mCertificate);
         assertFalse(error.hasError(SslError.SSL_UNTRUSTED));
@@ -60,63 +46,33 @@
         assertTrue(error.hasError(SslError.SSL_UNTRUSTED));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addError",
-        args = {int.class}
-    )
     public void testAddErrorIgnoresInvalidValues() {
         SslError error = new SslError(SslError.SSL_EXPIRED, mCertificate);
         error.addError(42);
         assertFalse(error.hasError(42));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "SslError",
-        args = {int.class, SslCertificate.class}
-    )
     public void testConstructorIgnoresInvalidValues() {
         SslError error = new SslError(42, mCertificate);
         assertFalse(error.hasError(42));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getPrimaryError",
-        args = {}
-    )
     public void testGetPrimaryError() {
         SslError error = new SslError(SslError.SSL_EXPIRED, mCertificate);
         error.addError(SslError.SSL_UNTRUSTED);
         assertEquals(error.getPrimaryError(), SslError.SSL_UNTRUSTED);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getPrimaryError",
-        args = {}
-    )
     public void testGetPrimaryErrorWithEmptySet() {
         SslError error = new SslError(42, mCertificate);
         assertEquals(error.getPrimaryError(), -1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getUrl",
-        args = {}
-    )
     public void testGetUrl() {
         SslError error = new SslError(SslError.SSL_EXPIRED, mCertificate, "foo");
         assertEquals(error.getUrl(), "foo");
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getUrl",
-        args = {}
-    )
     public void testGetUrlWithDeprecatedConstructor() {
         SslError error = new SslError(SslError.SSL_EXPIRED, mCertificate);
         assertEquals(error.getUrl(), "");
diff --git a/tests/tests/net/src/android/net/wifi/cts/ScanResultTest.java b/tests/tests/net/src/android/net/wifi/cts/ScanResultTest.java
index b7202d2..26cfff8 100644
--- a/tests/tests/net/src/android/net/wifi/cts/ScanResultTest.java
+++ b/tests/tests/net/src/android/net/wifi/cts/ScanResultTest.java
@@ -26,11 +26,7 @@
 import android.net.wifi.WifiManager;
 import android.net.wifi.WifiManager.WifiLock;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(ScanResult.class)
 public class ScanResultTest extends AndroidTestCase {
     private static class MySync {
         int expectedState = STATE_NULL;
@@ -118,11 +114,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "toString",
-        args = {}
-    )
     public void testScanResultProperties() {
         if (!WifiFeature.isWifiSupported(getContext())) {
             // skip the test if WiFi is not supported
diff --git a/tests/tests/net/src/android/net/wifi/cts/SupplicantStateTest.java b/tests/tests/net/src/android/net/wifi/cts/SupplicantStateTest.java
index 88ecfe8..11edf73 100644
--- a/tests/tests/net/src/android/net/wifi/cts/SupplicantStateTest.java
+++ b/tests/tests/net/src/android/net/wifi/cts/SupplicantStateTest.java
@@ -18,21 +18,9 @@
 
 import android.net.wifi.SupplicantState;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(SupplicantState.class)
 public class SupplicantStateTest extends AndroidTestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isValidState",
-            args = {android.net.wifi.SupplicantState.class}
-        )
-    })
     public void testIsValidState() {
         if (!WifiFeature.isWifiSupported(getContext())) {
             // skip the test if WiFi is not supported
diff --git a/tests/tests/net/src/android/net/wifi/cts/WifiConfigurationTest.java b/tests/tests/net/src/android/net/wifi/cts/WifiConfigurationTest.java
index f11aa4a..92a55b2 100644
--- a/tests/tests/net/src/android/net/wifi/cts/WifiConfigurationTest.java
+++ b/tests/tests/net/src/android/net/wifi/cts/WifiConfigurationTest.java
@@ -22,12 +22,7 @@
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiManager;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(WifiConfiguration.class)
 public class WifiConfigurationTest extends AndroidTestCase {
     private  WifiManager mWifiManager;
     @Override
@@ -37,18 +32,6 @@
                 .getSystemService(Context.WIFI_SERVICE);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "WifiConfiguration",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "toString",
-            args = {}
-        )
-    })
     public void testWifiConfiguration() {
         if (!WifiFeature.isWifiSupported(getContext())) {
             // skip the test if WiFi is not supported
diff --git a/tests/tests/net/src/android/net/wifi/cts/WifiInfoTest.java b/tests/tests/net/src/android/net/wifi/cts/WifiInfoTest.java
index 2713dfd..df1323b 100644
--- a/tests/tests/net/src/android/net/wifi/cts/WifiInfoTest.java
+++ b/tests/tests/net/src/android/net/wifi/cts/WifiInfoTest.java
@@ -16,10 +16,6 @@
 
 package android.net.wifi.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -31,7 +27,6 @@
 import android.net.wifi.WifiManager.WifiLock;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(WifiInfo.class)
 public class WifiInfoTest extends AndroidTestCase {
     private static class MySync {
         int expectedState = STATE_NULL;
@@ -112,63 +107,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "getMacAddress",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "getIpAddress",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "getDetailedStateOf",
-            args = {android.net.wifi.SupplicantState.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "getNetworkId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "getSSID",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "getBSSID",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "getSupplicantState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "getLinkSpeed",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "toString",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "getRssi",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "getHiddenSSID",
-            args = {}
-        )
-    })
     public void testWifiInfoProperties() throws Exception {
         if (!WifiFeature.isWifiSupported(getContext())) {
             // skip the test if WiFi is not supported
diff --git a/tests/tests/net/src/android/net/wifi/cts/WifiManagerTest.java b/tests/tests/net/src/android/net/wifi/cts/WifiManagerTest.java
index 014f0ee..5fc23e7 100644
--- a/tests/tests/net/src/android/net/wifi/cts/WifiManagerTest.java
+++ b/tests/tests/net/src/android/net/wifi/cts/WifiManagerTest.java
@@ -16,10 +16,6 @@
 
 package android.net.wifi.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -37,7 +33,6 @@
 import java.util.List;
 import java.util.Set;
 
-@TestTargetClass(WifiManager.class)
 public class WifiManagerTest extends AndroidTestCase {
     private static class MySync {
         int expectedState = STATE_NULL;
@@ -186,58 +181,6 @@
      * 4.pingSupplicant
      * 5.satrtScan
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isWifiEnabled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setWifiEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startScan",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getScanResults",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "pingSupplicant",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "reassociate",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "reconnect",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "disconnect",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createWifiLock",
-            args = {int.class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createWifiLock",
-            args = {String.class}
-        )
-    })
     public void testWifiManagerActions() throws Exception {
         if (!WifiFeature.isWifiSupported(getContext())) {
             // skip the test if WiFi is not supported
@@ -263,33 +206,6 @@
      * 3.wifi state
      * 4.ConnectionInfo
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isWifiEnabled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWifiState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setWifiEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getConnectionInfo",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDhcpInfo",
-            args = {}
-        )
-    })
     public void testWifiManagerProperties() throws Exception {
         if (!WifiFeature.isWifiSupported(getContext())) {
             // skip the test if WiFi is not supported
@@ -314,53 +230,6 @@
      * 6.configured Networks
      * 7.save configure;
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isWifiEnabled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setWifiEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getConfiguredNetworks",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addNetwork",
-            args = {android.net.wifi.WifiConfiguration.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "updateNetwork",
-            args = {android.net.wifi.WifiConfiguration.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeNetwork",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "enableNetwork",
-            args = {int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "disableNetwork",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "saveConfiguration",
-            args = {}
-        )
-    })
     public void testWifiManagerNetWork() throws Exception {
         if (!WifiFeature.isWifiSupported(getContext())) {
             // skip the test if WiFi is not supported
@@ -449,18 +318,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "compareSignalLevel",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "calculateSignalLevel",
-            args = {int.class, int.class}
-        )
-    })
     public void testSignal() {
         if (!WifiFeature.isWifiSupported(getContext())) {
             // skip the test if WiFi is not supported
diff --git a/tests/tests/net/src/android/net/wifi/cts/WifiManager_WifiLockTest.java b/tests/tests/net/src/android/net/wifi/cts/WifiManager_WifiLockTest.java
index c1fc4ba..3cdd56a 100644
--- a/tests/tests/net/src/android/net/wifi/cts/WifiManager_WifiLockTest.java
+++ b/tests/tests/net/src/android/net/wifi/cts/WifiManager_WifiLockTest.java
@@ -20,48 +20,11 @@
 import android.net.wifi.WifiManager;
 import android.net.wifi.WifiManager.WifiLock;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(WifiManager.WifiLock.class)
 public class WifiManager_WifiLockTest extends AndroidTestCase {
 
     private static final String WIFI_TAG = "WifiManager_WifiLockTest";
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "acquire",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finalize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isHeld",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setReferenceCounted",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "toString",
-            args = {}
-        )
-    })
     public void testWifiLock() {
         if (!WifiFeature.isWifiSupported(getContext())) {
             // skip the test if WiFi is not supported
diff --git a/tests/tests/openglperf/Android.mk b/tests/tests/openglperf/Android.mk
index 57e6ec3..c07969e 100644
--- a/tests/tests/openglperf/Android.mk
+++ b/tests/tests/openglperf/Android.mk
@@ -31,4 +31,6 @@
 
 LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_PACKAGE)
+
+#include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/tests/os/Android.mk b/tests/tests/os/Android.mk
index 35cafb9..54ebc4a 100644
--- a/tests/tests/os/Android.mk
+++ b/tests/tests/os/Android.mk
@@ -32,4 +32,4 @@
 # uncomment when dalvik.annotation.Test* are removed or part of SDK
 #LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/os/src/android/os/cts/AsyncTaskTest.java b/tests/tests/os/src/android/os/cts/AsyncTaskTest.java
index 94300b6..d1b2f47 100644
--- a/tests/tests/os/src/android/os/cts/AsyncTaskTest.java
+++ b/tests/tests/os/src/android/os/cts/AsyncTaskTest.java
@@ -16,18 +16,13 @@
 
 package android.os.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
+import android.cts.util.PollingCheck;
 import android.os.AsyncTask;
 import android.test.InstrumentationTestCase;
-import android.view.animation.cts.DelayedCheck;
 
 import java.util.concurrent.TimeUnit;
 
-@TestTargetClass(AsyncTask.class)
 public class AsyncTaskTest extends InstrumentationTestCase {
     private static final long COMPUTE_TIME = 1000;
     private static final long RESULT = 1000;
@@ -37,64 +32,10 @@
 
     private static MyAsyncTask mAsyncTask;
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AsyncTask",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "execute",
-            args = {Object[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "get",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "doInBackground",
-            args = {Object[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPreExecute",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStatus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onProgressUpdate",
-            args = {Object[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPostExecute",
-            args = {Object.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "publishProgress",
-            args = {Object[].class}
-        )
-    })
     public void testAsyncTask() throws Throwable {
         doTestAsyncTask(0);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-                level = TestLevel.COMPLETE,
-                method = "get",
-                args = {long.class, TimeUnit.class}
-            )
-    })
     public void testAsyncTaskWithTimeout() throws Throwable {
         doTestAsyncTask(DURATION);
     }
@@ -108,7 +49,7 @@
         }
 
         // wait for the task to finish completely (including onPostResult()).
-        new DelayedCheck(DURATION) {
+        new PollingCheck(DURATION) {
             protected boolean check() {
                 return mAsyncTask.getStatus() == AsyncTask.Status.FINISHED;
             }
@@ -132,7 +73,7 @@
         }
 
         // wait for progress update to be processed (happens asynchronously)
-        new DelayedCheck(DURATION) {
+        new PollingCheck(DURATION) {
             protected boolean check() {
                 return mAsyncTask.updateValue != null;
             }
@@ -155,23 +96,6 @@
         });
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "cancel",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "isCancelled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "onCancelled",
-            args = {}
-        )
-    })
     public void testCancelWithInterrupt() throws Throwable {
         startAsyncTask();
         Thread.sleep(COMPUTE_TIME / 2);
@@ -185,23 +109,6 @@
         assertTrue(mAsyncTask.exception instanceof InterruptedException);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "cancel",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "isCancelled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "onCancelled",
-            args = {}
-        )
-    })
     public void testCancel() throws Throwable {
         startAsyncTask();
         Thread.sleep(COMPUTE_TIME / 2);
@@ -214,23 +121,6 @@
         assertNull(mAsyncTask.exception);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "cancel",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "isCancelled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "onCancelled",
-            args = {}
-        )
-    })
     public void testCancelTooLate() throws Throwable {
         startAsyncTask();
         Thread.sleep(DURATION);
diff --git a/tests/tests/os/src/android/os/cts/BadParcelableExceptionTest.java b/tests/tests/os/src/android/os/cts/BadParcelableExceptionTest.java
index 6a42700..2c80046 100644
--- a/tests/tests/os/src/android/os/cts/BadParcelableExceptionTest.java
+++ b/tests/tests/os/src/android/os/cts/BadParcelableExceptionTest.java
@@ -17,27 +17,8 @@
 
 import junit.framework.TestCase;
 import android.os.BadParcelableException;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(BadParcelableException.class)
 public class BadParcelableExceptionTest extends TestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test method: BadParcelableException",
-            method = "BadParcelableException",
-            args = {java.lang.Exception.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test method: BadParcelableException",
-            method = "BadParcelableException",
-            args = {java.lang.String.class}
-        )
-    })
     public void testBadParcelableException(){
         BadParcelableException ne = null;
         boolean isThrowed = false;
diff --git a/tests/tests/os/src/android/os/cts/BinderTest.java b/tests/tests/os/src/android/os/cts/BinderTest.java
index 92eae94..c3f2bcb 100644
--- a/tests/tests/os/src/android/os/cts/BinderTest.java
+++ b/tests/tests/os/src/android/os/cts/BinderTest.java
@@ -31,13 +31,7 @@
 import android.os.Parcel;
 import android.os.Process;
 import android.os.RemoteException;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
-@TestTargetClass(Binder.class)
 public class BinderTest extends ActivityTestsBase {
     private static final String DESCRIPTOR_GOOGLE = "google";
     private static final String DESCRIPTOR_ANDROID = "android";
@@ -206,20 +200,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test transact",
-            method = "transact",
-            args = {int.class, android.os.Parcel.class, android.os.Parcel.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test onTransact",
-            method = "onTransact",
-            args = {int.class, android.os.Parcel.class, android.os.Parcel.class, int.class}
-        )
-    })
     public void testTransact() {
         MockServiceConnection conn1 = new MockServiceConnection(true, false);
         MockServiceConnection conn2 = new MockServiceConnection(false, false);
@@ -330,60 +310,6 @@
         getContext().unbindService(conn1);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCallingPid",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCallingUid",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dump",
-            args = {java.io.FileDescriptor.class, java.io.PrintWriter.class,
-                    java.lang.String[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dump",
-            args = {java.io.FileDescriptor.class, java.lang.String[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isBinderAlive",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "linkToDeath",
-            args = {android.os.IBinder.DeathRecipient.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unlinkToDeath",
-            args = {android.os.IBinder.DeathRecipient.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "pingBinder",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test constructor",
-            method = "Binder",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finalize",
-            args = {}
-        )
-    })
     public void testSimpleMethods() {
         new Binder();
 
@@ -405,66 +331,21 @@
         assertTrue(mBinder.pingBinder());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "flushPendingCommands",
-        args = {}
-    )
-    @ToBeFixed(bug = "1393825", explanation = "it is native function "
-        + "and we cannot get the state change")
     public void testFlushPendingCommands() {
         Binder.flushPendingCommands();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "joinThreadPool won't be return until the current process is exiting."
-            + "so not suitable to test it in unit test",
-        method = "joinThreadPool",
-        args = {}
-    )
-    @ToBeFixed(bug = "1709683", explanation = "it always throws UnsatisfiedLinkError "
-        + "when calling method: joinThreadPool")
     public void testJoinThreadPool() {
         //from java doc this function won't be return until the current process is exiting.
         //so not suitable to test it in unit test
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "clearCallingIdentity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "restoreCallingIdentity",
-            args = {long.class}
-        )
-    })
     public void testClearCallingIdentity() {
         long token = Binder.clearCallingIdentity();
         assertTrue(token > 0);
         Binder.restoreCallingIdentity(token);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "attachInterface",
-            args = {android.os.IInterface.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInterfaceDescriptor",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "queryLocalInterface",
-            args = {java.lang.String.class}
-        )
-    })
     public void testInterfaceRelatedMethods() {
         assertNull(mBinder.getInterfaceDescriptor());
         mBinder.attachInterface(new MockIInterface(), DESCRIPTOR_GOOGLE);
diff --git a/tests/tests/os/src/android/os/cts/BuildTest.java b/tests/tests/os/src/android/os/cts/BuildTest.java
index 89f26f2..210299a 100644
--- a/tests/tests/os/src/android/os/cts/BuildTest.java
+++ b/tests/tests/os/src/android/os/cts/BuildTest.java
@@ -16,7 +16,6 @@
 
 package android.os.cts;
 
-import dalvik.annotation.TestTargetClass;
 
 import android.os.Build;
 
@@ -26,7 +25,6 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(Build.class)
 public class BuildTest extends TestCase {
 
     private static final String RO_PRODUCT_CPU_ABI = "ro.product.cpu.abi";
diff --git a/tests/tests/os/src/android/os/cts/BundleTest.java b/tests/tests/os/src/android/os/cts/BundleTest.java
index bd0a97e..c8582f2 100644
--- a/tests/tests/os/src/android/os/cts/BundleTest.java
+++ b/tests/tests/os/src/android/os/cts/BundleTest.java
@@ -16,11 +16,6 @@
 
 package android.os.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.content.Intent;
 import android.os.Bundle;
@@ -38,7 +33,6 @@
 import java.util.ArrayList;
 import java.util.Set;
 
-@TestTargetClass(Bundle.class)
 public class BundleTest extends AndroidTestCase {
     private static final boolean BOOLEANKEYVALUE = false;
 
@@ -65,32 +59,6 @@
         mSpannable.setSpan(new ForegroundColorSpan(0x123456), 0, 3, 0);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test all constructors",
-            method = "Bundle",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test all constructors",
-            method = "Bundle",
-            args = {android.os.Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test all constructors",
-            method = "Bundle",
-            args = {java.lang.ClassLoader.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test all constructors",
-            method = "Bundle",
-            args = {int.class}
-        )
-    })
     public void testBundle() {
         final Bundle b1 = new Bundle();
         assertTrue(b1.isEmpty());
@@ -105,18 +73,6 @@
     }
 
     // first put sth into tested Bundle, it shouldn't be empty, then clear it and it should be empty
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "clear",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isEmpty",
-            args = {}
-        )
-    })
     public void testClear() {
         mBundle.putBoolean("android", true);
         mBundle.putBoolean(KEY, true);
@@ -127,11 +83,6 @@
 
     // first clone the tested Bundle, then compare the original Bundle with the
     // cloned Bundle, they should equal
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clone",
-        args = {}
-    )
     public void testClone() {
         mBundle.putBoolean(BOOLEANKEY, BOOLEANKEYVALUE);
         mBundle.putInt(INTKEY, INTKEYVALUE);
@@ -143,11 +94,6 @@
 
     // containsKey would return false if nothing has been put into the Bundle,
     // else containsKey would return true if any putXXX has been called before
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "containsKey",
-        args = {java.lang.String.class}
-    )
     public void testContainsKey() {
         assertFalse(mBundle.containsKey(KEY));
         mBundle.putBoolean(KEY, true);
@@ -158,11 +104,6 @@
 
     // get would return null if nothing has been put into the Bundle,else get
     // would return the value set by putXXX
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "get",
-        args = {java.lang.String.class}
-    )
     public void testGet() {
         assertNull(mBundle.get(KEY));
         mBundle.putBoolean(KEY, true);
@@ -171,20 +112,6 @@
         assertNotNull(mBundle.get(KEY));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getBoolean should only return the Boolean set by putBoolean",
-            method = "getBoolean",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getBoolean should only return the Boolean set by putBoolean",
-            method = "putBoolean",
-            args = {java.lang.String.class, boolean.class}
-        )
-    })
     public void testGetBoolean1() {
         assertFalse(mBundle.getBoolean(KEY));
         mBundle.putBoolean(KEY, true);
@@ -193,20 +120,6 @@
         assertTrue(mBundle.getBoolean(KEY));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getBoolean should only return the Boolean set by putBoolean",
-            method = "getBoolean",
-            args = {java.lang.String.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getBoolean should only return the Boolean set by putBoolean",
-            method = "putBoolean",
-            args = {java.lang.String.class, boolean.class}
-        )
-    })
     public void testGetBoolean2() {
         assertTrue(mBundle.getBoolean(KEY, true));
         mBundle.putBoolean(KEY, false);
@@ -215,20 +128,6 @@
         assertFalse(mBundle.getBoolean(KEY, true));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getBooleanArray should only return the BooleanArray set by putBooleanArray",
-            method = "getBooleanArray",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getBooleanArray should only return the BooleanArray set by putBooleanArray",
-            method = "putBooleanArray",
-            args = {java.lang.String.class, boolean[].class}
-        )
-    })
     public void testGetBooleanArray() {
         assertNull(mBundle.getBooleanArray(KEY));
         mBundle.putBooleanArray(KEY, new boolean[] {
@@ -249,20 +148,6 @@
         assertEquals(true, booleanArray[2]);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getBundle should only return the Bundle set by putBundle",
-            method = "getBundle",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getBundle should only return the Bundle set by putBundle",
-            method = "putBundle",
-            args = {java.lang.String.class, android.os.Bundle.class}
-        )
-    })
     public void testGetBundle() {
         assertNull(mBundle.getBundle(KEY));
         final Bundle bundle = new Bundle();
@@ -272,20 +157,6 @@
         assertBundleEquals(bundle, mBundle.getBundle(KEY));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getByte should only return the Byte set by putByte",
-            method = "getByte",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getByte should only return the Byte set by putByte",
-            method = "putByte",
-            args = {java.lang.String.class, byte.class}
-        )
-    })
     public void testGetByte1() {
         final byte b = 7;
 
@@ -296,20 +167,6 @@
         assertEquals(b, mBundle.getByte(KEY));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getByte should only return the Byte set by putByte",
-            method = "getByte",
-            args = {java.lang.String.class, byte.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getByte should only return the Byte set by putByte",
-            method = "putByte",
-            args = {java.lang.String.class, byte.class}
-        )
-    })
     public void testGetByte2() {
         final byte b1 = 6;
         final byte b2 = 7;
@@ -321,20 +178,6 @@
         assertEquals((Byte)b2, mBundle.getByte(KEY, b1));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getByteArray should only return the ByteArray set by putByteArray",
-            method = "getByteArray",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getByteArray should only return the ByteArray set by putByteArray",
-            method = "putByteArray",
-            args = {java.lang.String.class, byte[].class}
-        )
-    })
     public void testGetByteArray() {
         assertNull(mBundle.getByteArray(KEY));
         mBundle.putByteArray(KEY, new byte[] {
@@ -355,20 +198,6 @@
         assertEquals(3, byteArray[2]);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getChar should only return the Char set by putChar",
-            method = "getChar",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getChar should only return the Char set by putChar",
-            method = "putChar",
-            args = {java.lang.String.class, char.class}
-        )
-    })
     public void testGetChar1() {
         final char c = 'l';
 
@@ -379,20 +208,6 @@
         assertEquals(c, mBundle.getChar(KEY));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getChar should only return the Char set by putChar",
-            method = "getChar",
-            args = {java.lang.String.class, char.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getChar should only return the Char set by putChar",
-            method = "putChar",
-            args = {java.lang.String.class, char.class}
-        )
-    })
     public void testGetChar2() {
         final char c1 = 'l';
         final char c2 = 'i';
@@ -404,20 +219,6 @@
         assertEquals(c2, mBundle.getChar(KEY, c1));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getCharArray should only return the CharArray set by putCharArray",
-            method = "getCharArray",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getCharArray should only return the CharArray set by putCharArray",
-            method = "putCharArray",
-            args = {java.lang.String.class, char[].class}
-        )
-    })
     public void testGetCharArray() {
         assertNull(mBundle.getCharArray(KEY));
         mBundle.putCharArray(KEY, new char[] {
@@ -432,20 +233,6 @@
         assertEquals('i', charArray[1]);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getCharSequence should only return the CharSequence set by putCharSequence",
-            method = "getCharSequence",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getCharSequence should only return the CharSequence set by putCharSequence",
-            method = "putCharSequence",
-            args = {java.lang.String.class, java.lang.CharSequence.class}
-        )
-    })
     public void testGetCharSequence() {
         final CharSequence cS = "Bruce Lee";
 
@@ -460,18 +247,6 @@
         assertSpannableEquals(mSpannable, mBundle.getCharSequence(KEY2));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCharSequenceArray",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putCharSequenceArray",
-            args = {java.lang.String.class, java.lang.CharSequence[].class}
-        )
-    })
     public void testGetCharSequenceArray() {
         assertNull(mBundle.getCharSequenceArray(KEY));
         mBundle.putCharSequenceArray(KEY, new CharSequence[] {
@@ -492,18 +267,6 @@
         assertSpannableEquals(mSpannable, ret[3]);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCharSequenceArrayList",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putCharSequenceArrayList",
-            args = {java.lang.String.class, java.util.ArrayList.class}
-        )
-    })
     public void testGetCharSequenceArrayList() {
         assertNull(mBundle.getCharSequenceArrayList(KEY));
         final ArrayList<CharSequence> list = new ArrayList<CharSequence>();
@@ -528,20 +291,6 @@
         assertSpannableEquals(mSpannable, ret.get(3));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getDouble should return the Double set by putDouble",
-            method = "getDouble",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getDouble should return the Double set by putDouble",
-            method = "putDouble",
-            args = {java.lang.String.class, double.class}
-        )
-    })
     public void testGetDouble1() {
         final double d = 10.07;
 
@@ -552,20 +301,6 @@
         assertEquals(d, mBundle.getDouble(KEY));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getDouble should return the Double set by putDouble",
-            method = "getDouble",
-            args = {java.lang.String.class, double.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getDouble should return the Double set by putDouble",
-            method = "putDouble",
-            args = {java.lang.String.class, double.class}
-        )
-    })
     public void testGetDouble2() {
         final double d1 = 10.06;
         final double d2 = 10.07;
@@ -577,20 +312,6 @@
         assertEquals(d2, mBundle.getDouble(KEY, d1));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getDoubleArray should only return the DoubleArray set by putDoubleArray",
-            method = "getDoubleArray",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getDoubleArray should only return the DoubleArray set by putDoubleArray",
-            method = "putDoubleArray",
-            args = {java.lang.String.class, double[].class}
-        )
-    })
     public void testGetDoubleArray() {
         assertNull(mBundle.getDoubleArray(KEY));
         mBundle.putDoubleArray(KEY, new double[] {
@@ -605,20 +326,6 @@
         assertEquals(10.07, doubleArray[1]);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getFloat should only return the Float set by putFloat",
-            method = "getFloat",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getFloat should only return the Float set by putFloat",
-            method = "putFloat",
-            args = {java.lang.String.class, float.class}
-        )
-    })
     public void testGetFloat1() {
         final float f = 10.07f;
 
@@ -629,20 +336,6 @@
         assertEquals(f, mBundle.getFloat(KEY));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getFloat should only return the Float set by putFloat",
-            method = "getFloat",
-            args = {java.lang.String.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getFloat should only return the Float set by putFloat",
-            method = "putFloat",
-            args = {java.lang.String.class, float.class}
-        )
-    })
     public void testGetFloat2() {
         final float f1 = 10.06f;
         final float f2 = 10.07f;
@@ -654,20 +347,6 @@
         assertEquals(f2, mBundle.getFloat(KEY, f1));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getFloatArray should only return the FloatArray set by putFloatArray",
-            method = "getFloatArray",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getFloatArray should only return the FloatArray set by putFloatArray",
-            method = "putFloatArray",
-            args = {java.lang.String.class, float[].class}
-        )
-    })
     public void testGetFloatArray() {
         assertNull(mBundle.getFloatArray(KEY));
         mBundle.putFloatArray(KEY, new float[] {
@@ -682,20 +361,6 @@
         assertEquals(10.07f, floatArray[1]);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getInt should only return the Int set by putInt",
-            method = "getInt",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getInt should only return the Int set by putInt",
-            method = "putInt",
-            args = {java.lang.String.class, int.class}
-        )
-    })
     public void testGetInt1() {
         final int i = 1007;
 
@@ -706,20 +371,6 @@
         assertEquals(i, mBundle.getInt(KEY));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getInt should only return the Int set by putInt",
-            method = "getInt",
-            args = {java.lang.String.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getInt should only return the Int set by putInt",
-            method = "putInt",
-            args = {java.lang.String.class, int.class}
-        )
-    })
     public void testGetInt2() {
         final int i1 = 1006;
         final int i2 = 1007;
@@ -731,20 +382,6 @@
         assertEquals(i2, mBundle.getInt(KEY, i2));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getIntArray should only return the IntArray set by putIntArray",
-            method = "getIntArray",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getIntArray should only return the IntArray set by putIntArray",
-            method = "putIntArray",
-            args = {java.lang.String.class, int[].class}
-        )
-    })
     public void testGetIntArray() {
         assertNull(mBundle.getIntArray(KEY));
         mBundle.putIntArray(KEY, new int[] {
@@ -760,18 +397,6 @@
     }
 
     // getIntegerArrayList should only return the IntegerArrayList set by putIntegerArrayLis
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIntegerArrayList",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putIntegerArrayList",
-            args = {java.lang.String.class, java.util.ArrayList.class}
-        )
-    })
     public void testGetIntegerArrayList() {
         final int i1 = 1006;
         final int i2 = 1007;
@@ -794,20 +419,6 @@
         assertEquals((Integer)i2, retArrayList.get(1));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getLong should only return the Long set by putLong",
-            method = "getLong",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getLong should only return the Long set by putLong",
-            method = "putLong",
-            args = {java.lang.String.class, long.class}
-        )
-    })
     public void testGetLong1() {
         final long l = 1007;
 
@@ -818,20 +429,6 @@
         assertEquals(l, mBundle.getLong(KEY));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getLong should only return the Long set by putLong",
-            method = "getLong",
-            args = {java.lang.String.class, long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getLong should only return the Long set by putLong",
-            method = "putLong",
-            args = {java.lang.String.class, long.class}
-        )
-    })
     public void testGetLong2() {
         final long l1 = 1006;
         final long l2 = 1007;
@@ -843,20 +440,6 @@
         assertEquals(l2, mBundle.getLong(KEY, l2));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getLongArray should only return the LongArray set by putLongArray",
-            method = "getLongArray",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getLongArray should only return the LongArray set by putLongArray",
-            method = "putLongArray",
-            args = {java.lang.String.class, long[].class}
-        )
-    })
     public void testGetLongArray() {
         assertNull(mBundle.getLongArray(KEY));
         mBundle.putLongArray(KEY, new long[] {
@@ -871,20 +454,6 @@
         assertEquals(1007, longArray[1]);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getParcelable should only return the Parcelable set by putParcelable",
-            method = "getParcelable",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getParcelable should only return the Parcelable set by putParcelable",
-            method = "putParcelable",
-            args = {java.lang.String.class, android.os.Parcelable.class}
-        )
-    })
     public void testGetParcelable() {
         assertNull(mBundle.getParcelable(KEY));
         final Bundle bundle = new Bundle();
@@ -895,18 +464,6 @@
     }
 
     // getParcelableArray should only return the ParcelableArray set by putParcelableArray
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getParcelableArray",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putParcelableArray",
-            args = {java.lang.String.class, android.os.Parcelable[].class}
-        )
-    })
     public void testGetParcelableArray() {
         assertNull(mBundle.getParcelableArray(KEY));
         final Bundle bundle1 = new Bundle();
@@ -926,18 +483,6 @@
     }
 
     // getParcelableArrayList should only return the parcelableArrayList set by putParcelableArrayList
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getParcelableArrayList",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putParcelableArrayList",
-            args = {java.lang.String.class, java.util.ArrayList.class}
-        )
-    })
     public void testGetParcelableArrayList() {
         assertNull(mBundle.getParcelableArrayList(KEY));
         final ArrayList<Parcelable> parcelableArrayList = new ArrayList<Parcelable>();
@@ -957,20 +502,6 @@
         assertBundleEquals(bundle2, (Bundle) ret.get(1));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getSerializable should only return the Serializable set by putSerializable",
-            method = "getSerializable",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getSerializable should only return the Serializable set by putSerializable",
-            method = "putSerializable",
-            args = {java.lang.String.class, java.io.Serializable.class}
-        )
-    })
     public void testGetSerializable() {
         assertNull(mBundle.getSerializable(KEY));
         mBundle.putSerializable(KEY, "android");
@@ -979,20 +510,6 @@
         assertEquals("android", mBundle.getSerializable(KEY));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getShort should only return the Short set by putShort",
-            method = "getShort",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getShort should only return the Short set by putShort",
-            method = "putShort",
-            args = {java.lang.String.class, short.class}
-        )
-    })
     public void testGetShort1() {
         final short s = 1007;
 
@@ -1003,20 +520,6 @@
         assertEquals(s, mBundle.getShort(KEY));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getShort should only return the Short set by putShort",
-            method = "getShort",
-            args = {java.lang.String.class, short.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getShort should only return the Short set by putShort",
-            method = "putShort",
-            args = {java.lang.String.class, short.class}
-        )
-    })
     public void testGetShort2() {
         final short s1 = 1006;
         final short s2 = 1007;
@@ -1028,20 +531,6 @@
         assertEquals(s2, mBundle.getShort(KEY, s1));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getShortArray should only return the ShortArray set by putShortArray",
-            method = "getShortArray",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getShortArray should only return the ShortArray set by putShortArray",
-            method = "putShortArray",
-            args = {java.lang.String.class, short[].class}
-        )
-    })
     public void testGetShortArray() {
         final short s1 = 1006;
         final short s2 = 1007;
@@ -1061,18 +550,6 @@
 
     // getSparseParcelableArray should only return the SparseArray<Parcelable>
     // set by putSparseParcelableArray
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSparseParcelableArray",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putSparseParcelableArray",
-            args = {java.lang.String.class, android.util.SparseArray.class}
-        )
-    })
     public void testGetSparseParcelableArray() {
         assertNull(mBundle.getSparseParcelableArray(KEY));
         final SparseArray<Parcelable> sparseArray = new SparseArray<Parcelable>();
@@ -1094,20 +571,6 @@
         assertIntentEquals(intent, (Intent) ret.get(1007));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getString should only return the String set by putString",
-            method = "getString",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getString should only return the String set by putString",
-            method = "putString",
-            args = {java.lang.String.class, java.lang.String.class}
-        )
-    })
     public void testGetString() {
         assertNull(mBundle.getString(KEY));
         mBundle.putString(KEY, "android");
@@ -1116,20 +579,6 @@
         assertEquals("android", mBundle.getString(KEY));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getStringArray should only return the StringArray set by putStringArray",
-            method = "getStringArray",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "getStringArray should only return the StringArray set by putStringArray",
-            method = "putStringArray",
-            args = {java.lang.String.class, java.lang.String[].class}
-        )
-    })
     public void testGetStringArray() {
         assertNull(mBundle.getStringArray(KEY));
         mBundle.putStringArray(KEY, new String[] {
@@ -1147,18 +596,6 @@
     }
 
     // getStringArrayList should only return the StringArrayList set by putStringArrayList
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStringArrayList",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putStringArrayList",
-            args = {java.lang.String.class, java.util.ArrayList.class}
-        )
-    })
     public void testGetStringArrayList() {
         assertNull(mBundle.getStringArrayList(KEY));
         final ArrayList<String> stringArrayList = new ArrayList<String>();
@@ -1179,12 +616,6 @@
         assertEquals("three", ret.get(2));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "keySet should contains all keys that have been set",
-        method = "keySet",
-        args = {}
-    )
     public void testKeySet() {
         Set<String> setKey = mBundle.keySet();
         assertFalse(setKey.contains("one"));
@@ -1206,11 +637,6 @@
 
     // same as hasFileDescriptors, the only difference is that describeContents
     // return 0 if no fd and return 1 if has fd for the tested Bundle
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "describeContents",
-        args = {}
-    )
 
     public void testDescribeContents() {
         assertTrue((mBundle.describeContents()
@@ -1243,11 +669,6 @@
     //  if it read data from a Parcel object, which is created with a FileDescriptor.
     // case 3: The tested Bundle should has FileDescriptor
     //  if put a Parcelable object, which is created with a FileDescriptor, into it.
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "hasFileDescriptors",
-        args = {}
-    )
     public void testHasFileDescriptors() {
         assertFalse(mBundle.hasFileDescriptors());
         
@@ -1271,24 +692,12 @@
         assertTrue(mBundle.hasFileDescriptors());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setClassLoader",
-        args = {java.lang.ClassLoader.class}
-    )
-    @ToBeFixed(bug = "", explanation = "this method only set a private member and there is "
-        + "no way to check whether the set value is right or not ")
     public void testSetClassLoader() {
         mBundle.setClassLoader(new MockClassLoader());
     }
 
     // Write the bundle(A) to a parcel(B), and then create a bundle(C) from B.
     // C should be same as A.
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {android.os.Parcel.class, int.class}
-    )
     public void testWriteToParcel() {
         final String li = "Bruce Li";
 
@@ -1301,18 +710,6 @@
     }
 
     // test the size should be right after add/remove key-value pair of the Bundle.
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "size",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "remove",
-            args = {java.lang.String.class}
-        )
-    })
     public void testSize() {
         assertEquals(0, mBundle.size());
         mBundle.putBoolean("one", true);
@@ -1345,18 +742,6 @@
     }
 
     // The return value of toString() should not be null.
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "toString",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readFromParcel",
-            args = {android.os.Parcel.class}
-        )
-    })
     public void testToString() {
         assertNotNull(mBundle.toString());
         mBundle.putString("foo", "this test is so stupid");
@@ -1364,11 +749,6 @@
     }
 
     // The tested Bundle should hold mappings from the given after putAll be invoked.
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "putAll",
-        args = {android.os.Bundle.class}
-    )
     public void testPutAll() {
         assertEquals(0, mBundle.size());
 
diff --git a/tests/tests/os/src/android/os/cts/ConditionVariableTest.java b/tests/tests/os/src/android/os/cts/ConditionVariableTest.java
index 6a45d0f..559f890 100644
--- a/tests/tests/os/src/android/os/cts/ConditionVariableTest.java
+++ b/tests/tests/os/src/android/os/cts/ConditionVariableTest.java
@@ -17,12 +17,7 @@
 
 import junit.framework.TestCase;
 import android.os.ConditionVariable;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(ConditionVariable.class)
 public class ConditionVariableTest extends TestCase {
     private static final int WAIT_TIME = 3000;
     private static final int BLOCK_TIME = 1000;
@@ -37,46 +32,12 @@
         mConditionVariable = new ConditionVariable();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ConditionVariable",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ConditionVariable",
-            args = {boolean.class}
-        )
-    })
     public void testConstructor() {
         assertFalse(mConditionVariable.block(BLOCK_TIME));
         assertFalse(new ConditionVariable(false).block(BLOCK_TIME));
         assertTrue(new ConditionVariable(true).block(BLOCK_TIME));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "block",
-            args = {long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "open",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "close",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "block",
-            args = {}
-        )
-    })
     public void testConditionVariable() throws Throwable {
         // test open then block(long)
         mConditionVariable.open();
diff --git a/tests/tests/os/src/android/os/cts/CountDownTimerTest.java b/tests/tests/os/src/android/os/cts/CountDownTimerTest.java
index 4ed75cc..4dba51e 100644
--- a/tests/tests/os/src/android/os/cts/CountDownTimerTest.java
+++ b/tests/tests/os/src/android/os/cts/CountDownTimerTest.java
@@ -22,12 +22,7 @@
 import android.content.Intent;
 import android.os.CountDownTimer;
 import android.test.InstrumentationTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(CountDownTimer.class)
 public class CountDownTimerTest extends InstrumentationTestCase {
     private Context mContext;
     private CountDownTimerTestStub mActivity;
@@ -45,32 +40,6 @@
         mActivity.countDownTimer.start();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "CountDownTimer",
-            args = {long.class, long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "start",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onTick",
-            args = {long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onFinish",
-            args = {}
-        )
-    })
     public void testCountDownTimer() {
         int count = (int) (mActivity.MILLISINFUTURE / mActivity.INTERVAL);
         final long TIMEOUT_MSEC = mActivity.MILLISINFUTURE + mActivity.INTERVAL + OFFSET * count;
@@ -79,38 +48,6 @@
         assertEqualsTickTime(mActivity.tickTimes, OFFSET);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "start",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "CountDownTimer",
-            args = {long.class, long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onTick",
-            args = {long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onFinish",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "cancel",
-            args = {}
-        )
-    })
     public void testCountDownTimerCancel() {
         final long DELAY_MSEC = mActivity.INTERVAL + OFFSET;
         assertTrue(DELAY_MSEC < mActivity.MILLISINFUTURE);
diff --git a/tests/tests/os/src/android/os/cts/DeadObjectExceptionTest.java b/tests/tests/os/src/android/os/cts/DeadObjectExceptionTest.java
index 11a7c4d..4fa73b7 100644
--- a/tests/tests/os/src/android/os/cts/DeadObjectExceptionTest.java
+++ b/tests/tests/os/src/android/os/cts/DeadObjectExceptionTest.java
@@ -17,18 +17,8 @@
 
 import junit.framework.TestCase;
 import android.os.DeadObjectException;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(DeadObjectException.class)
 public class DeadObjectExceptionTest extends TestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test method: DeadObjectException",
-        method = "DeadObjectException",
-        args = {}
-    )
     public void testDeadObjectException(){
         DeadObjectException ne = null;
         boolean isThrowed = false;
diff --git a/tests/tests/os/src/android/os/cts/DebugTest.java b/tests/tests/os/src/android/os/cts/DebugTest.java
index d4066fb..c05c78a 100644
--- a/tests/tests/os/src/android/os/cts/DebugTest.java
+++ b/tests/tests/os/src/android/os/cts/DebugTest.java
@@ -18,20 +18,16 @@
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import android.content.Context;
 import android.os.Debug;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 import dalvik.system.VMDebug;
 
-@TestTargetClass(Debug.class)
 public class DebugTest extends AndroidTestCase {
-    private boolean mHasNofify;
+    private static final Logger Log = Logger.getLogger(DebugTest.class.getName());
 
     @Override
     public void tearDown() throws Exception {
@@ -40,85 +36,12 @@
         Debug.resetAllCounts();
     }
 
-    
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "changeDebugPort",
-        args = {int.class}
-    )
-    public void testChangeDebugPort() {
-    }
-
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        method = "enableEmulatorTraceOutput",
-        args = {}
-    )
-    public void testEnableEmulatorTraceOutput() {
-    }
-
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        method = "isDebuggerConnected",
-        args = {}
-    )
-    public void testIsDebuggerConnected() {
-    }
-
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "printLoadedClasses",
-        args = {int.class}
-    )
     public void testPrintLoadedClasses() {
         Debug.printLoadedClasses(Debug.SHOW_FULL_DETAIL);
         Debug.printLoadedClasses(Debug.SHOW_CLASSLOADER);
         Debug.printLoadedClasses(Debug.SHOW_INITIALIZED);
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        method = "setAllocationLimit",
-        args = {int.class}
-    )
-    public void testSetAllocationLimit() {
-    }
-
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        method = "setGlobalAllocationLimit",
-        args = {int.class}
-    )
-    public void testSetGlobalAllocationLimit() {
-    }
-
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startMethodTracing",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startMethodTracing",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startMethodTracing",
-            args = {java.lang.String.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startMethodTracing",
-            args = {java.lang.String.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stopMethodTracing",
-            args = {}
-        )
-    })
     public void testStartMethodTracing() throws InterruptedException {
         final long debugTime = 3000;
         final String traceName = getFileName();
@@ -148,296 +71,45 @@
         File file = new File(dir, "debug.trace");
         return file.getAbsolutePath();
     }
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startNativeTracing",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stopNativeTracing",
-            args = {}
-        )
-    })
+
     public void testStartNativeTracing() {
         Debug.startNativeTracing();
 
         Debug.stopNativeTracing();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "threadCpuTimeNanos",
-        args = {}
-    )
-    public void testThreadCpuTimeNanos() throws InterruptedException {
-        final int TIME = 1000;
-        if (Debug.threadCpuTimeNanos() != -1) {
-            long currentCupTimeNanos = Debug.threadCpuTimeNanos();
-            mHasNofify = false;
-            final Object lock = new Object();
-            TestThread t = new TestThread(new Runnable() {
+    public void testThreadCpuTimeNanos() throws Exception {
+        if (Debug.threadCpuTimeNanos() == -1) {
+            // Indicates the system does not support this operation, so we can't test it.
+            Log.log(Level.WARNING, "Skipping testThreadCpuTimeNanos() on unsupported system");
+            return;
+        }
+
+        TestThread t = new TestThread(new Runnable() {
+                @Override
                 public void run() {
-                    long time = System.currentTimeMillis();
-                    while (true) {
-                        if (System.currentTimeMillis() - time > TIME) {
-                            break;
-                        }
+                    long startDebugTime = Debug.threadCpuTimeNanos();
+
+                    // Do some work for a second to increment CPU time
+                    long startSystemTime = System.currentTimeMillis();
+                    while (System.currentTimeMillis() - startSystemTime < 1000) {
                         Math.random();
-                        if (System.currentTimeMillis() - time > TIME / 2 && !mHasNofify) {
-                            synchronized (lock) {
-                                mHasNofify = true;
-                                lock.notify();
-                            }
-                            break;
-                        }
                     }
+
+                    // Verify that threadCpuTimeNanos reports that some work was done.
+                    // We can't do more than this because the specification for this API call makes
+                    // clear that this is only an estimate.
+                    assertTrue(Debug.threadCpuTimeNanos() > startDebugTime);
                 }
             });
-            t.start();
-            synchronized (lock) {
-                if (!mHasNofify) {
-                    lock.wait();
-                }
-            }
-            assertTrue(Debug.threadCpuTimeNanos() > currentCupTimeNanos);
-            Thread.sleep(TIME / 2);
-        }
+        t.start();
+        t.join();
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        method = "waitForDebugger",
-        args = {}
-    )
-    @ToBeFixed(bug = "1419964", explanation = "This API leads to enter into a infinite cycle " +
-         "which is always waiting a debugger. However the debugger waiting could not be cancled.")
-    public void testWaitForDebugger() {
-    }
-
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "waitingForDebugger",
-        args = {}
-    )
     public void testWaitingForDebugger() {
         assertFalse(Debug.waitingForDebugger());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startAllocCounting",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stopAllocCounting",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMemoryInfo",
-            args = {android.os.Debug.MemoryInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getGlobalAllocCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getGlobalAllocSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getGlobalExternalAllocCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getGlobalExternalAllocSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getGlobalExternalFreedCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getGlobalExternalFreedSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getGlobalFreedCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getGlobalFreedSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getGlobalGcInvocationCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getThreadAllocCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getThreadAllocSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getThreadExternalAllocCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getThreadExternalAllocSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getThreadGcInvocationCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLoadedClassCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getNativeHeapAllocatedSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getNativeHeapFreeSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getNativeHeapSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBinderDeathObjectCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBinderLocalObjectCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBinderProxyObjectCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBinderReceivedTransactions",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBinderSentTransactions",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test method: resetAllCounts",
-            method = "resetAllCounts",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "resetGlobalAllocCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "resetGlobalAllocSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "resetGlobalFreedCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "resetGlobalFreedSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "resetGlobalGcInvocationCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "resetGlobalExternalAllocCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "resetGlobalExternalAllocSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "resetGlobalExternalFreedCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "resetGlobalExternalFreedSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "resetThreadAllocCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "resetThreadAllocSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "resetThreadExternalAllocCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "resetThreadExternalAllocSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "resetThreadGcInvocationCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dumpHprofData",
-            args = {String.class}
-        )
-    })
     public void testGetAndReset() throws IOException {
         final String dumpFile = getFileName();
         Debug.startAllocCounting();
diff --git a/tests/tests/os/src/android/os/cts/Debug_InstructionCountTest.java b/tests/tests/os/src/android/os/cts/Debug_InstructionCountTest.java
index d6e9a68..815cb61 100644
--- a/tests/tests/os/src/android/os/cts/Debug_InstructionCountTest.java
+++ b/tests/tests/os/src/android/os/cts/Debug_InstructionCountTest.java
@@ -16,45 +16,13 @@
 
 package android.os.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.os.Debug;
 
 import junit.framework.TestCase;
 
-@TestTargetClass(Debug.InstructionCount.class)
 public class Debug_InstructionCountTest extends TestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Debug.InstructionCount",
-            args = {}
-            ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "resetAndStart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "collect",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "globalTotal",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "globalMethodInvocations",
-            args = {}
-        )
-    })
     public void testDebugInstructionCount() {
         Debug.InstructionCount instructionCount = new Debug.InstructionCount();
 
diff --git a/tests/tests/os/src/android/os/cts/EnvironmentTest.java b/tests/tests/os/src/android/os/cts/EnvironmentTest.java
index 711306e..0c3ada2 100644
--- a/tests/tests/os/src/android/os/cts/EnvironmentTest.java
+++ b/tests/tests/os/src/android/os/cts/EnvironmentTest.java
@@ -17,51 +17,8 @@
 
 import junit.framework.TestCase;
 import android.os.Environment;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(Environment.class)
 public class EnvironmentTest extends TestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link Environment}",
-            method = "Environment",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: getExternalStorageState",
-            method = "getExternalStorageState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: getExternalStorageDirectory",
-            method = "getExternalStorageDirectory",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: getRootDirectory",
-            method = "getRootDirectory",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: getDownloadCacheDirectory",
-            method = "getDownloadCacheDirectory",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: getDataDirectory",
-            method = "getDataDirectory",
-            args = {}
-        )
-    })
     public void testEnvironment() {
         new Environment();
         assertNotNull(Environment.getExternalStorageState());
diff --git a/tests/tests/os/src/android/os/cts/HandlerTest.java b/tests/tests/os/src/android/os/cts/HandlerTest.java
index 13a5465..326218d 100644
--- a/tests/tests/os/src/android/os/cts/HandlerTest.java
+++ b/tests/tests/os/src/android/os/cts/HandlerTest.java
@@ -23,12 +23,7 @@
 import android.os.SystemClock;
 import android.os.Handler.Callback;
 import android.util.Printer;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(Handler.class)
 public class HandlerTest extends TestCase {
 
     public static final int MESSAGE_WHAT = 3;
@@ -49,38 +44,6 @@
         super.tearDown();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link Handler}",
-            method = "Handler",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link Handler}",
-            method = "Handler",
-            args = {android.os.Looper.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link Handler}",
-            method = "Handler",
-            args = {Callback.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link Handler}",
-            method = "Handler",
-            args = {Looper.class, Callback.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test constructor of Handler",
-            method = "toString",
-            args = {}
-        )
-    })
     public void testConstructor() {
         Callback cb = new Callback() {
             public boolean handleMessage(Message msg) {
@@ -95,12 +58,6 @@
         new Handler(Looper.myLooper(), cb);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test postAtTime with params Runnable, uptimeMillis",
-        method = "postAtTime",
-        args = {Runnable.class, long.class}
-    )
     public void testPostAtTime1() {
         MockRunnable r = new MockRunnable();
         assertTrue(mHandler.postAtTime(r, SystemClock.uptimeMillis() + RUNTIME));
@@ -110,12 +67,6 @@
         mHandler.removeCallbacks(r);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test postAtTime with params Runnable, Object, uptimeMillis",
-        method = "postAtTime",
-        args = {Runnable.class, Object.class, long.class}
-    )
     public void testPostAtTime2() {
         MockRunnable r = new MockRunnable();
         Object token = new Object();
@@ -126,12 +77,6 @@
         mHandler.removeCallbacks(r);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test sendMessageAtTime with params Message, uptimeMillis",
-        method = "sendMessageAtTime",
-        args = {Message.class, long.class}
-    )
     public void testSendMessageAtTime() {
         Message msg = mHandler1.obtainMessage();
         assertTrue(mHandler1.sendMessageAtTime(msg, SystemClock.uptimeMillis() + RUNTIME));
@@ -141,32 +86,12 @@
         mHandler1.removeMessages(msg.what);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test dump function",
-        method = "dump",
-        args = {Printer.class, String.class}
-    )
     public void testDump() {
         final String prefix = "AndroidTest";
         MockPrinter pw = new MockPrinter();
         mHandler.dump(pw, prefix);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test hasMessages with params int",
-            method = "hasMessages",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test hasMessages with params int",
-            method = "removeMessages",
-            args = {int.class}
-        )
-    })
     public void testHasMessagesWithInt() {
         Message msg = mHandler.obtainMessage();
         assertFalse(mHandler.hasMessages(msg.what));
@@ -176,12 +101,6 @@
         assertFalse(mHandler.hasMessages(msg.what));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test hasMessages with params int, Object",
-        method = "hasMessages",
-        args = {int.class, Object.class}
-    )
     public void testHasMessagesWithObject() {
         Message msg = mHandler.obtainMessage();
         msg.obj = new Object();
@@ -192,12 +111,6 @@
         assertFalse(mHandler.hasMessages(msg.what, msg.obj));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test removeCallbacksAndMessages with null Object",
-        method = "removeCallbacksAndMessages",
-        args = {Object.class}
-    )
     public void testRemoveCallbacksAndMessages() {
         Message msg = mHandler1.obtainMessage();
         mHandler1.sendMessageAtTime(msg, SystemClock.uptimeMillis() + RUNTIME);
@@ -238,12 +151,6 @@
         assertTrue(mr1.isRun());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test sendEmptyMessageAtTime with param Message and uptimeMillis",
-        method = "sendEmptyMessageAtTime",
-        args = {int.class, long.class}
-    )
     public void testSendEmptyMessageAtTime() {
         long uptime = SystemClock.uptimeMillis() + RUNTIME;
         assertTrue(mHandler1.sendEmptyMessageAtTime(MESSAGE_WHAT, uptime));
@@ -253,12 +160,6 @@
         mHandler1.removeMessages(MESSAGE_WHAT);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test getLooper",
-        method = "getLooper",
-        args = {}
-    )
     public void testGetLooper() {
         // new the Handler instance
         Looper looper = Looper.myLooper();
@@ -266,12 +167,6 @@
         assertSame(looper, mHandler.getLooper());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test removeCallbacks with param Runnable",
-        method = "removeCallbacks",
-        args = {Runnable.class}
-    )
     public void testRemoveCallbacks() {
         // test remove right object.
         MockRunnable r = new MockRunnable();
@@ -291,12 +186,6 @@
         assertTrue(r.isRun());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test removeCallbacks with params Runnable and Object",
-        method = "removeCallbacks",
-        args = {Runnable.class, Object.class}
-    )
     public void testRemoveCallbacksWithObject() {
         // test remove right object.
         MockRunnable r1 = new MockRunnable();
@@ -326,12 +215,6 @@
         assertTrue(r1.isRun());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test removeMessages with params Message",
-        method = "removeMessages",
-        args = {int.class}
-    )
     public void testRemoveMessages() {
         // test remove right message
         Message msg = mHandler1.obtainMessage();
@@ -354,12 +237,6 @@
         assertEquals(100, mHandler1.what);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test removeMessages with params Message, and uptimeMillis",
-        method = "removeMessages",
-        args = {int.class, Object.class}
-    )
     public void testRemoveMessagesWithObject() {
         // test remove right message
         Message msg = mHandler1.obtainMessage();
@@ -387,12 +264,6 @@
         assertEquals(100, mHandler1.what);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test sendMessage with param Message",
-        method = "sendMessage",
-        args = {Message.class}
-    )
     public void testSendMessage() {
         Message msg = mHandler1.obtainMessage();
         assertTrue(mHandler1.sendMessage(msg));
@@ -401,24 +272,12 @@
         mHandler1.removeMessages(msg.what);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test obtainMessage",
-        method = "obtainMessage",
-        args = {}
-    )
     public void testObtainMessage() {
          Message msg = mHandler.obtainMessage();
          assertNotNull(msg);
          assertEquals(mHandler, msg.getTarget());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test obtainMessage function",
-        method = "obtainMessage",
-        args = {int.class}
-    )
     public void testObtainMessageWithInt() {
          // new the Handler instance
          Handler handler = new Handler();
@@ -430,12 +289,6 @@
          assertEquals(msg.what, msg1.what);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test obtainMessage with params Message and Object",
-        method = "obtainMessage",
-        args = {int.class, java.lang.Object.class}
-    )
     public void testObtainMessageWithIntObject() {
         // new the Handler instance
         Handler handler = new Handler();
@@ -449,12 +302,6 @@
         assertSame(msg.obj, msg1.obj);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test obtainMessage with params Message,arg1 and arg2",
-        method = "obtainMessage",
-        args = {int.class, int.class, int.class}
-    )
     public void testObtainMessageWithMutiInt() {
         // new the Handler instance
         Handler handler = new Handler();
@@ -470,12 +317,6 @@
         assertEquals(msg.arg2, msg1.arg2);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test obtainMessage with params Message, Object,arg1 and arg2",
-        method = "obtainMessage",
-        args = {int.class, int.class, int.class, Object.class}
-    )
     public void testObtainMessageWithMutiIntObject() {
         // new the Handler instance
         Handler handler = new Handler();
@@ -492,12 +333,6 @@
         assertSame(msg.obj, msg1.obj);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test sendMessageAtFrontOfQueue with param Message",
-        method = "sendMessageAtFrontOfQueue",
-        args = {Message.class}
-    )
     public void testSendMessageAtFrontOfQueue() {
         Message lateMsg = mHandler1.obtainMessage();
         mHandler1.sendEmptyMessageAtTime(lateMsg.what, SystemClock.uptimeMillis() + RUNTIME * 5);
@@ -509,12 +344,6 @@
         mHandler1.removeMessages(msg.what);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test postDelayed with params Runnable, delaytime",
-        method = "postDelayed",
-        args = {Runnable.class, long.class}
-    )
     public void testPostDelayed() {
         MockRunnable r = new MockRunnable();
         assertTrue(mHandler.postDelayed(r, DELAYED));
@@ -524,12 +353,6 @@
         mHandler.removeCallbacks(r);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test postAtFrontOfQueue with param Runnable",
-        method = "postAtFrontOfQueue",
-        args = {Runnable.class}
-    )
     public void testPostAtFrontOfQueue() {
         MockRunnable r = new MockRunnable();
         MockRunnable mr = new MockRunnable();
@@ -541,12 +364,6 @@
         mHandler.removeCallbacks(r);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test sendMessageDelayed with params Message, delaytime",
-        method = "sendMessageDelayed",
-        args = {Message.class, long.class}
-    )
     public void testSendMessageDelayed() {
         Message msg = mHandler1.obtainMessage();
         assertTrue(mHandler1.sendMessageDelayed(msg, DELAYED));
@@ -556,12 +373,6 @@
         mHandler1.removeMessages(msg.what);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test post with param Runnalbe",
-        method = "post",
-        args = {Runnable.class}
-    )
     public void testPost() {
         MockRunnable r = new MockRunnable();
         assertFalse(r.isRun());
@@ -571,12 +382,6 @@
         mHandler.removeCallbacks(r);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test sendEmptyMessageDelayed with params Message,delaytime",
-        method = "sendEmptyMessageDelayed",
-        args = {int.class, long.class}
-    )
     public void testSendEmptyMessageDelayed() {
         Message msg = mHandler1.obtainMessage();
         msg.what = 100;
@@ -586,12 +391,6 @@
         mHandler1.removeMessages(msg.what);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test dispatchMessage with params Message, test its if branch",
-        method = "dispatchMessage",
-        args = {android.os.Message.class}
-    )
     public void testDispatchMessage1() {
         // new the Handler instance
         MockHandler handler = new MockHandler();
@@ -604,20 +403,6 @@
         assertTrue(callback.isRun());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test dispatchMessage with params Message, test its elsebranch",
-            method = "dispatchMessage",
-            args = {Message.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test dispatchMessage with params Message, test its elsebranch",
-            method = "handleMessage",
-            args = {Message.class}
-        )
-    })
     public void testDispatchMessage2() {
         // new the Handler instance
         MockHandler handler = new MockHandler();
@@ -628,12 +413,6 @@
         assertSame(msg, handler.message);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test sendEmptyMessage with param int what",
-        method = "sendEmptyMessage",
-        args = {int.class}
-    )
     public void testSendEmptyMessage() {
         Message msg = mHandler1.obtainMessage();
         msg.what = 100;
@@ -643,12 +422,6 @@
         mHandler1.removeMessages(msg.what);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test toString",
-        method = "toString",
-        args = {}
-    )
     public void testToString() {
         assertNotNull(mHandler1.toString());
     }
diff --git a/tests/tests/os/src/android/os/cts/HandlerThreadTest.java b/tests/tests/os/src/android/os/cts/HandlerThreadTest.java
index 789981e..060f535 100644
--- a/tests/tests/os/src/android/os/cts/HandlerThreadTest.java
+++ b/tests/tests/os/src/android/os/cts/HandlerThreadTest.java
@@ -20,30 +20,11 @@
 import android.os.HandlerThread;
 import android.os.Looper;
 import android.os.Process;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(HandlerThread.class)
 public class HandlerThreadTest extends TestCase {
 
     private static final int SLEEPTIME = 100;
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "HandlerThread",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "HandlerThread",
-            args = {java.lang.String.class, int.class}
-        )
-    })
     public void testConstructor() {
         // new the HandlerThread instance
         new HandlerThread("test");
@@ -51,32 +32,6 @@
         new HandlerThread("test", Thread.MAX_PRIORITY);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getThreadId, onLooperPrepared, ",
-            method = "getThreadId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getThreadId, onLooperPrepared, ",
-            method = "onLooperPrepared",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getThreadId, onLooperPrepared, ",
-            method = "getLooper",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getThreadId, onLooperPrepared, ",
-            method = "run",
-            args = {}
-        )
-    })
     public void testGetThreadId() {
         MockHandlerThread ht = new MockHandlerThread("test");
         assertEquals(-1, ht.getThreadId());
diff --git a/tests/tests/os/src/android/os/cts/LooperTest.java b/tests/tests/os/src/android/os/cts/LooperTest.java
index 0730a23..326caa3 100644
--- a/tests/tests/os/src/android/os/cts/LooperTest.java
+++ b/tests/tests/os/src/android/os/cts/LooperTest.java
@@ -24,12 +24,7 @@
 import android.test.AndroidTestCase;
 import android.util.Printer;
 import android.util.StringBuilderPrinter;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(Looper.class)
 public class LooperTest extends AndroidTestCase {
 
     public static final long WAIT_TIME = 1000;
@@ -40,32 +35,17 @@
     private boolean mHasQuit;
     private Handler mLoopHandler;
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dump",
-        args = {Printer.class, String.class}
-    )
     public void testDump() {
         StringBuilderPrinter printer = new StringBuilderPrinter(new StringBuilder());
         final String prefix = "LooperTest";
         Looper.myLooper().dump(printer, prefix);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getMainLooper",
-        args = {}
-    )
     public void testGetMainLooper() {
         Looper looper = Looper.getMainLooper();
         assertNotNull(looper);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "loop",
-        args = {}
-    )
     public void testLoop() {
         MockRunnable run = new MockRunnable();
 
@@ -78,11 +58,6 @@
         assertTrue(run.runCalled);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "myLooper",
-        args = {}
-    )
     public void testMyLooper() throws Throwable {
         TestThread t = new TestThread(new Runnable() {
             public void run() {
@@ -95,11 +70,6 @@
         t.runTest(WAIT_TIME);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "myQueue",
-        args = {}
-    )
     public void testMyQueue() throws Throwable {
         MessageQueue mq = Looper.myQueue();
         assertNotNull(mq);
@@ -118,15 +88,10 @@
         t.runTest(WAIT_TIME);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "prepare",
-        args = {}
-    )
     public void testPrepare() throws Throwable {
         try {
             Looper.prepare();
-            fail("should throw exception");
+            fail("should throw exception because current thread already has a looper");
         } catch (RuntimeException e) {
             //expected
         }
@@ -147,26 +112,12 @@
         t.runTest(WAIT_TIME);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "prepareMainLooper",
-        args = {}
-    )
     public void testPrepareMainLooper() throws Throwable {
-        try {
-            Looper.prepareMainLooper();
-            fail("should throw exception");
-        } catch (RuntimeException e) {
-            //expected
-        }
-
         TestThread t = new TestThread(new Runnable() {
             public void run() {
-                Looper.prepareMainLooper();
-
                 try {
                     Looper.prepareMainLooper();
-                    fail("should throw exception");
+                    fail("should throw exception because the main thread was already prepared");
                 } catch (Throwable e) {
                     //expected
                 }
@@ -176,18 +127,6 @@
         t.runTest(WAIT_TIME);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "quit",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getThread",
-            args = {}
-        )
-    })
     public void testQuit() throws Throwable {
         TestThread t = new TestThread(new Runnable() {
             public void run() {
@@ -219,11 +158,6 @@
         t.joinAndCheck(WAIT_TIME);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setMessageLogging",
-        args = {Printer.class}
-    )
     public void testSetMessageLogging() throws Throwable {
         mHasRun = false;
 
@@ -249,11 +183,6 @@
         assertTrue(mHasRun);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "toString",
-        args = {}
-    )
     public void testToString() {
         assertNotNull(Looper.myLooper().toString());
     }
diff --git a/tests/tests/os/src/android/os/cts/MemoryFileTest.java b/tests/tests/os/src/android/os/cts/MemoryFileTest.java
index bb5795d..137f3c3 100644
--- a/tests/tests/os/src/android/os/cts/MemoryFileTest.java
+++ b/tests/tests/os/src/android/os/cts/MemoryFileTest.java
@@ -22,13 +22,7 @@
 
 import junit.framework.TestCase;
 import android.os.MemoryFile;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
-@TestTargetClass(MemoryFile.class)
 public class MemoryFileTest extends TestCase {
     MemoryFile mMemoryFile;
 
@@ -38,31 +32,11 @@
         mMemoryFile = null;
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor",
-            method = "MemoryFile",
-            args = {java.lang.String.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor",
-            method = "finalize",
-            args = {}
-        )
-    })
     public void testConstructor() throws IOException {
         // new the MemoryFile instance
         new MemoryFile("Test File", 1024);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test writeBytes",
-        method = "writeBytes",
-        args = {byte[].class, int.class, int.class, int.class}
-    )
     public void testWriteBytes() throws IOException {
         byte[] data = new byte[512];
         // new the MemoryFile instance
@@ -89,20 +63,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getOutputStream and getInputStream function",
-            method = "getOutputStream",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getOutputStream and getInputStream function",
-            method = "getInputStream",
-            args = {}
-        )
-    })
     public void testGetOutputStream() throws IOException {
         byte[] bs = new byte[] { 1, 2, 3, 4 };
         // new the MemoryFile instance
@@ -118,22 +78,6 @@
         assertEquals(4, in.read());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test allowPurging and isPurgingAllowed",
-            method = "allowPurging",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test allowPurging and isPurgingAllowed",
-            method = "isPurgingAllowed",
-            args = {}
-        )
-    })
-    @ToBeFixed(bug = "1537041", explanation = "When set mAllowPurging to true, writeBytes"
-                     + "should throw out exception")
     public void testAllowPurging() throws IOException {
         // new the MemoryFile instance
         mMemoryFile = new MemoryFile("Test File", 1024);
@@ -152,12 +96,6 @@
         assertFalse(mMemoryFile.isPurgingAllowed());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test length",
-        method = "length",
-        args = {}
-    )
     public void testLength() throws IOException {
         mMemoryFile = new MemoryFile("Test File", 1024);
         assertEquals(1024, mMemoryFile.length());
@@ -172,12 +110,6 @@
         assertEquals(Integer.MIN_VALUE, mMemoryFile.length());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test readBytes",
-        method = "readBytes",
-        args = {byte[].class, int.class, int.class, int.class}
-    )
     public void testReadBytes() throws IOException {
         // new the MemoryFile instance
         mMemoryFile = new MemoryFile("Test File", 1024);
@@ -214,12 +146,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test close function",
-        method = "close",
-        args = {}
-    )
     public void testClose() throws IOException {
         // new the MemoryFile instance
         mMemoryFile = new MemoryFile("Test File", 1024);
diff --git a/tests/tests/os/src/android/os/cts/MessageQueueTest.java b/tests/tests/os/src/android/os/cts/MessageQueueTest.java
index c7b549a..8c38d5f 100644
--- a/tests/tests/os/src/android/os/cts/MessageQueueTest.java
+++ b/tests/tests/os/src/android/os/cts/MessageQueueTest.java
@@ -16,7 +16,6 @@
 
 package android.os.cts;
 
-import dalvik.annotation.TestTargetClass;
 
 import android.os.Handler;
 import android.os.HandlerThread;
@@ -30,7 +29,6 @@
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
-@TestTargetClass(MessageQueue.class)
 public class MessageQueueTest extends AndroidTestCase {
 
     private static final long TIMEOUT = 1000;
@@ -125,7 +123,6 @@
                 super.init();
                 long now = SystemClock.uptimeMillis() + 200;
                 mLastMessage = 4;
-                mCount = 0;
 
                 mHandler.sendMessageAtTime(mHandler.obtainMessage(2), now + 1);
                 mHandler.sendMessageAtTime(mHandler.obtainMessage(3), now + 2);
@@ -149,7 +146,6 @@
                 super.init();
                 long now = SystemClock.uptimeMillis() + 200;
                 mLastMessage = 3;
-                mCount = 0;
                 mHandler.sendMessageAtTime(mHandler.obtainMessage(3), now);
                 mHandler.sendMessageAtFrontOfQueue(mHandler.obtainMessage(2));
                 mHandler.sendMessageAtFrontOfQueue(mHandler.obtainMessage(0));
@@ -166,6 +162,69 @@
         tester.doTest(1000, 50);
     }
 
+    public void testSyncBarriers() throws Exception {
+        OrderTestHelper tester = new OrderTestHelper() {
+            private int mBarrierToken1;
+            private int mBarrierToken2;
+
+            public void init() {
+                super.init();
+                mLastMessage = 10;
+                mHandler.sendEmptyMessage(0);
+                mBarrierToken1 = Looper.myLooper().postSyncBarrier();
+                mHandler.sendEmptyMessage(5);
+                sendAsyncMessage(1);
+                sendAsyncMessage(2);
+                sendAsyncMessage(3);
+                mHandler.sendEmptyMessage(6);
+            }
+
+            public void handleMessage(Message msg) {
+                super.handleMessage(msg);
+                if (msg.what == 3) {
+                    mHandler.sendEmptyMessage(7);
+                    mBarrierToken2 = Looper.myLooper().postSyncBarrier();
+                    sendAsyncMessage(4);
+                    sendAsyncMessage(8);
+                } else if (msg.what == 4) {
+                    Looper.myLooper().removeSyncBarrier(mBarrierToken1);
+                    sendAsyncMessage(9);
+                    mHandler.sendEmptyMessage(10);
+                } else if (msg.what == 8) {
+                    Looper.myLooper().removeSyncBarrier(mBarrierToken2);
+                }
+            }
+
+            private void sendAsyncMessage(int what) {
+                Message msg = mHandler.obtainMessage(what);
+                msg.setAsynchronous(true);
+                mHandler.sendMessage(msg);
+            }
+        };
+
+        tester.doTest(1000, 50);
+    }
+
+    public void testReleaseSyncBarrierThrowsIfTokenNotValid() throws Exception {
+        // Invalid token
+        try {
+            Looper.myLooper().removeSyncBarrier(-1);
+            fail("Should have thrown IllegalStateException");
+        } catch (IllegalStateException ex) {
+            // expected
+        }
+
+        // Token already removed.
+        int barrierToken = Looper.myLooper().postSyncBarrier();
+        Looper.myLooper().removeSyncBarrier(barrierToken);
+        try {
+            Looper.myLooper().removeSyncBarrier(barrierToken);
+            fail("Should have thrown IllegalStateException");
+        } catch (IllegalStateException ex) {
+            // expected
+        }
+    }
+
     /**
      * Helper class used to test sending message to message queue.
      */
diff --git a/tests/tests/os/src/android/os/cts/MessageTest.java b/tests/tests/os/src/android/os/cts/MessageTest.java
index e5f4cf8..dc56a23 100644
--- a/tests/tests/os/src/android/os/cts/MessageTest.java
+++ b/tests/tests/os/src/android/os/cts/MessageTest.java
@@ -21,12 +21,7 @@
 import android.os.Message;
 import android.os.Parcel;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(Message.class)
 public class MessageTest extends AndroidTestCase {
     public static final int SLEEP_TIME = 300;
     public static final int WHAT = 1;
@@ -57,60 +52,10 @@
         mMessage = new Message();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor(s) of {@link Message}",
-        method = "Message",
-        args = {}
-    )
     public void testConstructor() {
         new Message();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: getWhen",
-            method = "getWhen",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: getTarget",
-            method = "getTarget",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: setTarget",
-            method = "setTarget",
-            args = {android.os.Handler.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: getCallback",
-            method = "getCallback",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: describeContents",
-            method = "describeContents",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: setData",
-            method = "setData",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: getData",
-            method = "getData",
-            args = {}
-        )
-    })
     public void testAccessMessageProperties() {
         assertEquals(0, mMessage.getWhen());
         mMessage.setTarget(mHandler);
@@ -131,12 +76,6 @@
         assertEquals(0, mMessage.describeContents());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test method: obtain",
-        method = "obtain",
-        args = {}
-    )
     public void testObtain() {
         Message message = Message.obtain();
         assertNotNull(message);
@@ -150,12 +89,6 @@
         assertNull(message.peekData());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test method: obtain",
-        method = "obtain",
-        args = {Message.class}
-    )
     public void testObtain2() {
         Message message = Message.obtain(mHandler, WHAT, ARG1, ARG2, OBJ);
         Message expected = Message.obtain(message);
@@ -167,47 +100,23 @@
         assertEquals(message.obj, expected.obj);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test method: obtain",
-        method = "obtain",
-        args = {Handler.class}
-    )
     public void testObtain3() {
         Message expected = Message.obtain(mHandler);
         assertEquals(mHandler, expected.getTarget());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test method: obtain",
-        method = "obtain",
-        args = {Handler.class, Runnable.class}
-    )
     public void testObtain4() {
         Message expected = Message.obtain(mHandler, mRunnable);
         assertEquals(mHandler, expected.getTarget());
         assertEquals(mRunnable, expected.getCallback());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test method: obtain",
-        method = "obtain",
-        args = {Handler.class, int.class}
-    )
     public void testObtain5() {
         Message expected = Message.obtain(mHandler, WHAT);
         assertEquals(mHandler, expected.getTarget());
         assertEquals(WHAT, expected.what);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test method: obtain",
-        method = "obtain",
-        args = {Handler.class, int.class, Object.class}
-    )
     public void testObtain6() {
         Message expected = Message.obtain(mHandler, WHAT, OBJ);
         assertEquals(mHandler, expected.getTarget());
@@ -215,12 +124,6 @@
         assertEquals(OBJ, expected.obj);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test method: obtain",
-        method = "obtain",
-        args = {Handler.class, int.class, int.class, int.class}
-    )
     public void testObtain7() {
         Message expected = Message.obtain(mHandler, WHAT, ARG1, ARG2);
         assertEquals(mHandler, expected.getTarget());
@@ -229,12 +132,6 @@
         assertEquals(ARG2, expected.arg2);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test method: obtain",
-        method = "obtain",
-        args = {Handler.class, int.class, int.class, int.class, Object.class}
-    )
     public void testObtain8() {
         Message expected = Message.obtain(mHandler, WHAT, ARG1, ARG2, OBJ);
         assertEquals(mHandler, expected.getTarget());
@@ -244,22 +141,10 @@
         assertEquals(OBJ, expected.obj);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test method: toString",
-        method = "toString",
-        args = {}
-    )
     public void testToString() {
         assertNotNull(mMessage.toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test method: peekData",
-        method = "peekData",
-        args = {}
-    )
     public void testPeekData() {
         Bundle expected = new Bundle();
         assertNull(mMessage.peekData());
@@ -268,31 +153,21 @@
         assertEquals(expected, mMessage.peekData());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test method: copyFrom",
-        method = "copyFrom",
-        args = {Message.class}
-    )
     public void testCopyFrom() {
         Message message = Message.obtain(mHandler, WHAT, ARG1, ARG2, OBJ);
         Bundle bundle = new Bundle();
         bundle.putInt(KEY, VALUE);
         message.setData(bundle);
+        message.setAsynchronous(true);
         mMessage.copyFrom(message);
         assertEquals(WHAT, mMessage.what);
         assertEquals(ARG1, mMessage.arg1);
         assertEquals(ARG2, mMessage.arg2);
         assertEquals(OBJ, mMessage.obj);
         assertEquals(VALUE, mMessage.getData().getInt(KEY));
+        assertTrue(mMessage.isAsynchronous());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test method: recycle",
-        method = "recycle",
-        args = {}
-    )
     public void testRecycle() {
         Message message = Message.obtain(mHandler, WHAT, ARG1, ARG2, OBJ);
         message.recycle();
@@ -306,12 +181,6 @@
         assertNull(message.peekData());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test method: writeToParcel",
-        method = "writeToParcel",
-        args = {Parcel.class, int.class}
-    )
     public void testWriteToParcel() {
         Message message = Message.obtain(mHandler, WHAT, ARG1, ARG2);
         Bundle bundle = new Bundle();
@@ -336,12 +205,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test method: sendToTarget",
-        method = "sendToTarget",
-        args = {}
-    )
     public void testSendToTarget() {
         try {
             mMessage.sendToTarget();
@@ -357,6 +220,17 @@
         assertTrue(mMessageHandlerCalled);
     }
 
+    public void testAsynchronous() {
+        Message message = Message.obtain();
+        assertFalse(message.isAsynchronous());
+
+        message.setAsynchronous(true);
+        assertTrue(message.isAsynchronous());
+
+        message.setAsynchronous(false);
+        assertFalse(message.isAsynchronous());
+    }
+
     private void sleep(long time) {
         try {
             Thread.sleep(time);
diff --git a/tests/tests/os/src/android/os/cts/MessengerTest.java b/tests/tests/os/src/android/os/cts/MessengerTest.java
index 6b2debc..0512b23 100644
--- a/tests/tests/os/src/android/os/cts/MessengerTest.java
+++ b/tests/tests/os/src/android/os/cts/MessengerTest.java
@@ -16,10 +16,6 @@
 
 package android.os.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.ComponentName;
 import android.content.Context;
@@ -38,7 +34,6 @@
 
 import java.io.FileDescriptor;
 
-@TestTargetClass(Messenger.class)
 public class MessengerTest extends AndroidTestCase {
 
     private Messenger mMessenger;
@@ -129,23 +124,6 @@
         getContext().unbindService(mConnection);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Messenger",
-            args = {android.os.Handler.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Messenger",
-            args = {android.os.IBinder.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "equals",
-            args = {java.lang.Object.class}
-        )
-    })
     public void testConstructorAndEquals() {
         Messenger messenger = new Messenger(mHandler);
         Messenger objMessenger = new Messenger(mHandler);
@@ -154,11 +132,6 @@
         assertFalse(messenger.equals(objMessenger));
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        method = "send",
-        args = {android.os.Message.class}
-    )
     public void testSend() throws RemoteException, InterruptedException {
         // messenger used by its own thread.
         Message message = Message.obtain(mHandler, WHAT, MSG_ARG1, MSG_ARG2);
@@ -174,31 +147,16 @@
         (new MessengerTestHelper()).doTest(1000, 50);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "hashCode",
-        args = {}
-    )
     public void testHashCode() {
         assertEquals(mMessenger.getBinder().hashCode(), mMessenger.hashCode());
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        method = "getBinder",
-        args = {}
-    )
     public void testGetBinder() {
         Messenger messenger = new Messenger(mIBinder);
         assertSame(mIBinder, messenger.getBinder());
         assertNotNull(mMessenger.getBinder());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {android.os.Parcel.class, int.class}
-    )
     public void testWriteToParcel() {
         Parcel parcel = Parcel.obtain();
         mMessenger.writeToParcel(parcel, 0);
@@ -208,27 +166,10 @@
         parcel.recycle();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
         assertEquals(0, mMessenger.describeContents());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeMessengerOrNullToParcel",
-            args = {android.os.Messenger.class, android.os.Parcel.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readMessengerOrNullFromParcel",
-            args = {android.os.Parcel.class}
-        )
-    })
     public void testWriteMessengerOrNullToParcel() {
         Parcel parcelWithMessenger = Parcel.obtain();
         Messenger.writeMessengerOrNullToParcel(mMessenger, parcelWithMessenger);
diff --git a/tests/tests/os/src/android/os/cts/ParcelFileDescriptorTest.java b/tests/tests/os/src/android/os/cts/ParcelFileDescriptorTest.java
index 3974b6c..1bbbecb 100644
--- a/tests/tests/os/src/android/os/cts/ParcelFileDescriptorTest.java
+++ b/tests/tests/os/src/android/os/cts/ParcelFileDescriptorTest.java
@@ -16,11 +16,6 @@
 
 package android.os.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.content.Context;
 import android.os.Parcel;
@@ -41,24 +36,11 @@
 import java.net.ServerSocket;
 import java.net.Socket;
 
-@TestTargetClass(ParcelFileDescriptor.class)
 public class ParcelFileDescriptorTest extends AndroidTestCase {
     private static final long DURATION = 100l;
 
     private TestThread mTestThread;
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ParcelFileDescriptor",
-            args = {android.os.ParcelFileDescriptor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "open",
-            args = {java.io.File.class, int.class}
-        )
-    })
     public void testConstructorAndOpen() throws Exception {
         ParcelFileDescriptor tempFile = makeParcelFileDescriptor(getContext());
 
@@ -75,11 +57,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "fromSocket",
-        args = {java.net.Socket.class}
-    )
     public void testFromSocket() throws Throwable {
         final int PORT = 12222;
         final int DATA = 1;
@@ -114,11 +91,6 @@
         mTestThread.joinAndCheck(DURATION * 2);
     }
 
-    @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "fromData",
-            args = {byte[].class}
-    )
     public void testFromData() throws IOException {
         assertNull(ParcelFileDescriptor.fromData(null, null));
         byte[] data = new byte[] { 0 };
@@ -153,12 +125,6 @@
         }
     }
 
-    @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            notes = "Tests that skip() works on FDs returned by fromData()",
-            method = "fromData",
-            args = {byte[].class}
-    )
     public void testFromDataSkip() throws IOException {
         byte[] data = new byte[] { 40, 41, 42, 43, 44, 45, 46 };
         ParcelFileDescriptor pfd = ParcelFileDescriptor.fromData(data, null);
@@ -180,21 +146,11 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "toString",
-        args = {}
-    )
     public void testToString() {
         ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(new Socket());
         assertNotNull(pfd.toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {android.os.Parcel.class, int.class}
-    )
     public void testWriteToParcel() throws Exception {
         ParcelFileDescriptor pf = makeParcelFileDescriptor(getContext());
 
@@ -214,11 +170,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "close",
-        args = {}
-    )
     public void testClose() throws Exception {
         ParcelFileDescriptor pf = makeParcelFileDescriptor(getContext());
         AutoCloseInputStream in1 = new AutoCloseInputStream(pf);
@@ -241,24 +192,11 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        method = "getStatSize",
-        args = {}
-    )
-    @ToBeFixed(bug="1695243", explanation="getStatSize() will return -1 if the fd is not a file,"
-            + " but here it will throw IllegalArgumentException, it's not the same with javadoc.")
     public void testGetStatSize() throws Exception {
         ParcelFileDescriptor pf = makeParcelFileDescriptor(getContext());
         assertTrue(pf.getStatSize() >= 0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test method: getFileDescriptor",
-        method = "getFileDescriptor",
-        args = {}
-    )
     public void testGetFileDescriptor() {
         ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(new Socket());
         assertNotNull(pfd.getFileDescriptor());
@@ -267,12 +205,6 @@
         assertSame(pfd.getFileDescriptor(), p.getFileDescriptor());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test method: describeContents",
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
         ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(new Socket());
         assertTrue((Parcelable.CONTENTS_FILE_DESCRIPTOR & pfd.describeContents()) != 0);
diff --git a/tests/tests/os/src/android/os/cts/ParcelFileDescriptor_AutoCloseInputStreamTest.java b/tests/tests/os/src/android/os/cts/ParcelFileDescriptor_AutoCloseInputStreamTest.java
index 38a24f6..040588a 100644
--- a/tests/tests/os/src/android/os/cts/ParcelFileDescriptor_AutoCloseInputStreamTest.java
+++ b/tests/tests/os/src/android/os/cts/ParcelFileDescriptor_AutoCloseInputStreamTest.java
@@ -21,25 +21,8 @@
 import android.os.ParcelFileDescriptor;
 import android.os.ParcelFileDescriptor.AutoCloseInputStream;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(ParcelFileDescriptor.AutoCloseInputStream.class)
 public class ParcelFileDescriptor_AutoCloseInputStreamTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AutoCloseInputStream",
-            args = {android.os.ParcelFileDescriptor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "close",
-            args = {}
-        )
-    })
     public void testAutoCloseInputStream() throws Exception {
         ParcelFileDescriptor pf = ParcelFileDescriptorTest.makeParcelFileDescriptor(getContext());
 
diff --git a/tests/tests/os/src/android/os/cts/ParcelFileDescriptor_AutoCloseOutputStreamTest.java b/tests/tests/os/src/android/os/cts/ParcelFileDescriptor_AutoCloseOutputStreamTest.java
index 927c849..2ae5645 100644
--- a/tests/tests/os/src/android/os/cts/ParcelFileDescriptor_AutoCloseOutputStreamTest.java
+++ b/tests/tests/os/src/android/os/cts/ParcelFileDescriptor_AutoCloseOutputStreamTest.java
@@ -20,27 +20,8 @@
 import android.os.ParcelFileDescriptor;
 import android.os.ParcelFileDescriptor.AutoCloseOutputStream;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(ParcelFileDescriptor.AutoCloseOutputStream.class)
 public class ParcelFileDescriptor_AutoCloseOutputStreamTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link AutoCloseOutputStream}",
-            method = "AutoCloseOutputStream",
-            args = {android.os.ParcelFileDescriptor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: close",
-            method = "close",
-            args = {}
-        )
-    })
     public void testAutoCloseOutputStream() throws Exception {
         ParcelFileDescriptor pf = ParcelFileDescriptorTest.makeParcelFileDescriptor(getContext());
 
diff --git a/tests/tests/os/src/android/os/cts/ParcelFormatExceptionTest.java b/tests/tests/os/src/android/os/cts/ParcelFormatExceptionTest.java
index 9cef5ee..d4abcaa 100644
--- a/tests/tests/os/src/android/os/cts/ParcelFormatExceptionTest.java
+++ b/tests/tests/os/src/android/os/cts/ParcelFormatExceptionTest.java
@@ -17,27 +17,8 @@
 
 import junit.framework.TestCase;
 import android.os.ParcelFormatException;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(ParcelFormatException.class)
 public class ParcelFormatExceptionTest extends TestCase{
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test method: ParcelFormatException",
-            method = "ParcelFormatException",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test method: ParcelFormatException",
-            method = "ParcelFormatException",
-            args = {java.lang.String.class}
-        )
-    })
     public void testParcelFormatException(){
         ParcelFormatException ne = null;
         boolean isThrowed = false;
diff --git a/tests/tests/os/src/android/os/cts/ParcelTest.java b/tests/tests/os/src/android/os/cts/ParcelTest.java
index 2493680..35e02ae 100644
--- a/tests/tests/os/src/android/os/cts/ParcelTest.java
+++ b/tests/tests/os/src/android/os/cts/ParcelTest.java
@@ -36,33 +36,9 @@
 import android.util.Log;
 import android.util.SparseArray;
 import android.util.SparseBooleanArray;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
-@TestTargetClass(Parcel.class)
 public class ParcelTest extends AndroidTestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "obtain",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "recycle",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            notes = "This method is protected final, which can't be invoked in test case.",
-            method = "obtain",
-            args = {int.class}
-        )
-    })
     public void testObtain() {
         Parcel p1 = Parcel.obtain();
         assertNotNull(p1);
@@ -88,13 +64,6 @@
         p7.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "appendFrom",
-            args = {Parcel.class, int.class, int.class}
-        )
-    })
     public void testAppendFrom() {
         Parcel p;
         Parcel p2;
@@ -115,14 +84,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: dataAvail ",
-            method = "dataAvail",
-            args = {}
-        )
-    })
     public void testDataAvail() {
         Parcel p;
 
@@ -144,13 +105,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dataCapacity",
-            args = {}
-        )
-    })
     public void testDataCapacity() {
         Parcel p;
 
@@ -164,13 +118,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDataCapacity",
-            args = {int.class}
-        )
-    })
     public void testSetDataCapacity() {
         Parcel p;
 
@@ -185,13 +132,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dataPosition",
-            args = {}
-        )
-    })
     public void testDataPosition() {
         Parcel p;
 
@@ -205,13 +145,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDataPosition",
-            args = {int.class}
-        )
-    })
     public void testSetDataPosition() {
         Parcel p;
 
@@ -232,13 +165,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dataSize",
-            args = {}
-        )
-    })
     public void testDataSize() {
         Parcel p;
 
@@ -253,13 +179,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDataSize",
-            args = {int.class}
-        )
-    })
     public void testSetDataSize() {
         Parcel p;
 
@@ -279,18 +198,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "enforceInterface",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeInterfaceToken",
-            args = {String.class}
-        )
-    })
     public void testEnforceInterface() {
         Parcel p;
         String s = "IBinder interface token";
@@ -313,18 +220,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "marshall",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unmarshall",
-            args = {byte[].class, int.class, int.class}
-        )
-    })
     public void testMarshall() {
         final byte[] c = {Byte.MAX_VALUE, (byte) 111, (byte) 11, (byte) 1, (byte) 0,
                     (byte) -1, (byte) -11, (byte) -111, Byte.MIN_VALUE};
@@ -349,18 +244,6 @@
     }
 
     @SuppressWarnings("unchecked")
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readValue",
-            args = {ClassLoader.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeValue",
-            args = {Object.class}
-        )
-    })
     public void testReadValue() {
         Parcel p;
         MockClassLoader mcl = new MockClassLoader();
@@ -635,18 +518,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readByte",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeByte",
-            args = {byte.class}
-        )
-    })
     public void testReadByte() {
         Parcel p;
 
@@ -699,18 +570,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readByteArray",
-            args = {byte[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeByteArray",
-            args = {byte[].class}
-        )
-    })
     public void testReadByteArray() {
         Parcel p;
 
@@ -802,13 +661,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeByteArray",
-            args = {byte[].class, int.class, int.class}
-        )
-    })
     public void testWriteByteArray() {
         Parcel p;
 
@@ -908,13 +760,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createByteArray",
-            args = {}
-        )
-    })
     public void testCreateByteArray() {
         Parcel p;
 
@@ -968,18 +813,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readCharArray",
-            args = {char[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeCharArray",
-            args = {char[].class}
-        )
-    })
     public void testReadCharArray() {
         Parcel p;
 
@@ -1048,13 +881,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createCharArray",
-            args = {}
-        )
-    })
     public void testCreateCharArray() {
         Parcel p;
 
@@ -1109,18 +935,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readInt",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeInt",
-            args = {int.class}
-        )
-    })
     public void testReadInt() {
         Parcel p;
 
@@ -1173,18 +987,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readIntArray",
-            args = {int[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeIntArray",
-            args = {int[].class}
-        )
-    })
     public void testReadIntArray() {
         Parcel p;
 
@@ -1251,13 +1053,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createIntArray",
-            args = {}
-        )
-    })
     public void testCreateIntArray() {
         Parcel p;
 
@@ -1310,18 +1105,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readLong",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeLong",
-            args = {long.class}
-        )
-    })
     public void testReadLong() {
         Parcel p;
 
@@ -1362,18 +1145,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readLongArray",
-            args = {long[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeLongArray",
-            args = {long[].class}
-        )
-    })
     public void testReadLongArray() {
         Parcel p;
 
@@ -1440,13 +1211,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createLongArray",
-            args = {}
-        )
-    })
     public void testCreateLongArray() {
         Parcel p;
 
@@ -1499,18 +1263,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readFloat",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeFloat",
-            args = {float.class}
-        )
-    })
     public void testReadFloat() {
         Parcel p;
 
@@ -1563,18 +1315,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readFloatArray",
-            args = {float[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeFloatArray",
-            args = {float[].class}
-        )
-    })
     public void testReadFloatArray() {
         Parcel p;
 
@@ -1641,13 +1381,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createFloatArray",
-            args = {}
-        )
-    })
     public void testCreateFloatArray() {
         Parcel p;
 
@@ -1700,18 +1433,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readDouble",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeDouble",
-            args = {double.class}
-        )
-    })
     public void testReadDouble() {
         Parcel p;
 
@@ -1764,18 +1485,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readDoubleArray",
-            args = {double[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeDoubleArray",
-            args = {double[].class}
-        )
-    })
     public void testReadDoubleArray() {
         Parcel p;
 
@@ -1842,13 +1551,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createDoubleArray",
-            args = {}
-        )
-    })
     public void testCreateDoubleArray() {
         Parcel p;
 
@@ -1903,18 +1605,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readBooleanArray",
-            args = {boolean[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeBooleanArray",
-            args = {boolean[].class}
-        )
-    })
     public void testReadBooleanArray() {
         Parcel p;
 
@@ -1981,13 +1671,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createBooleanArray",
-            args = {}
-        )
-    })
     public void testCreateBooleanArray() {
         Parcel p;
 
@@ -2041,18 +1724,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readString",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeString",
-            args = {String.class}
-        )
-    })
     public void testReadString() {
         Parcel p;
         final String string = "Hello, Android!";
@@ -2093,18 +1764,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readStringArray",
-            args = {String[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeStringArray",
-            args = {String[].class}
-        )
-    })
     public void testReadStringArray() {
         Parcel p;
 
@@ -2174,13 +1833,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createStringArray",
-            args = {}
-        )
-    })
     public void testCreateStringArray() {
         Parcel p;
 
@@ -2236,18 +1888,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readStringList",
-            args = {List.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeStringList",
-            args = {List.class}
-        )
-    })
     public void testReadStringList() {
         Parcel p;
 
@@ -2315,13 +1955,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createStringArrayList",
-            args = {}
-        )
-    })
     public void testCreateStringArrayList() {
         Parcel p;
 
@@ -2373,18 +2006,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readSerializable",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeSerializable",
-            args = {Serializable.class}
-        )
-    })
     public void testReadSerializable() {
         Parcel p;
 
@@ -2402,18 +2023,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readParcelable",
-            args = {ClassLoader.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeParcelable",
-            args = {Parcelable.class, int.class}
-        )
-    })
     public void testReadParcelable() {
         Parcel p;
         MockClassLoader mcl = new MockClassLoader();
@@ -2434,18 +2043,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readParcelableArray",
-            args = {ClassLoader.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeParcelableArray",
-            args = {Parcelable[].class, int.class}
-        )
-    })
     public void testReadParcelableArray() {
         Parcel p;
         MockClassLoader mcl = new MockClassLoader();
@@ -2484,18 +2081,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readTypedArray",
-            args = {Object[].class, android.os.Parcelable.Creator.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeTypedArray",
-            args = {android.os.Parcelable[].class, int.class}
-        )
-    })
     public void testReadTypedArray() {
         Parcel p;
         Signature[] s = {new Signature("1234"),
@@ -2565,13 +2150,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeTypedArray",
-            args = {Parcelable[].class, int.class}
-        )
-    })
     public void testReadTypedArray2() {
         Parcel p;
         Signature[] s = {
@@ -2611,18 +2189,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createTypedArray",
-            args = {Parcelable.Creator.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeTypedArray",
-            args = {Parcelable[].class, int.class}
-        )
-    })
     public void testCreateTypedArray() {
         Parcel p;
         Signature[] s = {new Signature("1234"),
@@ -2661,18 +2227,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readTypedList",
-            args = {List.class, Parcelable.Creator.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeTypedList",
-            args = {List.class}
-        )
-    })
     public void testReadTypedList() {
         Parcel p;
         ArrayList<Signature> s = new ArrayList<Signature>();
@@ -2741,18 +2295,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createTypedArrayList",
-            args = {Parcelable.Creator.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeTypedList",
-            args = {List.class}
-        )
-    })
     public void testCreateTypedArrayList() {
         Parcel p;
         ArrayList<Signature> s = new ArrayList<Signature>();
@@ -2793,30 +2335,9 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "readException",
-            args = {int.class, String.class}
-        )
-    })
-    @ToBeFixed(bug = "1668892", explanation = "The javadoc for readException(int, String) "
-                                               + "is not clear at all")
     public void testReadException() {
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeException",
-            args = {Exception.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readException",
-            args = {}
-        )
-    })
     public void testReadException2() {
         Parcel p = Parcel.obtain();
         String msg = "testReadException2";
@@ -2880,18 +2401,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeNoException",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readException",
-            args = {}
-        )
-    })
     public void testWriteNoException() {
         Parcel p = Parcel.obtain();
         p.writeNoException();
@@ -2900,18 +2409,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeFileDescriptor",
-            args = {FileDescriptor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readFileDescriptor",
-            args = {}
-        )
-    })
     public void testWriteFileDescriptor() {
         Parcel p;
         FileDescriptor fIn = FileDescriptor.in;
@@ -2931,13 +2428,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasFileDescriptors",
-            args = {}
-        )
-    })
     public void testHasFileDescriptor() {
         Parcel p;
         FileDescriptor fIn = FileDescriptor.in;
@@ -2955,18 +2445,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readBundle",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeBundle",
-            args = {Bundle.class}
-        )
-    })
     public void testReadBundle() {
         Bundle bundle = new Bundle();
         bundle.putBoolean("boolean", true);
@@ -3016,20 +2494,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: readBundle ",
-            method = "readBundle",
-            args = {ClassLoader.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: writeBundle ",
-            method = "writeBundle",
-            args = {Bundle.class}
-        )
-    })
     public void testReadBundle2() {
         Bundle b = new Bundle();
         b.putBoolean("boolean", true);
@@ -3059,18 +2523,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeArray",
-            args = {Object[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readArray",
-            args = {ClassLoader.class}
-        )
-    })
     public void testWriteArray() {
         Parcel p;
         MockClassLoader mcl = new MockClassLoader();
@@ -3100,18 +2552,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readArrayList",
-            args = {ClassLoader.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeArray",
-            args = {Object[].class}
-        )
-    })
     public void testReadArrayList() {
         Parcel p;
         MockClassLoader mcl = new MockClassLoader();
@@ -3142,18 +2582,6 @@
     }
 
     @SuppressWarnings("unchecked")
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeSparseArray",
-            args = {SparseArray.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readSparseArray",
-            args = {ClassLoader.class}
-        )
-    })
     public void testWriteSparseArray() {
         Parcel p;
         MockClassLoader mcl = new MockClassLoader();
@@ -3188,18 +2616,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeSparseBooleanArray",
-            args = {SparseBooleanArray.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readSparseBooleanArray",
-            args = {}
-        )
-    })
     public void testWriteSparseBooleanArray() {
         Parcel p;
 
@@ -3233,18 +2649,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeStrongBinder",
-            args = {IBinder.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readStrongBinder",
-            args = {}
-        )
-    })
     public void testWriteStrongBinder() {
         Parcel p;
         Binder binder;
@@ -3264,13 +2668,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeStrongInterface",
-            args = {IInterface.class}
-        )
-    })
     public void testWriteStrongInterface() {
         Parcel p;
         MockIInterface mockInterface = new MockIInterface();
@@ -3290,18 +2687,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeBinderArray",
-            args = {IBinder[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readBinderArray",
-            args = {IBinder[].class}
-        )
-    })
     public void testWriteBinderArray() {
         Parcel p;
         IBinder[] ibinder2 = {new Binder(), new Binder()};
@@ -3363,13 +2748,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createBinderArray",
-            args = {}
-        )
-    })
     public void testCreateBinderArray() {
         Parcel p;
         IBinder[] ibinder  = {};
@@ -3404,18 +2782,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeBinderList",
-            args = {List.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readBinderList",
-            args = {List.class}
-        )
-    })
     public void testWriteBinderList() {
         Parcel p;
         ArrayList<IBinder> arrayList = new ArrayList<IBinder>();
@@ -3461,13 +2827,6 @@
         p.recycle();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createBinderArrayList",
-            args = {}
-        )
-    })
     public void testCreateBinderArrayList() {
         Parcel p;
         ArrayList<IBinder> arrayList = new ArrayList<IBinder>();
@@ -3502,18 +2861,6 @@
     }
 
     @SuppressWarnings("unchecked")
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeMap",
-            args = {Map.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readMap",
-            args = {Map.class, ClassLoader.class}
-        )
-    })
     public void testWriteMap() {
         Parcel p;
         MockClassLoader mcl = new MockClassLoader();
@@ -3544,18 +2891,6 @@
     }
 
     @SuppressWarnings("unchecked")
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readHashMap",
-            args = {ClassLoader.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeMap",
-            args = {Map.class}
-        )
-    })
     public void testReadHashMap() {
         Parcel p;
         MockClassLoader mcl = new MockClassLoader();
@@ -3586,18 +2921,6 @@
     }
 
     @SuppressWarnings("unchecked")
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "readList",
-            args = {List.class, ClassLoader.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeList",
-            args = {List.class}
-        )
-    })
     public void testReadList() {
         Parcel p;
         MockClassLoader mcl = new MockClassLoader();
diff --git a/tests/tests/os/src/android/os/cts/PatternMatcherTest.java b/tests/tests/os/src/android/os/cts/PatternMatcherTest.java
index 22a4299..fcc099c 100644
--- a/tests/tests/os/src/android/os/cts/PatternMatcherTest.java
+++ b/tests/tests/os/src/android/os/cts/PatternMatcherTest.java
@@ -19,12 +19,7 @@
 import junit.framework.TestCase;
 import android.os.Parcel;
 import android.os.PatternMatcher;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(PatternMatcher.class)
 public class PatternMatcherTest extends TestCase {
 
     private PatternMatcher mPatternMatcher;
@@ -36,20 +31,6 @@
         mPatternMatcher = null;
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor",
-            method = "PatternMatcher",
-            args = {android.os.Parcel.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor",
-            method = "PatternMatcher",
-            args = {java.lang.String.class, int.class}
-        )
-    })
     public void testConstructor() {
 
         // new the PatternMatcher instance
@@ -66,12 +47,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getType",
-        method = "getType",
-        args = {}
-    )
     public void testGetType() {
 
         mPatternMatcher = new PatternMatcher("test", PatternMatcher.PATTERN_LITERAL);
@@ -84,12 +59,6 @@
         assertEquals(PatternMatcher.PATTERN_SIMPLE_GLOB, mPatternMatcher.getType());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getPath",
-        method = "getPath",
-        args = {}
-    )
     public void testGetPath() {
 
         // set the expected value
@@ -104,12 +73,6 @@
         assertEquals(expected2, mPatternMatcher.getPath());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test toString",
-        method = "toString",
-        args = {}
-    )
     public void testToString() {
 
         // set the expected value
@@ -129,12 +92,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test writeToParcel",
-        method = "writeToParcel",
-        args = {android.os.Parcel.class, int.class}
-    )
     public void testWriteToParcel() {
 
         String expected = "test1";
@@ -148,12 +105,6 @@
         assertEquals(PatternMatcher.PATTERN_LITERAL, p.readInt());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test describeContents",
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
 
         // set the expected value
@@ -161,12 +112,6 @@
         assertEquals(0, mPatternMatcher.describeContents());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test match",
-        method = "match",
-        args = {java.lang.String.class}
-    )
     public void testMatch() {
 
         // set the expected value
diff --git a/tests/tests/os/src/android/os/cts/PowerManagerTest.java b/tests/tests/os/src/android/os/cts/PowerManagerTest.java
index cee4b9b..9c248a6 100644
--- a/tests/tests/os/src/android/os/cts/PowerManagerTest.java
+++ b/tests/tests/os/src/android/os/cts/PowerManagerTest.java
@@ -21,43 +21,12 @@
 import android.os.SystemClock;
 import android.os.PowerManager.WakeLock;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(PowerManager.class)
 public class PowerManagerTest extends AndroidTestCase {
     private static final String TAG = "PowerManagerTest";
     public static final long TIME = 3000;
     public static final int MORE_TIME = 300;
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link PowerManager}",
-            method = "PowerManager",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: newWakeLock",
-            method = "newWakeLock",
-            args = {int.class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT ,
-            notes = "Test method: userActivity",
-            method = "userActivity",
-            args = {long.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT ,
-            notes = "Test method: goToSleep",
-            method = "goToSleep",
-            args = {long.class}
-        )
-    })
     /**
      * test points:
      * 1 Get a wake lock at the level of the flags parameter
diff --git a/tests/tests/os/src/android/os/cts/PowerManager_WakeLockTest.java b/tests/tests/os/src/android/os/cts/PowerManager_WakeLockTest.java
index 224bc85..a643fc6 100644
--- a/tests/tests/os/src/android/os/cts/PowerManager_WakeLockTest.java
+++ b/tests/tests/os/src/android/os/cts/PowerManager_WakeLockTest.java
@@ -20,53 +20,10 @@
 import android.os.PowerManager;
 import android.os.PowerManager.WakeLock;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(PowerManager.WakeLock.class)
 public class PowerManager_WakeLockTest extends AndroidTestCase {
     private static final String TAG = "PowerManager_WakeLockTest";
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: acquire",
-            method = "acquire",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: setReferenceCounted",
-            method = "setReferenceCounted",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: isHeld",
-            method = "isHeld",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: toString",
-            method = "toString",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            notes = "Test method: release",
-            method = "release",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            notes = "Test method: acquire",
-            method = "acquire",
-            args = {long.class}
-        )
-    })
     /**
      * Test points:
      * 1 Makes sure the device is on at the level you asked when you created the wake lock
diff --git a/tests/tests/os/src/android/os/cts/ProcessTest.java b/tests/tests/os/src/android/os/cts/ProcessTest.java
index 4f61688..1563068 100644
--- a/tests/tests/os/src/android/os/cts/ProcessTest.java
+++ b/tests/tests/os/src/android/os/cts/ProcessTest.java
@@ -25,13 +25,7 @@
 import android.os.Process;
 import android.test.AndroidTestCase;
 import android.util.Log;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
-@TestTargetClass(Process.class)
 public class ProcessTest extends AndroidTestCase {
 
     public static final int THREAD_PRIORITY_HIGHEST = -20;
@@ -98,51 +92,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            notes = "The documentation states that this will throw a  SecurityException" +
-                    " if the process does not have permission to set the requested priority " +
-                    "for the given thread. However, setting the current Thread's priority " +
-                    "does not throw a SecurityException, regardless of the priority value.",
-            method = "setThreadPriority",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            notes = "The documentation states that this will throw a  SecurityException" +
-                    " if the process does not have permission to set the requested priority " +
-                    "for the given thread. However, setting the current Thread's priority " +
-                    "does not throw a SecurityException, regardless of the priority value.",
-            method = "setThreadPriority",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getUidForName",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "myTid",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getGidForName",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getThreadPriority",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "myUid",
-            args = {}
-        )
-    })
     public void testMiscMethods() {
         /*
          * Test setThreadPriority(int) and setThreadPriority(int, int)
@@ -202,26 +151,6 @@
      * Only the process running the caller's packages/application
      * and any additional processes created by that app be able to kill each other's processes.
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            notes = "We can't run multi-apks under current CTS framework, "
-                + "so CTS will not test kill process of shared UID.",
-            method = "killProcess",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "supportsProcesses",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test the time since this process has been started",
-            method = "getElapsedCpuTime",
-            args = {}
-        )
-    })
     public void testKillProcess() throws Exception {
         long time = 0;
         int servicePid = 0;
@@ -248,18 +177,6 @@
         assertTrue(mHasDisconnected);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "sendSignal",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "myPid",
-            args = {}
-        )
-    })
     /**
      * Test myPid() point.
      * Returns the identifier of this process, which can be used with
diff --git a/tests/tests/os/src/android/os/cts/RemoteCallbackListTest.java b/tests/tests/os/src/android/os/cts/RemoteCallbackListTest.java
index f4031ff..130df05 100644
--- a/tests/tests/os/src/android/os/cts/RemoteCallbackListTest.java
+++ b/tests/tests/os/src/android/os/cts/RemoteCallbackListTest.java
@@ -16,10 +16,6 @@
 
 package android.os.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.app.cts.ISecondary;
 import android.content.ComponentName;
@@ -32,7 +28,6 @@
 import android.os.RemoteException;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(RemoteCallbackList.class)
 public class RemoteCallbackListTest extends AndroidTestCase {
     private static final String SERVICE_ACTION = "android.app.REMOTESERVICE";
 
@@ -86,41 +81,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCallbackDied",
-            args = {android.os.IInterface.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test register(IInterface), when"
-                  + " 1. Register successfully, it will return true;"
-                  + " 2. Register null, it will throw NPE.",
-            method = "register",
-            args = {android.os.IInterface.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unregister",
-            args = {android.os.IInterface.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "beginBroadcast",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "finishBroadcast",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBroadcastItem",
-            args = {int.class}
-        )
-    })
     public void testRemoteCallbackList() throws Exception {
         // Test constructor(default one).
         MockRemoteCallbackList<IInterface> rc = new MockRemoteCallbackList<IInterface>();
@@ -172,11 +132,6 @@
         assertTrue(rc.isOnCallbackDiedCalled);
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        method = "kill",
-        args = {}
-    )
     public void testKill() {
         MockRemoteCallbackList<IInterface> rc = new MockRemoteCallbackList<IInterface>();
         synchronized (mSync) {
diff --git a/tests/tests/os/src/android/os/cts/RemoteExceptionTest.java b/tests/tests/os/src/android/os/cts/RemoteExceptionTest.java
index 54abbc5..a273a49 100644
--- a/tests/tests/os/src/android/os/cts/RemoteExceptionTest.java
+++ b/tests/tests/os/src/android/os/cts/RemoteExceptionTest.java
@@ -18,18 +18,9 @@
 import junit.framework.TestCase;
 import android.os.RemoteException;
 
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(RemoteException.class)
 public class RemoteExceptionTest extends TestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "RemoteException",
-        args = {}
-    )
     public void testRemoteException() throws Exception {
         new RemoteException();
     }
diff --git a/tests/tests/os/src/android/os/cts/ResultReceiverTest.java b/tests/tests/os/src/android/os/cts/ResultReceiverTest.java
index 90ab141..e784444 100644
--- a/tests/tests/os/src/android/os/cts/ResultReceiverTest.java
+++ b/tests/tests/os/src/android/os/cts/ResultReceiverTest.java
@@ -17,10 +17,6 @@
 package android.os.cts;
 
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.os.Bundle;
 import android.os.Handler;
@@ -28,38 +24,10 @@
 import android.os.ResultReceiver;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(ResultReceiver.class)
 public class ResultReceiverTest extends AndroidTestCase {
     private Handler mHandler = new Handler();
     private static final long DURATION = 100l;
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "send",
-            args = {int.class, Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onReceiveResult",
-            args = {int.class, Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ResultReceiver",
-            args = {Handler.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "describeContents",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "writeToParcel",
-            args = {Parcel.class, int.class}
-        )
-    })
     public void testResultReceiver() throws InterruptedException {
         MockResultReceiver sender = new MockResultReceiver(mHandler);
         Bundle bundle = new Bundle();
diff --git a/tests/tests/os/src/android/os/cts/StatFsTest.java b/tests/tests/os/src/android/os/cts/StatFsTest.java
index 5f0d781..2396e26 100644
--- a/tests/tests/os/src/android/os/cts/StatFsTest.java
+++ b/tests/tests/os/src/android/os/cts/StatFsTest.java
@@ -20,45 +20,8 @@
 import junit.framework.TestCase;
 import android.os.Environment;
 import android.os.StatFs;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(StatFs.class)
 public class StatFsTest extends TestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "StatFs",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "restat",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBlockSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBlockCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFreeBlocks",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAvailableBlocks",
-            args = {}
-        )
-    })
     public void testStatFs(){
         File path = Environment.getDataDirectory();
         StatFs stat = new StatFs(path.getPath());
@@ -82,6 +45,6 @@
         assertTrue(blockSize > 0);
         assertTrue(totalBlocks > 0);
         assertTrue(freeBlocks >= availableBlocks);
-        assertTrue(availableBlocks >= 0);
+        assertTrue(availableBlocks > 0);
     }
 }
diff --git a/tests/tests/os/src/android/os/cts/SystemClockTest.java b/tests/tests/os/src/android/os/cts/SystemClockTest.java
index 7d76ac1..21ca442 100644
--- a/tests/tests/os/src/android/os/cts/SystemClockTest.java
+++ b/tests/tests/os/src/android/os/cts/SystemClockTest.java
@@ -18,19 +18,9 @@
 
 import android.os.SystemClock;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(SystemClock.class)
 public class SystemClockTest extends AndroidTestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test currentThreadTimeMillis(), the sleep() will not affect the thread",
-        method = "currentThreadTimeMillis",
-        args = {}
-    )
     public void testCurrentThreadTimeMillis() throws InterruptedException {
 
         long start = SystemClock.currentThreadTimeMillis();
@@ -40,11 +30,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "elapsedRealtime",
-        args = {}
-    )
     public void testElapsedRealtime() throws InterruptedException {
 
         long start = SystemClock.elapsedRealtime();
@@ -54,11 +39,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setCurrentTimeMillis",
-        args = {long.class}
-    )
     public void testSetCurrentTimeMillis() {
 
         long start = SystemClock.currentThreadTimeMillis();
@@ -68,12 +48,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test sleep(long), it is similar to Thread.sleep().",
-        method = "sleep",
-        args = {long.class}
-    )
     public void testSleep() {
 
         long start = SystemClock.currentThreadTimeMillis();
@@ -93,11 +67,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "uptimeMillis",
-        args = {}
-    )
     public void testUptimeMillis() throws InterruptedException {
 
         long start = SystemClock.uptimeMillis();
diff --git a/tests/tests/os/src/android/os/cts/TokenWatcherTest.java b/tests/tests/os/src/android/os/cts/TokenWatcherTest.java
index 5b46585..5a4ffcb 100644
--- a/tests/tests/os/src/android/os/cts/TokenWatcherTest.java
+++ b/tests/tests/os/src/android/os/cts/TokenWatcherTest.java
@@ -27,12 +27,7 @@
 import android.os.RemoteException;
 import android.os.TokenWatcher;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(TokenWatcher.class)
 public class TokenWatcherTest extends AndroidTestCase {
 
     private static final String TAG = "TokenWatcherTest";
@@ -111,49 +106,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor TokenWatcher(Handler h, String tag) throuth mock class",
-            method = "TokenWatcher",
-            args = {android.os.Handler.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isAcquired",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "acquire",
-            args = {android.os.IBinder.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "acquired",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "cleanup",
-            args = {android.os.IBinder.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {android.os.IBinder.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "released",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dump",
-            args = {}
-        )
-    })
     public void testTokenWatcher() throws RemoteException, InterruptedException {
         // new the MockTokenWatcher instance, test constructor
         IBinder token = mEmptyService.getToken();
@@ -185,18 +137,6 @@
         assertFalse(waitUntilReleased());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "cleanup",
-            args = {android.os.IBinder.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dump",
-            args = {}
-        )
-    })
     public void testCleanUp() throws RemoteException, InterruptedException {
         IBinder token = mEmptyService.getToken();
         mMockTokenWatcher = new MockTokenWatcher(mHandler, TAG);
diff --git a/tests/tests/os/src/android/os/cts/VibratorTest.java b/tests/tests/os/src/android/os/cts/VibratorTest.java
index 52d0d40..1577985 100644
--- a/tests/tests/os/src/android/os/cts/VibratorTest.java
+++ b/tests/tests/os/src/android/os/cts/VibratorTest.java
@@ -20,12 +20,7 @@
 import android.os.Vibrator;
 import android.test.AndroidTestCase;
 import android.util.Log;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(Vibrator.class)
 public class VibratorTest extends AndroidTestCase {
 
     private Vibrator mVibrator;
@@ -36,12 +31,6 @@
         mVibrator = (Vibrator) getContext().getSystemService(Context.VIBRATOR_SERVICE);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test cancel()",
-        method = "cancel",
-        args = {}
-    )
     public void testVibratorCancel() {
         try {
             mVibrator.vibrate(1000);
@@ -56,20 +45,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test vibrate",
-            method = "vibrate",
-            args = {long[].class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test vibrate",
-            method = "vibrate",
-            args = {long.class}
-        )
-    })
     public void testVibratePattern() {
         long[] pattern = {100, 200, 400, 800, 1600};
         try {
@@ -85,12 +60,6 @@
         sleep();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test vibrator with multi thread.",
-        method = "vibrate",
-        args = {long.class}
-    )
     public void testVibrateMultiThread() {
         Log.d("*******VibratorTest", "MultiTreadTest");
         new Thread(new Runnable() {
diff --git a/tests/tests/permission/Android.mk b/tests/tests/permission/Android.mk
index c1f7f4d..5d251de 100644
--- a/tests/tests/permission/Android.mk
+++ b/tests/tests/permission/Android.mk
@@ -30,6 +30,6 @@
 # uncomment when dalvik test annotations are removed or part of SDK
 #LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_PACKAGE)
 
 include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/tests/permission/src/android/permission/cts/FileSystemPermissionTest.java b/tests/tests/permission/src/android/permission/cts/FileSystemPermissionTest.java
index 294288f..b9e485d 100644
--- a/tests/tests/permission/src/android/permission/cts/FileSystemPermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/FileSystemPermissionTest.java
@@ -170,9 +170,14 @@
 
     /**
      * Verify that any publicly readable directories reachable from
-     * the root directory are not writable.  World writable directories
-     * are a security hole and an application should only be able to
-     * write to it's own home directory.
+     * the root directory are not writable.  An application should only be
+     * able to write to it's own home directory. World writable directories
+     * are a security hole because they enable a number of different attacks.
+     * <ul>
+     *   <li><a href="http://en.wikipedia.org/wiki/Symlink_race">Symlink Races</a></li>
+     *   <li>Data destruction by deleting or renaming files you don't own</li>
+     *   <li>Data substitution by replacing trusted files with untrusted files</li>
+     * </ul>
      *
      * Note: Because not all directories are readable, this is a best-effort
      * test only.  Writable directories within unreadable subdirectories
@@ -201,6 +206,7 @@
                     "/data/calibration",
                     "/data/clp",
                     "/data/dalvik-cache",
+                    "/data/data",
                     "/data/data/.drm",
                     "/data/data/.drm/.wmdrm",
                     "/data/data/cw",
@@ -224,6 +230,9 @@
                     "/data/data/recovery",
                     "/data/dontpanic",
                     "/data/drm",
+                    "/data/drm/fwdlock",
+                    "/data/drm/IDM",
+                    "/data/drm/IDM/HTTP",
                     "/data/drm/rights",
                     "/data/dump",
                     "/data/fota",
@@ -289,9 +298,15 @@
 
     /**
      * Verify that directories not discoverable by
-     * testAllOtherDirectoriesNotWritable are not writable.  World
-     * writable directories are a security hole and an application
-     * should only be able to write to it's own home directory.
+     * testAllOtherDirectoriesNotWritable are not writable.  An application
+     * should only be able to write to it's own home directory. World
+     * writable directories are a security hole because they enable a
+     * number of different attacks.
+     * <ul>
+     *   <li><a href="http://en.wikipedia.org/wiki/Symlink_race">Symlink Races</a></li>
+     *   <li>Data destruction by deleting or renaming files you don't own</li>
+     *   <li>Data substitution by replacing trusted files with untrusted files</li>
+     * </ul>
      *
      * Because /data and /data/data are not readable, we blindly try to
      * poke around in there looking for bad directories.  There has to be
diff --git a/tests/tests/permission/src/android/permission/cts/NoActivityRelatedPermissionTest.java b/tests/tests/permission/src/android/permission/cts/NoActivityRelatedPermissionTest.java
index fab9cf6..62b3683 100644
--- a/tests/tests/permission/src/android/permission/cts/NoActivityRelatedPermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/NoActivityRelatedPermissionTest.java
@@ -16,7 +16,6 @@
 
 package android.permission.cts;
 
-import dalvik.annotation.TestTargetClass;
 
 import android.app.Activity;
 import android.app.ActivityManager;
@@ -31,7 +30,6 @@
 /**
  * Verify the Activity related operations require specific permissions.
  */
-@TestTargetClass(Activity.class)
 public class NoActivityRelatedPermissionTest
         extends ActivityInstrumentationTestCase2<PermissionStubActivity> {
 
diff --git a/tests/tests/permission/src/android/permission/cts/NoNetworkStatePermissionTest.java b/tests/tests/permission/src/android/permission/cts/NoNetworkStatePermissionTest.java
index 80a7575..0f24cf5 100644
--- a/tests/tests/permission/src/android/permission/cts/NoNetworkStatePermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/NoNetworkStatePermissionTest.java
@@ -20,6 +20,7 @@
 import android.net.ConnectivityManager;
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
+import java.net.InetAddress;
 
 /**
  * Verify ConnectivityManager related methods without specific network state permissions.
@@ -165,4 +166,13 @@
             // expected
         }
     }
+
+    @SmallTest
+    public void testSecurityExceptionFromDns() throws Exception {
+        try {
+            InetAddress.getByName("www.google.com");
+            fail();
+        } catch (SecurityException expected) {
+        }
+    }
 }
diff --git a/tests/tests/permission2/Android.mk b/tests/tests/permission2/Android.mk
index 9c62245..09fd104 100755
--- a/tests/tests/permission2/Android.mk
+++ b/tests/tests/permission2/Android.mk
@@ -27,5 +27,4 @@
 
 LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
-
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/preference/Android.mk b/tests/tests/preference/Android.mk
index 886c166..7816c3b 100644
--- a/tests/tests/preference/Android.mk
+++ b/tests/tests/preference/Android.mk
@@ -30,4 +30,4 @@
 
 LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/preference2/Android.mk b/tests/tests/preference2/Android.mk
index 4b7b2e5..8fda601 100644
--- a/tests/tests/preference2/Android.mk
+++ b/tests/tests/preference2/Android.mk
@@ -28,4 +28,4 @@
 
 LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/provider/Android.mk b/tests/tests/provider/Android.mk
index c33d98a..fba7cda 100644
--- a/tests/tests/provider/Android.mk
+++ b/tests/tests/provider/Android.mk
@@ -29,5 +29,4 @@
 
 LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
 
-include $(BUILD_PACKAGE)
-
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/provider/src/android/provider/cts/BrowserTest.java b/tests/tests/provider/src/android/provider/cts/BrowserTest.java
index 73db4c3..f7b4b89 100644
--- a/tests/tests/provider/src/android/provider/cts/BrowserTest.java
+++ b/tests/tests/provider/src/android/provider/cts/BrowserTest.java
@@ -18,10 +18,10 @@
 
 import android.app.ActivityManager;
 import android.app.ActivityManager.RunningTaskInfo;
+import android.content.ContentProviderClient;
 import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.content.Context;
-import android.content.IContentProvider;
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.RemoteException;
@@ -32,17 +32,11 @@
 import android.provider.BrowserContract.Bookmarks;
 import android.provider.BrowserContract.History;
 import android.test.ActivityInstrumentationTestCase2;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
-@TestTargetClass(android.provider.Browser.class)
 public class BrowserTest extends ActivityInstrumentationTestCase2<BrowserStubActivity> {
     public BrowserTest() {
         super("com.android.cts.stub", BrowserStubActivity.class);
@@ -50,7 +44,7 @@
 
     private Context mContext;
     private ContentResolver mContentResolver;
-    private IContentProvider mProvider;
+    private ContentProviderClient mProvider;
     private BrowserStubActivity mActivity;
     private boolean mMasterSyncEnabled;
 
@@ -69,7 +63,8 @@
 
         mContext = getInstrumentation().getTargetContext();
         mContentResolver = mContext.getContentResolver();
-        mProvider = mContentResolver.acquireProvider(Browser.BOOKMARKS_URI.getAuthority());
+        mProvider = mContentResolver.acquireContentProviderClient(
+                Browser.BOOKMARKS_URI.getAuthority());
         mBookmarksBackup = new ArrayList<ContentValues>();
         mSearchesBackup = new ArrayList<ContentValues>();
 
@@ -78,7 +73,7 @@
         ContentResolver.setMasterSyncAutomatically(false);
 
         // backup the current contents in database
-        Cursor cursor = mProvider.query(Bookmarks.CONTENT_URI, null, null, null, null);
+        Cursor cursor = mProvider.query(Bookmarks.CONTENT_URI, null, null, null, null, null);
         if (cursor.moveToFirst()) {
             String[] colNames = cursor.getColumnNames();
             while (!cursor.isAfterLast()) {
@@ -112,7 +107,7 @@
         }
         cursor.close();
 
-        cursor = mProvider.query(Browser.SEARCHES_URI, null, null, null, null);
+        cursor = mProvider.query(Browser.SEARCHES_URI, null, null, null, null, null);
         if (cursor.moveToFirst()) {
             while (!cursor.isAfterLast()) {
                 ContentValues value = new ContentValues();
@@ -164,20 +159,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods to access the search string in the searches database",
-            method = "addSearchUrl",
-            args = {android.content.ContentResolver.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods to access the search string in the searches database",
-            method = "clearSearches",
-            args = {android.content.ContentResolver.class}
-        )
-    })
     public void testAccessSearches() {
         final String searchString = "search string";
         final String searchStringAnother = "another search string";
@@ -188,7 +169,7 @@
             cursor = mProvider.query(
                     Browser.SEARCHES_URI,
                     Browser.SEARCHES_PROJECTION,
-                    null, null, null);
+                    null, null, null, null);
             assertEquals(1, cursor.getCount());
             cursor.moveToFirst();
             assertEquals(searchString,
@@ -199,7 +180,7 @@
             Browser.addSearchUrl(mContentResolver, searchString);
             cursor = mProvider.query(Browser.SEARCHES_URI,
                     Browser.SEARCHES_PROJECTION,
-                    null, null, null);
+                    null, null, null, null);
             assertEquals(1, cursor.getCount());
             cursor.moveToFirst();
             long date = cursor.getLong(Browser.SEARCHES_PROJECTION_DATE_INDEX);
@@ -211,7 +192,7 @@
             Browser.addSearchUrl(mContentResolver, searchStringAnother);
             cursor = mProvider.query(Browser.SEARCHES_URI,
                     Browser.SEARCHES_PROJECTION,
-                    null, null, null);
+                    null, null, null, null);
             assertEquals(2, cursor.getCount());
             cursor.moveToFirst();
             assertEquals(searchString,
@@ -225,19 +206,13 @@
             cursor = mProvider.query(
                     Browser.SEARCHES_URI,
                     Browser.SEARCHES_PROJECTION,
-                    null, null, null);
+                    null, null, null, null);
             assertEquals(0, cursor.getCount());
         } catch (RemoteException e) {
             fail("Unexpected RemoteException");
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test getAllBookmarks(ContentResolver cr)",
-        method = "getAllBookmarks",
-        args = {android.content.ContentResolver.class}
-    )
     public void testGetAllBookmarks() {
         Cursor cursor;
         final String bookmarkUrl1 = "www.bookmark1.com";
@@ -270,12 +245,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test getAllVisitedUrls(ContentResolver cr)",
-        method = "getAllVisitedUrls",
-        args = {android.content.ContentResolver.class}
-    )
     public void testGetAllVisitedUrls() {
         Cursor cursor;
         final String visitedUrl1 = "www.visited1.com";
@@ -313,12 +282,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test updateVisitedHistory(ContentResolver cr, String url, boolean real)",
-        method = "updateVisitedHistory",
-        args = {android.content.ContentResolver.class, java.lang.String.class, boolean.class}
-    )
     public void testUpdateVisitedHistory() {
         Cursor cursor;
         final String visitedHistoryUrl = "www.visited-history.com";
@@ -328,14 +291,14 @@
             cursor = mProvider.query(
                     Browser.BOOKMARKS_URI,
                     Browser.HISTORY_PROJECTION,
-                    null, null, null);
+                    null, null, null, null);
             assertEquals(0, cursor.getCount());
             cursor.close();
             Browser.updateVisitedHistory(mContentResolver, visitedHistoryUrl, true);
             cursor = mProvider.query(
                     Browser.BOOKMARKS_URI,
                     Browser.HISTORY_PROJECTION,
-                    null, null, null);
+                    null, null, null, null);
             assertEquals(1, cursor.getCount());
             cursor.moveToFirst();
             assertEquals(visitedHistoryUrl, cursor.getString(Browser.HISTORY_PROJECTION_URL_INDEX));
@@ -350,7 +313,7 @@
             cursor = mProvider.query(
                     Browser.BOOKMARKS_URI,
                     Browser.HISTORY_PROJECTION,
-                    null, null, null);
+                    null, null, null, null);
             assertEquals(1, cursor.getCount());
             cursor.moveToFirst();
             assertEquals(visitedHistoryUrl, cursor.getString(Browser.HISTORY_PROJECTION_URL_INDEX));
@@ -365,38 +328,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test methods which help user to access the history table",
-            method = "truncateHistory",
-            args = {android.content.ContentResolver.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test methods which help user to access the history table",
-            method = "clearHistory",
-            args = {android.content.ContentResolver.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test methods which help user to access the history table",
-            method = "canClearHistory",
-            args = {android.content.ContentResolver.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test methods which help user to access the history table",
-            method = "deleteFromHistory",
-            args = {android.content.ContentResolver.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test methods which help user to access the history table",
-            method = "deleteHistoryTimeFrame",
-            args = {android.content.ContentResolver.class, long.class, long.class}
-        )
-    })
     public void testAccessHistory() {
         Cursor cursor;
         // NOTE: this value must keep same with the Browser.MAX_HISTORY_COUNT.
@@ -429,14 +360,14 @@
             cursor = mProvider.query(
                     Browser.BOOKMARKS_URI,
                     Browser.HISTORY_PROJECTION,
-                    null, null, null);
+                    null, null, null, null);
             assertEquals(MAX_HISTORY_COUNT, cursor.getCount());
             cursor.close();
             Browser.truncateHistory(mContentResolver);
             cursor = mProvider.query(
                     Browser.BOOKMARKS_URI,
                     Browser.HISTORY_PROJECTION,
-                    null, null, null);
+                    null, null, null, null);
             assertEquals(MAX_HISTORY_COUNT, cursor.getCount());
             cursor.close();
 
@@ -450,14 +381,14 @@
             cursor = mProvider.query(
                     Browser.BOOKMARKS_URI,
                     Browser.HISTORY_PROJECTION,
-                    null, null, null);
+                    null, null, null, null);
             assertEquals(MAX_HISTORY_COUNT + 1, cursor.getCount());
             cursor.close();
             Browser.truncateHistory(mContentResolver);
             cursor = mProvider.query(
                     Browser.BOOKMARKS_URI,
                     Browser.HISTORY_PROJECTION,
-                    null, null, null);
+                    null, null, null, null);
             assertEquals(MAX_HISTORY_COUNT + 1 - Browser.TRUNCATE_N_OLDEST, cursor.getCount());
             cursor.moveToFirst();
             assertEquals(Browser.TRUNCATE_N_OLDEST + 1,
@@ -469,7 +400,7 @@
                     Browser.BOOKMARKS_URI,
                     Browser.HISTORY_PROJECTION,
                     BookmarkColumns.BOOKMARK + " = 0",
-                    null, BookmarkColumns.DATE);
+                    null, BookmarkColumns.DATE, null);
             int historyCountBeforeDelete = cursor.getCount();
             cursor.moveToLast();
             assertEquals(MAX_HISTORY_COUNT, cursor.getLong(Browser.HISTORY_PROJECTION_DATE_INDEX));
@@ -480,7 +411,7 @@
                     Browser.BOOKMARKS_URI,
                     Browser.HISTORY_PROJECTION,
                     BookmarkColumns.BOOKMARK + " = 0",
-                    null, BookmarkColumns.DATE);
+                    null, BookmarkColumns.DATE, null);
             int historyCountAfterDelete = cursor.getCount();
             assertEquals(historyCountBeforeDelete - 1, historyCountAfterDelete);
             cursor.moveToLast();
@@ -495,7 +426,7 @@
                     Browser.BOOKMARKS_URI,
                     Browser.HISTORY_PROJECTION,
                     BookmarkColumns.BOOKMARK + " = 0",
-                    null, BookmarkColumns.DATE);
+                    null, BookmarkColumns.DATE, null);
             historyCountAfterDelete = cursor.getCount();
             assertEquals(historyCountBeforeDelete, historyCountAfterDelete);
             cursor.close();
@@ -509,7 +440,7 @@
                     Browser.BOOKMARKS_URI,
                     Browser.HISTORY_PROJECTION,
                     BookmarkColumns.BOOKMARK + " = 0",
-                    null, BookmarkColumns.DATE);
+                    null, BookmarkColumns.DATE, null);
             historyCountAfterDelete = cursor.getCount();
             assertEquals(historyCountBeforeDelete - (end - begin), historyCountAfterDelete);
             cursor.moveToFirst();
@@ -526,7 +457,7 @@
                     Browser.BOOKMARKS_URI,
                     Browser.HISTORY_PROJECTION,
                     BookmarkColumns.BOOKMARK + " = 0",
-                    null, BookmarkColumns.DATE);
+                    null, BookmarkColumns.DATE, null);
             historyCountAfterDelete = cursor.getCount();
             assertEquals(historyCountBeforeDelete - (end - firstDate), historyCountAfterDelete);
             cursor.moveToFirst();
@@ -544,7 +475,7 @@
                     Browser.BOOKMARKS_URI,
                     Browser.HISTORY_PROJECTION,
                     BookmarkColumns.BOOKMARK + " = 0",
-                    null, BookmarkColumns.DATE);
+                    null, BookmarkColumns.DATE, null);
             historyCountAfterDelete = cursor.getCount();
             assertEquals(historyCountBeforeDelete - (lastDate - begin + 1),
                     historyCountAfterDelete);
@@ -558,7 +489,7 @@
             cursor = mProvider.query(
                     Browser.BOOKMARKS_URI,
                     Browser.HISTORY_PROJECTION,
-                    null, null, BookmarkColumns.DATE);
+                    null, null, BookmarkColumns.DATE, null);
             assertEquals(1, cursor.getCount());
             cursor.moveToFirst();
             assertEquals(bookmarkUrl, cursor.getString(Browser.HISTORY_PROJECTION_URL_INDEX));
@@ -571,25 +502,10 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test requestAllIcons(ContentResolver, String, WebIconDatabase.IconListener).",
-        method = "requestAllIcons",
-        args = {android.content.ContentResolver.class, java.lang.String.class,
-                android.webkit.WebIconDatabase.IconListener.class}
-    )
     public void testRequestAllIcons() {
         Browser.requestAllIcons(mContentResolver, null, null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test saveBookmark(Context c, String title,  String url)",
-        method = "saveBookmark",
-        args = {android.content.Context.class, java.lang.String.class, java.lang.String.class}
-    )
-    @ToBeFixed( bug = "1558560", explanation = "Can not select activity item in ResolverActivity" +
-            " by getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_CENTER)")
     public void testSaveBookmark() {
         // TODO: send KEYCODE_DPAD_CENTER to skip the resolve page, but no effect.
 //        assertFalse(isRunning(ADD_BOOKMARK_CLASS_NAME));
@@ -605,14 +521,6 @@
         // TODO: how to finish the activity.
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test sendString(Context c, String s)",
-        method = "sendString",
-        args = {android.content.Context.class, java.lang.String.class}
-    )
-    @ToBeFixed( bug = "1558273", explanation = "android.provider.Browser#" +
-            "sendString(Context c, String s) does not return")
     public void testSendString() {
         // assertFalse(isRunning(COMPOSE_MESSAGE_CLASS_NAME));
         // Browser.sendString(mActivity, "string to be sent");
@@ -694,7 +602,7 @@
                     BOOKMARKS_PROJECTION,
                     BookmarkColumns.TITLE + " = ?",
                     new String[] {insertBookmarkTitle},
-                    BookmarkColumns.DATE);
+                    BookmarkColumns.DATE, null);
             assertTrue(cursor.moveToNext());
             assertEquals(insertBookmarkTitle, cursor.getString(TITLE_INDEX));
             assertEquals(insertBookmarkUrl,cursor.getString(URL_INDEX));
@@ -721,7 +629,7 @@
                     Browser.BOOKMARKS_URI,
                     BOOKMARKS_PROJECTION,
                     BookmarkColumns._ID + " = " + Id,
-                    null, null);
+                    null, null, null);
             assertTrue(cursor.moveToNext());
             assertEquals(updateBookmarkTitle, cursor.getString(TITLE_INDEX));
             assertEquals(updateBookmarkUrl,cursor.getString(URL_INDEX));
@@ -738,7 +646,7 @@
                     Browser.BOOKMARKS_URI,
                     BOOKMARKS_PROJECTION,
                     BookmarkColumns._ID + " = " + Id,
-                    null, null);
+                    null, null, null);
             assertEquals(0, cursor.getCount());
         } catch (RemoteException e) {
             fail("Unexpected RemoteException");
@@ -765,7 +673,7 @@
             Uri insertUri = mProvider.insert(Browser.SEARCHES_URI, value);
             Cursor cursor = mProvider.query(Browser.SEARCHES_URI,
                     Browser.SEARCHES_PROJECTION, SearchColumns.SEARCH + " = ?",
-                    new String[] {insertSearch}, null);
+                    new String[] {insertSearch}, null, null);
             assertTrue(cursor.moveToNext());
             assertEquals(insertSearch,
                     cursor.getString(Browser.SEARCHES_PROJECTION_SEARCH_INDEX));
@@ -784,7 +692,7 @@
                     SearchColumns._ID + " = " + Id, null);
             cursor = mProvider.query(Browser.SEARCHES_URI,
                     Browser.SEARCHES_PROJECTION,
-                    SearchColumns._ID + " = " + Id, null, null);
+                    SearchColumns._ID + " = " + Id, null, null, null);
             assertTrue(cursor.moveToNext());
             assertEquals(updateSearch,
                     cursor.getString(Browser.SEARCHES_PROJECTION_SEARCH_INDEX));
@@ -796,7 +704,7 @@
             mProvider.delete(insertUri, null, null);
             cursor = mProvider.query(Browser.SEARCHES_URI,
                     Browser.SEARCHES_PROJECTION,
-                    SearchColumns._ID + " = " + Id, null, null);
+                    SearchColumns._ID + " = " + Id, null, null, null);
             assertEquals(0, cursor.getCount());
         } catch (RemoteException e) {
             fail("Unexpected RemoteException");
diff --git a/tests/tests/provider/src/android/provider/cts/CalendarTest.java b/tests/tests/provider/src/android/provider/cts/CalendarTest.java
index f8babeb..8ea408f 100644
--- a/tests/tests/provider/src/android/provider/cts/CalendarTest.java
+++ b/tests/tests/provider/src/android/provider/cts/CalendarTest.java
@@ -22,8 +22,6 @@
 import android.content.Entity;
 import android.content.EntityIterator;
 import android.database.Cursor;
-import android.database.DatabaseUtils;
-import android.database.SQLException;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Environment;
@@ -38,9 +36,9 @@
 import android.provider.CalendarContract.Instances;
 import android.provider.CalendarContract.Reminders;
 import android.provider.CalendarContract.SyncState;
-import android.test.InstrumentationTestCase;
 import android.test.InstrumentationCtsTestRunner;
-import android.test.suitebuilder.annotation.*;
+import android.test.InstrumentationTestCase;
+import android.test.suitebuilder.annotation.MediumTest;
 import android.text.TextUtils;
 import android.text.format.DateUtils;
 import android.text.format.Time;
@@ -902,8 +900,6 @@
     protected void setUp() throws Exception {
         super.setUp();
         mContentResolver = getInstrumentation().getTargetContext().getContentResolver();
-        // IContentProvider provider = mContentResolver.acquireProvider(Calendar.AUTHORITY);
-        // mBuilder = new ContactsContract_TestDataBuilder(provider);
     }
 
     @MediumTest
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_ContactsTest.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_ContactsTest.java
index 2220d96..88db884 100644
--- a/tests/tests/provider/src/android/provider/cts/ContactsContract_ContactsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_ContactsTest.java
@@ -17,10 +17,10 @@
 package android.provider.cts;
 
 import android.app.Instrumentation;
+import android.content.ContentProviderClient;
 import android.content.ContentResolver;
 import android.content.ContentUris;
 import android.content.Context;
-import android.content.IContentProvider;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
@@ -41,7 +41,8 @@
     protected void setUp() throws Exception {
         super.setUp();
         mContentResolver = getInstrumentation().getTargetContext().getContentResolver();
-        IContentProvider provider = mContentResolver.acquireProvider(ContactsContract.AUTHORITY);
+        ContentProviderClient provider =
+                mContentResolver.acquireContentProviderClient(ContactsContract.AUTHORITY);
         mBuilder = new ContactsContract_TestDataBuilder(provider);
     }
 
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_DataTest.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_DataTest.java
index b4b4f2b..0644cb2 100644
--- a/tests/tests/provider/src/android/provider/cts/ContactsContract_DataTest.java
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_DataTest.java
@@ -16,23 +16,19 @@
 
 package android.provider.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
+import android.content.ContentProviderClient;
 import android.content.ContentResolver;
-import android.content.IContentProvider;
 import android.net.Uri;
 import android.provider.ContactsContract;
+import android.provider.ContactsContract.CommonDataKinds.StructuredName;
 import android.provider.ContactsContract.Data;
 import android.provider.ContactsContract.RawContacts;
-import android.provider.ContactsContract.CommonDataKinds.StructuredName;
 import android.provider.cts.ContactsContract_TestDataBuilder.TestContact;
 import android.provider.cts.ContactsContract_TestDataBuilder.TestData;
 import android.provider.cts.ContactsContract_TestDataBuilder.TestRawContact;
 import android.test.InstrumentationTestCase;
 
-@TestTargetClass(ContactsContract.Data.class)
 public class ContactsContract_DataTest extends InstrumentationTestCase {
     private ContentResolver mResolver;
     private ContactsContract_TestDataBuilder mBuilder;
@@ -41,7 +37,8 @@
     protected void setUp() throws Exception {
         super.setUp();
         mResolver = getInstrumentation().getTargetContext().getContentResolver();
-        IContentProvider provider = mResolver.acquireProvider(ContactsContract.AUTHORITY);
+        ContentProviderClient provider =
+                mResolver.acquireContentProviderClient(ContactsContract.AUTHORITY);
         mBuilder = new ContactsContract_TestDataBuilder(provider);
     }
 
@@ -51,13 +48,6 @@
         mBuilder.cleanup();
     }
 
-    @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            notes = "Test Data#getContactLookupUri(ContentResolver resolver, Uri dataUri) " +
-                    "using source id",
-            method = "Data#getContactLookupUri",
-            args = {android.content.ContentResolver.class, Uri.class}
-    )
     public void testGetLookupUriBySourceId() throws Exception {
         TestRawContact rawContact = mBuilder.newRawContact()
                 .with(RawContacts.ACCOUNT_TYPE, "test_type")
@@ -79,13 +69,6 @@
                 lookupContact.getId(), data.load().getRawContact().load().getContactId());
     }
 
-    @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            notes = "Test Data#getContactLookupUri(ContentResolver resolver, Uri dataUri) " +
-                    "using display name",
-            method = "Data#getContactLookupUri",
-            args = {android.content.ContentResolver.class, Uri.class}
-    )
     public void testGetLookupUriByDisplayName() throws Exception {
         TestRawContact rawContact = mBuilder.newRawContact()
                 .with(RawContacts.ACCOUNT_TYPE, "test_type")
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_GroupMembershipTest.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_GroupMembershipTest.java
index 86e40a9..ef7d12b 100644
--- a/tests/tests/provider/src/android/provider/cts/ContactsContract_GroupMembershipTest.java
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_GroupMembershipTest.java
@@ -16,23 +16,18 @@
 
 package android.provider.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
+import android.content.ContentProviderClient;
 import android.content.ContentResolver;
-import android.content.IContentProvider;
 import android.provider.ContactsContract;
+import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
 import android.provider.ContactsContract.Groups;
 import android.provider.ContactsContract.RawContacts;
-import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
 import android.provider.cts.ContactsContract_TestDataBuilder.TestData;
 import android.provider.cts.ContactsContract_TestDataBuilder.TestGroup;
 import android.provider.cts.ContactsContract_TestDataBuilder.TestRawContact;
 import android.test.InstrumentationTestCase;
 
-@TestTargetClass(GroupMembership.class)
 public class ContactsContract_GroupMembershipTest extends InstrumentationTestCase {
     private ContactsContract_TestDataBuilder mBuilder;
 
@@ -41,7 +36,8 @@
         super.setUp();
         ContentResolver contentResolver =
                 getInstrumentation().getTargetContext().getContentResolver();
-        IContentProvider provider = contentResolver.acquireProvider(ContactsContract.AUTHORITY);
+        ContentProviderClient provider =
+                contentResolver.acquireContentProviderClient(ContactsContract.AUTHORITY);
         mBuilder = new ContactsContract_TestDataBuilder(provider);
     }
 
@@ -51,12 +47,6 @@
         mBuilder.cleanup();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            notes = "Tests INSERT operation for group membership using group row ID"
-        )
-    })
     public void testAddGroupMembershipWithGroupRowId() throws Exception {
         TestRawContact rawContact = mBuilder.newRawContact().insert();
         TestGroup group = mBuilder.newGroup().insert();
@@ -69,12 +59,6 @@
         groupMembership.assertColumn(GroupMembership.GROUP_ROW_ID, group.getId());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            notes = "Tests INSERT operation for group membership using group source ID"
-        )
-    })
     public void testAddGroupMembershipWithGroupSourceId() throws Exception {
         TestRawContact rawContact = mBuilder.newRawContact()
                 .with(RawContacts.ACCOUNT_TYPE, "test_type")
@@ -95,12 +79,6 @@
         groupMembership.assertColumn(GroupMembership.GROUP_ROW_ID, group.getId());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            notes = "Tests INSERT operation for group membership using an unknown group source ID"
-        )
-    })
     public void testAddGroupMembershipWithUnknownGroupSourceId() throws Exception {
         TestRawContact rawContact = mBuilder.newRawContact()
                 .with(RawContacts.ACCOUNT_TYPE, "test_type")
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_PhotoTest.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_PhotoTest.java
index edab42f..fbd092f 100644
--- a/tests/tests/provider/src/android/provider/cts/ContactsContract_PhotoTest.java
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_PhotoTest.java
@@ -16,10 +16,10 @@
 
 package android.provider.cts;
 
-import com.android.cts.stub.R;
-
+import android.content.ContentProviderClient;
 import android.content.ContentResolver;
-import android.content.IContentProvider;
+import android.content.Context;
+import android.os.cts.FileUtils;
 import android.provider.ContactsContract;
 import android.provider.ContactsContract.CommonDataKinds.Photo;
 import android.provider.ContactsContract.Contacts;
@@ -28,7 +28,6 @@
 import android.provider.cts.ContactsContract_TestDataBuilder.TestRawContact;
 import android.test.InstrumentationTestCase;
 
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 
@@ -37,13 +36,18 @@
 
     private static final byte[] EMPTY_TEST_PHOTO_DATA = "".getBytes();
 
+    private Context mContext;
+
     private ContentResolver mResolver;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        mResolver = getInstrumentation().getTargetContext().getContentResolver();
-        IContentProvider provider = mResolver.acquireProvider(ContactsContract.AUTHORITY);
+
+        mContext= getInstrumentation().getTargetContext();
+        mResolver = mContext.getContentResolver();
+        ContentProviderClient provider =
+                mResolver.acquireContentProviderClient(ContactsContract.AUTHORITY);
         mBuilder = new ContactsContract_TestDataBuilder(provider);
     }
 
@@ -62,7 +66,7 @@
         assertNull(Contacts.openContactPhotoInputStream(mResolver, contact.getUri(), false));
 
         TestData photoData = rawContact.newDataRow(Photo.CONTENT_ITEM_TYPE)
-                .with(Photo.PHOTO, getTestPhotoData())
+                .with(Photo.PHOTO, PhotoUtil.getTestPhotoData(mContext))
                 .insert();
 
         photoData.load();
@@ -92,31 +96,10 @@
         assertNull(Contacts.openContactPhotoInputStream(mResolver, contact.getUri(), false));
     }
 
-    private byte[] getTestPhotoData() {
-        InputStream input = getInstrumentation().getTargetContext().getResources()
-                .openRawResource(R.drawable.testimage);
-        return readInputStreamFully(input);
-    }
-
-    protected byte[] readInputStreamFully(InputStream is) {
-        ByteArrayOutputStream os = new ByteArrayOutputStream();
-        byte[] buffer = new byte[10000];
-        int count;
-        try {
-            while ((count = is.read(buffer)) != -1) {
-                os.write(buffer, 0, count);
-            }
-            is.close();
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-        return os.toByteArray();
-    }
-
     private void assertPhotoStream(InputStream photoStream) throws IOException {
         try {
             assertNotNull(photoStream);
-            byte[] actualBytes = readInputStreamFully(photoStream);
+            byte[] actualBytes = FileUtils.readInputStreamFully(photoStream);
             assertTrue(actualBytes.length > 0);
         } finally {
             if (photoStream != null) {
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_RawContactsTest.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_RawContactsTest.java
index 7dc4393..02196c0 100644
--- a/tests/tests/provider/src/android/provider/cts/ContactsContract_RawContactsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_RawContactsTest.java
@@ -16,21 +16,17 @@
 
 package android.provider.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
+import android.content.ContentProviderClient;
 import android.content.ContentResolver;
-import android.content.IContentProvider;
 import android.net.Uri;
 import android.provider.ContactsContract;
-import android.provider.ContactsContract.RawContacts;
 import android.provider.ContactsContract.CommonDataKinds.StructuredName;
+import android.provider.ContactsContract.RawContacts;
 import android.provider.cts.ContactsContract_TestDataBuilder.TestContact;
 import android.provider.cts.ContactsContract_TestDataBuilder.TestRawContact;
 import android.test.InstrumentationTestCase;
 
-@TestTargetClass(ContactsContract.RawContacts.class)
 public class ContactsContract_RawContactsTest extends InstrumentationTestCase {
     private ContentResolver mResolver;
     private ContactsContract_TestDataBuilder mBuilder;
@@ -39,7 +35,8 @@
     protected void setUp() throws Exception {
         super.setUp();
         mResolver = getInstrumentation().getTargetContext().getContentResolver();
-        IContentProvider provider = mResolver.acquireProvider(ContactsContract.AUTHORITY);
+        ContentProviderClient provider =
+                mResolver.acquireContentProviderClient(ContactsContract.AUTHORITY);
         mBuilder = new ContactsContract_TestDataBuilder(provider);
     }
 
@@ -49,13 +46,6 @@
         mBuilder.cleanup();
     }
 
-    @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            notes = "Test RawContacts#getContactLookupUri(ContentResolver resolver, Uri " +
-                    "rawContactUri) using source id",
-            method = "RawContacts#getContactLookupUri",
-            args = {android.content.ContentResolver.class, Uri.class}
-    )
     public void testGetLookupUriBySourceId() throws Exception {
         TestRawContact rawContact = mBuilder.newRawContact()
                 .with(RawContacts.ACCOUNT_TYPE, "test_type")
@@ -77,13 +67,6 @@
                 lookupContact.getId(), rawContact.load().getContactId());
     }
 
-    @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            notes = "Test RawContacts#getContactLookupUri(ContentResolver resolver, Uri " +
-                    "rawContactUri) using display name",
-            method = "RawContacts#getContactLookupUri",
-            args = {android.content.ContentResolver.class, Uri.class}
-    )
     public void testGetLookupUriByDisplayName() throws Exception {
         TestRawContact rawContact = mBuilder.newRawContact()
                 .with(RawContacts.ACCOUNT_TYPE, "test_type")
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_StreamItemPhotosTest.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_StreamItemPhotosTest.java
new file mode 100644
index 0000000..d45e824
--- /dev/null
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_StreamItemPhotosTest.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.provider.cts;
+
+import android.content.ContentResolver;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.net.Uri;
+import android.provider.ContactsContract.StreamItemPhotos;
+import android.provider.ContactsContract.StreamItems;
+import android.test.AndroidTestCase;
+
+public class ContactsContract_StreamItemPhotosTest extends AndroidTestCase {
+
+    private ContentResolver mResolver;
+
+    private Uri mStreamItemUri;
+
+    private long mStreamItemId;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mResolver = mContext.getContentResolver();
+
+        long rawContactId = ContactsContract_StreamItemsTest.insertRawContact(mResolver);
+        mStreamItemUri = ContactsContract_StreamItemsTest.insertViaContentDirectoryUri(mResolver,
+                rawContactId);
+        mStreamItemId = ContentUris.parseId(mStreamItemUri);
+        assertTrue(mStreamItemId != -1);
+    }
+
+    public void testContentDirectoryUri() {
+        byte[] photoData = PhotoUtil.getTestPhotoData(mContext);
+        ContentValues values = new ContentValues();
+        values.put(StreamItemPhotos.SORT_INDEX, 1);
+        values.put(StreamItemPhotos.PHOTO, photoData);
+
+        Uri insertUri = Uri.withAppendedPath(
+                ContentUris.withAppendedId(StreamItems.CONTENT_URI, mStreamItemId),
+                StreamItems.StreamItemPhotos.CONTENT_DIRECTORY);
+        Uri uri = mResolver.insert(insertUri, values);
+        long photoId = ContentUris.parseId(uri);
+        assertTrue(photoId != -1);
+        assertEquals(Uri.withAppendedPath(insertUri, Long.toString(photoId)), uri);
+    }
+
+    public void testContentPhotoUri() {
+        byte[] photoData = PhotoUtil.getTestPhotoData(mContext);
+        ContentValues values = new ContentValues();
+        values.put(StreamItemPhotos.STREAM_ITEM_ID, mStreamItemId);
+        values.put(StreamItemPhotos.SORT_INDEX, 1);
+        values.put(StreamItemPhotos.PHOTO, photoData);
+
+        Uri uri = mResolver.insert(StreamItems.CONTENT_PHOTO_URI, values);
+        long photoId = ContentUris.parseId(uri);
+        assertTrue(photoId != -1);
+        assertEquals(Uri.withAppendedPath(StreamItems.CONTENT_PHOTO_URI,
+                Long.toString(photoId)), uri);
+    }
+}
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_StreamItemsTest.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_StreamItemsTest.java
index 5ca04ab..f8135aa 100644
--- a/tests/tests/provider/src/android/provider/cts/ContactsContract_StreamItemsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_StreamItemsTest.java
@@ -53,27 +53,8 @@
     }
 
     public void testContentDirectoryUri() throws Exception {
-        // Create a contact to attach the stream item to it.
-        ContentValues values = new ContentValues();
-        values.put(RawContacts.ACCOUNT_TYPE, ACCOUNT_TYPE);
-        values.put(RawContacts.ACCOUNT_NAME, ACCOUNT_NAME);
-
-        Uri contactUri = mResolver.insert(RawContacts.CONTENT_URI, values);
-        long rawContactId = ContentUris.parseId(contactUri);
-        assertTrue(rawContactId != -1);
-
-        // Attach a stream item to the contact.
-        values.clear();
-        values.put(RawContacts.ACCOUNT_TYPE, ACCOUNT_TYPE);
-        values.put(RawContacts.ACCOUNT_NAME, ACCOUNT_NAME);
-        values.put(StreamItems.TEXT, INSERT_TEXT);
-        values.put(StreamItems.TIMESTAMP, INSERT_TIMESTAMP);
-        values.put(StreamItems.COMMENTS, INSERT_COMMENTS);
-
-        Uri contactStreamUri = Uri.withAppendedPath(
-                ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId),
-                RawContacts.StreamItems.CONTENT_DIRECTORY);
-        Uri streamItemUri = mResolver.insert(contactStreamUri, values);
+        long rawContactId = insertRawContact(mResolver);
+        Uri streamItemUri = insertViaContentDirectoryUri(mResolver, rawContactId);
         long streamItemId = ContentUris.parseId(streamItemUri);
         assertTrue(streamItemId != -1);
 
@@ -88,7 +69,7 @@
         assertInsertedItem(streamItemUri);
 
         // Update the stream item.
-        values.clear();
+        ContentValues values = new ContentValues();
         values.put(Data.RAW_CONTACT_ID, rawContactId);
         values.put(RawContacts.ACCOUNT_TYPE, ACCOUNT_TYPE);
         values.put(RawContacts.ACCOUNT_NAME, ACCOUNT_NAME);
@@ -100,6 +81,33 @@
         assertUpdatedItem(streamItemUri);
     }
 
+    static long insertRawContact(ContentResolver resolver) {
+        // Create a contact to attach the stream item to it.
+        ContentValues values = new ContentValues();
+        values.put(RawContacts.ACCOUNT_TYPE, ACCOUNT_TYPE);
+        values.put(RawContacts.ACCOUNT_NAME, ACCOUNT_NAME);
+
+        Uri contactUri = resolver.insert(RawContacts.CONTENT_URI, values);
+        long rawContactId = ContentUris.parseId(contactUri);
+        assertTrue(rawContactId != -1);
+        return rawContactId;
+    }
+
+    static Uri insertViaContentDirectoryUri(ContentResolver resolver, long rawContactId) {
+        // Attach a stream item to the contact.
+        ContentValues values = new ContentValues();
+        values.put(RawContacts.ACCOUNT_TYPE, ACCOUNT_TYPE);
+        values.put(RawContacts.ACCOUNT_NAME, ACCOUNT_NAME);
+        values.put(StreamItems.TEXT, INSERT_TEXT);
+        values.put(StreamItems.TIMESTAMP, INSERT_TIMESTAMP);
+        values.put(StreamItems.COMMENTS, INSERT_COMMENTS);
+
+        Uri contactStreamUri = Uri.withAppendedPath(
+                ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId),
+                RawContacts.StreamItems.CONTENT_DIRECTORY);
+        return resolver.insert(contactStreamUri, values);
+    }
+
     public void testContentUri() throws Exception {
         // Create a contact with one stream item in it.
         ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContract_TestDataBuilder.java b/tests/tests/provider/src/android/provider/cts/ContactsContract_TestDataBuilder.java
index e1feda6..43c249e 100644
--- a/tests/tests/provider/src/android/provider/cts/ContactsContract_TestDataBuilder.java
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContract_TestDataBuilder.java
@@ -19,9 +19,9 @@
 import com.google.android.collect.Lists;
 import com.google.android.collect.Sets;
 
+import android.content.ContentProviderClient;
 import android.content.ContentUris;
 import android.content.ContentValues;
-import android.content.IContentProvider;
 import android.database.Cursor;
 import android.net.Uri;
 import android.provider.BaseColumns;
@@ -45,7 +45,7 @@
  * A test data builder for ContactsContract tests.
  */
 public class ContactsContract_TestDataBuilder {
-    private IContentProvider mProvider;
+    private ContentProviderClient mProvider;
     private ArrayList<Builder<?>> mCreatedRows = Lists.newArrayList();
     private HashSet<Builder<?>> mLoadedRows = Sets.newHashSet();
 
@@ -72,7 +72,7 @@
 
             assertNotNull("Row has not be inserted or loaded yet", mUri);
 
-            Cursor cursor = mProvider.query(mUri, IdQuery.COLUMNS, null, null, null);
+            Cursor cursor = mProvider.query(mUri, IdQuery.COLUMNS, null, null, null, null);
             if (cursor != null) {
                 try {
                     cursor.moveToFirst();
@@ -152,7 +152,7 @@
             close();
             mLoadedRows.add(this);
 
-            mCursor = mProvider.query(getUri(), null, null, null, null);
+            mCursor = mProvider.query(getUri(), null, null, null, null, null);
             if (mCursor == null || !mCursor.moveToFirst()) {
                 return null;
             } else {
@@ -186,7 +186,7 @@
             }
             mCursor = mProvider.query(getContentUri(), null,
                     selection.toString(),
-                    selectionArgs.toArray(new String[0]), null);
+                    selectionArgs.toArray(new String[0]), null, null);
             if (mCursor == null || !mCursor.moveToFirst()) {
                 fail("No data rows for " + getContentUri() + "[" + mValues.toString() + "]");
             }
@@ -339,7 +339,7 @@
         }
     }
 
-    public ContactsContract_TestDataBuilder(IContentProvider provider) {
+    public ContactsContract_TestDataBuilder(ContentProviderClient provider) {
         this.mProvider = provider;
     }
 
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsTest.java b/tests/tests/provider/src/android/provider/cts/ContactsTest.java
index 1c74b7f..b496007 100644
--- a/tests/tests/provider/src/android/provider/cts/ContactsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/ContactsTest.java
@@ -17,19 +17,18 @@
 package android.provider.cts;
 
 
-import dalvik.annotation.TestTargetClass;
 
+import android.content.ContentProviderClient;
 import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.content.Context;
-import android.content.IContentProvider;
 import android.database.Cursor;
 import android.graphics.drawable.BitmapDrawable;
 import android.net.Uri;
 import android.os.RemoteException;
 import android.provider.CallLog;
-import android.provider.Contacts;
 import android.provider.CallLog.Calls;
+import android.provider.Contacts;
 import android.provider.Contacts.ContactMethods;
 import android.provider.Contacts.Extensions;
 import android.provider.Contacts.GroupMembership;
@@ -48,18 +47,17 @@
 import java.io.InputStream;
 import java.util.Date;
 
-@TestTargetClass(android.provider.Contacts.class)
 public class ContactsTest extends InstrumentationTestCase {
     private ContentResolver mContentResolver;
-    private IContentProvider mProvider;
-    private IContentProvider mCallLogProvider;
+    private ContentProviderClient mProvider;
+    private ContentProviderClient mCallLogProvider;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         mContentResolver = getInstrumentation().getTargetContext().getContentResolver();
-        mProvider = mContentResolver.acquireProvider(Contacts.AUTHORITY);
-        mCallLogProvider = mContentResolver.acquireProvider(CallLog.AUTHORITY);
+        mProvider = mContentResolver.acquireContentProviderClient(Contacts.AUTHORITY);
+        mCallLogProvider = mContentResolver.acquireContentProviderClient(CallLog.AUTHORITY);
     }
 
     /**
@@ -100,7 +98,7 @@
             Uri uri = mProvider.insert(People.CONTENT_URI, value);
             Cursor cursor = mProvider.query(People.CONTENT_URI,
                     PEOPLE_PROJECTION, PeopleColumns.NAME + " = ?",
-                    new String[] {insertPeopleName}, null);
+                    new String[] {insertPeopleName}, null, null);
             assertTrue(cursor.moveToNext());
             assertEquals(insertPeopleName, cursor.getString(NAME_INDEX));
             assertEquals(insertPeopleNotes, cursor.getString(NOTES_INDEX));
@@ -122,7 +120,7 @@
 
             mProvider.update(uri, value, null, null);
             cursor = mProvider.query(People.CONTENT_URI, PEOPLE_PROJECTION,
-                    "people._id" + " = " + id, null, null);
+                    "people._id" + " = " + id, null, null, null);
             assertTrue(cursor.moveToNext());
             assertEquals(updatePeopleName, cursor.getString(NAME_INDEX));
             assertEquals(updatePeopleNotes, cursor.getString(NOTES_INDEX));
@@ -137,7 +135,7 @@
             // Test: delete
             mProvider.delete(uri, null, null);
             cursor = mProvider.query(People.CONTENT_URI, PEOPLE_PROJECTION,
-                    "people._id" + " = " + id, null, null);
+                    "people._id" + " = " + id, null, null, null);
             assertEquals(0, cursor.getCount());
         } catch (RemoteException e) {
             fail("Unexpected RemoteException");
@@ -172,7 +170,7 @@
             Uri uri = mProvider.insert(Groups.CONTENT_URI, value);
             Cursor cursor = mProvider.query(Groups.CONTENT_URI,
                     GROUPS_PROJECTION, Groups._ID + " = ?",
-                    new String[] {uri.getPathSegments().get(1)}, null);
+                    new String[] {uri.getPathSegments().get(1)}, null, null);
             assertTrue(cursor.moveToNext());
             assertEquals(insertGroupsName, cursor.getString(NAME_INDEX));
             assertEquals(insertGroupsNotes, cursor.getString(NOTES_INDEX));
@@ -187,7 +185,7 @@
 
             assertEquals(1, mProvider.update(uri, value, null, null));
             cursor = mProvider.query(Groups.CONTENT_URI, GROUPS_PROJECTION,
-                    Groups._ID + " = " + id, null, null);
+                    Groups._ID + " = " + id, null, null, null);
             assertTrue(cursor.moveToNext());
             assertEquals(updateGroupsNotes, cursor.getString(NOTES_INDEX));
             assertEquals(updateGroupsSystemId, cursor.getString(SYSTEM_ID_INDEX));
@@ -281,7 +279,7 @@
             Uri uri = mProvider.insert(Phones.CONTENT_URI, value);
             Cursor cursor = mProvider.query(Phones.CONTENT_URI,
                     PHONES_PROJECTION, Phones.PERSON_ID + " = " + peopleId,
-                    null, null);
+                    null, null, null);
             assertTrue(cursor.moveToNext());
             assertEquals(peopleId, cursor.getInt(PERSON_ID_INDEX));
             assertEquals(Phones.TYPE_HOME, cursor.getInt(TYPE_INDEX));
@@ -301,7 +299,7 @@
 
             mProvider.update(uri, value, null, null);
             cursor = mProvider.query(Phones.CONTENT_URI, PHONES_PROJECTION,
-                    "phones._id = " + id, null, null);
+                    "phones._id = " + id, null, null, null);
             assertTrue(cursor.moveToNext());
             assertEquals(peopleId, cursor.getInt(PERSON_ID_INDEX));
             assertEquals(Phones.TYPE_CUSTOM, cursor.getInt(TYPE_INDEX));
@@ -315,7 +313,7 @@
             // Test: delete
             mProvider.delete(uri, null, null);
             cursor = mProvider.query(Phones.CONTENT_URI, PHONES_PROJECTION,
-                    Phones.PERSON_ID + " = " + peopleId, null, null);
+                    Phones.PERSON_ID + " = " + peopleId, null, null, null);
             assertEquals(0, cursor.getCount());
 
             mProvider.delete(peopleUri, null, null);
@@ -365,7 +363,7 @@
             Cursor cursor = mProvider.query(
                     Organizations.CONTENT_URI, ORGANIZATIONS_PROJECTION,
                     Organizations.PERSON_ID + " = " + peopleId,
-                    null, null);
+                    null, null, null);
             assertTrue(cursor.moveToNext());
             assertEquals(insertOrganizationsCompany, cursor.getString(COMPANY_INDEX));
             assertEquals(insertOrganizationsTitle, cursor.getString(TITLE_INDEX));
@@ -385,7 +383,7 @@
 
             mProvider.update(uri, value, null, null);
             cursor = mProvider.query(Organizations.CONTENT_URI, ORGANIZATIONS_PROJECTION,
-                    "organizations._id" + " = " + id, null, null);
+                    "organizations._id" + " = " + id, null, null, null);
             assertTrue(cursor.moveToNext());
             assertEquals(updateOrganizationsCompany, cursor.getString(COMPANY_INDEX));
             assertEquals(updateOrganizationsTitle, cursor.getString(TITLE_INDEX));
@@ -398,7 +396,7 @@
             // Test: delete
             mProvider.delete(uri, null, null);
             cursor = mProvider.query(Organizations.CONTENT_URI, ORGANIZATIONS_PROJECTION,
-                    Organizations.PERSON_ID + " = " + peopleId, null, null);
+                    Organizations.PERSON_ID + " = " + peopleId, null, null, null);
             assertEquals(0, cursor.getCount());
 
             mProvider.delete(peopleUri, null, null);
@@ -452,7 +450,7 @@
             Cursor cursor = mCallLogProvider.query(
                     Calls.CONTENT_URI, CALLS_PROJECTION,
                     Calls.NUMBER + " = ?",
-                    new String[] {insertCallsNumber}, null);
+                    new String[] {insertCallsNumber}, null, null);
             assertTrue(cursor.moveToNext());
             assertEquals(insertCallsNumber, cursor.getString(NUMBER_INDEX));
             assertEquals(insertDate, cursor.getInt(DATE_INDEX));
@@ -479,7 +477,7 @@
 
             mCallLogProvider.update(uri, value, null, null);
             cursor = mCallLogProvider.query(Calls.CONTENT_URI, CALLS_PROJECTION,
-                    Calls._ID + " = " + id, null, null);
+                    Calls._ID + " = " + id, null, null, null);
             assertTrue(cursor.moveToNext());
             assertEquals(updateCallsNumber, cursor.getString(NUMBER_INDEX));
             assertEquals(now, cursor.getInt(DATE_INDEX));
@@ -494,7 +492,7 @@
             // Test: delete
             mCallLogProvider.delete(Calls.CONTENT_URI, Calls._ID + " = " + id, null);
             cursor = mCallLogProvider.query(Calls.CONTENT_URI, CALLS_PROJECTION,
-                    Calls._ID + " = " + id, null, null);
+                    Calls._ID + " = " + id, null, null, null);
             assertEquals(0, cursor.getCount());
             cursor.close();
         } catch (RemoteException e) {
@@ -546,7 +544,7 @@
             Cursor cursor = mProvider.query(
                     ContactMethods.CONTENT_URI, CONTACT_METHODS_PROJECTION,
                     ContactMethods.PERSON_ID + " = " + peopleId,
-                    null, null);
+                    null, null, null);
             assertTrue(cursor.moveToNext());
             assertEquals(peopleId, cursor.getInt(PERSON_ID_INDEX));
             assertEquals(insertKind, cursor.getInt(KIND_INDEX));
@@ -569,7 +567,7 @@
             mProvider.update(uri, value, null, null);
             cursor = mProvider.query(ContactMethods.CONTENT_URI,
                     CONTACT_METHODS_PROJECTION,
-                    "contact_methods._id" + " = " + id, null, null);
+                    "contact_methods._id" + " = " + id, null, null, null);
             assertTrue(cursor.moveToNext());
             assertEquals(peopleId, cursor.getInt(PERSON_ID_INDEX));
             assertEquals(updateData, cursor.getString(DATA_INDEX));
@@ -583,7 +581,7 @@
             mProvider.delete(uri, null, null);
             cursor = mProvider.query(ContactMethods.CONTENT_URI,
                     CONTACT_METHODS_PROJECTION,
-                    "contact_methods._id" + " = " + id, null, null);
+                    "contact_methods._id" + " = " + id, null, null, null);
             assertEquals(0, cursor.getCount());
             cursor.close();
 
@@ -631,7 +629,7 @@
             Cursor cursor = mProvider.query(
                     Settings.CONTENT_URI, SETTINGS_PROJECTION,
                     Settings.KEY + " = ?",
-                    new String[] {insertKey}, null);
+                    new String[] {insertKey}, null, null);
             assertTrue(cursor.moveToNext());
             assertNull(cursor.getString(SYNC_ACCOUNT_NAME_INDEX));
             assertNull(cursor.getString(SYNC_ACCOUNT_TYPE_INDEX));
@@ -650,7 +648,7 @@
             cursor = mProvider.query(
                     Settings.CONTENT_URI, SETTINGS_PROJECTION,
                     Settings.KEY + " = ?",
-                    new String[] {updateKey}, null);
+                    new String[] {updateKey}, null, null);
             assertTrue(cursor.moveToNext());
             assertNull(cursor.getString(SYNC_ACCOUNT_NAME_INDEX));
             assertNull(cursor.getString(SYNC_ACCOUNT_TYPE_INDEX));
@@ -660,7 +658,7 @@
             cursor = mProvider.query(
                     Settings.CONTENT_URI, SETTINGS_PROJECTION,
                     Settings.KEY + " = ?",
-                    new String[] {insertKey}, null);
+                    new String[] {insertKey}, null, null);
             assertTrue(cursor.moveToNext());
             assertNull(cursor.getString(SYNC_ACCOUNT_NAME_INDEX));
             assertNull(cursor.getString(SYNC_ACCOUNT_TYPE_INDEX));
@@ -678,7 +676,7 @@
             cursor = mProvider.query(
                     Settings.CONTENT_URI, SETTINGS_PROJECTION,
                     Settings.KEY + " = ?",
-                    new String[] {insertKey}, null);
+                    new String[] {insertKey}, null, null);
             assertTrue(cursor.moveToNext());
             assertNull(cursor.getString(SYNC_ACCOUNT_NAME_INDEX));
             assertNull(cursor.getString(SYNC_ACCOUNT_TYPE_INDEX));
@@ -688,7 +686,7 @@
             cursor = mProvider.query(
                     Settings.CONTENT_URI, SETTINGS_PROJECTION,
                     Settings.KEY + " = ?",
-                    new String[] {updateKey}, null);
+                    new String[] {updateKey}, null, null);
             assertTrue(cursor.moveToNext());
             assertNull(cursor.getString(SYNC_ACCOUNT_NAME_INDEX));
             assertNull(cursor.getString(SYNC_ACCOUNT_TYPE_INDEX));
@@ -744,7 +742,7 @@
             Cursor cursor = mProvider.query(
                     Extensions.CONTENT_URI, EXTENSIONS_PROJECTION,
                     Extensions.PERSON_ID + " = " + peopleId,
-                    null, null);
+                    null, null, null);
             assertTrue(cursor.moveToNext());
             assertEquals(insertName, cursor.getString(NAME_INDEX));
             assertEquals(insertValue, cursor.getString(VALUE_INDEX));
@@ -760,7 +758,7 @@
             cursor = mProvider.query(Extensions.CONTENT_URI,
                     EXTENSIONS_PROJECTION,
                     Extensions.PERSON_ID + " = " + peopleId,
-                    null, null);
+                    null, null, null);
             assertTrue(cursor.moveToNext());
             assertEquals(updateName, cursor.getString(NAME_INDEX));
             assertEquals(updateValue, cursor.getString(VALUE_INDEX));
@@ -772,7 +770,7 @@
             cursor = mProvider.query(Extensions.CONTENT_URI,
                     EXTENSIONS_PROJECTION,
                     Extensions.PERSON_ID + " = " + peopleId,
-                    null, null);
+                    null, null, null);
             assertEquals(0, cursor.getCount());
             cursor.close();
         } catch (RemoteException e) {
@@ -819,7 +817,7 @@
             Cursor cursor = mProvider.query(
                     GroupMembership.CONTENT_URI, GROUP_MEMBERSHIP_PROJECTION,
                     GroupMembership.PERSON_ID + " = " + peopleId,
-                    null, null);
+                    null, null, null);
 
             // Check that the person has been associated with the group. The person may be in
             // additional groups by being added automatically.
@@ -852,7 +850,7 @@
             cursor = mProvider.query(GroupMembership.CONTENT_URI,
                     GROUP_MEMBERSHIP_PROJECTION,
                     "groupmembership._id" + " = " + id,
-                    null, null);
+                    null, null, null);
             assertEquals(0, cursor.getCount());
             cursor.close();
 
diff --git a/tests/tests/provider/src/android/provider/cts/Contacts_ContactMethodsTest.java b/tests/tests/provider/src/android/provider/cts/Contacts_ContactMethodsTest.java
index 2c8945a..fc6e267 100644
--- a/tests/tests/provider/src/android/provider/cts/Contacts_ContactMethodsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/Contacts_ContactMethodsTest.java
@@ -23,45 +23,11 @@
 
 import com.android.internal.R;
 
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
-@TestTargetClass(android.provider.Contacts.ContactMethods.class)
 public class Contacts_ContactMethodsTest extends AndroidTestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test addPostalLocation function",
-        method = "addPostalLocation",
-        args = {android.content.Context.class, long.class, double.class, double.class}
-    )
-    @ToBeFixed(explanation = "This function is not static, but we can't new a" +
-            " instance to call it because the constructor is private.")
     public void testAddPostalLocation() {
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods which encode or decode protocol",
-            method = "encodePredefinedImProtocol",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods which encode or decode protocol",
-            method = "encodeCustomImProtocol",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods which encode or decode protocol",
-            method = "decodeImProtocol",
-            args = {java.lang.String.class}
-        )
-    })
     public void testEncodeAndDecodeProtocol() {
         int protocol = ContactMethods.PROTOCOL_AIM;
         String encodedString = ContactMethods.encodePredefinedImProtocol(protocol);
@@ -85,12 +51,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getDisplayLabel(Context context, int kind, int type, CharSequence label)",
-        method = "getDisplayLabel",
-        args = {android.content.Context.class, int.class, int.class, java.lang.CharSequence.class}
-    )
     public void test() {
         String label = "label";
         String display = ContactMethods.getDisplayLabel(getContext(), Contacts.KIND_EMAIL,
diff --git a/tests/tests/provider/src/android/provider/cts/Contacts_OrganizationsTest.java b/tests/tests/provider/src/android/provider/cts/Contacts_OrganizationsTest.java
index cf43430..1410a34 100644
--- a/tests/tests/provider/src/android/provider/cts/Contacts_OrganizationsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/Contacts_OrganizationsTest.java
@@ -19,19 +19,8 @@
 import android.content.Context;
 import android.provider.Contacts.Organizations;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(android.provider.Contacts.Organizations.class)
 public class Contacts_OrganizationsTest extends AndroidTestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getDisplayLabel(Context context, int type, CharSequence label",
-        method = "getDisplayLabel",
-        args = {android.content.Context.class, int.class, java.lang.CharSequence.class}
-    )
     public void testGetDisplayLabel() {
         String label = "label";
         String display = Organizations.getDisplayLabel(getContext(),
diff --git a/tests/tests/provider/src/android/provider/cts/Contacts_PeopleTest.java b/tests/tests/provider/src/android/provider/cts/Contacts_PeopleTest.java
index b9d26e6..d634d30 100644
--- a/tests/tests/provider/src/android/provider/cts/Contacts_PeopleTest.java
+++ b/tests/tests/provider/src/android/provider/cts/Contacts_PeopleTest.java
@@ -16,16 +16,12 @@
 
 package android.provider.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
+import android.content.ContentProviderClient;
 import android.content.ContentResolver;
 import android.content.ContentUris;
 import android.content.ContentValues;
 import android.content.Context;
-import android.content.IContentProvider;
 import android.database.Cursor;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
@@ -42,10 +38,9 @@
 import java.util.ArrayList;
 import java.util.List;
 
-@TestTargetClass(android.provider.Contacts.People.class)
 public class Contacts_PeopleTest extends InstrumentationTestCase {
     private ContentResolver mContentResolver;
-    private IContentProvider mProvider;
+    private ContentProviderClient mProvider;
 
     private ArrayList<Uri> mPeopleRowsAdded;
     private ArrayList<Uri> mGroupRowsAdded;
@@ -72,7 +67,7 @@
     protected void setUp() throws Exception {
         super.setUp();
         mContentResolver = getInstrumentation().getTargetContext().getContentResolver();
-        mProvider = mContentResolver.acquireProvider(Contacts.AUTHORITY);
+        mProvider = mContentResolver.acquireContentProviderClient(Contacts.AUTHORITY);
 
         mPeopleRowsAdded = new ArrayList<Uri>();
         mGroupRowsAdded = new ArrayList<Uri>();
@@ -115,38 +110,6 @@
         super.tearDown();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods which add person to a group",
-            method = "addToMyContactsGroup",
-            args = {android.content.ContentResolver.class, long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods which add person to a group",
-            method = "addToGroup",
-            args = {android.content.ContentResolver.class, long.class, long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods which add person to a group",
-            method = "addToGroup",
-            args = {android.content.ContentResolver.class, long.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods which add person to a group",
-            method = "queryGroups",
-            args = {android.content.ContentResolver.class, long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods which add person to a group",
-            method = "createPersonInMyContactsGroup",
-            args = {android.content.ContentResolver.class, android.content.ContentValues.class}
-        )
-    })
     public void testAddToGroup() {
         Cursor cursor;
         try {
@@ -157,13 +120,13 @@
 
             // People: test_people_0, Group: Groups.GROUP_MY_CONTACTS
             cursor = mProvider.query(mPeopleRowsAdded.get(0), PEOPLE_PROJECTION,
-                    null, null, null);
+                    null, null, null, null);
             cursor.moveToFirst();
             int personId = cursor.getInt(PEOPLE_ID_INDEX);
             cursor.close();
             mRowsAdded.add(People.addToMyContactsGroup(mContentResolver, personId));
             cursor = mProvider.query(Groups.CONTENT_URI, GROUPS_PROJECTION,
-                    Groups.SYSTEM_ID + "='" + Groups.GROUP_MY_CONTACTS + "'", null, null);
+                    Groups.SYSTEM_ID + "='" + Groups.GROUP_MY_CONTACTS + "'", null, null, null);
             cursor.moveToFirst();
             int groupId = cursor.getInt(GROUPS_ID_INDEX);
             cursor.close();
@@ -180,14 +143,14 @@
             values.put(People.LAST_TIME_CONTACTED, 0);
             mRowsAdded.add(People.createPersonInMyContactsGroup(mContentResolver, values));
             cursor = mProvider.query(People.CONTENT_URI, PEOPLE_PROJECTION,
-                    People.NAME + " = 'test_people_create'", null, null);
+                    People.NAME + " = 'test_people_create'", null, null, null);
 
             cursor.moveToFirst();
             personId = cursor.getInt(PEOPLE_ID_INDEX);
             mRowsAdded.add(ContentUris.withAppendedId(People.CONTENT_URI, personId));
             cursor.close();
             cursor = mProvider.query(Groups.CONTENT_URI, GROUPS_PROJECTION,
-                    Groups.SYSTEM_ID + "='" + Groups.GROUP_MY_CONTACTS + "'", null, null);
+                    Groups.SYSTEM_ID + "='" + Groups.GROUP_MY_CONTACTS + "'", null, null, null);
             cursor.moveToFirst();
             groupId = cursor.getInt(GROUPS_ID_INDEX);
             cursor.close();
@@ -199,12 +162,12 @@
 
             // People: test_people_1, Group: test_group_0
             cursor = mProvider.query(mPeopleRowsAdded.get(1), PEOPLE_PROJECTION,
-                    null, null, null);
+                    null, null, null, null);
             cursor.moveToFirst();
             personId = cursor.getInt(PEOPLE_ID_INDEX);
             cursor.close();
             cursor = mProvider.query(mGroupRowsAdded.get(0), GROUPS_PROJECTION,
-                    null, null, null);
+                    null, null, null, null);
             cursor.moveToFirst();
             groupId = cursor.getInt(GROUPS_ID_INDEX);
             cursor.close();
@@ -224,7 +187,7 @@
 
             // People: test_people_2, Group: test_group_1
             cursor = mProvider.query(mPeopleRowsAdded.get(2), PEOPLE_PROJECTION,
-                    null, null, null);
+                    null, null, null, null);
             cursor.moveToFirst();
             personId = cursor.getInt(PEOPLE_ID_INDEX);
             cursor.close();
@@ -241,7 +204,7 @@
             found = false;
             for (int id : groupIds) {
                 cursor = mProvider.query(Groups.CONTENT_URI, GROUPS_PROJECTION,
-                        Groups._ID + "=" + id, null, null);
+                        Groups._ID + "=" + id, null, null, null);
                 cursor.moveToFirst();
                 if (groupName.equals(cursor.getString(GROUPS_NAME_INDEX))) {
                     found = true;
@@ -255,24 +218,18 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test markAsContacted(ContentResolver resolver, long personId)",
-        method = "markAsContacted",
-        args = {android.content.ContentResolver.class, long.class}
-    )
     public void testMarkAsContacted() {
         Cursor cursor;
         try {
             cursor = mProvider.query(mPeopleRowsAdded.get(0), PEOPLE_PROJECTION,
-                    null, null, null);
+                    null, null, null, null);
             cursor.moveToFirst();
             int personId = cursor.getInt(PEOPLE_ID_INDEX);
             long oldLastContacted = cursor.getLong(PEOPLE_LAST_CONTACTED_INDEX);
             cursor.close();
             People.markAsContacted(mContentResolver, personId);
             cursor = mProvider.query(mPeopleRowsAdded.get(0), PEOPLE_PROJECTION,
-                    null, null, null);
+                    null, null, null, null);
             cursor.moveToFirst();
             long lastContacted = cursor.getLong(PEOPLE_LAST_CONTACTED_INDEX);
             assertTrue(oldLastContacted < lastContacted);
@@ -281,7 +238,7 @@
 
             People.markAsContacted(mContentResolver, personId);
             cursor = mProvider.query(mPeopleRowsAdded.get(0), PEOPLE_PROJECTION,
-                    null, null, null);
+                    null, null, null, null);
             cursor.moveToFirst();
             lastContacted = cursor.getLong(PEOPLE_LAST_CONTACTED_INDEX);
             assertTrue(oldLastContacted < lastContacted);
@@ -291,27 +248,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods access the photo data of person",
-            method = "setPhotoData",
-            args = {android.content.ContentResolver.class, android.net.Uri.class, byte[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods access the photo data of person",
-            method = "loadContactPhoto",
-            args = {android.content.Context.class, android.net.Uri.class, int.class,
-                    android.graphics.BitmapFactory.Options.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods access the photo data of person",
-            method = "openContactPhotoInputStream",
-            args = {android.content.ContentResolver.class, android.net.Uri.class}
-        )
-    })
     public void testAccessPhotoData() {
         Context context = getInstrumentation().getTargetContext();
         try {
@@ -346,4 +282,3 @@
         }
     }
 }
-
diff --git a/tests/tests/provider/src/android/provider/cts/Contacts_PhonesTest.java b/tests/tests/provider/src/android/provider/cts/Contacts_PhonesTest.java
index 4121132..efd321d 100644
--- a/tests/tests/provider/src/android/provider/cts/Contacts_PhonesTest.java
+++ b/tests/tests/provider/src/android/provider/cts/Contacts_PhonesTest.java
@@ -19,19 +19,8 @@
 import android.content.Context;
 import android.provider.Contacts.Phones;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(android.provider.Contacts.Phones.class)
 public class Contacts_PhonesTest extends AndroidTestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getDisplayLabel(Context context, int type,  CharSequence label)",
-        method = "getDisplayLabel",
-        args = {android.content.Context.class, int.class, java.lang.CharSequence.class}
-    )
     public void testGetDisplayLabel() {
         CharSequence label = "label";
         String display = Phones.getDisplayLabel(getContext(),
@@ -69,13 +58,6 @@
         assertEquals(labels[Phones.TYPE_OTHER - 1], display);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getDisplayLabel which need specify a labelArray",
-        method = "getDisplayLabel",
-        args = {android.content.Context.class, int.class, java.lang.CharSequence.class, 
-                java.lang.CharSequence[].class}
-    )
     public void testGetDisplayLabelCharSequenceArray() {
         CharSequence label = "label";
         CharSequence[] labelArray = new CharSequence[] {
diff --git a/tests/tests/provider/src/android/provider/cts/Contacts_SettingsTest.java b/tests/tests/provider/src/android/provider/cts/Contacts_SettingsTest.java
index 8b13386..0cb7da5 100644
--- a/tests/tests/provider/src/android/provider/cts/Contacts_SettingsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/Contacts_SettingsTest.java
@@ -17,85 +17,18 @@
 package android.provider.cts;
 
 import android.content.ContentResolver;
-import android.content.ContentValues;
-import android.content.IContentProvider;
-import android.provider.Contacts;
 import android.provider.Contacts.Settings;
 import android.test.InstrumentationTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
-import java.util.ArrayList;
-
-@TestTargetClass(android.provider.Contacts.Settings.class)
 public class Contacts_SettingsTest extends InstrumentationTestCase {
     private ContentResolver mContentResolver;
-    private IContentProvider mProvider;
 
-    // the backup for the setting tables which we will modified in test cases
-    private ArrayList<ContentValues> mSettingBackup;
-
-    @ToBeFixed(explanation = "The URL: content://contacts/settings does not support" +
-            " deleting operation, that makes the table's status can't be recovered.")
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         mContentResolver = getInstrumentation().getTargetContext().getContentResolver();
-        mProvider = mContentResolver.acquireProvider(Contacts.AUTHORITY);
-        mSettingBackup = new ArrayList<ContentValues>();
-
-        // backup the current contents in database
-//        Cursor cursor = mProvider.query(Settings.CONTENT_URI, null, null, null, null);
-//        if (cursor.moveToFirst()) {
-//            while (!cursor.isAfterLast()) {
-//                ContentValues value = new ContentValues();
-//
-//                value.put(Settings._ID, cursor.getInt(0));
-//                value.put(Settings._SYNC_ACCOUNT, cursor.getString(1));
-//                value.put(Settings.KEY, cursor.getString(2));
-//                value.put(Settings.VALUE, cursor.getString(3));
-//                mSettingBackup.add(value);
-//
-//                cursor.moveToNext();
-//            }
-//        }
-//        cursor.close();
     }
 
-    @Override
-    protected void tearDown() throws Exception {
-        // NOTE: because we cannot delete the URL: content://contacts/settings,
-        // the contents added by test cases can't be removed.
-//        // clear all contents in current database.
-//        mProvider.delete(Settings.CONTENT_URI, null, null);
-//
-//        // recover the old backup contents
-//        for (ContentValues value : mSettingBackup) {
-//            mProvider.insert(Settings.CONTENT_URI, value);
-//        }
-
-        super.tearDown();
-    }
-
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods which access setting",
-            method = "getSetting",
-            args = {android.content.ContentResolver.class, java.lang.String.class, 
-                    java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods which access setting",
-            method = "setSetting",
-            args = {android.content.ContentResolver.class, java.lang.String.class, 
-                    java.lang.String.class, java.lang.String.class}
-        )
-    })
     public void testAccessSetting() {
         String key1 = "key 1";
         String value1 = "value 1";
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_AudioTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_AudioTest.java
index 2a37a00..79118dd 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_AudioTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_AudioTest.java
@@ -16,15 +16,11 @@
 
 package android.provider.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.provider.MediaStore.Audio;
 
 import junit.framework.TestCase;
 
-@TestTargetClass(Audio.class)
 public class MediaStore_AudioTest extends TestCase {
     private String mKeyForBeatles;
 
@@ -34,11 +30,6 @@
         mKeyForBeatles = Audio.keyFor("beatles");
     }
 
-    @TestTargetNew(
-      level = TestLevel.COMPLETE,
-      method = "keyFor",
-      args = {String.class}
-    )
     public void testKeyFor() {
         assertEquals(mKeyForBeatles, Audio.keyFor("[beatles]"));
         assertEquals(mKeyForBeatles, Audio.keyFor("(beatles)"));
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 00bb47d..9ac91c1 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
@@ -16,10 +16,6 @@
 
 package android.provider.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
 import android.content.ContentResolver;
 import android.content.ContentValues;
@@ -30,7 +26,6 @@
 import android.provider.cts.MediaStoreAudioTestHelper.Audio2;
 import android.test.InstrumentationTestCase;
 
-@TestTargetClass(Albums.class)
 public class MediaStore_Audio_AlbumsTest extends InstrumentationTestCase {
     private ContentResolver mContentResolver;
 
@@ -41,13 +36,6 @@
         mContentResolver = getInstrumentation().getContext().getContentResolver();
     }
 
-    @TestTargetNew(
-      level = TestLevel.SUFFICIENT,
-      method = "getContentUri",
-      args = {String.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. This is no "
-            + "document which describs possible values of the param volumeName.")
     public void testGetContentUri() {
         assertNotNull(mContentResolver.query(
                 Albums.getContentUri(MediaStoreAudioTestHelper.INTERNAL_VOLUME_NAME), null, null,
@@ -61,14 +49,10 @@
         assertNull(mContentResolver.query(Albums.getContentUri(volume), null, null, null, null));
     }
 
-    @ToBeFixed(bug = "", explanation = "The result cursor of query for all columns does not "
-            + "contain column Albums.ALBUM_ID and Albums.NUMBER_OF_SONGS_FOR_ARTIST.")
     public void testStoreAudioAlbumsInternal() {
         testStoreAudioAlbums(true);
     }
 
-    @ToBeFixed(bug = "", explanation = "The result cursor of query for all columns does not "
-            + "contain column Albums.ALBUM_ID and Albums.NUMBER_OF_SONGS_FOR_ARTIST.")
     public void testStoreAudioAlbumsExternal() {
         testStoreAudioAlbums(false);
     }
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 a7ef2d1..2e3cc1b 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
@@ -16,10 +16,6 @@
 
 package android.provider.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
 import android.content.ContentResolver;
 import android.content.ContentValues;
@@ -30,7 +26,6 @@
 import android.provider.cts.MediaStoreAudioTestHelper.Audio2;
 import android.test.InstrumentationTestCase;
 
-@TestTargetClass(Artists.class)
 public class MediaStore_Audio_ArtistsTest extends InstrumentationTestCase {
     private ContentResolver mContentResolver;
 
@@ -41,13 +36,6 @@
         mContentResolver = getInstrumentation().getContext().getContentResolver();
     }
 
-    @TestTargetNew(
-      level = TestLevel.COMPLETE,
-      method = "getContentUri",
-      args = {String.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. This is no "
-            + "document which describs possible values of the param volumeName.")
     public void testGetContentUri() {
         assertNotNull(mContentResolver.query(
                 Artists.getContentUri(MediaStoreAudioTestHelper.INTERNAL_VOLUME_NAME), null, null,
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_Artists_AlbumsTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_Artists_AlbumsTest.java
index c450939..fdba619 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_Artists_AlbumsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_Artists_AlbumsTest.java
@@ -16,10 +16,6 @@
 
 package android.provider.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
 import android.content.ContentResolver;
 import android.content.ContentValues;
@@ -32,7 +28,6 @@
 import android.provider.cts.MediaStoreAudioTestHelper.Audio2;
 import android.test.InstrumentationTestCase;
 
-@TestTargetClass(Albums.class)
 public class MediaStore_Audio_Artists_AlbumsTest extends InstrumentationTestCase {
     private ContentResolver mContentResolver;
 
@@ -43,13 +38,6 @@
         mContentResolver = getInstrumentation().getContext().getContentResolver();
     }
 
-    @TestTargetNew(
-      level = TestLevel.COMPLETE,
-      method = "getContentUri",
-      args = {String.class, long.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. This is no "
-            + "document which describs possible values of the param volumeName.")
     public void testGetContentUri() {
         Uri contentUri = MediaStore.Audio.Artists.Albums.getContentUri(
                 MediaStoreAudioTestHelper.INTERNAL_VOLUME_NAME, 1);
@@ -64,14 +52,10 @@
                 null, null, null, null));
     }
 
-    @ToBeFixed(bug = "", explanation = "The result cursor of query for all columns does not "
-            + "contain the column Albums.ALBUM_ID.")
     public void testStoreAudioArtistsAlbumsInternal() {
         testStoreAudioArtistsAlbums(true);
     }
 
-    @ToBeFixed(bug = "", explanation = "The result cursor of query for all columns does not "
-            + "contain the column Albums.ALBUM_ID.")
     public void testStoreAudioArtistsAlbumsExternal() {
         testStoreAudioArtistsAlbums(false);
     }
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 aa364b4..2e389b6 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
@@ -16,10 +16,6 @@
 
 package android.provider.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
 import android.content.ContentResolver;
 import android.content.ContentValues;
@@ -33,7 +29,6 @@
 import android.provider.cts.MediaStoreAudioTestHelper.Audio2;
 import android.test.InstrumentationTestCase;
 
-@TestTargetClass(Members.class)
 public class MediaStore_Audio_Genres_MembersTest extends InstrumentationTestCase {
     private ContentResolver mContentResolver;
 
@@ -61,20 +56,14 @@
 
     @Override
     protected void tearDown() throws Exception {
+        // "jam" should already have been deleted as part of the test, but delete it again just
+        // in case the test failed and aborted before that.
         mContentResolver.delete(Media.EXTERNAL_CONTENT_URI, Media._ID + "=" + mAudioIdOfJam, null);
         mContentResolver.delete(Media.EXTERNAL_CONTENT_URI, Media._ID + "=" + mAudioIdOfJamLive,
                 null);
         super.tearDown();
     }
 
-    @TestTargetNew(
-      level = TestLevel.COMPLETE,
-      method = "getContentUri",
-      args = {String.class, long.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. There is no "
-            + "document related to the possible values of param volumeName. @throw clause "
-            + "should be added in to javadoc when getting uri for internal volume.")
     public void testGetContentUri() {
         assertNotNull(mContentResolver.query(
                 Members.getContentUri(MediaStoreAudioTestHelper.EXTERNAL_VOLUME_NAME, 1), null,
@@ -259,6 +248,47 @@
             assertEquals(0, c.getCount());
             c.close();
 
+            // same for 2nd genre
+            assertEquals(1, mContentResolver.delete(members2Uri, null, null));
+            c = mContentResolver.query(members2Uri, null, null, null, null);
+            assertEquals(0, c.getCount());
+            c.close();
+
+            // insert again, then verify that deleting the audio entry cleans up its genre member
+            // entry as well
+            values.put(Members.AUDIO_ID, mAudioIdOfJam);
+            membersUri = Members.getContentUri(MediaStoreAudioTestHelper.EXTERNAL_VOLUME_NAME,
+                    genreId);
+            assertNotNull(mContentResolver.insert(membersUri, values));
+            // Query members across all genres
+            c = mContentResolver.query(allMembersUri,
+                    new String[] { Members.AUDIO_ID, Members.GENRE_ID}, null, null, null);
+            colidx = c.getColumnIndex(Members.AUDIO_ID);
+            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();
+            mContentResolver.delete(Media.EXTERNAL_CONTENT_URI,
+                    Media._ID + "=" + mAudioIdOfJam, null);
+            // Query members across all genres
+            c = mContentResolver.query(allMembersUri,
+                    new String[] { Members.AUDIO_ID, Members.GENRE_ID}, null, null, null);
+            colidx = c.getColumnIndex(Members.AUDIO_ID);
+            jamcnt = 0;
+            // The song should no longer appear in the genre
+            while(c.moveToNext()) {
+                if (c.getLong(colidx) == mAudioIdOfJam) {
+                    jamcnt++;
+                }
+            }
+            assertEquals(0, jamcnt);
+            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);
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 a964f64..8a4e3ee 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
@@ -16,10 +16,6 @@
 
 package android.provider.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
 import android.content.ContentResolver;
 import android.content.ContentValues;
@@ -31,7 +27,6 @@
 import android.provider.cts.MediaStoreAudioTestHelper.Audio2;
 import android.test.InstrumentationTestCase;
 
-@TestTargetClass(Media.class)
 public class MediaStore_Audio_MediaTest extends InstrumentationTestCase {
     private ContentResolver mContentResolver;
 
@@ -42,11 +37,6 @@
         mContentResolver = getInstrumentation().getContext().getContentResolver();
     }
 
-    @TestTargetNew(
-      level = TestLevel.COMPLETE,
-      method = "getContentUri",
-      args = {String.class}
-    )
     public void testGetContentUri() {
         assertNotNull(mContentResolver.query(
                 Media.getContentUri(MediaStoreAudioTestHelper.INTERNAL_VOLUME_NAME), null, null,
@@ -60,11 +50,6 @@
         assertNull(mContentResolver.query(Media.getContentUri(volume), null, null, null, null));
     }
 
-    @TestTargetNew(
-      level = TestLevel.COMPLETE,
-      method = "getContentUriForPath",
-      args = {String.class}
-    )
     public void testGetContentUriForPath() {
         String externalPath = Environment.getExternalStorageDirectory().getPath();
         assertNotNull(mContentResolver.query(Media.getContentUriForPath(externalPath), null, null,
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_PlaylistsTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_PlaylistsTest.java
index 48ae5d7..19fa2e1 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_PlaylistsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_Audio_PlaylistsTest.java
@@ -16,10 +16,6 @@
 
 package android.provider.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
 import android.content.ContentResolver;
 import android.content.ContentValues;
@@ -32,7 +28,6 @@
 
 import java.util.regex.Pattern;
 
-@TestTargetClass(Playlists.class)
 public class MediaStore_Audio_PlaylistsTest extends InstrumentationTestCase {
     private ContentResolver mContentResolver;
 
@@ -43,13 +38,6 @@
         mContentResolver = getInstrumentation().getContext().getContentResolver();
     }
 
-    @TestTargetNew(
-      level = TestLevel.COMPLETE,
-      method = "getContentUri",
-      args = {String.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. @throw clause "
-            + "should be added in to javadoc when getting uri for internal volume.")
     public void testGetContentUri() {
         assertNotNull(mContentResolver.query(
                 Playlists.getContentUri(MediaStoreAudioTestHelper.EXTERNAL_VOLUME_NAME), 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 62aa208..e758a87 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
@@ -16,9 +16,6 @@
 
 package android.provider.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.content.ContentResolver;
 import android.content.ContentValues;
@@ -34,7 +31,6 @@
 
 import java.util.regex.Pattern;
 
-@TestTargetClass(Members.class)
 public class MediaStore_Audio_Playlists_MembersTest extends InstrumentationTestCase {
     private String[] mAudioProjection = {
             Members._ID,
@@ -124,11 +120,6 @@
         super.tearDown();
     }
 
-    @TestTargetNew(
-      level = TestLevel.COMPLETE,
-      method = "getContentUri",
-      args = {String.class, long.class}
-    )
     public void testGetContentUri() {
         assertEquals("content://media/external/audio/playlists/1337/members",
                 Members.getContentUri("external", 1337).toString());
@@ -351,6 +342,46 @@
             assertEquals(2, result);
             result = mContentResolver.delete(members2Uri, null, null);
             assertEquals(1, result);
+
+            // insert again, then verify that deleting the audio entry cleans up its playlist member
+            // entry as well
+            values.clear();
+            values.put(Members.AUDIO_ID, mIdOfAudio1);
+            values.put(Members.PLAY_ORDER, 1);
+            membersUri = Members.getContentUri(MediaStoreAudioTestHelper.EXTERNAL_VOLUME_NAME,
+                    playlistId);
+            audioUri = mContentResolver.insert(membersUri, values);
+            assertNotNull(audioUri);
+            // Query members of the playlist
+            c = mContentResolver.query(membersUri,
+                    new String[] { Members.AUDIO_ID, Members.PLAYLIST_ID}, null, null, null);
+            colidx = c.getColumnIndex(Members.AUDIO_ID);
+            cnt = 0;
+            // The song should appear only once, for the playlist we used when inserting it
+            while(c.moveToNext()) {
+                if (c.getLong(colidx) == mIdOfAudio1) {
+                    cnt++;
+                    assertEquals(playlistId, c.getLong(c.getColumnIndex(Members.PLAYLIST_ID)));
+                }
+            }
+            assertEquals(1, cnt);
+            c.close();
+            mContentResolver.delete(Media.EXTERNAL_CONTENT_URI,
+                    Media._ID + "=" + mIdOfAudio1, null);
+            // Query members of the playlist
+            c = mContentResolver.query(membersUri,
+                    new String[] { Members.AUDIO_ID, Members.PLAYLIST_ID}, null, null, null);
+            colidx = c.getColumnIndex(Members.AUDIO_ID);
+            cnt = 0;
+            // The song should no longer appear in the playlist
+            while(c.moveToNext()) {
+                if (c.getLong(colidx) == mIdOfAudio1) {
+                    cnt++;
+                }
+            }
+            assertEquals(0, cnt);
+            c.close();
+
         } finally {
             // delete the playlists
             mContentResolver.delete(Playlists.EXTERNAL_CONTENT_URI,
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 5203326..e746e74 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
@@ -26,6 +26,7 @@
 import android.graphics.BitmapFactory;
 import android.net.Uri;
 import android.os.Environment;
+import android.os.cts.FileUtils;
 import android.provider.MediaStore.Images.Media;
 import android.provider.MediaStore.Images.Thumbnails;
 import android.test.InstrumentationTestCase;
@@ -193,7 +194,7 @@
                 "/testimage1.jpg";
 
         int numBytes = 1337;
-        FileCopyHelper.createFile(new File(externalPath), numBytes);
+        FileUtils.createFile(new File(externalPath), numBytes);
 
         ContentValues values = new ContentValues();
         values.put(Media.ORIENTATION, 0);
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_Images_ThumbnailsTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_Images_ThumbnailsTest.java
index 7ec7937..8ecea7b 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_Images_ThumbnailsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_Images_ThumbnailsTest.java
@@ -19,6 +19,7 @@
 import com.android.cts.stub.R;
 
 import android.content.ContentResolver;
+import android.content.ContentUris;
 import android.content.ContentValues;
 import android.content.Context;
 import android.database.Cursor;
@@ -26,10 +27,12 @@
 import android.graphics.BitmapFactory;
 import android.net.Uri;
 import android.os.Environment;
+import android.provider.MediaStore;
 import android.provider.MediaStore.Images.Media;
 import android.provider.MediaStore.Images.Thumbnails;
 import android.test.InstrumentationTestCase;
 
+import java.io.File;
 import java.util.ArrayList;
 
 public class MediaStore_Images_ThumbnailsTest extends InstrumentationTestCase {
@@ -118,13 +121,16 @@
         assertNotNull(stringUrl);
         mRowsAdded.add(Uri.parse(stringUrl));
 
-        // get the original image id
-        Cursor c = mContentResolver.query(Uri.parse(stringUrl), new String[]{ Media._ID }, null,
-                null, null);
+        // get the original image id and path
+        Cursor c = mContentResolver.query(Uri.parse(stringUrl),
+                new String[]{ Media._ID, Media.DATA }, null, null, null);
         c.moveToFirst();
         long imageId = c.getLong(c.getColumnIndex(Media._ID));
+        String imagePath = c.getString(c.getColumnIndex(Media.DATA));
         c.close();
 
+        assertTrue("image file does not exist", new File(imagePath).exists());
+
         String[] sizeProjection = new String[] { Thumbnails.WIDTH, Thumbnails.HEIGHT };
         c = Thumbnails.queryMiniThumbnail(mContentResolver, imageId, Thumbnails.MINI_KIND,
                 sizeProjection);
@@ -140,6 +146,68 @@
         assertEquals(50, c.getLong(c.getColumnIndex(Thumbnails.WIDTH)));
         assertEquals(50, c.getLong(c.getColumnIndex(Thumbnails.HEIGHT)));
         c.close();
+
+        c = Thumbnails.queryMiniThumbnail(mContentResolver, imageId, Thumbnails.MINI_KIND,
+                new String[] { Thumbnails._ID, Thumbnails.DATA, Thumbnails.IMAGE_ID});
+
+        c.moveToNext();
+        long img = c.getLong(c.getColumnIndex(Thumbnails.IMAGE_ID));
+        assertEquals(imageId, img);
+        String thumbPath = c.getString(c.getColumnIndex(Thumbnails.DATA));
+        assertTrue("thumbnail file does not exist", new File(thumbPath).exists());
+
+        // deleting the image from the database also deletes the image file, and the
+        // corresponding entry in the thumbnail table, which in turn triggers deletion
+        // of the thumbnail file on disk
+        mContentResolver.delete(Uri.parse(stringUrl), null, null);
+        mRowsAdded.remove(stringUrl);
+
+        assertFalse("image file should no longer exist", new File(imagePath).exists());
+
+        Cursor c2 = Thumbnails.queryMiniThumbnail(mContentResolver, imageId, Thumbnails.MINI_KIND,
+                new String[] { Thumbnails._ID, Thumbnails.DATA, Thumbnails.IMAGE_ID});
+        assertEquals(0, c2.getCount());
+        c2.close();
+
+        assertFalse("thumbnail file should no longer exist", new File(thumbPath).exists());
+        c.close();
+
+        // insert image, then delete it via the files table
+        stringUrl = Media.insertImage(mContentResolver, src, null, null);
+        c = mContentResolver.query(Uri.parse(stringUrl),
+                new String[]{ Media._ID, Media.DATA}, null, null, null);
+        c.moveToFirst();
+        imageId = c.getLong(c.getColumnIndex(Media._ID));
+        imagePath = c.getString(c.getColumnIndex(Media.DATA));
+        c.close();
+        assertTrue("image file does not exist", new File(imagePath).exists());
+        Uri fileuri = MediaStore.Files.getContentUri("external", imageId);
+        mContentResolver.delete(fileuri, null, null);
+        assertFalse("image file should no longer exist", new File(imagePath).exists());
+
+
+        // insert image, then delete its thumbnail
+        stringUrl = Media.insertImage(mContentResolver, src, null, null);
+        c = mContentResolver.query(Uri.parse(stringUrl),
+                new String[]{ Media._ID, Media.DATA}, null, null, null);
+        c.moveToFirst();
+        imageId = c.getLong(c.getColumnIndex(Media._ID));
+        imagePath = c.getString(c.getColumnIndex(Media.DATA));
+        c.close();
+        c2 = Thumbnails.queryMiniThumbnail(mContentResolver, imageId, Thumbnails.MINI_KIND,
+                new String[] { Thumbnails._ID, Thumbnails.DATA, Thumbnails.IMAGE_ID});
+        c2.moveToFirst();
+        thumbPath = c2.getString(c2.getColumnIndex(Thumbnails.DATA));
+        assertTrue("thumbnail file does not exist", new File(thumbPath).exists());
+
+        Uri imguri = Uri.parse(stringUrl);
+        long imgid = ContentUris.parseId(imguri);
+        assertEquals(imgid, imageId);
+        mRowsAdded.add(imguri);
+        mContentResolver.delete(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,
+                MediaStore.Images.Thumbnails.IMAGE_ID + "=?", new String[]{ "" + imgid});
+        assertFalse("thumbnail file should no longer exist", new File(thumbPath).exists());
+        assertTrue("image file should still exist", new File(imagePath).exists());
     }
 
     public void testGetContentUri() {
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_Video_MediaTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_Video_MediaTest.java
index 6f7842c..36612cf 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_Video_MediaTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_Video_MediaTest.java
@@ -16,37 +16,34 @@
 
 package android.provider.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
+
+import com.android.cts.stub.R;
 
 import android.content.ContentResolver;
 import android.content.ContentValues;
+import android.content.Context;
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.Environment;
+import android.os.cts.FileUtils;
 import android.provider.MediaStore;
 import android.provider.MediaStore.Video.Media;
-import android.test.InstrumentationTestCase;
+import android.provider.MediaStore.Video.VideoColumns;
+import android.test.AndroidTestCase;
 
 import java.io.File;
+import java.io.IOException;
 
-@TestTargetClass(MediaStore.Video.Media.class)
-public class MediaStore_Video_MediaTest extends InstrumentationTestCase {
+public class MediaStore_Video_MediaTest extends AndroidTestCase {
     private ContentResolver mContentResolver;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
 
-        mContentResolver = getInstrumentation().getContext().getContentResolver();
+        mContentResolver = getContext().getContentResolver();
     }
 
-    @TestTargetNew(
-      level = TestLevel.COMPLETE,
-      method = "getContentUri",
-      args = {String.class}
-    )
     public void testGetContentUri() {
         assertNotNull(mContentResolver.query(Media.getContentUri("internal"), null, null, null,
                 null));
@@ -65,7 +62,7 @@
                 "/video/testvideo1.3gp";
 
         int numBytes = 1337;
-        FileCopyHelper.createFile(new File(externalVideoPath), numBytes);
+        FileUtils.createFile(new File(externalVideoPath), numBytes);
 
         ContentValues values = new ContentValues();
         values.put(Media.ALBUM, "cts");
@@ -183,6 +180,24 @@
             // delete
             assertEquals(1, mContentResolver.delete(uri, null, null));
         }
+
+        // check that the video file is removed when deleting the database entry
+        Context context = getContext();
+        Uri videoUri = insertVideo(context);
+        File videofile = new File(Environment.getExternalStorageDirectory(), "testVideo.3gp");
+        assertTrue(videofile.exists());
+        mContentResolver.delete(videoUri, null, null);
+        assertFalse(videofile.exists());
+
+        // insert again, then delete with the "delete data" parameter set to false
+        videoUri = insertVideo(context);
+        assertTrue(videofile.exists());
+        Uri.Builder builder = videoUri.buildUpon();
+        builder.appendQueryParameter(MediaStore.PARAM_DELETE_DATA, "false");
+        mContentResolver.delete(builder.build(), null, null);
+        assertTrue(videofile.exists());
+        videofile.delete();
+
     }
 
     public void testStoreVideoMediaInternal() {
@@ -195,4 +210,13 @@
             // expected
         }
     }
+
+    private Uri insertVideo(Context context) throws IOException {
+        File file = new File(Environment.getExternalStorageDirectory(), "testVideo.3gp");
+        new FileCopyHelper(context).copyToExternalStorage(R.raw.testvideo, file);
+
+        ContentValues values = new ContentValues();
+        values.put(VideoColumns.DATA, file.getAbsolutePath());
+        return context.getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values);
+    }
 }
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_Video_ThumbnailsTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_Video_ThumbnailsTest.java
index 935b255..2a4b46c 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_Video_ThumbnailsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_Video_ThumbnailsTest.java
@@ -83,6 +83,22 @@
         // Check that an additional thumbnails have been registered.
         int count2 = getThumbnailCount(Thumbnails.EXTERNAL_CONTENT_URI);
         assertTrue(count2 > count);
+
+        Cursor c = mResolver.query(Thumbnails.EXTERNAL_CONTENT_URI,
+                new String[] { Thumbnails._ID, Thumbnails.DATA, Thumbnails.VIDEO_ID },
+                null, null, null);
+
+        if (c.moveToLast()) {
+            long vid = c.getLong(2);
+            assertEquals(videoId, vid);
+            String path = c.getString(1);
+            assertTrue("thumbnail file does not exist", new File(path).exists());
+            long id = c.getLong(0);
+            mResolver.delete(ContentUris.withAppendedId(Thumbnails.EXTERNAL_CONTENT_URI, id),
+                    null, null);
+            assertFalse("thumbnail file should no longer exist", new File(path).exists());
+        }
+        c.close();
     }
 
     private Uri insertVideo() throws IOException {
diff --git a/tests/tests/provider/src/android/provider/cts/SearchRecentSuggestionsTest.java b/tests/tests/provider/src/android/provider/cts/SearchRecentSuggestionsTest.java
index 1395de1..a17bcdd 100644
--- a/tests/tests/provider/src/android/provider/cts/SearchRecentSuggestionsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/SearchRecentSuggestionsTest.java
@@ -16,21 +16,15 @@
 
 package android.provider.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-
 import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.content.Context;
+import android.cts.util.PollingCheck;
 import android.database.Cursor;
 import android.net.Uri;
 import android.provider.SearchRecentSuggestions;
 import android.test.ProviderTestCase2;
-import android.view.animation.cts.DelayedCheck;
 
-@TestTargetClass(android.provider.SearchRecentSuggestions.class)
 public class SearchRecentSuggestionsTest extends
         ProviderTestCase2<TestSearchRecentSuggestionsProvider> {
     private final static String AUTHORITY_HEAD = "content://"
@@ -38,14 +32,14 @@
 
     private Uri mTestUri;
     private TestSearchRecentSuggestionsProvider mTestSRSProvider;
-    private Context mContext;
+    private Context mProviderContext;
 
     @Override
     public void setUp() throws Exception {
         super.setUp();
         mTestUri = Uri.parse(AUTHORITY_HEAD + "/suggestions");
         mTestSRSProvider = getProvider();
-        mContext = mTestSRSProvider.getContext();
+        mProviderContext = mTestSRSProvider.getContext();
     }
 
     public SearchRecentSuggestionsTest() {
@@ -53,40 +47,13 @@
                 TestSearchRecentSuggestionsProvider.AUTHORITY);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "SearchRecentSuggestions",
-        args = {android.content.Context.class, java.lang.String.class, int.class}
-    )
     public void testConstructor() {
-        new SearchRecentSuggestions(mContext, TestSearchRecentSuggestionsProvider.AUTHORITY,
+        new SearchRecentSuggestions(mProviderContext, TestSearchRecentSuggestionsProvider.AUTHORITY,
                 TestSearchRecentSuggestionsProvider.MODE);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "SearchRecentSuggestions",
-            args = {android.content.Context.class, java.lang.String.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "saveRecentQuery",
-            args = {java.lang.String.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "clearHistory",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "truncateHistory",
-            args = {android.content.ContentResolver.class, int.class}
-        )
-    })
     public void testSearchRecentSuggestions() {
-        MySearchRecentSuggestions srs = new MySearchRecentSuggestions(mContext,
+        SearchRecentSuggestions srs = new MySearchRecentSuggestions(mProviderContext,
                 TestSearchRecentSuggestionsProvider.AUTHORITY,
                 TestSearchRecentSuggestionsProvider.MODE);
         Cursor c = mTestSRSProvider.query(mTestUri, null, null, null, null);
@@ -123,8 +90,8 @@
             waitForCursorCount(mTestUri, null, 3);
 
             // truncateHistory will delete the oldest one record
-            ContentResolver cr = mContext.getContentResolver();
-            srs.truncateHistory(cr, 2);
+            ContentResolver cr = mProviderContext.getContentResolver();
+            ((MySearchRecentSuggestions) srs).truncateHistory(cr, 2);
 
             waitForCursorCount(mTestUri, SearchRecentSuggestions.QUERIES_PROJECTION_2LINE, 2);
 
@@ -220,6 +187,7 @@
             super(context, authority, mode);
         }
 
+        @Override
         protected void truncateHistory(ContentResolver cr, int maxEntries) {
             super.truncateHistory(cr, maxEntries);
         }
@@ -227,7 +195,8 @@
 
     private void waitForCursorCount(final Uri uri, final String[] projection,
             final int expectedCount) {
-        new DelayedCheck() {
+        new PollingCheck() {
+            @Override
             protected boolean check() {
                 Cursor cursor = null;
                 try {
diff --git a/tests/tests/provider/src/android/provider/cts/SettingsTest.java b/tests/tests/provider/src/android/provider/cts/SettingsTest.java
index 06fb4b4..601efce 100644
--- a/tests/tests/provider/src/android/provider/cts/SettingsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/SettingsTest.java
@@ -16,20 +16,17 @@
 
 package android.provider.cts;
 
-import dalvik.annotation.TestTargetClass;
 
+import android.content.ContentProviderClient;
 import android.content.ContentResolver;
 import android.content.ContentValues;
-import android.content.IContentProvider;
 import android.database.Cursor;
 import android.database.sqlite.SQLiteException;
 import android.net.Uri;
 import android.os.RemoteException;
 import android.provider.Settings;
 import android.test.AndroidTestCase;
-import android.util.Log;
 
-@TestTargetClass(android.provider.Settings.class)
 public class SettingsTest extends AndroidTestCase {
     public void testSystemTable() throws RemoteException {
         final String[] SYSTEM_PROJECTION = new String[] {
@@ -47,7 +44,8 @@
 
         // get provider
         ContentResolver cr = mContext.getContentResolver();
-        IContentProvider provider = cr.acquireProvider(Settings.System.CONTENT_URI);
+        ContentProviderClient provider =
+                cr.acquireContentProviderClient(Settings.System.CONTENT_URI);
         Cursor cursor = null;
 
         try {
@@ -58,7 +56,7 @@
 
             provider.insert(Settings.System.CONTENT_URI, value);
             cursor = provider.query(Settings.System.CONTENT_URI, SYSTEM_PROJECTION,
-                    Settings.System.NAME + "=\"" + insertName + "\"", null, null);
+                    Settings.System.NAME + "=\"" + insertName + "\"", null, null, null);
             assertNotNull(cursor);
             assertEquals(1, cursor.getCount());
             assertTrue(cursor.moveToFirst());
@@ -75,7 +73,7 @@
             provider.update(Settings.System.CONTENT_URI, value,
                     Settings.System.NAME + "=\"" + insertName + "\"", null);
             cursor = provider.query(Settings.System.CONTENT_URI, SYSTEM_PROJECTION,
-                    Settings.System._ID + " = " + Id, null, null);
+                    Settings.System._ID + " = " + Id, null, null, null);
             assertNotNull(cursor);
             assertEquals(1, cursor.getCount());
             assertTrue(cursor.moveToFirst());
@@ -87,7 +85,7 @@
             provider.delete(Settings.System.CONTENT_URI,
                     Settings.System.NAME + "=\"" + updateName + "\"", null);
             cursor = provider.query(Settings.System.CONTENT_URI, SYSTEM_PROJECTION,
-                    Settings.System._ID + " = " + Id, null, null);
+                    Settings.System._ID + " = " + Id, null, null, null);
             assertNotNull(cursor);
             assertEquals(0, cursor.getCount());
         } finally {
@@ -115,7 +113,7 @@
         // get provider
         Uri uri = Uri.parse("content://settings/bluetooth_devices");
         ContentResolver cr = mContext.getContentResolver();
-        IContentProvider provider = cr.acquireProvider(uri);
+        ContentProviderClient provider = cr.acquireContentProviderClient(uri);
         Cursor cursor = null;
 
         try {
@@ -128,7 +126,7 @@
 
             provider.insert(uri, value);
             cursor = provider.query(uri, BLUETOOTH_DEVICES_PROJECTION,
-                    "name=\"" + insertName + "\"", null, null);
+                    "name=\"" + insertName + "\"", null, null, null);
             assertNotNull(cursor);
             assertEquals(1, cursor.getCount());
             assertTrue(cursor.moveToFirst());
@@ -147,7 +145,7 @@
 
             provider.update(uri, value, "name=\"" + insertName + "\"", null);
             cursor = provider.query(uri, BLUETOOTH_DEVICES_PROJECTION,
-                    "name=\"" + updateName + "\"", null, null);
+                    "name=\"" + updateName + "\"", null, null, null);
             assertNotNull(cursor);
             assertEquals(1, cursor.getCount());
             assertTrue(cursor.moveToFirst());
@@ -158,7 +156,8 @@
 
             // Test: delete
             provider.delete(uri, "name=\"" + updateName + "\"", null);
-            cursor = provider.query(uri, BLUETOOTH_DEVICES_PROJECTION, "_id = " + Id, null, null);
+            cursor = provider.query(uri, BLUETOOTH_DEVICES_PROJECTION, "_id = " + Id,
+                    null, null, null);
             assertNotNull(cursor);
             assertEquals(0, cursor.getCount());
         } finally {
@@ -174,14 +173,16 @@
         };
 
         ContentResolver cr = mContext.getContentResolver();
-        IContentProvider provider = cr.acquireProvider(Settings.Secure.CONTENT_URI);
+        ContentProviderClient provider =
+                cr.acquireContentProviderClient(Settings.Secure.CONTENT_URI);
         assertNotNull(provider);
 
         // Test that the secure table can be read from.
         Cursor cursor = null;
         try {
             cursor = provider.query(Settings.Secure.CONTENT_URI, SECURE_PROJECTION,
-                    Settings.Secure.NAME + "=\"" + Settings.Secure.ADB_ENABLED + "\"", null, null);
+                    Settings.Secure.NAME + "=\"" + Settings.Secure.ADB_ENABLED + "\"",
+                    null, null, null);
             assertNotNull(cursor);
         } finally {
             if (cursor != null) {
diff --git a/tests/tests/provider/src/android/provider/cts/Settings_NameValueTableTest.java b/tests/tests/provider/src/android/provider/cts/Settings_NameValueTableTest.java
index a2c1cf8..72923cf 100644
--- a/tests/tests/provider/src/android/provider/cts/Settings_NameValueTableTest.java
+++ b/tests/tests/provider/src/android/provider/cts/Settings_NameValueTableTest.java
@@ -16,9 +16,6 @@
 
 package android.provider.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.content.ContentResolver;
 import android.database.Cursor;
@@ -27,14 +24,7 @@
 import android.provider.Settings.NameValueTable;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(android.provider.Settings.NameValueTable.class)
 public class Settings_NameValueTableTest extends AndroidTestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "putString",
-        args = {android.content.ContentResolver.class, android.net.Uri.class,
-                java.lang.String.class, java.lang.String.class}
-    )
     public void testPutString() {
         ContentResolver cr = mContext.getContentResolver();
         Uri uri = Settings.System.CONTENT_URI;
@@ -75,11 +65,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getUriFor",
-        args = {android.net.Uri.class, java.lang.String.class}
-    )
     public void testGetUriFor() {
         Uri uri = Uri.parse("content://authority/path");
         String name = "table";
diff --git a/tests/tests/provider/src/android/provider/cts/Settings_SecureTest.java b/tests/tests/provider/src/android/provider/cts/Settings_SecureTest.java
index 13a32d6..7166211 100644
--- a/tests/tests/provider/src/android/provider/cts/Settings_SecureTest.java
+++ b/tests/tests/provider/src/android/provider/cts/Settings_SecureTest.java
@@ -16,10 +16,6 @@
 
 package android.provider.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.ContentResolver;
 import android.net.Uri;
@@ -28,7 +24,6 @@
 import android.provider.Settings.SettingNotFoundException;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(android.provider.Settings.Secure.class)
 public class Settings_SecureTest extends AndroidTestCase {
 
     private static final String NO_SUCH_SETTING = "NoSuchSetting";
@@ -63,23 +58,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInt",
-            args = {android.content.ContentResolver.class, java.lang.String.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLong",
-            args = {android.content.ContentResolver.class, java.lang.String.class, long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFloat",
-            args = {android.content.ContentResolver.class, java.lang.String.class, float.class}
-        )
-    })
     public void testGetDefaultValues() {
         assertEquals(10, Secure.getInt(cr, "int", 10));
         assertEquals(20, Secure.getLong(cr, "long", 20));
@@ -166,11 +144,6 @@
         assertNull(Secure.getString(cr, NO_SUCH_SETTING));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getUriFor",
-        args = {java.lang.String.class}
-    )
     public void testGetUriFor() {
         String name = "table";
 
diff --git a/tests/tests/provider/src/android/provider/cts/Settings_SettingNotFoundExceptionTest.java b/tests/tests/provider/src/android/provider/cts/Settings_SettingNotFoundExceptionTest.java
index d1c1f55..e187a57 100644
--- a/tests/tests/provider/src/android/provider/cts/Settings_SettingNotFoundExceptionTest.java
+++ b/tests/tests/provider/src/android/provider/cts/Settings_SettingNotFoundExceptionTest.java
@@ -16,20 +16,11 @@
 
 package android.provider.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.provider.Settings.SettingNotFoundException;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(android.provider.Settings.SettingNotFoundException.class)
 public class Settings_SettingNotFoundExceptionTest extends AndroidTestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "Settings.SettingNotFoundException",
-        args = {java.lang.String.class}
-    )
     public void testConstructor() {
         new SettingNotFoundException("Setting not found exception.");
         new SettingNotFoundException(null);
diff --git a/tests/tests/provider/src/android/provider/cts/Settings_SystemTest.java b/tests/tests/provider/src/android/provider/cts/Settings_SystemTest.java
index 578cca3..dc87fad 100644
--- a/tests/tests/provider/src/android/provider/cts/Settings_SystemTest.java
+++ b/tests/tests/provider/src/android/provider/cts/Settings_SystemTest.java
@@ -16,10 +16,6 @@
 
 package android.provider.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.ContentResolver;
 import android.content.res.Configuration;
@@ -29,7 +25,6 @@
 import android.provider.Settings.System;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(android.provider.Settings.System.class)
 public class Settings_SystemTest extends AndroidTestCase {
     private ContentResolver cr;
 
@@ -41,69 +36,6 @@
         assertNotNull(cr);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putInt",
-            args = {android.content.ContentResolver.class, java.lang.String.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putLong",
-            args = {android.content.ContentResolver.class, java.lang.String.class, long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putFloat",
-            args = {android.content.ContentResolver.class, java.lang.String.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putString",
-            args = {android.content.ContentResolver.class, java.lang.String.class,
-                    java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "putConfiguration",
-            args = {android.content.ContentResolver.class, android.content.res.Configuration.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setShowGTalkServiceStatus",
-            args = {android.content.ContentResolver.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInt",
-            args = {android.content.ContentResolver.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLong",
-            args = {android.content.ContentResolver.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFloat",
-            args = {android.content.ContentResolver.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getString",
-            args = {android.content.ContentResolver.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getConfiguration",
-            args = {android.content.ContentResolver.class, android.content.res.Configuration.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getShowGTalkServiceStatus",
-            args = {android.content.ContentResolver.class}
-        )
-    })
     public void testSystemSettings() throws SettingNotFoundException {
         /**
          * first query the exist settings in System table, and then insert six
@@ -186,34 +118,12 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInt",
-            args = {android.content.ContentResolver.class, java.lang.String.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLong",
-            args = {android.content.ContentResolver.class, java.lang.String.class, long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFloat",
-            args = {android.content.ContentResolver.class, java.lang.String.class, float.class}
-        )
-    })
     public void testGetDefaultValues() {
         assertEquals(10, System.getInt(cr, "int", 10));
         assertEquals(20, System.getLong(cr, "long", 20l));
         assertEquals(30.0f, System.getFloat(cr, "float", 30.0f), 0.001);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getUriFor",
-        args = {java.lang.String.class}
-    )
     public void testGetUriFor() {
         String name = "table";
 
diff --git a/tests/tests/provider/src/android/provider/cts/UserDictionary_WordsTest.java b/tests/tests/provider/src/android/provider/cts/UserDictionary_WordsTest.java
index 7f8d66d..e226fef 100644
--- a/tests/tests/provider/src/android/provider/cts/UserDictionary_WordsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/UserDictionary_WordsTest.java
@@ -16,24 +16,18 @@
 
 package android.provider.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.content.ContentResolver;
-import android.content.Context;
 import android.database.Cursor;
 import android.net.Uri;
-import android.os.RemoteException;
 import android.provider.UserDictionary;
 import android.test.AndroidTestCase;
 
 import java.util.ArrayList;
+import java.util.Locale;
 
-@TestTargetClass(android.provider.UserDictionary.Words.class)
 public class UserDictionary_WordsTest extends AndroidTestCase {
 
-    private Context mContext;
     private ContentResolver mContentResolver;
     private ArrayList<Uri> mAddedBackup;
 
@@ -51,10 +45,7 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-
-        mContext = getContext();
         mContentResolver = mContext.getContentResolver();
-
         mAddedBackup = new ArrayList<Uri>();
     }
 
@@ -68,28 +59,47 @@
         super.tearDown();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addWord",
-        args = {Context.class, String.class, int.class, int.class}
-    )
-    public void testAddWord() throws RemoteException {
-        Cursor cursor;
-
+    @SuppressWarnings("deprecation")
+    public void testAddWord_deprecated() throws Exception {
         String word = "UserDictionary_WordsTest";
         int frequency = 1;
         UserDictionary.Words.addWord(getContext(), word, frequency,
                 UserDictionary.Words.LOCALE_TYPE_ALL);
-        cursor = mContentResolver.query(
-                UserDictionary.Words.CONTENT_URI,
-                WORDS_PROJECTION,
+
+        Cursor cursor = mContentResolver.query(UserDictionary.Words.CONTENT_URI, WORDS_PROJECTION,
                 UserDictionary.Words.WORD + "='" + word + "'", null, null);
+        assertTrue(cursor.moveToFirst());
+        mAddedBackup.add(Uri.withAppendedPath(UserDictionary.Words.CONTENT_URI,
+                cursor.getString(ID_INDEX)));
+
         assertEquals(1, cursor.getCount());
-        cursor.moveToFirst();
         assertEquals(word, cursor.getString(WORD_INDEX));
         assertEquals(frequency, cursor.getInt(FREQUENCY_INDEX));
         assertNull(cursor.getString(LOCALE_INDEX));
-        mAddedBackup.add(
-                Uri.withAppendedPath(UserDictionary.Words.CONTENT_URI, cursor.getString(ID_INDEX)));
+        cursor.close();
+    }
+
+    public void testAddWord() throws Exception {
+        assertWord("testWord1", 42, null, Locale.KOREA, 42);
+        assertWord("testWord2", -3007, "tw2", Locale.JAPAN, 0);
+        assertWord("testWord3", 1337, "tw3", Locale.US, 255);
+    }
+
+    private void assertWord(String word, int frequency, String shortcut, Locale locale,
+            int expectedFrequency) {
+
+        UserDictionary.Words.addWord(mContext, word, frequency, shortcut, locale);
+
+        Cursor cursor = mContentResolver.query(UserDictionary.Words.CONTENT_URI, WORDS_PROJECTION,
+                UserDictionary.Words.WORD + "='" + word + "'", null, null);
+        assertTrue(cursor.moveToFirst());
+        mAddedBackup.add(Uri.withAppendedPath(UserDictionary.Words.CONTENT_URI,
+                cursor.getString(ID_INDEX)));
+
+        assertEquals(1, cursor.getCount());
+        assertEquals(word, cursor.getString(WORD_INDEX));
+        assertEquals(expectedFrequency, cursor.getInt(FREQUENCY_INDEX));
+        assertEquals(locale.toString(), cursor.getString(LOCALE_INDEX));
+        cursor.close();
     }
 }
diff --git a/tests/tests/provider/src/android/provider/cts/VoicemailContractTest.java b/tests/tests/provider/src/android/provider/cts/VoicemailContractTest.java
new file mode 100644
index 0000000..ffb60f4
--- /dev/null
+++ b/tests/tests/provider/src/android/provider/cts/VoicemailContractTest.java
@@ -0,0 +1,238 @@
+/*
+ * 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.provider.cts;
+
+import android.content.ContentProviderClient;
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.net.Uri;
+import android.provider.VoicemailContract;
+import android.provider.VoicemailContract.Status;
+import android.provider.VoicemailContract.Voicemails;
+import android.test.InstrumentationTestCase;
+
+/**
+ * CTS tests for voicemail provider accessed through {@link VoicemailContract}.
+ */
+public class VoicemailContractTest extends InstrumentationTestCase {
+    private ContentResolver mContentResolver;
+    private ContentProviderClient mVoicemailProvider;
+    private ContentProviderClient mStatusProvider;
+    private Uri mVoicemailContentUri;
+    private Uri mStatusContentUri;
+    private String mSourcePackageName;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mSourcePackageName = getInstrumentation().getTargetContext().getPackageName();
+        mVoicemailContentUri = Voicemails.buildSourceUri(mSourcePackageName);
+        mStatusContentUri = Status.buildSourceUri(mSourcePackageName);
+        mContentResolver = getInstrumentation().getTargetContext().getContentResolver();
+        mVoicemailProvider = mContentResolver.acquireContentProviderClient(mVoicemailContentUri);
+        mStatusProvider = mContentResolver.acquireContentProviderClient(mStatusContentUri);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        // Clean up, just in case we failed to delete the entry when a test failed.
+        // The cotentUris are specific to this package, so this will delete only the
+        // entries inserted by this package.
+        mStatusProvider.delete(mStatusContentUri, null, null);
+        mVoicemailProvider.delete(mVoicemailContentUri, null, null);
+        super.tearDown();
+    }
+
+    public void testVoicemailsTable() throws Exception {
+        final String[] VOICEMAILS_PROJECTION = new String[] {
+                Voicemails._ID, Voicemails.NUMBER, Voicemails.DATE, Voicemails.DURATION,
+                Voicemails.IS_READ, Voicemails.SOURCE_PACKAGE, Voicemails.SOURCE_DATA,
+                Voicemails.HAS_CONTENT, Voicemails.MIME_TYPE};
+        final int ID_INDEX = 0;
+        final int NUMBER_INDEX = 1;
+        final int DATE_INDEX = 2;
+        final int DURATION_INDEX = 3;
+        final int IS_READ_INDEX = 4;
+        final int SOURCE_PACKAGE_INDEX = 5;
+        final int SOURCE_DATA_INDEX = 6;
+        final int HAS_CONTENT_INDEX = 7;
+        final int MIME_TYPE_INDEX = 8;
+
+        String insertCallsNumber = "0123456789";
+        long insertCallsDuration = 120;
+        String insertSourceData = "internal_id";
+        String insertMimeType = "audio/mp3";
+        long insertDate = 1324478862000L;
+
+        String updateCallsNumber = "9876543210";
+        long updateCallsDuration = 310;
+        String updateSourceData = "another_id";
+        long updateDate = 1324565262000L;
+
+        // Test: insert
+        ContentValues value = new ContentValues();
+        value.put(Voicemails.NUMBER, insertCallsNumber);
+        value.put(Voicemails.DATE, insertDate);
+        value.put(Voicemails.DURATION, insertCallsDuration);
+        // Source package is expected to be inserted by the provider, if not set.
+        value.put(Voicemails.SOURCE_DATA, insertSourceData);
+        value.put(Voicemails.MIME_TYPE, insertMimeType);
+        value.put(Voicemails.IS_READ, false);
+        value.put(Voicemails.HAS_CONTENT, true);
+
+        Uri uri = mVoicemailProvider.insert(mVoicemailContentUri, value);
+        Cursor cursor = mVoicemailProvider.query(
+                mVoicemailContentUri, VOICEMAILS_PROJECTION,
+                Voicemails.NUMBER + " = ?",
+                new String[] {insertCallsNumber}, null, null);
+        assertTrue(cursor.moveToNext());
+        assertEquals(insertCallsNumber, cursor.getString(NUMBER_INDEX));
+        assertEquals(insertDate, cursor.getLong(DATE_INDEX));
+        assertEquals(insertCallsDuration, cursor.getLong(DURATION_INDEX));
+        assertEquals(mSourcePackageName, cursor.getString(SOURCE_PACKAGE_INDEX));
+        assertEquals(insertSourceData, cursor.getString(SOURCE_DATA_INDEX));
+        assertEquals(insertMimeType, cursor.getString(MIME_TYPE_INDEX));
+        assertEquals(0, cursor.getInt(IS_READ_INDEX));
+        assertEquals(1, cursor.getInt(HAS_CONTENT_INDEX));
+        int id = cursor.getInt(ID_INDEX);
+        assertEquals(id, Integer.parseInt(uri.getLastPathSegment()));
+        cursor.close();
+
+        // Test: update
+        value.clear();
+        value.put(Voicemails.NUMBER, updateCallsNumber);
+        value.put(Voicemails.DATE, updateDate);
+        value.put(Voicemails.DURATION, updateCallsDuration);
+        value.put(Voicemails.SOURCE_DATA, updateSourceData);
+
+        mVoicemailProvider.update(uri, value, null, null);
+        cursor = mVoicemailProvider.query(mVoicemailContentUri, VOICEMAILS_PROJECTION,
+                Voicemails._ID + " = " + id, null, null, null);
+        assertEquals(1, cursor.getCount());
+        assertTrue(cursor.moveToNext());
+        assertEquals(mSourcePackageName, cursor.getString(SOURCE_PACKAGE_INDEX));
+        assertEquals(updateCallsNumber, cursor.getString(NUMBER_INDEX));
+        assertEquals(updateDate, cursor.getLong(DATE_INDEX));
+        assertEquals(updateCallsDuration, cursor.getLong(DURATION_INDEX));
+        assertEquals(updateSourceData, cursor.getString(SOURCE_DATA_INDEX));
+        cursor.close();
+
+        // Test: delete
+        mVoicemailProvider.delete(mVoicemailContentUri, Voicemails._ID + " = " + id, null);
+        cursor = mVoicemailProvider.query(mVoicemailContentUri, VOICEMAILS_PROJECTION,
+                Voicemails._ID + " = " + id, null, null, null);
+        assertEquals(0, cursor.getCount());
+        cursor.close();
+    }
+
+    public void testStatusTable() throws Exception {
+        final String[] STATUS_PROJECTION = new String[] {
+                Status._ID, Status.SOURCE_PACKAGE, Status.CONFIGURATION_STATE,
+                Status.DATA_CHANNEL_STATE, Status.NOTIFICATION_CHANNEL_STATE,
+                Status.SETTINGS_URI, Status.VOICEMAIL_ACCESS_URI};
+        final int ID_INDEX = 0;
+        final int SOURCE_PACKAGE_INDEX = 1;
+        final int CONFIGURATION_STATE_INDEX = 2;
+        final int DATA_CHANNEL_STATE_INDEX = 3;
+        final int NOTIFICATION_CHANNEL_STATE_INDEX = 4;
+        final int SETTINGS_URI_INDEX = 5;
+        final int VOICEMAIL_ACCESS_URI_INDEX = 6;
+
+        int insertConfigurationState = Status.CONFIGURATION_STATE_OK;
+        int insertDataChannelState = Status.DATA_CHANNEL_STATE_OK;
+        int insertNotificationChannelState = Status.NOTIFICATION_CHANNEL_STATE_OK;
+        String insertSettingsUri = "settings_uri";
+        String insertVoicemailAccessUri = "tel:901";
+
+        int updateDataChannelState = Status.DATA_CHANNEL_STATE_NO_CONNECTION;
+        int updateNotificationChannelState = Status.NOTIFICATION_CHANNEL_STATE_MESSAGE_WAITING;
+        String updateSettingsUri = "settings_uri_2";
+
+        // Test: insert
+        ContentValues value = new ContentValues();
+        value.put(Status.CONFIGURATION_STATE, insertConfigurationState);
+        value.put(Status.DATA_CHANNEL_STATE, insertDataChannelState);
+        value.put(Status.NOTIFICATION_CHANNEL_STATE, insertNotificationChannelState);
+        value.put(Status.SETTINGS_URI, insertSettingsUri);
+        value.put(Status.VOICEMAIL_ACCESS_URI, insertVoicemailAccessUri);
+
+        Uri uri = mStatusProvider.insert(mStatusContentUri, value);
+        Cursor cursor = mStatusProvider.query(
+                mStatusContentUri, STATUS_PROJECTION, null, null, null, null);
+        assertTrue(cursor.moveToNext());
+        assertEquals(mSourcePackageName, cursor.getString(SOURCE_PACKAGE_INDEX));
+        assertEquals(insertConfigurationState, cursor.getInt(CONFIGURATION_STATE_INDEX));
+        assertEquals(insertDataChannelState, cursor.getInt(DATA_CHANNEL_STATE_INDEX));
+        assertEquals(insertNotificationChannelState,
+                cursor.getInt(NOTIFICATION_CHANNEL_STATE_INDEX));
+        assertEquals(insertSettingsUri, cursor.getString(SETTINGS_URI_INDEX));
+        assertEquals(insertVoicemailAccessUri, cursor.getString(VOICEMAIL_ACCESS_URI_INDEX));
+        int id = cursor.getInt(ID_INDEX);
+        assertEquals(id, Integer.parseInt(uri.getLastPathSegment()));
+        cursor.close();
+
+        // Test: update
+        value.clear();
+        value.put(Status.DATA_CHANNEL_STATE, updateDataChannelState);
+        value.put(Status.NOTIFICATION_CHANNEL_STATE, updateNotificationChannelState);
+        value.put(Status.SETTINGS_URI, updateSettingsUri);
+
+        mStatusProvider.update(uri, value, null, null);
+        cursor = mStatusProvider.query(mStatusContentUri, STATUS_PROJECTION,
+                Voicemails._ID + " = " + id, null, null, null);
+        assertEquals(1, cursor.getCount());
+        assertTrue(cursor.moveToNext());
+        assertEquals(mSourcePackageName, cursor.getString(SOURCE_PACKAGE_INDEX));
+        assertEquals(updateDataChannelState, cursor.getInt(DATA_CHANNEL_STATE_INDEX));
+        assertEquals(updateNotificationChannelState,
+                cursor.getInt(NOTIFICATION_CHANNEL_STATE_INDEX));
+        assertEquals(updateSettingsUri, cursor.getString(SETTINGS_URI_INDEX));
+        cursor.close();
+
+        // Test: delete
+        mStatusProvider.delete(mStatusContentUri, Voicemails._ID + " = " + id, null);
+        cursor = mStatusProvider.query(mStatusContentUri, STATUS_PROJECTION,
+                Voicemails._ID + " = " + id, null, null, null);
+        assertEquals(0, cursor.getCount());
+        cursor.close();
+    }
+
+    public void testVoicemailTablePermissions() throws Exception {
+        ContentValues value = new ContentValues();
+        value.put(Voicemails.NUMBER, "0123456789");
+        value.put(Voicemails.SOURCE_PACKAGE, "some.other.package");
+        try {
+            mVoicemailProvider.insert(mVoicemailContentUri, value);
+            fail("Expected SecurityException. None thrown.");
+        } catch (SecurityException e) {
+            // Expected result.
+        }
+    }
+
+    public void testStatusTablePermissions() throws Exception {
+        ContentValues value = new ContentValues();
+        value.put(Status.CONFIGURATION_STATE, Status.CONFIGURATION_STATE_OK);
+        value.put(Status.SOURCE_PACKAGE, "some.other.package");
+        try {
+            mStatusProvider.insert(mStatusContentUri, value);
+            fail("Expected SecurityException. None thrown.");
+        } catch (SecurityException e) {
+            // Expected result.
+        }
+    }
+}
diff --git a/tests/tests/renderscript/Android.mk b/tests/tests/renderscript/Android.mk
index fc64614..d2137e2 100644
--- a/tests/tests/renderscript/Android.mk
+++ b/tests/tests/renderscript/Android.mk
@@ -34,4 +34,4 @@
 
 LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/AllocationTest.java b/tests/tests/renderscript/src/android/renderscript/cts/AllocationTest.java
index 722274d..233e6cb 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 = 0x0020;
+            int invalidUsage = 0x0100;
             Allocation.createFromBitmap(mRS, B,
                 Allocation.MipmapControl.MIPMAP_NONE, invalidUsage);
             fail("should throw RSIllegalArgumentException.");
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/CompilerTest.java b/tests/tests/renderscript/src/android/renderscript/cts/CompilerTest.java
new file mode 100644
index 0000000..799479e
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/CompilerTest.java
@@ -0,0 +1,41 @@
+/*
+ * 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.RSRuntimeException;
+import android.util.Log;
+
+import com.android.cts.stub.R;
+
+/**
+ * Test whether the driver properly handles compile-time issues.
+ */
+public class CompilerTest extends RSBaseCompute {
+    /**
+     * missing_link.rs contains symbols that can't be resolved at runtime,
+     * which should trigger an exception.
+     */
+    public void testMissingLink() {
+        try {
+            ScriptC_missing_link t = new ScriptC_missing_link(mRS,
+                                                              mRes,
+                                                              R.raw.missing_link);
+            fail("should throw RSRuntimeException");
+        } catch (RSRuntimeException e) {
+        }
+    }
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ComputeTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ComputeTest.java
index 5418a80..08a9428 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/ComputeTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ComputeTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 The Android Open Source Project
+ * Copyright (C) 2011-2012 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -321,7 +321,75 @@
         assertTrue(initializeGlobals(t));
         t.invoke_test();
         waitForMessage();
-        assertEquals(result, RS_MSG_TEST_PASSED);
+        checkForErrors();
+    }
+
+    private void checkInit(ScriptC_array_init s) {
+        float[] fa = s.get_fa();
+        assertTrue(fa[0] == 1.0);
+        assertTrue(fa[1] == 9.9999f);
+        assertTrue(fa[2] == 0);
+        assertTrue(fa[3] == 0);
+        assertTrue(fa.length == 4);
+
+        double[] da = s.get_da();
+        assertTrue(da[0] == 7.0);
+        assertTrue(da[1] == 8.88888);
+        assertTrue(da.length == 2);
+
+        byte[] ca = s.get_ca();
+        assertTrue(ca[0] == 'a');
+        assertTrue(ca[1] == 7);
+        assertTrue(ca[2] == 'b');
+        assertTrue(ca[3] == 'c');
+        assertTrue(ca.length == 4);
+
+        short[] sa = s.get_sa();
+        assertTrue(sa[0] == 1);
+        assertTrue(sa[1] == 1);
+        assertTrue(sa[2] == 2);
+        assertTrue(sa[3] == 3);
+        assertTrue(sa.length == 4);
+
+        int[] ia = s.get_ia();
+        assertTrue(ia[0] == 5);
+        assertTrue(ia[1] == 8);
+        assertTrue(ia[2] == 0);
+        assertTrue(ia[3] == 0);
+        assertTrue(ia.length == 4);
+
+        long[] la = s.get_la();
+        assertTrue(la[0] == 13);
+        assertTrue(la[1] == 21);
+        assertTrue(la.length == 2);
+
+        long[] lla = s.get_lla();
+        assertTrue(lla[0] == 34);
+        assertTrue(lla[1] == 0);
+        assertTrue(lla[2] == 0);
+        assertTrue(lla[3] == 0);
+        assertTrue(lla.length == 4);
+
+        boolean[] ba = s.get_ba();
+        assertTrue(ba[0] == true);
+        assertTrue(ba[1] == false);
+        assertTrue(ba[2] == false);
+        assertTrue(ba.length == 3);
+    }
+
+    /**
+     * Test array initialization.
+     */
+    public void testArrayInit() {
+        ScriptC_array_init t = new ScriptC_array_init(mRS,
+                                                      mRes,
+                                                      R.raw.array_init);
+
+        checkInit(t);
+        t.invoke_array_init_test();
+        mRS.finish();
+        waitForMessage();
+        checkForErrors();
     }
 
     /**
@@ -333,7 +401,7 @@
                                                       R.raw.utils);
         t.invoke_test();
         waitForMessage();
-        assertEquals(result, RS_MSG_TEST_PASSED);
+        checkForErrors();
     }
 
     void setUpAllocation(Allocation a, int val) {
@@ -383,5 +451,6 @@
             fail("should throw RSRuntimeException");
         } catch (RSRuntimeException e) {
         }
+        checkForErrors();
     }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ContextCreationTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ContextCreationTest.java
index 358c494..1edce0a 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/ContextCreationTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ContextCreationTest.java
@@ -16,7 +16,6 @@
 
 package android.renderscript.cts;
 
-import dalvik.annotation.TestTargetClass;
 import android.renderscript.*;
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.UiThreadTest;
@@ -25,7 +24,6 @@
 /**
  * Tests for the RenderScriptGL class.
  */
-@TestTargetClass(RenderScriptGL.class)
 public class ContextCreationTest extends
         ActivityInstrumentationTestCase2<RenderscriptGLStubActivity> {
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ElementTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ElementTest.java
index 4f8185a..d63e191 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/ElementTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ElementTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 The Android Open Source Project
+ * Copyright (C) 2011-2012 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@
 import android.renderscript.Element;
 import android.renderscript.Element.DataType;
 import android.renderscript.Element.DataKind;
+import android.renderscript.RSIllegalArgumentException;
 
 public class ElementTest extends RSBaseCompute {
 
@@ -412,6 +413,9 @@
     }
 
     public void testDataType() {
+        // Uncomment when NONE is no longer hidden.
+        //assertEquals(DataType.NONE, DataType.valueOf("NONE"));
+
         assertEquals(DataType.FLOAT_32, DataType.valueOf("FLOAT_32"));
         assertEquals(DataType.FLOAT_64, DataType.valueOf("FLOAT_64"));
         assertEquals(DataType.SIGNED_8, DataType.valueOf("SIGNED_8"));
@@ -444,10 +448,33 @@
         assertEquals(DataType.RS_PROGRAM_RASTER, DataType.valueOf("RS_PROGRAM_RASTER"));
         assertEquals(DataType.RS_PROGRAM_STORE, DataType.valueOf("RS_PROGRAM_STORE"));
         // Make sure no new enums are added
-        assertEquals(27, DataType.values().length);
+        assertEquals(28, DataType.values().length);
 
         for (DataType dt : DataType.values()) {
-            Element.createVector(mRS, dt, 2);
+            switch (dt) {
+            case FLOAT_32:
+            case FLOAT_64:
+            case SIGNED_8:
+            case SIGNED_16:
+            case SIGNED_32:
+            case SIGNED_64:
+            case UNSIGNED_8:
+            case UNSIGNED_16:
+            case UNSIGNED_32:
+            case UNSIGNED_64:
+            case BOOLEAN:
+                Element.createVector(mRS, dt, 2);
+                break;
+
+            default: {
+                try {
+                    Element.createVector(mRS, dt, 2);
+                    fail("should throw RSIllegalArgumentException");
+                } catch (RSIllegalArgumentException e) {
+                }
+                break;
+            }
+            }
         }
     }
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ForEachTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ForEachTest.java
index 12c8fb0..a64d1d9 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/ForEachTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ForEachTest.java
@@ -67,8 +67,10 @@
         t = new Type.Builder(mRS, Element.U8(mRS)).setX(x).create();
         Allocation out = Allocation.createTyped(mRS, t);
         fe_i8.forEach_root(in, out);
+        mRS.finish();
         try {
             fe_i8.forEach_root(in, badOut);
+            mRS.finish();
             fail("should throw RSRuntimeException");
         } catch (RSRuntimeException e) {
         }
@@ -82,8 +84,10 @@
         t = new Type.Builder(mRS, Element.U8_2(mRS)).setX(x).create();
         out = Allocation.createTyped(mRS, t);
         fe_i8_2.forEach_root(in, out);
+        mRS.finish();
         try {
             fe_i8_2.forEach_root(in, badOut);
+            mRS.finish();
             fail("should throw RSRuntimeException");
         } catch (RSRuntimeException e) {
         }
@@ -97,8 +101,10 @@
         t = new Type.Builder(mRS, Element.U8_3(mRS)).setX(x).create();
         out = Allocation.createTyped(mRS, t);
         fe_i8_3.forEach_root(in, out);
+        mRS.finish();
         try {
             fe_i8_3.forEach_root(in, badOut);
+            mRS.finish();
             fail("should throw RSRuntimeException");
         } catch (RSRuntimeException e) {
         }
@@ -112,8 +118,10 @@
         t = new Type.Builder(mRS, Element.U8_4(mRS)).setX(x).create();
         out = Allocation.createTyped(mRS, t);
         fe_i8_4.forEach_root(in, out);
+        mRS.finish();
         try {
             fe_i8_4.forEach_root(in, badOut);
+            mRS.finish();
             fail("should throw RSRuntimeException");
         } catch (RSRuntimeException e) {
         }
@@ -125,8 +133,10 @@
         t = new Type.Builder(mRS, Element.U16(mRS)).setX(x).create();
         out = Allocation.createTyped(mRS, t);
         fe_i16.forEach_root(in, out);
+        mRS.finish();
         try {
             fe_i16.forEach_root(in, badOut);
+            mRS.finish();
             fail("should throw RSRuntimeException");
         } catch (RSRuntimeException e) {
         }
@@ -140,8 +150,10 @@
         t = new Type.Builder(mRS, Element.U16_2(mRS)).setX(x).create();
         out = Allocation.createTyped(mRS, t);
         fe_i16_2.forEach_root(in, out);
+        mRS.finish();
         try {
             fe_i16_2.forEach_root(in, badOut);
+            mRS.finish();
             fail("should throw RSRuntimeException");
         } catch (RSRuntimeException e) {
         }
@@ -155,8 +167,10 @@
         t = new Type.Builder(mRS, Element.U16_3(mRS)).setX(x).create();
         out = Allocation.createTyped(mRS, t);
         fe_i16_3.forEach_root(in, out);
+        mRS.finish();
         try {
             fe_i16_3.forEach_root(in, badOut);
+            mRS.finish();
             fail("should throw RSRuntimeException");
         } catch (RSRuntimeException e) {
         }
@@ -170,8 +184,10 @@
         t = new Type.Builder(mRS, Element.U16_4(mRS)).setX(x).create();
         out = Allocation.createTyped(mRS, t);
         fe_i16_4.forEach_root(in, out);
+        mRS.finish();
         try {
             fe_i16_4.forEach_root(in, badOut);
+            mRS.finish();
             fail("should throw RSRuntimeException");
         } catch (RSRuntimeException e) {
         }
@@ -183,8 +199,10 @@
         t = new Type.Builder(mRS, Element.U32(mRS)).setX(x).create();
         out = Allocation.createTyped(mRS, t);
         fe_i32.forEach_root(in, out);
+        mRS.finish();
         try {
             fe_i32.forEach_root(in, badOut);
+            mRS.finish();
             fail("should throw RSRuntimeException");
         } catch (RSRuntimeException e) {
         }
@@ -198,8 +216,10 @@
         t = new Type.Builder(mRS, Element.U32_2(mRS)).setX(x).create();
         out = Allocation.createTyped(mRS, t);
         fe_i32_2.forEach_root(in, out);
+        mRS.finish();
         try {
             fe_i32_2.forEach_root(in, badOut);
+            mRS.finish();
             fail("should throw RSRuntimeException");
         } catch (RSRuntimeException e) {
         }
@@ -213,8 +233,10 @@
         t = new Type.Builder(mRS, Element.U32_3(mRS)).setX(x).create();
         out = Allocation.createTyped(mRS, t);
         fe_i32_3.forEach_root(in, out);
+        mRS.finish();
         try {
             fe_i32_3.forEach_root(in, badOut);
+            mRS.finish();
             fail("should throw RSRuntimeException");
         } catch (RSRuntimeException e) {
         }
@@ -228,8 +250,10 @@
         t = new Type.Builder(mRS, Element.U32_4(mRS)).setX(x).create();
         out = Allocation.createTyped(mRS, t);
         fe_i32_4.forEach_root(in, out);
+        mRS.finish();
         try {
             fe_i32_4.forEach_root(in, badOut);
+            mRS.finish();
             fail("should throw RSRuntimeException");
         } catch (RSRuntimeException e) {
         }
@@ -241,8 +265,10 @@
         t = new Type.Builder(mRS, Element.U64(mRS)).setX(x).create();
         out = Allocation.createTyped(mRS, t);
         fe_i64.forEach_root(in, out);
+        mRS.finish();
         try {
             fe_i64.forEach_root(in, badOut);
+            mRS.finish();
             fail("should throw RSRuntimeException");
         } catch (RSRuntimeException e) {
         }
@@ -256,8 +282,10 @@
         t = new Type.Builder(mRS, Element.U64_2(mRS)).setX(x).create();
         out = Allocation.createTyped(mRS, t);
         fe_i64_2.forEach_root(in, out);
+        mRS.finish();
         try {
             fe_i64_2.forEach_root(in, badOut);
+            mRS.finish();
             fail("should throw RSRuntimeException");
         } catch (RSRuntimeException e) {
         }
@@ -271,8 +299,10 @@
         t = new Type.Builder(mRS, Element.U64_3(mRS)).setX(x).create();
         out = Allocation.createTyped(mRS, t);
         fe_i64_3.forEach_root(in, out);
+        mRS.finish();
         try {
             fe_i64_3.forEach_root(in, badOut);
+            mRS.finish();
             fail("should throw RSRuntimeException");
         } catch (RSRuntimeException e) {
         }
@@ -286,8 +316,10 @@
         t = new Type.Builder(mRS, Element.U64_4(mRS)).setX(x).create();
         out = Allocation.createTyped(mRS, t);
         fe_i64_4.forEach_root(in, out);
+        mRS.finish();
         try {
             fe_i64_4.forEach_root(in, badOut);
+            mRS.finish();
             fail("should throw RSRuntimeException");
         } catch (RSRuntimeException e) {
         }
@@ -298,8 +330,10 @@
         in = Allocation.createTyped(mRS, t);
         out = Allocation.createTyped(mRS, t);
         fe_f32.forEach_root(in, out);
+        mRS.finish();
         try {
             fe_f32.forEach_root(in, badOut);
+            mRS.finish();
             fail("should throw RSRuntimeException");
         } catch (RSRuntimeException e) {
         }
@@ -313,8 +347,10 @@
         t = new Type.Builder(mRS, Element.F32_2(mRS)).setX(x).create();
         out = Allocation.createTyped(mRS, t);
         fe_f32_2.forEach_root(in, out);
+        mRS.finish();
         try {
             fe_f32_2.forEach_root(in, badOut);
+            mRS.finish();
             fail("should throw RSRuntimeException");
         } catch (RSRuntimeException e) {
         }
@@ -327,8 +363,10 @@
         in = Allocation.createTyped(mRS, t);
         out = Allocation.createTyped(mRS, t);
         fe_f32_3.forEach_root(in, out);
+        mRS.finish();
         try {
             fe_f32_3.forEach_root(in, badOut);
+            mRS.finish();
             fail("should throw RSRuntimeException");
         } catch (RSRuntimeException e) {
         }
@@ -341,8 +379,10 @@
         in = Allocation.createTyped(mRS, t);
         out = Allocation.createTyped(mRS, t);
         fe_f32_4.forEach_root(in, out);
+        mRS.finish();
         try {
             fe_f32_4.forEach_root(in, badOut);
+            mRS.finish();
             fail("should throw RSRuntimeException");
         } catch (RSRuntimeException e) {
         }
@@ -353,8 +393,10 @@
         in = Allocation.createTyped(mRS, t);
         out = Allocation.createTyped(mRS, t);
         fe_f64.forEach_root(in, out);
+        mRS.finish();
         try {
             fe_f64.forEach_root(in, badOut);
+            mRS.finish();
             fail("should throw RSRuntimeException");
         } catch (RSRuntimeException e) {
         }
@@ -367,8 +409,10 @@
         in = Allocation.createTyped(mRS, t);
         out = Allocation.createTyped(mRS, t);
         fe_f64_2.forEach_root(in, out);
+        mRS.finish();
         try {
             fe_f64_2.forEach_root(in, badOut);
+            mRS.finish();
             fail("should throw RSRuntimeException");
         } catch (RSRuntimeException e) {
         }
@@ -381,8 +425,10 @@
         in = Allocation.createTyped(mRS, t);
         out = Allocation.createTyped(mRS, t);
         fe_f64_3.forEach_root(in, out);
+        mRS.finish();
         try {
             fe_f64_3.forEach_root(in, badOut);
+            mRS.finish();
             fail("should throw RSRuntimeException");
         } catch (RSRuntimeException e) {
         }
@@ -395,8 +441,10 @@
         in = Allocation.createTyped(mRS, t);
         out = Allocation.createTyped(mRS, t);
         fe_f64_4.forEach_root(in, out);
+        mRS.finish();
         try {
             fe_f64_4.forEach_root(in, badOut);
+            mRS.finish();
             fail("should throw RSRuntimeException");
         } catch (RSRuntimeException e) {
         }
@@ -408,8 +456,10 @@
         in = new ScriptField_fe_test(mRS, x).getAllocation();
         out = new ScriptField_fe_test(mRS, x).getAllocation();
         fe_struct.forEach_root(in, out);
+        mRS.finish();
         try {
             fe_struct.forEach_root(in, badOut);
+            mRS.finish();
             fail("should throw RSRuntimeException");
         } catch (RSRuntimeException e) {
         }
@@ -420,8 +470,10 @@
         in = Allocation.createTyped(mRS, t);
         out = Allocation.createTyped(mRS, t);
         fe_bool.forEach_root(in, out);
+        mRS.finish();
         try {
             fe_bool.forEach_root(in, badOut);
+            mRS.finish();
             fail("should throw RSRuntimeException");
         } catch (RSRuntimeException e) {
         }
@@ -432,8 +484,10 @@
         t = new Type.Builder(mRS, Element.A_8(mRS)).setX(x).create();
         out = Allocation.createTyped(mRS, t);
         fe_i8.forEach_root(in, out);
+        mRS.finish();
         try {
             fe_i8.forEach_root(in, badOut);
+            mRS.finish();
             fail("should throw RSRuntimeException");
         } catch (RSRuntimeException e) {
         }
@@ -444,8 +498,10 @@
         t = new Type.Builder(mRS, Element.RGBA_8888(mRS)).setX(x).create();
         out = Allocation.createTyped(mRS, t);
         fe_i8_4.forEach_root(in, out);
+        mRS.finish();
         try {
             fe_i8_4.forEach_root(in, badOut);
+            mRS.finish();
             fail("should throw RSRuntimeException");
         } catch (RSRuntimeException e) {
         }
@@ -456,8 +512,10 @@
         t = new Type.Builder(mRS, Element.RGB_888(mRS)).setX(x).create();
         out = Allocation.createTyped(mRS, t);
         fe_i8_3.forEach_root(in, out);
+        mRS.finish();
         try {
             fe_i8_3.forEach_root(in, badOut);
+            mRS.finish();
             fail("should throw RSRuntimeException");
         } catch (RSRuntimeException e) {
         }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/RSBase.java b/tests/tests/renderscript/src/android/renderscript/cts/RSBase.java
index 56838e1..29183f0 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/RSBase.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/RSBase.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 The Android Open Source Project
+ * Copyright (C) 2011-2012 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,8 +18,11 @@
 
 import android.content.Context;
 import android.content.res.Resources;
+import android.renderscript.RenderScript.RSErrorHandler;
 import android.renderscript.RenderScript.RSMessageHandler;
+import android.renderscript.RSRuntimeException;
 import android.test.AndroidTestCase;
+import android.util.Log;
 
 /**
  * Base RenderScript test class. This class provides a message handler and a
@@ -30,11 +33,11 @@
     Context mCtx;
     Resources mRes;
 
-    public int result;
+    private int result;
     private boolean msgHandled;
 
-    public static final int RS_MSG_TEST_PASSED = 100;
-    public static final int RS_MSG_TEST_FAILED = 101;
+    private static final int RS_MSG_TEST_PASSED = 100;
+    private static final int RS_MSG_TEST_FAILED = 101;
 
     RSMessageHandler mRsMessage = new RSMessageHandler() {
         public void run() {
@@ -59,6 +62,16 @@
         }
     }
 
+    protected boolean FoundError = false;
+    protected RSErrorHandler mRsError = new RSErrorHandler() {
+        public void run() {
+            FoundError = true;
+            Log.e("RenderscriptCTS", mErrorMessage);
+            throw new RSRuntimeException("Received error " + mErrorNum +
+                                         " message " + mErrorMessage);
+        }
+    };
+
     @Override
     protected void setUp() throws Exception {
         super.setUp();
@@ -67,4 +80,12 @@
         mCtx = getContext();
         mRes = mCtx.getResources();
     }
+
+    /**
+     * Verify that we didn't fail on the control or script side of things.
+     */
+    protected void checkForErrors() {
+        assertFalse(FoundError);
+        assertTrue(result != RS_MSG_TEST_FAILED);
+    }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ScriptC_set_target_api_11.java b/tests/tests/renderscript/src/android/renderscript/cts/ScriptC_set_target_api_11.java
new file mode 100644
index 0000000..77d634f
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ScriptC_set_target_api_11.java
@@ -0,0 +1,43 @@
+/*
+ * 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.
+ */
+
+/*
+ * This file is auto-generated. DO NOT MODIFY!
+ * The source Renderscript file: set_target_api_11.rs
+ */
+package android.renderscript.cts;
+
+import android.renderscript.*;
+import android.content.res.Resources;
+
+/**
+ * @hide
+ */
+public class ScriptC_set_target_api_11 extends ScriptC {
+    // Constructor
+    public  ScriptC_set_target_api_11(RenderScript rs, Resources resources, int id) {
+        super(rs, resources, id);
+    }
+
+    private final static int mExportFuncIdx_check = 0;
+    public void invoke_check(int version) {
+        FieldPacker check_fp = new FieldPacker(4);
+        check_fp.addI32(version);
+        invoke(mExportFuncIdx_check, check_fp);
+    }
+
+}
+
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ScriptC_set_target_api_12.java b/tests/tests/renderscript/src/android/renderscript/cts/ScriptC_set_target_api_12.java
new file mode 100644
index 0000000..343d99d
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ScriptC_set_target_api_12.java
@@ -0,0 +1,43 @@
+/*
+ * 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.
+ */
+
+/*
+ * This file is auto-generated. DO NOT MODIFY!
+ * The source Renderscript file: set_target_api_12.rs
+ */
+package android.renderscript.cts;
+
+import android.renderscript.*;
+import android.content.res.Resources;
+
+/**
+ * @hide
+ */
+public class ScriptC_set_target_api_12 extends ScriptC {
+    // Constructor
+    public  ScriptC_set_target_api_12(RenderScript rs, Resources resources, int id) {
+        super(rs, resources, id);
+    }
+
+    private final static int mExportFuncIdx_check = 0;
+    public void invoke_check(int version) {
+        FieldPacker check_fp = new FieldPacker(4);
+        check_fp.addI32(version);
+        invoke(mExportFuncIdx_check, check_fp);
+    }
+
+}
+
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ScriptC_set_target_api_13.java b/tests/tests/renderscript/src/android/renderscript/cts/ScriptC_set_target_api_13.java
new file mode 100644
index 0000000..cf06a6b
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ScriptC_set_target_api_13.java
@@ -0,0 +1,43 @@
+/*
+ * 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.
+ */
+
+/*
+ * This file is auto-generated. DO NOT MODIFY!
+ * The source Renderscript file: set_target_api_13.rs
+ */
+package android.renderscript.cts;
+
+import android.renderscript.*;
+import android.content.res.Resources;
+
+/**
+ * @hide
+ */
+public class ScriptC_set_target_api_13 extends ScriptC {
+    // Constructor
+    public  ScriptC_set_target_api_13(RenderScript rs, Resources resources, int id) {
+        super(rs, resources, id);
+    }
+
+    private final static int mExportFuncIdx_check = 0;
+    public void invoke_check(int version) {
+        FieldPacker check_fp = new FieldPacker(4);
+        check_fp.addI32(version);
+        invoke(mExportFuncIdx_check, check_fp);
+    }
+
+}
+
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ScriptC_set_target_api_14.java b/tests/tests/renderscript/src/android/renderscript/cts/ScriptC_set_target_api_14.java
new file mode 100644
index 0000000..1b9b213
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ScriptC_set_target_api_14.java
@@ -0,0 +1,43 @@
+/*
+ * 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.
+ */
+
+/*
+ * This file is auto-generated. DO NOT MODIFY!
+ * The source Renderscript file: set_target_api_14.rs
+ */
+package android.renderscript.cts;
+
+import android.renderscript.*;
+import android.content.res.Resources;
+
+/**
+ * @hide
+ */
+public class ScriptC_set_target_api_14 extends ScriptC {
+    // Constructor
+    public  ScriptC_set_target_api_14(RenderScript rs, Resources resources, int id) {
+        super(rs, resources, id);
+    }
+
+    private final static int mExportFuncIdx_check = 0;
+    public void invoke_check(int version) {
+        FieldPacker check_fp = new FieldPacker(4);
+        check_fp.addI32(version);
+        invoke(mExportFuncIdx_check, check_fp);
+    }
+
+}
+
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ScriptC_set_target_api_15.java b/tests/tests/renderscript/src/android/renderscript/cts/ScriptC_set_target_api_15.java
new file mode 100644
index 0000000..4ed95b9
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ScriptC_set_target_api_15.java
@@ -0,0 +1,43 @@
+/*
+ * 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.
+ */
+
+/*
+ * This file is auto-generated. DO NOT MODIFY!
+ * The source Renderscript file: set_target_api_15.rs
+ */
+package android.renderscript.cts;
+
+import android.renderscript.*;
+import android.content.res.Resources;
+
+/**
+ * @hide
+ */
+public class ScriptC_set_target_api_15 extends ScriptC {
+    // Constructor
+    public  ScriptC_set_target_api_15(RenderScript rs, Resources resources, int id) {
+        super(rs, resources, id);
+    }
+
+    private final static int mExportFuncIdx_check = 0;
+    public void invoke_check(int version) {
+        FieldPacker check_fp = new FieldPacker(4);
+        check_fp.addI32(version);
+        invoke(mExportFuncIdx_check, check_fp);
+    }
+
+}
+
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ScriptC_set_target_api_16.java b/tests/tests/renderscript/src/android/renderscript/cts/ScriptC_set_target_api_16.java
new file mode 100644
index 0000000..3a7f006
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ScriptC_set_target_api_16.java
@@ -0,0 +1,43 @@
+/*
+ * 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.
+ */
+
+/*
+ * This file is auto-generated. DO NOT MODIFY!
+ * The source Renderscript file: set_target_api_16.rs
+ */
+package android.renderscript.cts;
+
+import android.renderscript.*;
+import android.content.res.Resources;
+
+/**
+ * @hide
+ */
+public class ScriptC_set_target_api_16 extends ScriptC {
+    // Constructor
+    public  ScriptC_set_target_api_16(RenderScript rs, Resources resources, int id) {
+        super(rs, resources, id);
+    }
+
+    private final static int mExportFuncIdx_check = 0;
+    public void invoke_check(int version) {
+        FieldPacker check_fp = new FieldPacker(4);
+        check_fp.addI32(version);
+        invoke(mExportFuncIdx_check, check_fp);
+    }
+
+}
+
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/StructArrayTest.java b/tests/tests/renderscript/src/android/renderscript/cts/StructArrayTest.java
new file mode 100644
index 0000000..6003ca9
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/StructArrayTest.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.renderscript.cts;
+import com.android.cts.stub.R;
+
+public class StructArrayTest extends RSBaseCompute {
+    /**
+     * Test for that array struct elements are properly set
+     */
+    public void testStructArrays() {
+        mRS.setErrorHandler(mRsError);
+        ScriptC_struct_array pad = new ScriptC_struct_array(mRS,
+                                                            mRes,
+                                                            R.raw.struct_array);
+        ScriptField_ArrayMe S = new ScriptField_ArrayMe(mRS, 1);
+        int[] values = {0, 1, 2, 3, 4};
+        S.set_i(0, values, true);
+
+        pad.bind_s(S);
+        pad.invoke_verify();
+        waitForMessage();
+        checkForErrors();
+    }
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/StructPadTest.java b/tests/tests/renderscript/src/android/renderscript/cts/StructPadTest.java
index 884a0dc..c56c086 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/StructPadTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/StructPadTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 The Android Open Source Project
+ * Copyright (C) 2011-2012 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,12 +17,17 @@
 package android.renderscript.cts;
 
 import android.renderscript.Float4;
+import com.android.cts.stub.R;
 
 public class StructPadTest extends RSBaseCompute {
     /**
      * Test for appropriate alignment/padding of structures.
      */
     public void testStructPadding() {
+        mRS.setErrorHandler(mRsError);
+        ScriptC_struct_pad pad = new ScriptC_struct_pad(mRS,
+                                                        mRes,
+                                                        R.raw.struct_pad);
         ScriptField_PadMe S = new ScriptField_PadMe(mRS, 1);
         Float4 F4 = new Float4(1.0f, 2.0f, 3.0f, 4.0f);
 
@@ -30,6 +35,16 @@
         S.set_f4(0, F4, true);
         S.set_j(0, 9, true);
 
+        ScriptField_PadMe.Item I = new ScriptField_PadMe.Item();
+        I.i = S.get_i(0);
+        I.f4 = S.get_f4(0);
+        I.j = S.get_j(0);
+
         S.set(new ScriptField_PadMe.Item(), 0, true);
+
+        pad.set_s(I);
+        pad.invoke_verify();
+        waitForMessage();
+        checkForErrors();
     }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/VersionTest.java b/tests/tests/renderscript/src/android/renderscript/cts/VersionTest.java
new file mode 100644
index 0000000..6c9e7e9
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/VersionTest.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.renderscript.cts;
+
+import android.renderscript.RenderScript.RSMessageHandler;
+import com.android.cts.stub.R;
+
+/**
+ * Test for appropriate handling of versioned bitcode.
+ */
+public class VersionTest extends RSBaseCompute {
+    public void testVersion11() {
+        ScriptC_set_target_api_11 test11 =
+                new ScriptC_set_target_api_11(mRS,
+                                              mRes,
+                                              R.raw.set_target_api_11);
+        test11.invoke_check(11);
+        waitForMessage();
+        checkForErrors();
+    }
+
+    public void testVersion12() {
+        ScriptC_set_target_api_12 test12 =
+                new ScriptC_set_target_api_12(mRS,
+                                              mRes,
+                                              R.raw.set_target_api_12);
+        test12.invoke_check(12);
+        waitForMessage();
+        checkForErrors();
+    }
+
+    public void testVersion13() {
+        ScriptC_set_target_api_13 test13 =
+                new ScriptC_set_target_api_13(mRS,
+                                              mRes,
+                                              R.raw.set_target_api_13);
+        test13.invoke_check(13);
+        waitForMessage();
+        checkForErrors();
+    }
+
+    public void testVersion14() {
+        ScriptC_set_target_api_14 test14 =
+                new ScriptC_set_target_api_14(mRS,
+                                              mRes,
+                                              R.raw.set_target_api_14);
+        test14.invoke_check(14);
+        waitForMessage();
+        checkForErrors();
+    }
+
+    public void testVersion15() {
+        ScriptC_set_target_api_15 test15 =
+                new ScriptC_set_target_api_15(mRS,
+                                              mRes,
+                                              R.raw.set_target_api_15);
+        test15.invoke_check(15);
+        waitForMessage();
+        checkForErrors();
+    }
+
+    public void testVersion16() {
+        ScriptC_set_target_api_16 test16 =
+                new ScriptC_set_target_api_16(mRS,
+                                              mRes,
+                                              R.raw.set_target_api_16);
+        test16.invoke_check(16);
+        waitForMessage();
+        checkForErrors();
+    }
+}
diff --git a/tests/tests/sax/Android.mk b/tests/tests/sax/Android.mk
index 749588a..9dc1847 100644
--- a/tests/tests/sax/Android.mk
+++ b/tests/tests/sax/Android.mk
@@ -29,4 +29,4 @@
 
 LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/sax/src/android/sax/cts/ElementTest.java b/tests/tests/sax/src/android/sax/cts/ElementTest.java
index 9d6abfb..039b42f 100644
--- a/tests/tests/sax/src/android/sax/cts/ElementTest.java
+++ b/tests/tests/sax/src/android/sax/cts/ElementTest.java
@@ -16,10 +16,6 @@
 
 package android.sax.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import org.xml.sax.Attributes;
 import org.xml.sax.InputSource;
@@ -39,7 +35,6 @@
 import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;
 
-@TestTargetClass(Element.class)
 public class ElementTest extends AndroidTestCase {
     private static final String ATOM_NAMESPACE = "http://www.w3.org/2005/Atom";
     private static final String FEED = "feed";
@@ -73,54 +68,6 @@
         mEntry2ListenersCalled = 0;
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Element",
-            method = "getChild",
-            args = {java.lang.String.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getChild",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setElementListener",
-            args = {android.sax.ElementListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEndTextElementListener",
-            args = {android.sax.EndTextElementListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requireChild",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requireChild",
-            args = {java.lang.String.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEndElementListener",
-            args = {android.sax.EndElementListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setStartElementListener",
-            args = {android.sax.StartElementListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTextElementListener",
-            args = {android.sax.TextElementListener.class}
-        )
-    })
     public void testParse() throws Exception {
         RootElement root = new RootElement(ATOM_NAMESPACE, FEED);
         assertNotNull(root);
diff --git a/tests/tests/sax/src/android/sax/cts/RootElementTest.java b/tests/tests/sax/src/android/sax/cts/RootElementTest.java
index 42c5f24..f390e02 100755
--- a/tests/tests/sax/src/android/sax/cts/RootElementTest.java
+++ b/tests/tests/sax/src/android/sax/cts/RootElementTest.java
@@ -18,34 +18,12 @@
 
 import android.sax.RootElement;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(RootElement.class)
 public class RootElementTest extends AndroidTestCase {
 
     private static final String ATOM_NAMESPACE = "http://www.w3.org/2005/Atom";
     private static final String FEED = "feed";
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getContentHandler",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "RootElement",
-            args = {java.lang.String.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "RootElement",
-            args = {java.lang.String.class}
-        )
-    })
     public void testRoot() throws Exception {
         RootElement root = new RootElement(ATOM_NAMESPACE, FEED);
         assertNotNull(root.getContentHandler());
diff --git a/tests/tests/security/Android.mk b/tests/tests/security/Android.mk
index 6ea5e1b..ef13886 100644
--- a/tests/tests/security/Android.mk
+++ b/tests/tests/security/Android.mk
@@ -28,4 +28,4 @@
 
 LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/security/src/android/security/cts/AslrTest.java b/tests/tests/security/src/android/security/cts/AslrTest.java
new file mode 100644
index 0000000..a4c4f80
--- /dev/null
+++ b/tests/tests/security/src/android/security/cts/AslrTest.java
@@ -0,0 +1,53 @@
+/*
+ * 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.security.cts;
+
+import junit.framework.TestCase;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+
+/**
+ * Verify that ASLR is properly enabled on Android Compatible devices.
+ */
+public class AslrTest extends TestCase {
+
+    public void testOneExecutableIsPie() throws IOException {
+        assertTrue(ReadElf.read(new File("/system/bin/cat")).isPIE());
+    }
+
+    public void testVaRandomize() throws IOException {
+        BufferedReader in = null;
+        try {
+            in = new BufferedReader(new FileReader("/proc/sys/kernel/randomize_va_space"));
+            int level = Integer.parseInt(in.readLine().trim());
+            assertTrue("Expected /proc/sys/kernel/randomize_va_space to be "
+                    + "greater than or equal to 2, got " + level,
+                    level >= 2);
+        } catch (FileNotFoundException e) {
+            // Odd. The file doesn't exist... Assume ASLR is enabled.
+        } finally {
+            if (in != null) {
+                in.close();
+            }
+        }
+    }
+
+}
diff --git a/tests/tests/security/src/android/security/cts/KernelSettingsTest.java b/tests/tests/security/src/android/security/cts/KernelSettingsTest.java
new file mode 100644
index 0000000..7198241
--- /dev/null
+++ b/tests/tests/security/src/android/security/cts/KernelSettingsTest.java
@@ -0,0 +1,72 @@
+/*
+ * 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.security.cts;
+
+import junit.framework.TestCase;
+
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+
+/**
+ * Verify that the kernel is configured how we expect it to be
+ * configured.
+ */
+public class KernelSettingsTest extends TestCase {
+
+    /**
+     * Protect against kernel based NULL pointer attacks by enforcing a
+     * minimum (and maximum!) value of mmap_min_addr.
+     *
+     * http://lwn.net/Articles/342330/
+     * http://lwn.net/Articles/342420/
+     */
+    public void testMmapMinAddr() throws IOException {
+        try {
+            assertEquals("32768", getFile("/proc/sys/vm/mmap_min_addr"));
+        } catch (FileNotFoundException e) {
+            // Odd. The file doesn't exist... Assume we're ok.
+        }
+    }
+
+    /**
+     * /proc/kallsyms will show the address of exported kernel symbols. This
+     * information can be used to write a reliable kernel exploit that can run
+     * on many platforms without using hardcoded pointers. To make this more
+     * difficult for attackers, don't export kernel symbols.
+     */
+    public void testKptrRestrict() throws IOException {
+        try {
+            assertEquals("2", getFile("/proc/sys/kernel/kptr_restrict"));
+        } catch (FileNotFoundException e) {
+            // Odd. The file doesn't exist... Assume we're ok.
+        }
+    }
+
+    private String getFile(String filename) throws IOException {
+        BufferedReader in = null;
+        try {
+            in = new BufferedReader(new FileReader(filename));
+            return in.readLine().trim();
+        } finally {
+            if (in != null) {
+                in.close();
+            }
+        }
+    }
+}
diff --git a/tests/tests/security/src/android/security/cts/ListeningPortsTest.java b/tests/tests/security/src/android/security/cts/ListeningPortsTest.java
new file mode 100644
index 0000000..f3112a3
--- /dev/null
+++ b/tests/tests/security/src/android/security/cts/ListeningPortsTest.java
@@ -0,0 +1,309 @@
+/*
+ * 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 android.security.cts;
+
+import junit.framework.AssertionFailedError;
+import junit.framework.TestCase;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Scanner;
+import java.util.regex.Pattern;
+
+/**
+ * Verifies that Android devices are not listening on accessible
+ * open ports. Open ports are often targeted by attackers looking to break
+ * into computer systems remotely, and minimizing the number of open ports
+ * is considered a security best practice.
+ */
+public class ListeningPortsTest extends TestCase {
+
+    /** Ports that are allowed to be listening. */
+    private static final List<String> EXCEPTION_PATTERNS = new ArrayList<String>(6);
+
+    static {
+        // IPv4 exceptions
+        EXCEPTION_PATTERNS.add("0.0.0.0:5555");   // emulator port
+        EXCEPTION_PATTERNS.add("10.0.2.15:5555"); // net forwarding for emulator
+        EXCEPTION_PATTERNS.add("127.0.0.1:5037"); // adb daemon "smart sockets"
+    }
+
+    /**
+     * Remotely accessible ports are often used by attackers to gain
+     * unauthorized access to computers systems without user knowledge or
+     * awareness.
+     */
+    public void testNoRemotelyAccessibleListeningTcpPorts() throws Exception {
+        assertNoAccessibleListeningPorts("/proc/net/tcp", true, false);
+    }
+
+    /**
+     * Remotely accessible ports are often used by attackers to gain
+     * unauthorized access to computers systems without user knowledge or
+     * awareness.
+     */
+    public void testNoRemotelyAccessibleListeningTcp6Ports() throws Exception {
+        assertNoAccessibleListeningPorts("/proc/net/tcp6", true, false);
+    }
+
+    /**
+     * Remotely accessible ports are often used by attackers to gain
+     * unauthorized access to computers systems without user knowledge or
+     * awareness.
+     */
+    public void testNoRemotelyAccessibleListeningUdpPorts() throws Exception {
+        assertNoRemotelyAccessibleListeningUdpPorts("/proc/net/udp", false);
+    }
+
+    /**
+     * Remotely accessible ports are often used by attackers to gain
+     * unauthorized access to computers systems without user knowledge or
+     * awareness.
+     */
+    public void testNoRemotelyAccessibleListeningUdp6Ports() throws Exception {
+        assertNoRemotelyAccessibleListeningUdpPorts("/proc/net/udp6", false);
+    }
+
+    /**
+     * Locally accessible ports are often targeted by malicious locally
+     * installed programs to gain unauthorized access to program data or
+     * cause system corruption.
+     *
+     * In all cases, a local listening IP port can be replaced by a UNIX domain
+     * socket. Unix domain sockets can be protected with unix filesystem
+     * permission. Alternatively, you can use getsockopt(SO_PEERCRED) to
+     * determine if a program is authorized to connect to your socket.
+     *
+     * Please convert loopback IP connections to unix domain sockets.
+     */
+    public void testNoListeningLoopbackTcpPorts() throws Exception {
+        assertNoAccessibleListeningPorts("/proc/net/tcp", true, true);
+    }
+
+    /**
+     * Locally accessible ports are often targeted by malicious locally
+     * installed programs to gain unauthorized access to program data or
+     * cause system corruption.
+     *
+     * In all cases, a local listening IP port can be replaced by a UNIX domain
+     * socket. Unix domain sockets can be protected with unix filesystem
+     * permission. Alternatively, you can use getsockopt(SO_PEERCRED) to
+     * determine if a program is authorized to connect to your socket.
+     *
+     * Please convert loopback IP connections to unix domain sockets.
+     */
+    public void testNoListeningLoopbackTcp6Ports() throws Exception {
+        assertNoAccessibleListeningPorts("/proc/net/tcp6", true, true);
+    }
+
+    /**
+     * Locally accessible ports are often targeted by malicious locally
+     * installed programs to gain unauthorized access to program data or
+     * cause system corruption.
+     *
+     * In all cases, a local listening IP port can be replaced by a UNIX domain
+     * socket. Unix domain sockets can be protected with unix filesystem
+     * permission.  Alternately, or you can use setsockopt(SO_PASSCRED) to
+     * send credentials, and recvmsg to retrieve the passed credentials.
+     *
+     * Please convert loopback IP connections to unix domain sockets.
+     */
+    public void testNoListeningLoopbackUdpPorts() throws Exception {
+        assertNoAccessibleListeningPorts("/proc/net/udp", false, true);
+    }
+
+    /**
+     * Locally accessible ports are often targeted by malicious locally
+     * installed programs to gain unauthorized access to program data or
+     * cause system corruption.
+     *
+     * In all cases, a local listening IP port can be replaced by a UNIX domain
+     * socket. Unix domain sockets can be protected with unix filesystem
+     * permission.  Alternately, or you can use setsockopt(SO_PASSCRED) to
+     * send credentials, and recvmsg to retrieve the passed credentials.
+     *
+     * Please convert loopback IP connections to unix domain sockets.
+     */
+    public void testNoListeningLoopbackUdp6Ports() throws Exception {
+        assertNoAccessibleListeningPorts("/proc/net/udp6", false, true);
+    }
+
+    private static final int RETRIES_MAX = 6;
+
+    /**
+     * UDP tests can be flaky due to DNS lookups.  Compensate.
+     */
+    private static void assertNoRemotelyAccessibleListeningUdpPorts(
+            String procFilePath, boolean loopback)
+            throws Exception {
+        for (int i = 0; i < RETRIES_MAX; i++) {
+            try {
+                assertNoAccessibleListeningPorts(procFilePath, false, loopback);
+                return;
+            } catch (ListeningPortsAssertionError e) {
+                if (i == RETRIES_MAX - 1) {
+                    throw e;
+                }
+                Thread.sleep(2 * 1000 * i);
+            }
+        }
+        throw new IllegalStateException("unreachable");
+    }
+
+    /**
+     * Remotely accessible ports (loopback==false) are often used by
+     * attackers to gain unauthorized access to computers systems without
+     * user knowledge or awareness.
+     *
+     * Locally accessible ports (loopback==true) are often targeted by
+     * malicious locally installed programs to gain unauthorized access to
+     * program data or cause system corruption.
+     */
+    private static void assertNoAccessibleListeningPorts(
+            String procFilePath, boolean isTcp, boolean loopback) throws IOException {
+        String errors = "";
+        List<ParsedProcEntry> entries = ParsedProcEntry.parse(procFilePath);
+        for (ParsedProcEntry entry : entries) {
+            String addrPort = entry.localAddress.getHostAddress() + ':' + entry.port;
+
+            if (isPortListening(entry.state, isTcp)
+                && !isException(addrPort)
+                && (!entry.localAddress.isLoopbackAddress() ^ loopback)) {
+                errors += "\nFound port listening on addr="
+                        + entry.localAddress.getHostAddress() + ", port="
+                        + entry.port + ", UID=" + entry.uid + " in "
+                        + procFilePath;
+            }
+        }
+        if (!errors.equals("")) {
+            fail(errors);
+        }
+    }
+
+    private static boolean isException(String localAddress) {
+        return isPatternMatch(EXCEPTION_PATTERNS, localAddress);
+    }
+
+    private static boolean isPatternMatch(List<String> patterns, String input) {
+        for (String pattern : patterns) {
+            pattern = Pattern.quote(pattern);
+            if (Pattern.matches(pattern, input)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private static boolean isPortListening(String state, boolean isTcp) {
+        // 0A = TCP_LISTEN from include/net/tcp_states.h
+        String listeningState = isTcp ? "0A" : "07";
+        return listeningState.equals(state);
+    }
+
+    private static class ListeningPortsAssertionError extends AssertionFailedError {
+        private ListeningPortsAssertionError(String msg) {
+            super(msg);
+        }
+    }
+
+    private static class ParsedProcEntry {
+        private final InetAddress localAddress;
+        private final int port;
+        private final String state;
+        private final int uid;
+
+        private ParsedProcEntry(InetAddress addr, int port, String state, int uid) {
+            this.localAddress = addr;
+            this.port = port;
+            this.state = state;
+            this.uid = uid;
+        }
+
+
+        private static List<ParsedProcEntry> parse(String procFilePath) throws IOException {
+
+            List<ParsedProcEntry> retval = new ArrayList<ParsedProcEntry>();
+            /*
+            * Sample output of "cat /proc/net/tcp" on emulator:
+            *
+            * sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  ...
+            * 0: 0100007F:13AD 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0   ...
+            * 1: 00000000:15B3 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0   ...
+            * 2: 0F02000A:15B3 0202000A:CE8A 01 00000000:00000000 00:00000000 00000000     0   ...
+            *
+            */
+
+            File procFile = new File(procFilePath);
+            Scanner scanner = null;
+            try {
+                scanner = new Scanner(procFile);
+                while (scanner.hasNextLine()) {
+                    String line = scanner.nextLine().trim();
+
+                    // Skip column headers
+                    if (line.startsWith("sl")) {
+                        continue;
+                    }
+
+                    String[] fields = line.split("\\s+");
+                    final int expectedNumColumns = 12;
+                    assertTrue(procFilePath + " should have at least " + expectedNumColumns
+                            + " columns of output " + fields, fields.length >= expectedNumColumns);
+
+                    String state = fields[3];
+                    int uid = Integer.parseInt(fields[7]);
+                    InetAddress localIp = addrToInet(fields[1].split(":")[0]);
+                    int localPort = Integer.parseInt(fields[1].split(":")[1], 16);
+
+                    retval.add(new ParsedProcEntry(localIp, localPort, state, uid));
+                }
+            } finally {
+                if (scanner != null) {
+                    scanner.close();
+                }
+            }
+            return retval;
+        }
+
+        /**
+         * Convert a string stored in little endian format to an IP address.
+         */
+        private static InetAddress addrToInet(String s) throws UnknownHostException {
+            int len = s.length();
+            if (len != 8 && len != 32) {
+                throw new IllegalArgumentException(len + "");
+            }
+            byte[] retval = new byte[len / 2];
+
+            for (int i = 0; i < len / 2; i += 4) {
+                retval[i] = (byte) ((Character.digit(s.charAt(2*i + 6), 16) << 4)
+                        + Character.digit(s.charAt(2*i + 7), 16));
+                retval[i + 1] = (byte) ((Character.digit(s.charAt(2*i + 4), 16) << 4)
+                        + Character.digit(s.charAt(2*i + 5), 16));
+                retval[i + 2] = (byte) ((Character.digit(s.charAt(2*i + 2), 16) << 4)
+                        + Character.digit(s.charAt(2*i + 3), 16));
+                retval[i + 3] = (byte) ((Character.digit(s.charAt(2*i), 16) << 4)
+                        + Character.digit(s.charAt(2*i + 1), 16));
+            }
+            return InetAddress.getByAddress(retval);
+        }
+    }
+}
diff --git a/tests/tests/security/src/android/security/cts/PIILogTest.java b/tests/tests/security/src/android/security/cts/PIILogTest.java
new file mode 100644
index 0000000..d7ed5c4
--- /dev/null
+++ b/tests/tests/security/src/android/security/cts/PIILogTest.java
@@ -0,0 +1,200 @@
+/*
+ * 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.security.cts;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.location.Address;
+import android.location.Geocoder;
+import android.location.Location;
+import android.location.LocationManager;
+import android.telephony.SmsManager;
+import android.telephony.TelephonyManager;
+import android.test.AndroidTestCase;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.util.List;
+
+public class PIILogTest extends AndroidTestCase {
+
+    private boolean mHasLocation;
+    private boolean mIsPhone;
+    private LocationManager mLocationManager;
+    private PackageManager mPackageManager;
+    private String mPhoneNumber;
+    private TelephonyManager mTelephonyManager;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        mPackageManager = mContext.getPackageManager();
+
+        mIsPhone = mPackageManager.hasSystemFeature(
+                PackageManager.FEATURE_TELEPHONY);
+        if (mIsPhone) {
+            mTelephonyManager = (TelephonyManager)mContext.getSystemService(
+                    Context.TELEPHONY_SERVICE);
+            mPhoneNumber = mTelephonyManager.getLine1Number();
+        }
+
+        mHasLocation = mPackageManager.hasSystemFeature(PackageManager.FEATURE_LOCATION);
+        if (mHasLocation) {
+            mLocationManager = (LocationManager)mContext.getSystemService(Context.LOCATION_SERVICE);
+        }
+    }
+
+    private Location getLocation() {
+        return mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
+    }
+
+    public void testLogEmail() throws Exception {
+        // get the account manager
+        AccountManager accountManager = AccountManager.get(mContext);
+
+        // get all the accounts
+        Account[] accounts = accountManager.getAccounts();
+
+        // iterate over the accounts
+        for (Account accnt : accounts) {
+
+            // get the portion of the account prior to an '@', if present
+            String fullName = accnt.name;
+            String nameFragment = fullName;
+            int index = fullName.indexOf("@");
+            if (index > 0) {
+                nameFragment = fullName.substring(0, index);
+            }
+
+            // check to make sure this account doesn't show up in the logs
+            assertValueNotInLogs(nameFragment);
+        }
+    }
+
+    public void testLogPhoneCalls() throws Exception {
+        // check to make sure we're a phone...
+        if (mIsPhone && (mPhoneNumber != null)) {
+            assertValueNotInLogs(mPhoneNumber);
+        }
+    }
+
+    public void testLogIMEI() throws Exception {
+        // check to make sure we're a phone...
+        if (mIsPhone) {
+
+            // get our imei
+            String imei = mTelephonyManager.getDeviceId();
+
+            // check if the number shows up in logs
+            assertValueNotInLogs(imei);
+        }
+    }
+
+    public void testLogLocation() throws Exception {
+        // check to make sure we can get location data
+        if (mHasLocation) {
+
+            // try to get our location
+            Location location = getLocation();
+
+            // we didn't get it, and so need to bail.
+            // this is done to avoid a situation in which the test fails due
+            // to network conditions or a timeout.
+            if (location == null) {
+                return;
+            }
+
+            // get our latitude and longitude
+            double longitude = location.getLongitude();
+            double latitude = location.getLatitude();
+
+            // check if either of those show up in the logs
+            assertValueNotInLogs(Double.toString(longitude));
+
+            assertValueNotInLogs(Double.toString(latitude));
+
+            // get other names for where we are
+            Geocoder geo = new Geocoder(mContext);
+            List<Address> addresses = geo.getFromLocation(latitude, longitude, 10);
+
+            // iterate over those
+            for (Address addr : addresses) {
+                // we want to check for several interesting bits of data:
+                //    1. look for the locality
+                //    2. look for the sub-locality
+                //    3. look for the thoroughfare
+                //    4. look for the postal code
+                String locality = addr.getLocality();
+                if (locality != null) {
+                    assertValueNotInLogs(locality);
+                }
+
+                String sublocality = addr.getSubLocality();
+                if (sublocality != null) {
+                    assertValueNotInLogs(sublocality);
+                }
+
+                String thoroughfare = addr.getThoroughfare();
+                if (thoroughfare != null) {
+                    assertValueNotInLogs(thoroughfare);
+                }
+
+                String postal_code = addr.getPostalCode();
+                if (postal_code != null) {
+                    assertValueNotInLogs(postal_code);
+                }
+            }
+        }
+    }
+
+    public void testLogSMS() throws Exception {
+        // check to make sure we're a phone...
+        if (mIsPhone && (mPhoneNumber != null)) {
+
+            // send an SMS to our number
+            SmsManager manager = SmsManager.getDefault();
+            manager.sendTextMessage(mPhoneNumber, null, "%^&*(", null, null);
+
+            // check if that number shows up in logs
+            assertValueNotInLogs(mPhoneNumber);
+
+            // check if any message fragments show up in logs
+            assertValueNotInLogs("%^&*(");
+        }
+    }
+
+    private void assertValueNotInLogs(String value) throws Exception {
+        StringBuilder failLines = new StringBuilder();
+        Process process = Runtime.getRuntime().exec("logcat -d *:IWFSE");
+        BufferedReader bufferedReader = new BufferedReader(
+                new InputStreamReader(process.getInputStream()));
+        String line;
+        while ((line = bufferedReader.readLine()) != null) {
+            if (line.contains(value)) {
+                failLines.append(line);
+            }
+        }
+        bufferedReader.close();
+        String message = failLines.toString();
+        assertTrue(message, message.isEmpty()); 
+    }
+}
diff --git a/tests/tests/security/src/android/security/cts/ReadElf.java b/tests/tests/security/src/android/security/cts/ReadElf.java
new file mode 100644
index 0000000..2266b8b
--- /dev/null
+++ b/tests/tests/security/src/android/security/cts/ReadElf.java
@@ -0,0 +1,492 @@
+/*
+ * 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.security.cts;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * A poor man's implementation of the readelf command. This program is
+ * designed to parse ELF (Executable and Linkable Format) files.
+ */
+class ReadElf {
+    /** The magic values for the ELF identification. */
+    private static final byte[] ELF_IDENT = {
+            (byte) 0x7F, (byte) 'E', (byte) 'L', (byte) 'F',
+    };
+
+    /** Size of the e_ident[] structure in the ELF header. */
+    private static final int EI_NIDENT = 16;
+
+    /** Offset from end of ident structure in half-word sizes. */
+    private static final int OFFSET_TYPE = 0;
+
+    /** Machine type. */
+    private static final int OFFSET_MACHINE = 1;
+
+    /** ELF version. */
+    private static final int OFFSET_VERSION = 2;
+
+    /**
+     * The offset to which the system transfers control. e.g., the first thing
+     * executed.
+     */
+    private static final int OFFSET_ENTRY = 4;
+
+    /** Program header offset in bytes. */
+    private static final int OFFSET_PHOFF = 6;
+
+    /** Segment header offset in bytes. */
+    private static final int OFFSET_SHOFF = 8;
+
+    /** Processor-specific flags for binary. */
+    private static final int OFFSET_FLAGS = 10;
+
+    /** ELF header size in bytes. */
+    private static final int OFFSET_EHSIZE = 12;
+
+    /** All program headers entry size in bytes. */
+    private static final int OFFSET_PHENTSIZE = 13;
+
+    /** Number of program headers in ELF. */
+    private static final int OFFSET_PHNUM = 14;
+
+    /** All segment headers entry size in bytes. */
+    private static final int OFFSET_SHENTSIZE = 15;
+
+    /** Number of segment headers in ELF. */
+    private static final int OFFSET_SHNUM = 16;
+
+    /** The section header index that refers to string table. */
+    private static final int OFFSET_SHSTRNDX = 17;
+
+    /** Program header offset for type of this program header. */
+    private static final int PHOFF_TYPE = 0;
+
+    /** Program header offset for absolute offset in file. */
+    private static final int PHOFF_OFFSET = 2;
+
+    /** Program header offset for virtual address. */
+    private static final int PHOFF_VADDR = 4;
+
+    /** Program header offset for physical address. */
+    private static final int PHOFF_PADDR = 6;
+
+    /** Program header offset for file size in bytes. */
+    private static final int PHOFF_FILESZ = 8;
+
+    /** Program header offset for memory size in bytes. */
+    private static final int PHOFF_MEMSZ = 10;
+
+    /** Program header offset for flags. */
+    private static final int PHOFF_FLAGS = 12;
+
+    /**
+     * Program header offset for required alignment. 0 or 1 means no alignment
+     * necessary.
+     */
+    private static final int PHOFF_ALIGN = 14;
+
+    /** Index into string pool for segment name. */
+    private static final long SHOFF_NAME = 0;
+
+    /** Segment header offset for type (half-words) */
+    private static final long SHOFF_TYPE = 2;
+
+    /** Segment header offset for offset (meta!) (half-words) */
+    private static final long SHOFF_OFFSET = 8;
+
+    /** Segment header offset for size (half-words) */
+    private static final long SHOFF_SIZE = 10;
+
+    /** Data is presented in LSB format. */
+    private static final int ELFDATA2LSB = 1;
+
+    /** Date is presented in MSB format. */
+    private static final int ELFDATA2MSB = 2;
+
+    private static final int ELFCLASS32 = 1;
+
+    private static final int ELFCLASS64 = 2;
+
+    private static final long PT_LOAD = 1;
+
+    /** Section Type: Symbol Table */
+    private static final int SHT_SYMTAB = 2;
+
+    /** Section Type: String Table */
+    private static final int SHT_STRTAB = 3;
+
+    /** Section Type: Dynamic **/
+    private static final int SHT_DYNAMIC = 6;
+
+    /** Section Type: Dynamic Symbol Table */
+    private static final int SHT_DYNSYM = 11;
+
+    /** Symbol Table Entry: Name offset */
+    private static final int SYMTAB_NAME = 0;
+
+    /** Symbol Table Entry: SymTab Info */
+    private static final int SYMTAB_ST_INFO = 6;
+
+    /** Symbol Table Entry size (half-words) */
+    private static final int SYMTAB_ENTRY_HALFWORD_SIZE = 7;
+
+    /**
+     * Symbol Table Entry size (extra in bytes) to cover "st_info" and
+     * "st_other"
+     */
+    private static final int SYMTAB_ENTRY_BYTE_EXTRA_SIZE = 2;
+
+    public static class Symbol {
+        public static final int STB_LOCAL = 0;
+
+        public static final int STB_GLOBAL = 1;
+
+        public static final int STB_WEAK = 2;
+
+        public static final int STB_LOPROC = 13;
+
+        public static final int STB_HIPROC = 15;
+
+        public final String name;
+
+        public final int bind;
+
+        public final int type;
+
+        Symbol(String name, int st_info) {
+            this.name = name;
+            this.bind = (st_info >> 4) & 0x0F;
+            this.type = st_info & 0x0F;
+        }
+    };
+
+    private final RandomAccessFile mFile;
+    private final byte[] mBuffer = new byte[512];
+    private int mClass;
+    private int mEndian;
+    private boolean mIsDynamic;
+    private boolean mIsPIE;
+    private int mType;
+    private int mWordSize;
+    private int mHalfWordSize;
+
+    /** Symbol Table offset */
+    private long mSymTabOffset;
+
+    /** Symbol Table size */
+    private long mSymTabSize;
+
+    /** Dynamic Symbol Table offset */
+    private long mDynSymOffset;
+
+    /** Dynamic Symbol Table size */
+    private long mDynSymSize;
+
+    /** Section Header String Table offset */
+    private long mShStrTabOffset;
+
+    /** Section Header String Table size */
+    private long mShStrTabSize;
+
+    /** String Table offset */
+    private long mStrTabOffset;
+
+    /** String Table size */
+    private long mStrTabSize;
+
+    /** Dynamic String Table offset */
+    private long mDynStrOffset;
+
+    /** Dynamic String Table size */
+    private long mDynStrSize;
+
+    /** Symbol Table symbol names */
+    private Map<String, Symbol> mSymbols;
+
+    /** Dynamic Symbol Table symbol names */
+    private Map<String, Symbol> mDynamicSymbols;
+
+    static ReadElf read(File file) throws IOException {
+        return new ReadElf(file);
+    }
+
+    boolean isDynamic() {
+        return mIsDynamic;
+    }
+
+    int getType() {
+        return mType;
+    }
+
+    boolean isPIE() {
+        return mIsPIE;
+    }
+
+    private ReadElf(File file) throws IOException {
+        mFile = new RandomAccessFile(file, "r");
+
+        readIdent();
+
+        readHeader();
+    }
+
+    protected void finalize() throws Throwable {
+        try {
+            mFile.close();
+        } catch (IOException e) {
+            // nothing
+        } finally {
+            super.finalize();
+        }
+    }
+
+    private void readHeader() throws IOException {
+        mType = readHalf(getHeaderOffset(OFFSET_TYPE));
+
+        final long shOffset = readWord(getHeaderOffset(OFFSET_SHOFF));
+        final int shNumber = readHalf(getHeaderOffset(OFFSET_SHNUM));
+        final int shSize = readHalf(getHeaderOffset(OFFSET_SHENTSIZE));
+        final int shStrIndex = readHalf(getHeaderOffset(OFFSET_SHSTRNDX));
+
+        readSectionHeaders(shOffset, shNumber, shSize, shStrIndex);
+
+        final long phOffset = readWord(getHeaderOffset(OFFSET_PHOFF));
+        final int phNumber = readHalf(getHeaderOffset(OFFSET_PHNUM));
+        final int phSize = readHalf(getHeaderOffset(OFFSET_PHENTSIZE));
+
+        readProgramHeaders(phOffset, phNumber, phSize);
+    }
+
+    private void readSectionHeaders(long tableOffset, int shNumber, int shSize, int shStrIndex)
+            throws IOException {
+        // Read the Section Header String Table offset first.
+        {
+            final long shStrTabShOffset = tableOffset + shStrIndex * shSize;
+            final long type = readWord(shStrTabShOffset + mHalfWordSize * SHOFF_TYPE);
+
+            if (type == SHT_STRTAB) {
+                mShStrTabOffset = readWord(shStrTabShOffset + mHalfWordSize * SHOFF_OFFSET);
+                mShStrTabSize = readWord(shStrTabShOffset + mHalfWordSize * SHOFF_SIZE);
+            }
+        }
+
+        for (int i = 0; i < shNumber; i++) {
+            // Don't bother to re-read the Section Header StrTab.
+            if (i == shStrIndex) {
+                continue;
+            }
+
+            final long shOffset = tableOffset + i * shSize;
+
+            final long type = readWord(shOffset + mHalfWordSize * SHOFF_TYPE);
+            if ((type == SHT_SYMTAB) || (type == SHT_DYNSYM)) {
+                final long nameOffset = readWord(shOffset + mHalfWordSize * SHOFF_NAME);
+                final long offset = readWord(shOffset + mHalfWordSize * SHOFF_OFFSET);
+                final long size = readWord(shOffset + mHalfWordSize * SHOFF_SIZE);
+
+                final String symTabName = readShStrTabEntry(nameOffset);
+                if (".symtab".equals(symTabName)) {
+                    mSymTabOffset = offset;
+                    mSymTabSize = size;
+                } else if (".dynsym".equals(symTabName)) {
+                    mDynSymOffset = offset;
+                    mDynSymSize = size;
+                }
+            } else if (type == SHT_STRTAB) {
+                final long nameOffset = readWord(shOffset + mHalfWordSize * SHOFF_NAME);
+                final long offset = readWord(shOffset + mHalfWordSize * SHOFF_OFFSET);
+                final long size = readWord(shOffset + mHalfWordSize * SHOFF_SIZE);
+
+                final String strTabName = readShStrTabEntry(nameOffset);
+                if (".strtab".equals(strTabName)) {
+                    mStrTabOffset = offset;
+                    mStrTabSize = size;
+                } else if (".dynstr".equals(strTabName)) {
+                    mDynStrOffset = offset;
+                    mDynStrSize = size;
+                }
+            } else if (type == SHT_DYNAMIC) {
+                mIsDynamic = true;
+            }
+        }
+    }
+
+    private void readProgramHeaders(long phOffset, int phNumber, int phSize) throws IOException {
+        for (int i = 0; i < phNumber; i++) {
+            final long baseOffset = phOffset + i * phSize;
+            final long type = readWord(baseOffset);
+            if (type == PT_LOAD) {
+                final long virtAddress = readWord(baseOffset + mHalfWordSize * PHOFF_VADDR);
+                if (virtAddress == 0) {
+                    mIsPIE = true;
+                }
+            }
+        }
+    }
+
+    private void readSymbolTable(Map<String, Symbol> symbolMap, long symStrOffset, long symStrSize,
+            long symOffset, long symSize) throws IOException {
+        final long symEnd = symOffset + symSize;
+        for (long off = symOffset; off < symEnd; off += SYMTAB_ENTRY_HALFWORD_SIZE * mHalfWordSize
+                + SYMTAB_ENTRY_BYTE_EXTRA_SIZE) {
+            long strOffset = readWord(off + SYMTAB_NAME);
+            if (strOffset == 0) {
+                continue;
+            }
+
+            final String symName = readStrTabEntry(symStrOffset, symStrSize, strOffset);
+            if (symName != null) {
+                final int st_info = readByte(off + SYMTAB_ST_INFO);
+                symbolMap.put(symName, new Symbol(symName, st_info));
+            }
+        }
+    }
+
+    private String readShStrTabEntry(long strOffset) throws IOException {
+        if ((mShStrTabOffset == 0) || (strOffset < 0) || (strOffset >= mShStrTabSize)) {
+            return null;
+        }
+
+        return readString(mShStrTabOffset + strOffset);
+    }
+
+    private String readStrTabEntry(long tableOffset, long tableSize, long strOffset)
+            throws IOException {
+        if ((tableOffset == 0) || (strOffset < 0) || (strOffset >= tableSize)) {
+            return null;
+        }
+
+        return readString(tableOffset + strOffset);
+    }
+
+    private int getHeaderOffset(int halfWorldOffset) {
+        return EI_NIDENT + halfWorldOffset * mHalfWordSize;
+    }
+
+    private int readByte(long offset) throws IOException {
+        mFile.seek(offset);
+        mFile.readFully(mBuffer, 0, 1);
+
+        return mBuffer[0];
+    }
+
+    private int readHalf(long offset) throws IOException {
+        mFile.seek(offset);
+        mFile.readFully(mBuffer, 0, mWordSize);
+
+        final int answer;
+        if (mEndian == ELFDATA2LSB) {
+            answer = mBuffer[1] << 8 | mBuffer[0];
+        } else {
+            answer = mBuffer[0] << 8 | mBuffer[1];
+        }
+
+        return answer;
+    }
+
+    private long readWord(long offset) throws IOException {
+        mFile.seek(offset);
+        mFile.readFully(mBuffer, 0, mWordSize);
+
+        int answer = 0;
+        if (mEndian == ELFDATA2LSB) {
+            for (int i = mWordSize - 1; i >= 0; i--) {
+                answer = (answer << 8) | (mBuffer[i] & 0xFF);
+            }
+        } else {
+            final int N = mWordSize - 1;
+            for (int i = 0; i <= N; i++) {
+                answer = (answer << 8) | mBuffer[i];
+            }
+        }
+
+        return answer;
+    }
+
+    private String readString(long offset) throws IOException {
+        mFile.seek(offset);
+        mFile.readFully(mBuffer, 0, (int) Math.min(mBuffer.length, mFile.length() - offset));
+
+        for (int i = 0; i < mBuffer.length; i++) {
+            if (mBuffer[i] == 0) {
+                return new String(mBuffer, 0, i);
+            }
+        }
+
+        return null;
+    }
+
+    private void readIdent() throws IOException {
+        mFile.seek(0);
+        mFile.readFully(mBuffer, 0, EI_NIDENT);
+
+        if ((mBuffer[0] != ELF_IDENT[0]) || (mBuffer[1] != ELF_IDENT[1])
+                || (mBuffer[2] != ELF_IDENT[2]) || (mBuffer[3] != ELF_IDENT[3])) {
+            throw new IllegalArgumentException("Invalid ELF file");
+        }
+
+        mClass = mBuffer[4];
+        if (mClass == ELFCLASS32) {
+            mWordSize = 4;
+            mHalfWordSize = 2;
+        } else {
+            throw new IOException("Invalid executable type " + mClass + ": not ELFCLASS32!");
+        }
+
+        mEndian = mBuffer[5];
+    }
+
+    public Symbol getSymbol(String name) {
+        if ((mSymTabOffset == 0) && (mSymTabSize == 0)) {
+            return null;
+        }
+
+        if (mSymbols == null) {
+            mSymbols = new HashMap<String, Symbol>();
+            try {
+                readSymbolTable(mSymbols, mStrTabOffset, mStrTabSize, mSymTabOffset, mSymTabSize);
+            } catch (IOException e) {
+                return null;
+            }
+        }
+
+        return mSymbols.get(name);
+    }
+
+    public Symbol getDynamicSymbol(String name) {
+        if ((mDynSymOffset == 0) && (mDynSymSize == 0)) {
+            return null;
+        }
+
+        if (mDynamicSymbols == null) {
+            mDynamicSymbols = new HashMap<String, Symbol>();
+            try {
+                readSymbolTable(mDynamicSymbols, mDynStrOffset, mDynStrSize, mDynSymOffset,
+                        mDynSymSize);
+            } catch (IOException e) {
+                return null;
+            }
+        }
+
+        return mDynamicSymbols.get(name);
+    }
+}
diff --git a/tests/tests/security/src/android/security/cts/VoldExploitTest.java b/tests/tests/security/src/android/security/cts/VoldExploitTest.java
index ab14f12..702361d 100644
--- a/tests/tests/security/src/android/security/cts/VoldExploitTest.java
+++ b/tests/tests/security/src/android/security/cts/VoldExploitTest.java
@@ -69,18 +69,14 @@
         int pid = findVold();
 
         StorageManager sm = (StorageManager) getContext().getSystemService(Context.STORAGE_SERVICE);
-        try {
-            sm.getMountedObbPath("AAAA AAAA AAAA AAAA "
-                    + "AAAA AAAA AAAA AAAA "
-                    + "AAAA AAAA AAAA AAAA "
-                    + "AAAA AAAA AAAA AAAA"
-                    + "AAAA AAAA AAAA AAAA"
-                    + "AAAA AAAA AAAA AAAA"
-                    + "AAAA AAAA AAAA AAAA"
-                    + "AAAA AAAA AAAA AAAA");
-        } catch (IllegalStateException e) {
-            // expected
-        }
+        sm.getMountedObbPath("AAAA AAAA AAAA AAAA "
+                + "AAAA AAAA AAAA AAAA "
+                + "AAAA AAAA AAAA AAAA "
+                + "AAAA AAAA AAAA AAAA"
+                + "AAAA AAAA AAAA AAAA"
+                + "AAAA AAAA AAAA AAAA"
+                + "AAAA AAAA AAAA AAAA"
+                + "AAAA AAAA AAAA AAAA");
 
         Thread.sleep(2000);  // give vold some time to crash
 
diff --git a/tests/tests/speech/Android.mk b/tests/tests/speech/Android.mk
index 932c564..225acf3 100755
--- a/tests/tests/speech/Android.mk
+++ b/tests/tests/speech/Android.mk
@@ -31,5 +31,4 @@
 
 LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
 
-include $(BUILD_PACKAGE)
-
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/telephony/Android.mk b/tests/tests/telephony/Android.mk
index 6ccc9b3..de5c2ac 100644
--- a/tests/tests/telephony/Android.mk
+++ b/tests/tests/telephony/Android.mk
@@ -33,5 +33,4 @@
 # uncomment when dalvik.annotation.Test* are removed or part of SDK
 # #LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
-
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/telephony/src/android/telephony/cts/CellLocationTest.java b/tests/tests/telephony/src/android/telephony/cts/CellLocationTest.java
index 9cf1fb6..61b97b2 100644
--- a/tests/tests/telephony/src/android/telephony/cts/CellLocationTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/CellLocationTest.java
@@ -15,10 +15,6 @@
  */
 package android.telephony.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.Context;
 import android.os.Looper;
@@ -29,7 +25,6 @@
 import android.telephony.gsm.GsmCellLocation;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(CellLocation.class)
 public class CellLocationTest extends AndroidTestCase {
     private boolean mOnCellLocationChangedCalled;
     private final Object mLock = new Object();
@@ -56,18 +51,6 @@
         super.tearDown();
     }
 
-    @TestTargets({
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getEmpty",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "requestLocationUpdate",
-        args = {}
-      )
-    })
     public void testCellLocation() throws Throwable {
         CellLocation cl = CellLocation.getEmpty();
         if (cl instanceof GsmCellLocation) {
diff --git a/tests/tests/telephony/src/android/telephony/cts/NeighboringCellInfoTest.java b/tests/tests/telephony/src/android/telephony/cts/NeighboringCellInfoTest.java
index 38182a5..535212f 100644
--- a/tests/tests/telephony/src/android/telephony/cts/NeighboringCellInfoTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/NeighboringCellInfoTest.java
@@ -21,82 +21,15 @@
 import static android.telephony.TelephonyManager.NETWORK_TYPE_GPRS;
 import static android.telephony.TelephonyManager.NETWORK_TYPE_UMTS;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.os.Parcel;
 import android.telephony.NeighboringCellInfo;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(NeighboringCellInfo.class)
 public class NeighboringCellInfoTest extends AndroidTestCase{
     private static final int RSSI = 20;
     private static final int CID = 0xffff;
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "NeighboringCellInfo",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "NeighboringCellInfo",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "NeighboringCellInfo",
-            args = {Parcel.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRssi",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLac",
-            args = {}
-        ),
-        @TestTargetNew(
-                level = TestLevel.COMPLETE,
-                method = "getCid",
-                args = {}
-        ),
-        @TestTargetNew(
-                level = TestLevel.COMPLETE,
-                method = "getPsc",
-                args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRssi",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setCid",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "describeContents",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "toString",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeToParcel",
-            args = {Parcel.class, int.class}
-        )
-    })
     public void testNeighboringCellInfo() {
         int rssi = 31;
         String location = "ffffffff";
diff --git a/tests/tests/telephony/src/android/telephony/cts/PhoneNumberFormattingTextWatcherTest.java b/tests/tests/telephony/src/android/telephony/cts/PhoneNumberFormattingTextWatcherTest.java
deleted file mode 100644
index b96dcd9..0000000
--- a/tests/tests/telephony/src/android/telephony/cts/PhoneNumberFormattingTextWatcherTest.java
+++ /dev/null
@@ -1,69 +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.telephony.cts;
-
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-
-import android.telephony.PhoneNumberFormattingTextWatcher;
-import android.test.AndroidTestCase;
-import android.text.Editable;
-import android.widget.TextView;
-
-@TestTargetClass(PhoneNumberFormattingTextWatcher.class)
-public class PhoneNumberFormattingTextWatcherTest extends AndroidTestCase {
-
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "PhoneNumberFormattingTextWatcher",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "beforeTextChanged",
-            args = {java.lang.CharSequence.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "afterTextChanged",
-            args = {android.text.Editable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "onTextChanged",
-            args = {java.lang.CharSequence.class, int.class, int.class, int.class}
-        )
-    })
-    public void testPhoneNumberFormattingTextWatcher() {
-        TextView text = new TextView(getContext());
-        text.addTextChangedListener(new PhoneNumberFormattingTextWatcher());
-
-        text.setText("+15551212");
-        assertEquals("+1-555-1212", text.getText().toString());
-
-        // delete first dash and first 5
-        Editable edit = (Editable) text.getText();
-        edit.delete(2, 3);
-        assertEquals("+1-551-212", text.getText().toString());
-
-        // already formatted correctly
-        text.setText("+1-555-1212");
-        assertEquals("+1-555-1212", text.getText().toString());
-    }
-}
diff --git a/tests/tests/telephony/src/android/telephony/cts/PhoneNumberUtilsTest.java b/tests/tests/telephony/src/android/telephony/cts/PhoneNumberUtilsTest.java
index 23891e0..3fc5b28 100644
--- a/tests/tests/telephony/src/android/telephony/cts/PhoneNumberUtilsTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/PhoneNumberUtilsTest.java
@@ -15,10 +15,6 @@
  */
 package android.telephony.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.ContentResolver;
 import android.content.ContentValues;
@@ -36,24 +32,11 @@
 
 import java.util.Locale;
 
-@TestTargetClass(PhoneNumberUtils.class)
 public class PhoneNumberUtilsTest extends AndroidTestCase {
     // mPhoneNumber ~ "+17005550020", length == 7.
     private byte[] mPhoneNumber = { (byte) 0x91, (byte) 0x71, (byte) 0x00, (byte) 0x55,
             (byte) 0x05, (byte) 0x20, (byte) 0xF0 };
 
-    @TestTargets({
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "extractNetworkPortion",
-        args = {String.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "extractPostDialPortion",
-        args = {String.class}
-      )
-    })
     public void testExtractMethods() {
 
         // Test extractNetworkPortion
@@ -83,38 +66,6 @@
                                 PhoneNumberUtils.WAIT)));
     }
 
-    @TestTargets({
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "calledPartyBCDToString",
-        args = {byte[].class, int.class, int.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "toCallerIDMinMatch",
-        args = {String.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "networkPortionToCalledPartyBCD",
-        args = {String.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "calledPartyBCDFragmentToString",
-        args = {byte[].class, int.class, int.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "networkPortionToCalledPartyBCDWithLength",
-        args = {String.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "numberToCalledPartyBCD",
-        args = {String.class}
-      )
-    })
     public void testCallMethods() {
         // Test calledPartyBCDToString
         assertEquals("+17005550020", PhoneNumberUtils.calledPartyBCDToString(mPhoneNumber, 0, 7));
@@ -159,24 +110,6 @@
         }
     }
 
-    @TestTargets({
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getStrippedReversed",
-        args = {String.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getFormatTypeForLocale",
-        args = {Locale.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        notes = "partial, null branch is ok, non-null has a insert fail",
-        method = "getNumberFromIntent",
-        args = {Intent.class, Context.class}
-      )
-    })
     public void testGetMethods() throws RemoteException {
         // Test getStrippedReversed
         assertNull(PhoneNumberUtils.getStrippedReversed(null));
@@ -231,48 +164,6 @@
         }
     }
 
-    @TestTargets({
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "formatNanpNumber",
-        args = {Editable.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "convertKeypadLettersToDigits",
-        args = {String.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "stringFromStringAndTOA",
-        args = {String.class, int.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "formatJapaneseNumber",
-        args = {Editable.class}
-       ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "formatNumber",
-        args = {String.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "formatNumber",
-        args = {Editable.class, int.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "stripSeparators",
-        args = {String.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "toaFromString",
-        args = {String.class}
-      )
-    })
     public void testFormatMethods() {
         // Test formatNanpNumber
         SpannableStringBuilder builderNumber = new SpannableStringBuilder();
@@ -352,53 +243,6 @@
         assertEquals(PhoneNumberUtils.TOA_Unknown, PhoneNumberUtils.toaFromString("88888888"));
     }
 
-    @TestTargets({
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "is12Key",
-        args = {char.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isDialable",
-        args = {char.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isEmergencyNumber",
-        args = {String.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isGlobalPhoneNumber",
-        args = {String.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isISODigit",
-        args = {char.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isReallyDialable",
-        args = {char.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isStartsPostDial",
-        args = {char.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isWellFormedSmsAddress",
-        args = {String.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isNonSeparator",
-        args = {char.class}
-      )
-    })
     public void testJudgeMethods() {
         // Test is12Key, isDialable, isISODigit, isReallyDialable, isStartsPostDial
         for (char c = '0'; c <= '9'; c++) {
diff --git a/tests/tests/telephony/src/android/telephony/cts/PhoneStateListenerTest.java b/tests/tests/telephony/src/android/telephony/cts/PhoneStateListenerTest.java
index b6c3d2a..bfc4c85 100644
--- a/tests/tests/telephony/src/android/telephony/cts/PhoneStateListenerTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/PhoneStateListenerTest.java
@@ -23,12 +23,7 @@
 import android.telephony.ServiceState;
 import android.telephony.TelephonyManager;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(PhoneStateListener.class)
 public class PhoneStateListenerTest extends AndroidTestCase {
 
     public static final long WAIT_TIME = 1000;
@@ -65,14 +60,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link PhoneStateListener}",
-            method = "PhoneStateListener",
-            args = {}
-        )
-    })
     public void testPhoneStateListener() {
         new PhoneStateListener();
     }
@@ -82,14 +69,6 @@
      * registration. There is no simple way to emulate state changes for testing the listeners.
      */
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: onServiceStateChanged ",
-            method = "onServiceStateChanged",
-            args = {ServiceState.class}
-        )
-    })
     public void testOnServiceStateChanged() throws Throwable {
         TestThread t = new TestThread(new Runnable() {
             public void run() {
@@ -128,14 +107,6 @@
         mLooper = null;
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: onSignalStrengthChanged ",
-            method = "onSignalStrengthChanged",
-            args = {int.class}
-        )
-    })
     public void testOnSignalStrengthChanged() throws Throwable {
         TestThread t = new TestThread(new Runnable() {
             public void run() {
@@ -170,14 +141,6 @@
         assertTrue(mOnSignalStrengthChangedCalled);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: onMessageWaitingIndicatorChanged ",
-            method = "onMessageWaitingIndicatorChanged",
-            args = {boolean.class}
-        )
-    })
     public void testOnMessageWaitingIndicatorChanged() throws Throwable {
         TestThread t = new TestThread(new Runnable() {
             public void run() {
@@ -213,14 +176,6 @@
         assertTrue(mOnMessageWaitingIndicatorChangedCalled);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: onCallForwardingIndicatorChanged ",
-            method = "onCallForwardingIndicatorChanged",
-            args = {boolean.class}
-        )
-    })
     public void testOnCallForwardingIndicatorChanged() throws Throwable {
         TestThread t = new TestThread(new Runnable() {
             public void run() {
@@ -256,14 +211,6 @@
         assertTrue(mOnCallForwardingIndicatorChangedCalled);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: onCellLocationChanged ",
-            method = "onCellLocationChanged",
-            args = {CellLocation.class}
-        )
-    })
     public void testOnCellLocationChanged() throws Throwable {
         TestThread t = new TestThread(new Runnable() {
             public void run() {
@@ -298,14 +245,6 @@
         assertTrue(mOnCellLocationChangedCalled);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: onCallStateChanged ",
-            method = "onCallStateChanged",
-            args = {int.class, String.class}
-        )
-    })
     public void testOnCallStateChanged() throws Throwable {
         TestThread t = new TestThread(new Runnable() {
             public void run() {
@@ -340,14 +279,6 @@
         assertTrue(mOnCallStateChangedCalled);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: onDataConnectionStateChanged ",
-            method = "onDataConnectionStateChanged",
-            args = {int.class}
-        )
-    })
     public void testOnDataConnectionStateChanged() throws Throwable {
         TestThread t = new TestThread(new Runnable() {
             public void run() {
@@ -383,14 +314,6 @@
         assertTrue(mOnDataConnectionStateChangedCalled);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: onDataActivity ",
-            method = "onDataActivity",
-            args = {int.class}
-        )
-    })
     public void testOnDataActivity() throws Throwable {
         TestThread t = new TestThread(new Runnable() {
             public void run() {
diff --git a/tests/tests/telephony/src/android/telephony/cts/ServiceStateTest.java b/tests/tests/telephony/src/android/telephony/cts/ServiceStateTest.java
index 56188fb..59a44ed 100644
--- a/tests/tests/telephony/src/android/telephony/cts/ServiceStateTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/ServiceStateTest.java
@@ -18,124 +18,12 @@
 import android.os.Parcel;
 import android.telephony.ServiceState;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(ServiceState.class)
 public class ServiceStateTest extends AndroidTestCase {
     private static final String OPERATOR_ALPHA_LONG = "CtsOperatorLong";
     private static final String OPERATOR_ALPHA_SHORT = "CtsOp";
     private static final String OPERATOR_NUMERIC = "02871";
 
-    @TestTargets({
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "describeContents",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "equals",
-        args = {Object.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getIsManualSelection",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getOperatorAlphaLong",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getOperatorAlphaShort",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getOperatorNumeric",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getRoaming",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getState",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "hashCode",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "ServiceState",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "ServiceState",
-        args = {Parcel.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "ServiceState",
-        args = {ServiceState.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "copyFrom",
-        args = {ServiceState.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setIsManualSelection",
-        args = {boolean.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setOperatorName",
-        args = {String.class, String.class, String.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setRoaming",
-        args = {boolean.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setState",
-        args = {int.class}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setStateOff",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setStateOutOfService",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "toString",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {Parcel.class, int.class}
-      )
-    })
     public void testServiceState() {
         ServiceState serviceState = new ServiceState();
 
diff --git a/tests/tests/telephony/src/android/telephony/cts/SmsManagerTest.java b/tests/tests/telephony/src/android/telephony/cts/SmsManagerTest.java
index 6c9a152..927455e 100755
--- a/tests/tests/telephony/src/android/telephony/cts/SmsManagerTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/SmsManagerTest.java
@@ -16,10 +16,6 @@
 
 package android.telephony.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
@@ -43,7 +39,6 @@
  *
  * Structured so tests can be reused to test {@link android.telephony.gsm.SmsManager}
  */
-@TestTargetClass(SmsManager.class)
 public class SmsManagerTest extends AndroidTestCase {
 
     private static final String LONG_TEXT =
@@ -149,11 +144,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "divideMessage",
-        args = {String.class}
-    )
     public void testDivideMessage() {
         ArrayList<String> dividedMessages = divideMessage(LONG_TEXT);
         assertNotNull(dividedMessages);
@@ -179,25 +169,6 @@
         return LONG_TEXT.equals(actualMessage);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "sendDataMessage",
-            args = {String.class, String.class, short.class, byte[].class,
-                    PendingIntent.class, PendingIntent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "sendTextMessage",
-            args = {String.class, String.class, String.class, PendingIntent.class,
-                    PendingIntent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "sendMultipartTextMessage",
-            args = {String.class, String.class, ArrayList.class, ArrayList.class, ArrayList.class}
-        )
-    })
     public void testSendMessages() throws InterruptedException {
         if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
             return;
@@ -287,11 +258,6 @@
                 PendingIntent.FLAG_ONE_SHOT);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getDefault",
-        args = {}
-    )
     public void testGetDefault() {
         assertNotNull(getSmsManager());
     }
diff --git a/tests/tests/telephony/src/android/telephony/cts/SmsMessageTest.java b/tests/tests/telephony/src/android/telephony/cts/SmsMessageTest.java
index 4b5b55a..ff7b097 100644
--- a/tests/tests/telephony/src/android/telephony/cts/SmsMessageTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/SmsMessageTest.java
@@ -16,10 +16,6 @@
 
 package android.telephony.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.Context;
 import android.content.pm.PackageManager;
@@ -27,7 +23,6 @@
 import android.telephony.TelephonyManager;
 import android.test.AndroidTestCase;
 
-@TestTargetClass(SmsMessage.class)
 public class SmsMessageTest extends AndroidTestCase{
 
     private TelephonyManager mTelephonyManager;
@@ -77,103 +72,6 @@
     }
 
     @SuppressWarnings("deprecation")
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createFromPdu",
-            args = {byte[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getServiceCenterAddress",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getOriginatingAddress",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTPLayerLengthForPDU",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMessageBody",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "calculateLength",
-            args = {CharSequence.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "calculateLength",
-            args = {String.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPdu",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isEmail",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isCphsMwiMessage",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isMwiDontStore",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isReplyPathPresent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isStatusReportMessage",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getProtocolIdentifier",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIndexOnSim",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMessageClass",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStatus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStatusOnSim",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTimestampMillis",
-            args = {}
-        )
-    })
     public void testCreateFromPdu() throws Exception {
         if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
                 || mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_CDMA)) {
@@ -253,28 +151,6 @@
         return total - messageLength == remaining;
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isReplace",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isMWISetMessage",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isMWIClearMessage",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isMwiDontStore",
-            args = {}
-        )
-    })
     public void testCPHSVoiceMail() throws Exception {
         if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
                 || mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_CDMA)) {
@@ -317,13 +193,6 @@
         assertTrue(sms.isMwiDontStore());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getUserData",
-            args = {}
-        )
-    })
     public void testGetUserData() throws Exception {
         if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
                 || mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_CDMA)) {
@@ -342,18 +211,6 @@
         assertNotNull(userData);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSubmitPdu",
-            args = {String.class, String.class, String.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSubmitPdu",
-            args = {String.class, String.class, short.class, byte[].class, boolean.class}
-        )
-    })
     public void testGetSubmitPdu() throws Exception {
         if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
             return;
@@ -398,38 +255,6 @@
         assertNotNull(smsPdu);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getEmailBody",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getEmailFrom",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDisplayMessageBody",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPseudoSubject",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDisplayOriginatingAddress",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isEmail",
-            args = {}
-        )
-    })
     public void testEmailGateway() throws Exception {
         if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
                 || mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_CDMA)) {
diff --git a/tests/tests/telephony/src/android/telephony/cts/SmsMessage_MessageClassTest.java b/tests/tests/telephony/src/android/telephony/cts/SmsMessage_MessageClassTest.java
index 450b4e3..2d4277f 100644
--- a/tests/tests/telephony/src/android/telephony/cts/SmsMessage_MessageClassTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/SmsMessage_MessageClassTest.java
@@ -19,26 +19,9 @@
 import junit.framework.TestCase;
 import android.telephony.SmsMessage;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(SmsMessage.MessageClass.class)
 public class SmsMessage_MessageClassTest extends TestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "valueOf",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "values",
-            args = {}
-        )
-    })
     public void testMessageClass() {
     }
 }
diff --git a/tests/tests/telephony/src/android/telephony/cts/SmsMessage_SubmitPduTest.java b/tests/tests/telephony/src/android/telephony/cts/SmsMessage_SubmitPduTest.java
index 6b96468..0acc5d2 100644
--- a/tests/tests/telephony/src/android/telephony/cts/SmsMessage_SubmitPduTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/SmsMessage_SubmitPduTest.java
@@ -18,21 +18,9 @@
 
 import android.telephony.SmsMessage;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(SmsMessage.SubmitPdu.class)
 public class SmsMessage_SubmitPduTest extends AndroidTestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "toString",
-            args = {}
-        )
-    })
     // SmsMessage.SubmitPdu constructor is not public, so no need to test its methods
     public void testToString() {
     }
diff --git a/tests/tests/telephony/src/android/telephony/cts/TelephonyManagerTest.java b/tests/tests/telephony/src/android/telephony/cts/TelephonyManagerTest.java
index 645eb81..0055330 100644
--- a/tests/tests/telephony/src/android/telephony/cts/TelephonyManagerTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/TelephonyManagerTest.java
@@ -16,10 +16,6 @@
 
 package android.telephony.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.Context;
 import android.content.pm.PackageManager;
@@ -35,7 +31,6 @@
 
 import java.util.regex.Pattern;
 
-@TestTargetClass(TelephonyManager.class)
 public class TelephonyManagerTest extends AndroidTestCase {
     private TelephonyManager mTelephonyManager;
     private boolean mOnCellLocationChangedCalled = false;
@@ -60,11 +55,6 @@
         super.tearDown();
     }
 
-    @TestTargetNew(
-      level = TestLevel.COMPLETE,
-      method = "listen",
-      args = {PhoneStateListener.class, int.class}
-    )
     public void testListen() throws Throwable {
         if (mTelephonyManager.getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA) {
             // TODO: temp workaround, need to adjust test to for CDMA
@@ -133,118 +123,6 @@
      * it's no need to get details of these information, just make sure they are in right
      * condition(>0 or not null).
      */
-    @TestTargets({
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getNetworkType",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getPhoneType",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getVoiceMailNumber",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSimOperatorName",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getNetworkCountryIso",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getCellLocation",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getDeviceSoftwareVersion",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSimState",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSimSerialNumber",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getDeviceId",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSimOperator",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getNetworkOperatorName",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSubscriberId",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLine1Number",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getNetworkOperator",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSimCountryIso",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getDataActivity",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getDataState",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getCallState",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isNetworkRoaming",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getVoiceMailAlphaTag",
-        args = {}
-      ),
-      @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getNeighboringCellInfo",
-        args = {}
-      )
-    })
     public void testTelephonyManager() {
         assertTrue(mTelephonyManager.getNetworkType() >= TelephonyManager.NETWORK_TYPE_UNKNOWN);
         assertTrue(mTelephonyManager.getPhoneType() >= TelephonyManager.PHONE_TYPE_NONE);
@@ -278,11 +156,6 @@
      * GSM, a valid MEID or ESN if CDMA, or a valid MAC address if
      * only a WiFi device.
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getDeviceId",
-        args = {}
-    )
     public void testGetDeviceId() {
         String deviceId = mTelephonyManager.getDeviceId();
         int phoneType = mTelephonyManager.getPhoneType();
diff --git a/tests/tests/telephony/src/android/telephony/gsm/cts/GsmCellLocationTest.java b/tests/tests/telephony/src/android/telephony/gsm/cts/GsmCellLocationTest.java
index 07eb141..045adb7 100644
--- a/tests/tests/telephony/src/android/telephony/gsm/cts/GsmCellLocationTest.java
+++ b/tests/tests/telephony/src/android/telephony/gsm/cts/GsmCellLocationTest.java
@@ -19,12 +19,7 @@
 import android.os.Bundle;
 import android.telephony.gsm.GsmCellLocation;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(GsmCellLocation.class)
 public class GsmCellLocationTest extends AndroidTestCase {
 
     private static final int CID_VALUE = 20;
@@ -32,58 +27,6 @@
     private static final int INVALID_CID = -1;
     private static final int INVALID_LAC = -1;
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "GsmCellLocation",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "GsmCellLocation",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCid",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLac",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setLacAndCid",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setStateInvalid",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hashCode",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "toString",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "fillInNotifierBundle",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "equals",
-            args = {Object.class}
-        )
-    })
     public void testGsmCellLocation() {
         Bundle bundle = new Bundle();
 
diff --git a/tests/tests/telephony/src/android/telephony/gsm/cts/SmsManagerTest.java b/tests/tests/telephony/src/android/telephony/gsm/cts/SmsManagerTest.java
index 512e89d..5cd81a3 100644
--- a/tests/tests/telephony/src/android/telephony/gsm/cts/SmsManagerTest.java
+++ b/tests/tests/telephony/src/android/telephony/gsm/cts/SmsManagerTest.java
@@ -20,20 +20,11 @@
 
 import android.app.PendingIntent;
 import android.telephony.gsm.SmsManager;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 @SuppressWarnings("deprecation")
-@TestTargetClass(SmsManager.class)
 public class SmsManagerTest extends android.telephony.cts.SmsManagerTest {
 
     @Override
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getDefault",
-        args = {}
-    )
     public void testGetDefault() {
         assertNotNull(getSmsManager());
     }
diff --git a/tests/tests/telephony/src/android/telephony/gsm/cts/SmsMessage_MessageClassTest.java b/tests/tests/telephony/src/android/telephony/gsm/cts/SmsMessage_MessageClassTest.java
index 400bc27..2fc6314 100644
--- a/tests/tests/telephony/src/android/telephony/gsm/cts/SmsMessage_MessageClassTest.java
+++ b/tests/tests/telephony/src/android/telephony/gsm/cts/SmsMessage_MessageClassTest.java
@@ -19,27 +19,10 @@
 import junit.framework.TestCase;
 import android.telephony.gsm.SmsMessage;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 @SuppressWarnings("deprecation")
-@TestTargetClass(SmsMessage.MessageClass.class)
 public class SmsMessage_MessageClassTest extends TestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "valueOf",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "values",
-            args = {}
-        )
-    })
     public void testMessageClass() {
     }
 }
diff --git a/tests/tests/telephony/src/android/telephony/gsm/cts/SmsMessage_SubmitPduTest.java b/tests/tests/telephony/src/android/telephony/gsm/cts/SmsMessage_SubmitPduTest.java
index e28d2f6..b933841 100644
--- a/tests/tests/telephony/src/android/telephony/gsm/cts/SmsMessage_SubmitPduTest.java
+++ b/tests/tests/telephony/src/android/telephony/gsm/cts/SmsMessage_SubmitPduTest.java
@@ -18,22 +18,10 @@
 
 import android.telephony.gsm.SmsMessage;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 @SuppressWarnings("deprecation")
-@TestTargetClass(SmsMessage.SubmitPdu.class)
 public class SmsMessage_SubmitPduTest extends AndroidTestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "toString",
-            args = {}
-        )
-    })
     public void testToString() {
         SmsMessage.SubmitPdu sp = new SmsMessage.SubmitPdu();
         assertNotNull(sp.toString());
diff --git a/tests/tests/text/Android.mk b/tests/tests/text/Android.mk
index 5c44027..1ffeee9 100644
--- a/tests/tests/text/Android.mk
+++ b/tests/tests/text/Android.mk
@@ -32,5 +32,4 @@
 # uncomment when dalvik.annotation.Test* are removed or part of SDK
 #LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
-
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/text/src/android/text/cts/AlteredCharSequenceTest.java b/tests/tests/text/src/android/text/cts/AlteredCharSequenceTest.java
index 7aad01d..609370f 100644
--- a/tests/tests/text/src/android/text/cts/AlteredCharSequenceTest.java
+++ b/tests/tests/text/src/android/text/cts/AlteredCharSequenceTest.java
@@ -19,21 +19,12 @@
 import android.test.AndroidTestCase;
 import android.text.AlteredCharSequence;
 import android.text.Spanned;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(AlteredCharSequence.class)
 public class AlteredCharSequenceTest extends AndroidTestCase {
 
     private static final String SOURCE_STR = "This is a char sequence.";
     private AlteredCharSequence mAlteredCharSequence;
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "charAt",
-        args = {int.class}
-    )
     public void testCharAt() {
         mAlteredCharSequence = null;
         char[] sub = { 'i', 's' };
@@ -61,11 +52,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getChars",
-        args = {int.class, int.class, char[].class, int.class}
-    )
     public void testGetChars() {
         mAlteredCharSequence = null;
         char[] sub = { 'i', 's' };
@@ -98,11 +84,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "length",
-        args = {}
-    )
     public void testLength() {
         char[] sub = { 'i', 's' };
 
@@ -114,11 +95,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "make",
-        args = {java.lang.CharSequence.class, char[].class, int.class, int.class}
-    )
     public void testMake() {
         mAlteredCharSequence = null;
         char[] sub = { 'i', 's' };
@@ -137,11 +113,6 @@
         assertFalse(0 == acsClassName.compareTo(spanClassName));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "subSequence",
-        args = {int.class, int.class}
-    )
     public void testSubSequence() {
         mAlteredCharSequence = null;
         char[] sub = { 'i', 's' };
@@ -158,11 +129,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "toString",
-        args = {}
-    )
     public void testToString() {
         mAlteredCharSequence = null;
         char[] sub = { 'i', 's' };
diff --git a/tests/tests/text/src/android/text/cts/AndroidCharacterTest.java b/tests/tests/text/src/android/text/cts/AndroidCharacterTest.java
index 50a3776..7eaa092 100644
--- a/tests/tests/text/src/android/text/cts/AndroidCharacterTest.java
+++ b/tests/tests/text/src/android/text/cts/AndroidCharacterTest.java
@@ -18,29 +18,13 @@
 
 import android.test.AndroidTestCase;
 import android.text.AndroidCharacter;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(AndroidCharacter.class)
 public class AndroidCharacterTest extends AndroidTestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor",
-        method = "AndroidCharacter",
-        args = {}
-    )
     public void testConstructor() {
         new AndroidCharacter();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getDirectionalities(char[] src, byte[] dest, int count)",
-        method = "getDirectionalities",
-        args = {char[].class, byte[].class, int.class}
-    )
     public void testGetDirectionalities() {
         char[] src = new char[128];
         for (int i = 0; i < src.length; i++) {
@@ -61,12 +45,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getEastAsianWidth(char input)",
-        method = "getEastAsianWidth",
-        args = {char.class}
-    )
     public void testGetEastAsianWidth() {
         // LATIN CAPITAL LETTER U WITH CARON (U+01D3)
         assertEquals(AndroidCharacter.EAST_ASIAN_WIDTH_NEUTRAL,
@@ -93,12 +71,6 @@
                 AndroidCharacter.getEastAsianWidth((char)0x319F));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getEastAsianWidths(char[] src, byte[] dest, int count)",
-        method = "getEastAsianWidths",
-        args = {char[].class, byte[].class, int.class}
-    )
     public void testGetEastAsianWidths() {
         char[] src = {
                 0x01D3, 0xFFFD, 0xFF86, 0xFF41, 0x0041, 0x319f,
@@ -132,12 +104,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getMirror(char ch)",
-        method = "getMirror",
-        args = {char.class}
-    )
     public void testGetMirror() {
         assertEquals('A', AndroidCharacter.getMirror('A'));
         assertEquals('B', AndroidCharacter.getMirror('B'));
@@ -147,12 +113,6 @@
         assertEquals('<', AndroidCharacter.getMirror('>'));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test mirror(char[] text, int start, int count)",
-        method = "mirror",
-        args = {char[].class, int.class, int.class}
-    )
     public void testMirror() {
         char[] src = new char[64];
         for (int i = 0; i < src.length; i++) {
diff --git a/tests/tests/text/src/android/text/cts/AnnotationTest.java b/tests/tests/text/src/android/text/cts/AnnotationTest.java
index 9447e49..a0d597a 100644
--- a/tests/tests/text/src/android/text/cts/AnnotationTest.java
+++ b/tests/tests/text/src/android/text/cts/AnnotationTest.java
@@ -19,12 +19,7 @@
 import android.os.Parcel;
 import android.test.AndroidTestCase;
 import android.text.Annotation;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(Annotation.class)
 public class AnnotationTest extends AndroidTestCase {
 
     private static final String KEY1 = "name";
@@ -41,21 +36,11 @@
         mAnnotation = null;
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "Annotation",
-        args = {java.lang.String.class, java.lang.String.class}
-    )
     public void testConstructor() {
         // new the Annotation instance
         new Annotation(KEY1, VALUE1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getValue",
-        args = {}
-    )
     public void testGetValue() {
         // new the Annotation instance
         mAnnotation = new Annotation(KEY1, VALUE1);
@@ -64,11 +49,6 @@
         assertEquals(VALUE2, mAnnotation.getValue());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getKey",
-        args = {}
-    )
     public void testGetKey() {
         // new the Annotation instance
         mAnnotation = new Annotation(KEY1, VALUE1);
@@ -77,34 +57,12 @@
         assertEquals(KEY2, mAnnotation.getKey());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSpanTypeId",
-        args = {}
-    )
     public void testGetSpanTypeId() {
         mAnnotation = new Annotation(KEY1, VALUE1);
         // Because of the return value is a hide value, we only can assert the return value isn't 0.
         assertTrue(mAnnotation.getSpanTypeId() != 0);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeToParcel",
-            args = {Parcel.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Annotation",
-            args = {Parcel.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "describeContents",
-            args = {}
-        )
-    })
     public void testWriteToParcel() {
         Parcel dest = Parcel.obtain();
         try {
diff --git a/tests/tests/text/src/android/text/cts/AutoTextTest.java b/tests/tests/text/src/android/text/cts/AutoTextTest.java
index 3ab301d..1f2d1da 100644
--- a/tests/tests/text/src/android/text/cts/AutoTextTest.java
+++ b/tests/tests/text/src/android/text/cts/AutoTextTest.java
@@ -20,18 +20,9 @@
 import android.test.AndroidTestCase;
 import android.text.AutoText;
 import android.view.View;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(AutoText.class)
 public class AutoTextTest extends AndroidTestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "get",
-        args = {java.lang.CharSequence.class, int.class, int.class, android.view.View.class}
-    )
     public void testGet() {
         // Define the necessary sources.
         CharSequence src;
@@ -78,11 +69,6 @@
         assertEquals("can", actual);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSize",
-        args = {android.view.View.class}
-    )
     public void testGetSize() {
         Locale.setDefault(Locale.ENGLISH);
         View view = new View(getContext());
diff --git a/tests/tests/text/src/android/text/cts/BoringLayoutTest.java b/tests/tests/text/src/android/text/cts/BoringLayoutTest.java
index 01da716..b7e2215 100644
--- a/tests/tests/text/src/android/text/cts/BoringLayoutTest.java
+++ b/tests/tests/text/src/android/text/cts/BoringLayoutTest.java
@@ -26,12 +26,7 @@
 import android.text.TextPaint;
 import android.text.TextUtils;
 import android.text.Layout.Alignment;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(BoringLayout.class)
 public class BoringLayoutTest extends AndroidTestCase {
     private static final float SPACING_MULT_NO_SCALE = 1.0f;
     private static final float SPACING_ADD_NO_SCALE = 0.0f;
@@ -62,23 +57,6 @@
         mBoringLayout = makeDefaultBoringLayout();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "BoringLayout",
-            args = {java.lang.CharSequence.class, android.text.TextPaint.class, int.class,
-                    android.text.Layout.Alignment.class, float.class, float.class,
-                    android.text.BoringLayout.Metrics.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "BoringLayout",
-            args = {java.lang.CharSequence.class, android.text.TextPaint.class, int.class,
-                    android.text.Layout.Alignment.class, float.class, float.class,
-                    android.text.BoringLayout.Metrics.class, boolean.class,
-                    android.text.TextUtils.TruncateAt.class, int.class}
-        )
-    })
     public void testConstructors() {
         new BoringLayout(DEFAULT_CHAR_SEQUENCE,
                 DEFAULT_PAINT,
@@ -101,30 +79,6 @@
                 DEFAULT_OUTER_WIDTH);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test the scalibility of BoringLayout."
-                  + " 1. No scale."
-                  + " 2. Enlarge to 2/1.5 times of the font size."
-                  + " 3. Reduce to 0.5 times of the font size."
-                  + " 4. Add 1.5/1.4/3.0 to the original font."
-                  + " 5. Minus 1.6/1.4/3.0 from the original font.",
-            method = "getHeight",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test the scalibility of BoringLayout."
-                  + " 1. No scale."
-                  + " 2. Enlarge to 2/1.5 times of the font size."
-                  + " 3. Reduce to 0.5 times of the font size."
-                  + " 4. Add 1.5/1.4/3.0 to the original font."
-                  + " 5. Minus 1.6/1.4/3.0 from the original font.",
-            method = "getLineDirections",
-            args = {int.class}
-        )
-    })
     public void testScale() {
         final int metricsBottomToTop = METRICS_BOTTOM - METRICS_TOP;
 
@@ -190,73 +144,6 @@
         assertEquals(boringLayout.getHeight() + METRICS_TOP, boringLayout.getLineDescent(0));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test the precondition of a BoringLayout according to the definition."
-                  + " The preconditions include:"
-                  + " 1. One line text layout."
-                  + " 2. Left to right text direction."
-                  + " 3. Won't be ellipsis. Use default parameters to construct the BoringLayout."
-                  + " Test getLineCount, and followed methods are in same condition",
-            method = "getLineCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getLineTop",
-            method = "getLineTop",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getHeight",
-            method = "getHeight",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getLineStart",
-            method = "getLineStart",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getParagraphDirection",
-            method = "getParagraphDirection",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getLineContainsTab",
-            method = "getLineContainsTab",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getEllipsisCount",
-            method = "getEllipsisCount",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getEllipsisStart",
-            method = "getEllipsisStart",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getLineMax",
-            method = "getLineMax",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test ellipsized",
-            method = "ellipsized",
-            args = {int.class, int.class}
-        )
-    })
     public void testPreconditions() {
         assertEquals(1, mBoringLayout.getLineCount());
         assertEquals(0, mBoringLayout.getLineTop(0));
@@ -276,38 +163,6 @@
         assertEquals(1, mBoringLayout.getEllipsisStart(0));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test the static maker method of BoringLayout. This method will return a"
-                  + " suitable instance of BoringLayout according  to the specific parameters."
-                  + " 1. Alignment is {@link android.text.Layout.Alignment#ALIGN_CENTER} and the"
-                  + " source string is a {@link android.text.Spanned}."
-                  + " 2. Alignment is {@link android.text.Layout.Alignment#ALIGN_NORMAL} and the"
-                  + " source string is not a {@link android.text.Spanned}also test"
-                  + " getEllipsizedWidth. Test replaceOrMake, and followed methods are in same"
-                  + " condition",
-            method = "replaceOrMake",
-            args = {java.lang.CharSequence.class, android.text.TextPaint.class, int.class,
-                    android.text.Layout.Alignment.class, float.class, float.class,
-                    android.text.BoringLayout.Metrics.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test replaceOrMake",
-            method = "replaceOrMake",
-            args = {java.lang.CharSequence.class, android.text.TextPaint.class, int.class,
-                    android.text.Layout.Alignment.class, float.class, float.class,
-                    android.text.BoringLayout.Metrics.class, boolean.class,
-                    android.text.TextUtils.TruncateAt.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getEllipsizedWidth",
-            method = "getEllipsizedWidth",
-            args = {}
-        )
-    })
     public void testReplaceOrMake() {
         String source = "This is a SpannableString.";
         BoringLayout layout_1 = mBoringLayout.replaceOrMake(
@@ -337,24 +192,6 @@
     }
 
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test the alignment of BoringLayout."
-                  + " 1. {@link android.text.Layout.Alignment#ALIGN_NORMAL}."
-                  + " 2. {@link android.text.Layout.Alignment#ALIGN_CENTER}."
-                  + " 3. {@link android.text.Layout.Alignment#ALIGN_OPPOSITE}."
-                  + " Also the getLineLeft and getLineRight method",
-            method = "getLineLeft",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getLineRight",
-            method = "getLineRight",
-            args = {int.class}
-        )
-    })
     public void testAlignment() {
         BoringLayout boringLayout = makeBoringLayoutAlign(Layout.Alignment.ALIGN_NORMAL);
         assertEquals(0.0f, boringLayout.getLineLeft(0));
@@ -372,27 +209,6 @@
         assertEquals((float) DEFAULT_OUTER_WIDTH, boringLayout.getLineRight(0));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test whether include the padding to calculate the layout."
-                  + " 1. Include padding while calculate the layout."
-                  + " 2. Don't include padding while calculate the layout."
-                  + " Also test other related methods",
-            method = "getTopPadding",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBottomPadding",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLineDescent",
-            args = {int.class}
-        )
-    })
     public void testIncludePadding() {
         assertEquals(METRICS_TOP - METRICS_ASCENT, mBoringLayout.getTopPadding());
         assertEquals(METRICS_BOTTOM - METRICS_DESCENT, mBoringLayout.getBottomPadding());
@@ -415,25 +231,6 @@
         assertEquals(boringLayout.getHeight() + METRICS_ASCENT, boringLayout.getLineDescent(0));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test the static method which is to verify whether the given source string is"
-                  + " suitable for BoringLayout or not."
-                  + " 1. A normal simple string."
-                  + " 2. Exceptional strings, including:"
-                  + "   2.1 Hebrew characters, which are read from right to left."
-                  + "   2.2 Strings with whitespaces in it.",
-            method = "isBoring",
-            args = {java.lang.CharSequence.class, android.text.TextPaint.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isBoring",
-            args = {java.lang.CharSequence.class, android.text.TextPaint.class,
-                    android.text.BoringLayout.Metrics.class}
-        )
-    })
     public void testIsBoringString() {
         TextPaint paint = new TextPaint();
         assertNotNull(BoringLayout.isBoring("hello android", paint));
@@ -450,33 +247,11 @@
         assertNull(BoringLayout.isBoring("hello android\n\n\n", paint));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLineDirections",
-        args = {int.class}
-    )
     public void testGetLineDirections() {
         assertNotNull(mBoringLayout.getLineDirections(0));
         assertNotNull(mBoringLayout.getLineDirections(2));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "make",
-            args = {java.lang.CharSequence.class, android.text.TextPaint.class, int.class,
-                    android.text.Layout.Alignment.class, float.class, float.class,
-                    android.text.BoringLayout.Metrics.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "make",
-            args = {java.lang.CharSequence.class, android.text.TextPaint.class, int.class,
-                    android.text.Layout.Alignment.class, float.class, float.class,
-                    android.text.BoringLayout.Metrics.class, boolean.class,
-                    android.text.TextUtils.TruncateAt.class, int.class}
-        )
-    })
     public void testMake() {
         BoringLayout boringLayout = BoringLayout.make(DEFAULT_CHAR_SEQUENCE,
                 DEFAULT_PAINT,
@@ -502,12 +277,6 @@
         assertNotNull(boringLayout);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "draw",
-        args = {android.graphics.Canvas.class, android.graphics.Path.class,
-                android.graphics.Paint.class, int.class}
-    )
     public void testDraw() {
         BoringLayout boringLayout = BoringLayout.make((String)DEFAULT_CHAR_SEQUENCE,
                 DEFAULT_PAINT,
diff --git a/tests/tests/text/src/android/text/cts/BoringLayout_MetricsTest.java b/tests/tests/text/src/android/text/cts/BoringLayout_MetricsTest.java
index acb723f..141ff02 100644
--- a/tests/tests/text/src/android/text/cts/BoringLayout_MetricsTest.java
+++ b/tests/tests/text/src/android/text/cts/BoringLayout_MetricsTest.java
@@ -18,26 +18,9 @@
 
 import android.test.AndroidTestCase;
 import android.text.BoringLayout;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(BoringLayout.Metrics.class)
 public class BoringLayout_MetricsTest extends AndroidTestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "toString",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "BoringLayout.Metrics",
-            args = {}
-        )
-    })
     public void testMetrics() {
         BoringLayout.Metrics bm = new BoringLayout.Metrics();
         assertNotNull(bm.toString());
diff --git a/tests/tests/text/src/android/text/cts/ClipboardManagerTest.java b/tests/tests/text/src/android/text/cts/ClipboardManagerTest.java
index 336f0ce..e62e0f8 100644
--- a/tests/tests/text/src/android/text/cts/ClipboardManagerTest.java
+++ b/tests/tests/text/src/android/text/cts/ClipboardManagerTest.java
@@ -16,10 +16,6 @@
 
 package android.text.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.Context;
 import android.test.AndroidTestCase;
@@ -28,7 +24,6 @@
 /**
  * Test {@link ClipboardManager}.
  */
-@TestTargetClass(ClipboardManager.class)
 public class ClipboardManagerTest extends AndroidTestCase {
     private ClipboardManager mClipboardManager;
 
@@ -38,18 +33,6 @@
         mClipboardManager = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setText",
-            args = {CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getText",
-            args = {}
-        )
-    })
     public void testAccessText() {
         // set the expected value
         CharSequence expected = "test";
@@ -57,11 +40,6 @@
         assertEquals(expected, mClipboardManager.getText());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "hasText",
-        args = {}
-    )
     public void testHasText() {
         mClipboardManager.setText("");
         assertFalse(mClipboardManager.hasText());
diff --git a/tests/tests/text/src/android/text/cts/DynamicLayoutTest.java b/tests/tests/text/src/android/text/cts/DynamicLayoutTest.java
index 675054c..6ef1299 100644
--- a/tests/tests/text/src/android/text/cts/DynamicLayoutTest.java
+++ b/tests/tests/text/src/android/text/cts/DynamicLayoutTest.java
@@ -22,13 +22,7 @@
 import android.text.Layout;
 import android.text.TextPaint;
 import android.text.TextUtils;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
-@TestTargetClass(DynamicLayout.class)
 public class DynamicLayoutTest extends AndroidTestCase {
 
     protected static final float SPACING_MULT_NO_SCALE = 1.0f;
@@ -63,30 +57,6 @@
                 true);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "DynamicLayout",
-            args = {java.lang.CharSequence.class, java.lang.CharSequence.class,
-                    android.text.TextPaint.class, int.class, android.text.Layout.Alignment.class,
-                    float.class, float.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "DynamicLayout",
-            args = {java.lang.CharSequence.class, java.lang.CharSequence.class,
-                    android.text.TextPaint.class, int.class, android.text.Layout.Alignment.class,
-                    float.class, float.class, boolean.class,
-                    android.text.TextUtils.TruncateAt.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "DynamicLayout",
-            args = {java.lang.CharSequence.class, android.text.TextPaint.class,
-                    int.class, android.text.Layout.Alignment.class,
-                    float.class, float.class, boolean.class}
-        )
-    })
     public void testConstructors() {
         new DynamicLayout(SINGLELINE_CHAR_SEQUENCE,
                 MULTLINE_CHAR_SEQUENCE,
@@ -115,24 +85,6 @@
                 true);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "getEllipsisCount",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "getEllipsisStart",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "getEllipsizedWidth",
-            args = {}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "DynamicLayout javadoc is incomplete.")
     public void testEllipsis() {
         final DynamicLayout dynamicLayout = new DynamicLayout(SINGLELINE_CHAR_SEQUENCE,
                 MULTLINE_CHAR_SEQUENCE,
@@ -154,19 +106,6 @@
      * 1. Include padding while calculate the layout.
      * 2. Don't include padding while calculate the layout.
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTopPadding",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBottomPadding",
-            args = {}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "DynamicLayout javadoc is incomplete.")
     public void testIncludePadding() {
         final FontMetricsInt fontMetricsInt = mDefaultPaint.getFontMetricsInt();
 
@@ -198,43 +137,6 @@
      * Test the line top
      * 1. the Y-coordinate of line top.2. the Y-coordinate of baseline.
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLineContainsTab",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLineCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLineDescent",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLineTop",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLineDirections",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getParagraphDirection",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLineStart",
-            args = {int.class}
-        )
-    })
     public void testLineLayout() {
         assertEquals(TEXT.length, mDynamicLayout.getLineCount());
         assertFalse(mDynamicLayout.getLineContainsTab(LINE0));
diff --git a/tests/tests/text/src/android/text/cts/Editable_FactoryTest.java b/tests/tests/text/src/android/text/cts/Editable_FactoryTest.java
index 3e73150..8dde216 100644
--- a/tests/tests/text/src/android/text/cts/Editable_FactoryTest.java
+++ b/tests/tests/text/src/android/text/cts/Editable_FactoryTest.java
@@ -20,21 +20,11 @@
 import android.text.Editable;
 import android.text.SpannableStringBuilder;
 import android.text.Editable.Factory;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(Editable.Factory.class)
 public class Editable_FactoryTest extends AndroidTestCase {
 
     Factory mFactory;
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test newEditable(CharSequence source)",
-        method = "newEditable",
-        args = {java.lang.CharSequence.class}
-    )
     public void testNewEditable() {
 
         CharSequence source = "abc";
@@ -48,12 +38,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getInstance()",
-        method = "getInstance",
-        args = {}
-    )
     public void testGetInstance() {
 
         // new the Factory instance
diff --git a/tests/tests/text/src/android/text/cts/HtmlTest.java b/tests/tests/text/src/android/text/cts/HtmlTest.java
index 7f86914..7db5c62 100644
--- a/tests/tests/text/src/android/text/cts/HtmlTest.java
+++ b/tests/tests/text/src/android/text/cts/HtmlTest.java
@@ -33,27 +33,10 @@
 import android.text.style.TypefaceSpan;
 import android.text.style.URLSpan;
 import android.text.style.UnderlineSpan;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(Html.class)
 public class HtmlTest extends AndroidTestCase {
     private final static int SPAN_EXCLUSIVE_INCLUSIVE = Spannable.SPAN_EXCLUSIVE_INCLUSIVE;
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "fromHtml",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "fromHtml",
-            args = {String.class, ImageGetter.class, TagHandler.class}
-        )
-    })
     public void testSingleTagOnWhileString() {
         final String source = "<b>hello</b>";
 
@@ -76,18 +59,6 @@
         assertEquals(expectEnd, spanned.getSpanEnd(spans[0]));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "fromHtml",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "fromHtml",
-            args = {String.class, ImageGetter.class, TagHandler.class}
-        )
-    })
     public void testBadHtml() {
         final String source = "Hello <b>b<i>bi</b>i</i>";
 
@@ -106,18 +77,6 @@
         assertEquals(spansLen, spans.length);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "fromHtml",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "fromHtml",
-            args = {String.class, ImageGetter.class, TagHandler.class}
-        )
-    })
     public void testSymbols() {
         final String source = "&copy; &gt; &lt";
         final String expected = "\u00a9 > <";
@@ -128,18 +87,6 @@
         assertEquals(expected, spanned);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "fromHtml",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "fromHtml",
-            args = {String.class, ImageGetter.class, TagHandler.class}
-        )
-    })
     public void testColor() throws Exception {
         final int start = 0;
 
@@ -163,11 +110,6 @@
         assertEquals(0, colors.length);
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL_COMPLETE,
-        method = "toHtml",
-        args = {Spanned.class}
-    )
     public void testParagraphs() throws Exception {
         SpannableString s = new SpannableString("Hello world");
         assertEquals("<p>Hello world</p>\n", Html.toHtml(s));
@@ -182,11 +124,6 @@
         assertEquals("<p>Hello world<br></p>\n<p>or something</p>\n", Html.toHtml(s));
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL_COMPLETE,
-        method = "toHtml",
-        args = {Spanned.class}
-    )
     public void testBlockquote() throws Exception {
         final int start = 0;
 
@@ -201,11 +138,6 @@
         assertEquals("<blockquote><p>Hello</p>\n</blockquote>\n<p>world</p>\n", Html.toHtml(s));
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL_COMPLETE,
-        method = "toHtml",
-        args = {Spanned.class}
-    )
     public void testEntities() throws Exception {
         SpannableString s = new SpannableString("Hello <&> world");
         assertEquals("<p>Hello &lt;&amp;&gt; world</p>\n", Html.toHtml(s));
@@ -217,11 +149,6 @@
         assertEquals("<p>Hello&nbsp; world</p>\n", Html.toHtml(s));
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL_COMPLETE,
-        method = "toHtml",
-        args = {Spanned.class}
-    )
     public void testMarkup() throws Exception {
         final int start = 6;
 
@@ -267,22 +194,11 @@
         assertEquals("<p>Hello <a href=\"http://www.google.com\">linky</a> world</p>\n", ret);
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL_COMPLETE,
-        method = "toHtml",
-        args = {Spanned.class}
-    )
     public void testImg() throws Exception {
         Spanned s = Html.fromHtml("yes<img src=\"http://example.com/foo.gif\">no");
         assertEquals("<p>yes<img src=\"http://example.com/foo.gif\">no</p>\n", Html.toHtml(s));
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL_COMPLETE,
-        notes = "Test method: toHtml",
-        method = "toHtml",
-        args = {Spanned.class}
-    )
     public void testUtf8() throws Exception {
         Spanned s = Html.fromHtml("<p>\u0124\u00eb\u0142\u0142o, world!</p>");
         assertEquals("<p>&#292;&#235;&#322;&#322;o, world!</p>\n", Html.toHtml(s));
diff --git a/tests/tests/text/src/android/text/cts/InputFilter_AllCapsTest.java b/tests/tests/text/src/android/text/cts/InputFilter_AllCapsTest.java
index dfef98b..2eec7d7 100644
--- a/tests/tests/text/src/android/text/cts/InputFilter_AllCapsTest.java
+++ b/tests/tests/text/src/android/text/cts/InputFilter_AllCapsTest.java
@@ -20,21 +20,9 @@
 import android.text.InputFilter;
 import android.text.SpannableStringBuilder;
 import android.text.InputFilter.AllCaps;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(InputFilter.AllCaps.class)
 public class InputFilter_AllCapsTest extends AndroidTestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test filter. Implicitly invoked by SpannableStringBuilder#replace and explicitly" +
-                " test to make sure its functionality",
-        method = "filter",
-        args = {java.lang.CharSequence.class, int.class, int.class, android.text.Spanned.class,
-                int.class, int.class}
-    )
     public void testFilter() {
 
         // Implicitly invoked
diff --git a/tests/tests/text/src/android/text/cts/InputFilter_LengthFilterTest.java b/tests/tests/text/src/android/text/cts/InputFilter_LengthFilterTest.java
index df77e60..db06ef6 100644
--- a/tests/tests/text/src/android/text/cts/InputFilter_LengthFilterTest.java
+++ b/tests/tests/text/src/android/text/cts/InputFilter_LengthFilterTest.java
@@ -20,27 +20,9 @@
 import android.text.InputFilter;
 import android.text.SpannableStringBuilder;
 import android.text.InputFilter.LengthFilter;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(InputFilter.LengthFilter.class)
 public class InputFilter_LengthFilterTest extends AndroidTestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "filter",
-            args = {java.lang.CharSequence.class, int.class, int.class, android.text.Spanned.class,
-                    int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "InputFilter.LengthFilter",
-            args = {int.class}
-        )
-    })
     public void testFilter() {
         // Define the variables
         CharSequence source;
diff --git a/tests/tests/text/src/android/text/cts/LayoutTest.java b/tests/tests/text/src/android/text/cts/LayoutTest.java
index 60bac35..973d883 100644
--- a/tests/tests/text/src/android/text/cts/LayoutTest.java
+++ b/tests/tests/text/src/android/text/cts/LayoutTest.java
@@ -16,10 +16,6 @@
 
 package android.text.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
 import android.graphics.Rect;
 import android.test.AndroidTestCase;
@@ -30,7 +26,6 @@
 import android.text.Layout.Alignment;
 import android.text.style.StrikethroughSpan;
 
-@TestTargetClass(Layout.class)
 public class LayoutTest extends AndroidTestCase {
     private final static int LINE_COUNT = 5;
     private final static int LINE_HEIGHT = 12;
@@ -57,14 +52,6 @@
         mSpacingadd = 2;
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "Layout",
-        args = {java.lang.CharSequence.class, android.text.TextPaint.class, int.class,
-                android.text.Layout.Alignment.class, float.class, float.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc " +
-            " of Layout constructor when the width is smaller than 0")
     public void testConstructor() {
         new MockLayout(LAYOUT_TEXT, mTextPaint, mWidth, mAlign, mSpacingmult, mSpacingadd);
 
@@ -75,11 +62,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getText",
-        args = {}
-    )
     public void testGetText() {
         CharSequence text = "test case 1";
         Layout layout = new MockLayout(text, mTextPaint, mWidth,
@@ -90,11 +72,6 @@
         assertNull(layout.getText());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getPaint",
-        args = {}
-    )
     public void testGetPaint() {
         Layout layout = new MockLayout(LAYOUT_TEXT, mTextPaint, mWidth,
                 mAlign, mSpacingmult, mSpacingadd);
@@ -105,11 +82,6 @@
         assertNull(layout.getPaint());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getWidth",
-        args = {}
-    )
     public void testGetWidth() {
         Layout layout = new MockLayout(LAYOUT_TEXT, mTextPaint, 10,
                 mAlign, mSpacingmult, mSpacingadd);
@@ -119,11 +91,6 @@
         assertEquals(0,  layout.getWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getEllipsizedWidth",
-        args = {}
-    )
     public void testGetEllipsizedWidth() {
         Layout layout = new MockLayout(LAYOUT_TEXT, mTextPaint, 15,
                 mAlign, mSpacingmult, mSpacingadd);
@@ -133,13 +100,6 @@
         assertEquals(0,  layout.getEllipsizedWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "increaseWidthTo",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc " +
-            " of Layout#increaseWidthTo(int) when the new width is smaller than old one")
     public void testIncreaseWidthTo() {
         Layout layout = new MockLayout(LAYOUT_TEXT, mTextPaint, mWidth,
                 mAlign, mSpacingmult, mSpacingadd);
@@ -158,22 +118,12 @@
         assertEquals(oldWidth + 1, layout.getWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getHeight",
-        args = {}
-    )
     public void testGetHeight() {
         Layout layout = new MockLayout(LAYOUT_TEXT, mTextPaint, mWidth,
                 mAlign, mSpacingmult, mSpacingadd);
         assertEquals(60, layout.getHeight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getAlignment",
-        args = {}
-    )
     public void testGetAlignment() {
         Layout layout = new MockLayout(LAYOUT_TEXT, mTextPaint, mWidth,
                 mAlign, mSpacingmult, mSpacingadd);
@@ -183,11 +133,6 @@
         assertNull(layout.getAlignment());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSpacingMultiplier",
-        args = {}
-    )
     public void testGetSpacingMultiplier() {
         Layout layout = new MockLayout(LAYOUT_TEXT, mTextPaint, mWidth, mAlign, -1, mSpacingadd);
         assertEquals(-1.0f, layout.getSpacingMultiplier());
@@ -196,11 +141,6 @@
         assertEquals(5.0f, layout.getSpacingMultiplier());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSpacingAdd",
-        args = {}
-    )
     public void testGetSpacingAdd() {
         Layout layout = new MockLayout(LAYOUT_TEXT, mTextPaint, mWidth, mAlign, mSpacingmult, -1);
         assertEquals(-1.0f, layout.getSpacingAdd());
@@ -209,11 +149,6 @@
         assertEquals(20.0f, layout.getSpacingAdd());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLineBounds",
-        args = {int.class, android.graphics.Rect.class}
-    )
     public void testGetLineBounds() {
         Layout layout = new MockLayout(LAYOUT_TEXT, mTextPaint, mWidth,
                 mAlign, mSpacingmult, mSpacingadd);
@@ -226,11 +161,6 @@
         assertEquals(36, bounds.bottom);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLineForVertical",
-        args = {int.class}
-    )
     public void testGetLineForVertical() {
         Layout layout = new MockLayout(LAYOUT_TEXT, mTextPaint, mWidth,
                 mAlign, mSpacingmult, mSpacingadd);
@@ -240,11 +170,6 @@
         assertEquals(LINE_COUNT - 1, layout.getLineForVertical(1000));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLineForOffset",
-        args = {int.class}
-    )
     public void testGetLineForOffset() {
         Layout layout = new MockLayout(LAYOUT_TEXT, mTextPaint, mWidth,
                 mAlign, mSpacingmult, mSpacingadd);
@@ -254,24 +179,12 @@
         assertEquals(LINE_COUNT - 1, layout.getLineForOffset(1000));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLineEnd",
-        args = {int.class}
-    )
     public void testGetLineEnd() {
         Layout layout = new MockLayout(LAYOUT_TEXT, mTextPaint, mWidth,
                 mAlign, mSpacingmult, mSpacingadd);
         assertEquals(2, layout.getLineEnd(1));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLineVisibleEnd",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc " +
-            " of Layout#getLineVisibleEnd(int) when the line is out of bound")
     public void testGetLineVisibleEnd() {
         Layout layout = new MockLayout(LAYOUT_TEXT, mTextPaint, mWidth,
                 mAlign, mSpacingmult, mSpacingadd);
@@ -286,44 +199,24 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLineBottom",
-        args = {int.class}
-    )
     public void testGetLineBottom() {
         Layout layout = new MockLayout(LAYOUT_TEXT, mTextPaint, mWidth,
                 mAlign, mSpacingmult, mSpacingadd);
         assertEquals(LINE_HEIGHT, layout.getLineBottom(0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLineBaseline",
-        args = {int.class}
-    )
     public void testGetLineBaseline() {
         Layout layout = new MockLayout(LAYOUT_TEXT, mTextPaint, mWidth,
                 mAlign, mSpacingmult, mSpacingadd);
         assertEquals(8, layout.getLineBaseline(0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLineAscent",
-        args = {int.class}
-    )
     public void testGetLineAscent() {
         Layout layout = new MockLayout(LAYOUT_TEXT, mTextPaint, mWidth,
                 mAlign, mSpacingmult, mSpacingadd);
         assertEquals(-8, layout.getLineAscent(0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getParagraphAlignment",
-        args = {int.class}
-    )
     public void testGetParagraphAlignment() {
         Layout layout = new MockLayout(LAYOUT_TEXT, mTextPaint, mWidth,
                 mAlign, mSpacingmult, mSpacingadd);
@@ -335,33 +228,18 @@
         assertSame(mAlign, layout.getParagraphAlignment(1));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getParagraphLeft",
-        args = {int.class}
-    )
     public void testGetParagraphLeft() {
         Layout layout = new MockLayout(LAYOUT_TEXT, mTextPaint, mWidth,
                 mAlign, mSpacingmult, mSpacingadd);
         assertEquals(0, layout.getParagraphLeft(0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getParagraphRight",
-        args = {int.class}
-    )
     public void testGetParagraphRight() {
         Layout layout = new MockLayout(LAYOUT_TEXT, mTextPaint, mWidth,
                 mAlign, mSpacingmult, mSpacingadd);
         assertEquals(mWidth, layout.getParagraphRight(0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isSpanned",
-        args = {}
-    )
     public void testIsSpanned() {
         MockLayout layout = new MockLayout(LAYOUT_TEXT, mTextPaint, mWidth,
                 mAlign, mSpacingmult, mSpacingadd);
@@ -374,11 +252,6 @@
         assertTrue(layout.mockIsSpanned());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getDesiredWidth",
-        args = {java.lang.CharSequence.class, int.class, int.class, android.text.TextPaint.class}
-    )
     public void testGetDesiredWidthRange() {
         CharSequence textShort = "test";
         CharSequence textLonger = "test\ngetDesiredWidth";
@@ -395,11 +268,6 @@
         assertTrue(widthShort > widthPartShort);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getDesiredWidth",
-        args = {java.lang.CharSequence.class, android.text.TextPaint.class}
-    )
     public void testGetDesiredWidth() {
         CharSequence textShort = "test";
         CharSequence textLonger = "test\ngetDesiredWidth";
diff --git a/tests/tests/text/src/android/text/cts/LoginFilterTest.java b/tests/tests/text/src/android/text/cts/LoginFilterTest.java
index ed86d52..76f5d04 100644
--- a/tests/tests/text/src/android/text/cts/LoginFilterTest.java
+++ b/tests/tests/text/src/android/text/cts/LoginFilterTest.java
@@ -21,31 +21,14 @@
 import android.text.SpannableString;
 import android.text.Spanned;
 import android.text.SpannedString;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
-@TestTargetClass(LoginFilter.class)
 public class LoginFilterTest extends TestCase {
 
-    @ToBeFixed(bug="1448885", explanation="LoginFilter is an abstract class and its" +
-            " constructors are all package private, we can not extends it directly" +
-            " to test. So, we try to extends its subclass UsernameFilterGeneric to test")
     @Override
     protected void setUp() throws Exception {
         super.setUp();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "filter",
-        args = {java.lang.CharSequence.class, int.class, int.class, android.text.Spanned.class,
-                int.class, int.class}
-    )
-    @ToBeFixed(bug="1417734", explanation="should add @throws clause into javadoc " +
-        " of LoginFilter#filter(CharSequence, int, int, Spanned, int, int) when" +
-        " the source or dest is null")
     public void testFilter() {
         CharSequence result;
         MockLoginFilter loginFilter = new MockLoginFilter();
@@ -133,11 +116,6 @@
 
     // This method does nothing. we only test onInvalidCharacter function here,
     // the callback should be tested in testFilter()
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onInvalidCharacter",
-        args = {char.class}
-    )
     public void testOnInvalidCharacter() {
         LoginFilter loginFilter = new MockLoginFilter();
         loginFilter.onInvalidCharacter('a');
@@ -145,11 +123,6 @@
 
     // This method does nothing. we only test onStop function here,
     // the callback should be tested in testFilter()
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onStop",
-        args = {}
-    )
     public void testOnStop() {
         LoginFilter loginFilter = new MockLoginFilter();
         loginFilter.onStop();
@@ -157,11 +130,6 @@
 
     // This method does nothing. we only test onStart function here,
     // the callback should be tested in testFilter()
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onStart",
-        args = {}
-    )
     public void testOnStart() {
         LoginFilter loginFilter = new LoginFilter.UsernameFilterGeneric();
         loginFilter.onStart();
diff --git a/tests/tests/text/src/android/text/cts/LoginFilter_PasswordFilterGMailTest.java b/tests/tests/text/src/android/text/cts/LoginFilter_PasswordFilterGMailTest.java
index fa4ed6e..ec567c3 100644
--- a/tests/tests/text/src/android/text/cts/LoginFilter_PasswordFilterGMailTest.java
+++ b/tests/tests/text/src/android/text/cts/LoginFilter_PasswordFilterGMailTest.java
@@ -16,43 +16,19 @@
 
 package android.text.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.text.LoginFilter.PasswordFilterGMail;
 
 import junit.framework.TestCase;
 
-@TestTargetClass(PasswordFilterGMail.class)
 public class LoginFilter_PasswordFilterGMailTest extends TestCase {
 
-@TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "LoginFilter.PasswordFilterGMail",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "LoginFilter.PasswordFilterGMail",
-            args = {boolean.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testConstructor() {
         new PasswordFilterGMail();
         new PasswordFilterGMail(true);
         new PasswordFilterGMail(false);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isAllowed",
-        args = {char.class}
-    )
     public void testIsAllowed() {
         PasswordFilterGMail passwordFilterGMail = new PasswordFilterGMail();
 
diff --git a/tests/tests/text/src/android/text/cts/LoginFilter_UsernameFilterGMailTest.java b/tests/tests/text/src/android/text/cts/LoginFilter_UsernameFilterGMailTest.java
index 5550a11..90cc097 100644
--- a/tests/tests/text/src/android/text/cts/LoginFilter_UsernameFilterGMailTest.java
+++ b/tests/tests/text/src/android/text/cts/LoginFilter_UsernameFilterGMailTest.java
@@ -16,45 +16,18 @@
 
 package android.text.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.text.LoginFilter.UsernameFilterGMail;
 
 import junit.framework.TestCase;
 
-@TestTargetClass(UsernameFilterGMail.class)
 public class LoginFilter_UsernameFilterGMailTest extends TestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of UsernameFilterGMail.",
-            method = "LoginFilter.UsernameFilterGMail",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of UsernameFilterGMail.",
-            method = "LoginFilter.UsernameFilterGMail",
-            args = {boolean.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testConstructor() {
         new UsernameFilterGMail();
         new UsernameFilterGMail(true);
         new UsernameFilterGMail(false);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test isAllowed(char c).",
-        method = "isAllowed",
-        args = {char.class}
-    )
     public void testIsAllowed() {
         UsernameFilterGMail usernameFilterGMail = new UsernameFilterGMail();
 
diff --git a/tests/tests/text/src/android/text/cts/LoginFilter_UsernameFilterGenericTest.java b/tests/tests/text/src/android/text/cts/LoginFilter_UsernameFilterGenericTest.java
index 2421855..f9043ee 100644
--- a/tests/tests/text/src/android/text/cts/LoginFilter_UsernameFilterGenericTest.java
+++ b/tests/tests/text/src/android/text/cts/LoginFilter_UsernameFilterGenericTest.java
@@ -16,44 +16,19 @@
 
 package android.text.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.text.LoginFilter.UsernameFilterGeneric;
 
 import junit.framework.TestCase;
 
-@TestTargetClass(UsernameFilterGeneric.class)
 public class LoginFilter_UsernameFilterGenericTest extends TestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "LoginFilter.UsernameFilterGeneric",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "LoginFilter.UsernameFilterGeneric",
-            args = {boolean.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testConstructor() {
         new UsernameFilterGeneric();
         new UsernameFilterGeneric(true);
         new UsernameFilterGeneric(false);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test isAllowed(char c).",
-        method = "isAllowed",
-        args = {char.class}
-    )
     public void testIsAllowed() {
         UsernameFilterGeneric usernameFilterGeneric = new UsernameFilterGeneric();
 
diff --git a/tests/tests/text/src/android/text/cts/SelectionTest.java b/tests/tests/text/src/android/text/cts/SelectionTest.java
index 4fc3386..ed5cc6e 100644
--- a/tests/tests/text/src/android/text/cts/SelectionTest.java
+++ b/tests/tests/text/src/android/text/cts/SelectionTest.java
@@ -16,10 +16,6 @@
 
 package android.text.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
 import android.test.AndroidTestCase;
 import android.text.Selection;
@@ -27,13 +23,7 @@
 import android.text.StaticLayout;
 import android.text.TextPaint;
 
-@TestTargetClass(Selection.class)
 public class SelectionTest extends AndroidTestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSelectionStart",
-        args = {java.lang.CharSequence.class}
-    )
     public void testGetSelectionStart() {
         CharSequence text = "hello, world";
         SpannableStringBuilder builder = new SpannableStringBuilder(text);
@@ -51,11 +41,6 @@
         assertEquals(-1, Selection.getSelectionStart(null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSelectionEnd",
-        args = {java.lang.CharSequence.class}
-    )
     public void testGetSelectionEnd() {
         CharSequence text = "hello, world";
         SpannableStringBuilder builder = new SpannableStringBuilder(text);
@@ -73,13 +58,6 @@
         assertEquals(-1, Selection.getSelectionStart(null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setSelection",
-        args = {android.text.Spannable.class, int.class, int.class}
-    )
-    @ToBeFixed(bug = "1417734",explanation = "throw unexpected IndexOutOfBoundsException" +
-            "and NullPointerException")
     public void testSetSelection1() {
         CharSequence text = "hello, world";
         SpannableStringBuilder builder = new SpannableStringBuilder(text);
@@ -109,13 +87,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setSelection",
-        args = {android.text.Spannable.class, int.class}
-    )
-    @ToBeFixed(bug = "1417734",explanation = "throw unexpected IndexOutOfBoundsException" +
-            "and NullPointerException")
     public void testSetSelection2() {
         SpannableStringBuilder builder = new SpannableStringBuilder("hello, world");
         assertEquals(-1, Selection.getSelectionStart(builder));
@@ -142,11 +113,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "removeSelection",
-        args = {android.text.Spannable.class}
-    )
     public void testRemoveSelection() {
         CharSequence text = "hello, world";
         SpannableStringBuilder builder = new SpannableStringBuilder(text);
@@ -166,11 +132,6 @@
         assertEquals(-1, Selection.getSelectionEnd(builder));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "selectAll",
-        args = {android.text.Spannable.class}
-    )
     public void testSelectAll() {
         CharSequence text = "hello, world";
         SpannableStringBuilder builder = new SpannableStringBuilder(text);
@@ -197,11 +158,6 @@
         assertEquals(0, Selection.getSelectionEnd(empty));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "moveLeft",
-        args = {android.text.Spannable.class, android.text.Layout.class}
-    )
     public void testMoveLeft() {
         CharSequence text = "hello\nworld";
         SpannableStringBuilder builder = new SpannableStringBuilder(text);
@@ -229,11 +185,6 @@
         assertEquals(0, Selection.getSelectionEnd(builder));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "moveRight",
-        args = {android.text.Spannable.class, android.text.Layout.class}
-    )
     public void testMoveRight() {
         CharSequence text = "hello\nworld";
         SpannableStringBuilder builder = new SpannableStringBuilder(text);
@@ -265,11 +216,6 @@
         assertEquals(text.length(), Selection.getSelectionEnd(builder));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "moveUp",
-        args = {android.text.Spannable.class, android.text.Layout.class}
-    )
     public void testMoveUp() {
         CharSequence text = "Google\nhello,world";
         SpannableStringBuilder builder = new SpannableStringBuilder(text);
@@ -304,11 +250,6 @@
         assertEquals(5, Selection.getSelectionEnd(builder));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "moveDown",
-        args = {android.text.Spannable.class, android.text.Layout.class}
-    )
     public void testMoveDown() {
         CharSequence text = "hello,world\nGoogle";
         SpannableStringBuilder builder = new SpannableStringBuilder(text);
@@ -341,11 +282,6 @@
         assertEquals(18, Selection.getSelectionEnd(builder));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "extendSelection",
-        args = {android.text.Spannable.class, int.class}
-    )
     public void testExtendSelection() {
         CharSequence text = "hello, world";
         SpannableStringBuilder builder = new SpannableStringBuilder(text);
@@ -392,11 +328,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "extendLeft",
-        args = {android.text.Spannable.class, android.text.Layout.class}
-    )
     public void testExtendLeft() {
         CharSequence text = "Google\nhello, world";
         SpannableStringBuilder builder = new SpannableStringBuilder(text);
@@ -423,11 +354,6 @@
         assertEquals(0, Selection.getSelectionEnd(builder));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "extendRight",
-        args = {android.text.Spannable.class, android.text.Layout.class}
-    )
     public void testExtendRight() {
         CharSequence text = "Google\nhello, world";
         SpannableStringBuilder builder = new SpannableStringBuilder(text);
@@ -450,11 +376,6 @@
         assertEquals(text.length(), Selection.getSelectionEnd(builder));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "extendUp",
-        args = {android.text.Spannable.class, android.text.Layout.class}
-    )
     public void testExtendUp() {
         CharSequence text = "Google\nhello, world";
         SpannableStringBuilder builder = new SpannableStringBuilder(text);
@@ -485,11 +406,6 @@
         assertEquals(0, Selection.getSelectionEnd(builder));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "extendDown",
-        args = {android.text.Spannable.class, android.text.Layout.class}
-    )
     public void testExtendDown() {
         CharSequence text = "Google\nhello, world";
         SpannableStringBuilder builder = new SpannableStringBuilder(text);
@@ -511,11 +427,6 @@
         assertEquals(text.length(), Selection.getSelectionEnd(builder));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "extendToLeftEdge",
-        args = {android.text.Spannable.class, android.text.Layout.class}
-    )
     public void testExtendToLeftEdge() {
         CharSequence text = "hello\nworld";
         SpannableStringBuilder builder = new SpannableStringBuilder(text);
@@ -551,11 +462,6 @@
         assertEquals(0, Selection.getSelectionEnd(builder));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "extendToRightEdge",
-        args = {android.text.Spannable.class, android.text.Layout.class}
-    )
     public void testExtendToRightEdge() {
         CharSequence text = "hello\nworld";
         SpannableStringBuilder builder = new SpannableStringBuilder(text);
@@ -582,11 +488,6 @@
         assertEquals(text.length(), Selection.getSelectionEnd(builder));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "moveToLeftEdge",
-        args = {android.text.Spannable.class, android.text.Layout.class}
-    )
     public void testMoveToLeftEdge() {
         CharSequence text = "hello\nworld";
         SpannableStringBuilder builder = new SpannableStringBuilder(text);
@@ -618,11 +519,6 @@
         assertEquals(0, Selection.getSelectionEnd(builder));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "moveToRightEdge",
-        args = {android.text.Spannable.class, android.text.Layout.class}
-    )
     public void testMoveToRightEdge() {
         CharSequence text = "hello\nworld";
         SpannableStringBuilder builder = new SpannableStringBuilder(text);
diff --git a/tests/tests/text/src/android/text/cts/SpannableStringBuilderTest.java b/tests/tests/text/src/android/text/cts/SpannableStringBuilderTest.java
index f8b4336..158e1b3 100644
--- a/tests/tests/text/src/android/text/cts/SpannableStringBuilderTest.java
+++ b/tests/tests/text/src/android/text/cts/SpannableStringBuilderTest.java
@@ -16,11 +16,6 @@
 
 package android.text.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.test.AndroidTestCase;
 import android.text.InputFilter;
@@ -34,7 +29,6 @@
 /**
  * Test {@link SpannableStringBuilder}.
  */
-@TestTargetClass(SpannableStringBuilder.class)
 public class SpannableStringBuilderTest extends AndroidTestCase {
 
     private StrikethroughSpan mStrikethroughSpan;
@@ -47,19 +41,6 @@
         mStrikethroughSpan = new StrikethroughSpan();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "SpannableStringBuilder",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "SpannableStringBuilder",
-            args = {java.lang.CharSequence.class}
-        )
-    })
-    @ToBeFixed(bug = "1371108", explanation = "an unexpected NullPointerException thrown here")
     public void testConstructor1() {
         new SpannableStringBuilder();
         new SpannableStringBuilder("test");
@@ -71,13 +52,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "SpannableStringBuilder",
-        args = {CharSequence.class, int.class, int.class}
-    )
-    @ToBeFixed(bug = "1417734",
-            explanation = "an unexpected StringIndexOutOfBoundsException thrown here")
     public void testConstructor2() {
         new SpannableStringBuilder("Text", 0, "Text".length());
         new SpannableStringBuilder(new SpannableString("test"), 0, "Text".length());
@@ -101,11 +75,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSpanFlags",
-        args = {Object.class}
-    )
     public void testGetSpanFlags() {
         SpannableStringBuilder builder = new SpannableStringBuilder("spannable string");
         assertEquals(0, builder.getSpanFlags(mUnderlineSpan));
@@ -119,11 +88,6 @@
         assertEquals(0, builder.getSpanFlags(new Object()));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "nextSpanTransition",
-        args = {int.class, int.class, Class.class}
-    )
     public void testNextSpanTransition() {
         SpannableStringBuilder builder = new SpannableStringBuilder("spannable string");
 
@@ -139,13 +103,6 @@
         assertEquals(1, builder.nextSpanTransition(3, 1, UnderlineSpan.class));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setSpan",
-        args = {Object.class, int.class, int.class, int.class}
-    )
-    @ToBeFixed(bug = "1417734",
-            explanation = "an unexpected IndexOutOfBoundsException thrown here")
     public void testSetSpan() {
         SpannableStringBuilder builder = new SpannableStringBuilder("hello, world");
         try {
@@ -171,12 +128,6 @@
         assertEquals(Spanned.SPAN_EXCLUSIVE_EXCLUSIVE, builder.getSpanFlags(mUnderlineSpan));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "valueOf",
-        args = {CharSequence.class}
-    )
-    @ToBeFixed(bug = "1371108", explanation = "an unexpected NullPointerException thrown here")
     public void testValueOf() {
         try {
             SpannableStringBuilder.valueOf(null);
@@ -196,12 +147,6 @@
         assertSame(builder, SpannableStringBuilder.valueOf(builder));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "replace",
-        args = {int.class, int.class, CharSequence.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add throws into javadoc")
     public void testReplace1() {
         SpannableStringBuilder builder = new SpannableStringBuilder("hello, world!");
         CharSequence text = "hi";
@@ -231,12 +176,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "replace",
-        args = {int.class, int.class, CharSequence.class, int.class, int.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add throws into javadoc")
     public void testReplace2() {
         SpannableStringBuilder builder = new SpannableStringBuilder("hello, world");
         CharSequence text = "ahiabc";
@@ -305,13 +244,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "subSequence",
-        args = {int.class, int.class}
-    )
-    @ToBeFixed(bug = "1417734",
-            explanation = "an unexpected IndexOutOfBoundsException thrown here")
     public void testSubSequence() {
         SpannableStringBuilder builder = new SpannableStringBuilder("hello, world");
         CharSequence text = builder.subSequence(0, 2);
@@ -325,12 +257,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getChars",
-        args = {int.class, int.class, char[].class, int.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add throws into javadoc")
     public void testGetChars() {
         SpannableStringBuilder builder = new SpannableStringBuilder("hello");
         char[] buf = new char[4];
@@ -361,12 +287,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "append",
-        args = {CharSequence.class}
-    )
-    @ToBeFixed(bug = "1371108", explanation = "an unexpected NullPointerException thrown here")
     public void testAppend1() {
         SpannableStringBuilder builder = new SpannableStringBuilder("hello");
         builder.append(",world");
@@ -378,12 +298,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "append",
-        args = {CharSequence.class, int.class, int.class}
-    )
-    @ToBeFixed(bug = "1371108", explanation = "an unexpected NullPointerException thrown here")
     public void testAppend2() {
         SpannableStringBuilder builder = new SpannableStringBuilder("hello");
         builder.append(",world", 1, 3);
@@ -412,12 +326,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "append",
-        args = {char.class}
-    )
-    @ToBeFixed(bug = "1371108", explanation = "an unexpected NullPointerException thrown here")
     public void testAppend3() {
         SpannableStringBuilder builder = new SpannableStringBuilder("hello");
         builder.append('a');
@@ -432,11 +340,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clearSpans",
-        args = {}
-    )
     public void testClearSpans() {
         SpannableStringBuilder builder = new SpannableStringBuilder("hello, world");
 
@@ -451,11 +354,6 @@
         assertEquals(0, builder.getSpanFlags(mUnderlineSpan));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSpanStart",
-        args = {Object.class}
-    )
     public void testGetSpanStart() {
         SpannableStringBuilder builder = new SpannableStringBuilder("hello");
         builder.setSpan(mUnderlineSpan, 1, 3, 0);
@@ -464,18 +362,6 @@
         assertEquals(-1, builder.getSpanStart(null));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFilters",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFilters",
-            args = {InputFilter[].class}
-        )
-    })
     public void testAccessFilters() {
         InputFilter[] filters = new InputFilter[100];
         SpannableStringBuilder builder = new SpannableStringBuilder();
@@ -489,11 +375,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "removeSpan",
-        args = {Object.class}
-    )
     public void testRemoveSpan() {
         SpannableStringBuilder builder = new SpannableStringBuilder("hello, world");
 
@@ -516,11 +397,6 @@
         builder.removeSpan(null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "toString",
-        args = {}
-    )
     public void testToString() {
         SpannableStringBuilder builder = new SpannableStringBuilder("hello");
         assertEquals("hello", builder.toString());
@@ -529,11 +405,6 @@
         assertEquals("", builder.toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSpanEnd",
-        args = {Object.class}
-    )
     public void testGetSpanEnd() {
         SpannableStringBuilder builder = new SpannableStringBuilder("hello");
         builder.setSpan(mUnderlineSpan, 1, 3, 0);
@@ -542,12 +413,6 @@
         assertEquals(-1, builder.getSpanEnd(null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "charAt",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add throws into javadoc")
     public void testCharAt() {
         SpannableStringBuilder builder = new SpannableStringBuilder("hello");
         assertEquals('h', builder.charAt(0));
@@ -565,12 +430,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "insert",
-        args = {int.class, CharSequence.class, int.class, int.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add throws into javadoc")
     public void testInsert1() {
         SpannableStringBuilder builder = new SpannableStringBuilder("hello");
         builder.insert(1, "abcd", 1, 3);
@@ -611,12 +470,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "insert",
-        args = {int.class, CharSequence.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add throws into javadoc")
     public void testInsert2() {
         SpannableStringBuilder builder = new SpannableStringBuilder("hello");
         builder.insert(1, "abcd");
@@ -645,11 +498,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clear",
-        args = {}
-    )
     public void testClear() {
         SpannableStringBuilder builder = new SpannableStringBuilder("hello");
         assertEquals("hello", builder.toString());
@@ -657,11 +505,6 @@
         assertEquals("", builder.toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSpans",
-        args = {int.class, int.class, Class.class}
-    )
     public void testGetSpans() {
         SpannableStringBuilder builder = new SpannableStringBuilder("hello, world");
         UnderlineSpan span1 = new UnderlineSpan();
@@ -681,11 +524,6 @@
         builder.getSpans(4, 1, UnderlineSpan.class);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "length",
-        args = {}
-    )
     public void testLength() {
         SpannableStringBuilder builder = new SpannableStringBuilder("hello");
         assertEquals(5, builder.length());
@@ -693,13 +531,6 @@
         assertEquals(0, builder.length());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "delete",
-        args = {int.class, int.class}
-    )
-    @ToBeFixed(bug = "1417734",
-            explanation = "an unexpected IndexOutOfBoundsException thrown here")
     public void testDelete() {
         SpannableStringBuilder builder = new SpannableStringBuilder("hello,world");
         assertEquals("hello,world", builder.toString());
diff --git a/tests/tests/text/src/android/text/cts/SpannableStringTest.java b/tests/tests/text/src/android/text/cts/SpannableStringTest.java
index 6168fd0..3214bb4 100644
--- a/tests/tests/text/src/android/text/cts/SpannableStringTest.java
+++ b/tests/tests/text/src/android/text/cts/SpannableStringTest.java
@@ -19,21 +19,9 @@
 import android.test.AndroidTestCase;
 import android.text.SpannableString;
 import android.text.style.UnderlineSpan;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
-@TestTargetClass(SpannableString.class)
 public class SpannableStringTest extends AndroidTestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "SpannableString",
-        args = {java.lang.CharSequence.class}
-    )
-    @ToBeFixed(bug="1695243", explanation="should add @throws clause into javadoc of "
-        + " constructor SpannableString(CharSequence) when param CharSequence is null")
     public void testConstructor() {
         new SpannableString("test");
 
@@ -44,13 +32,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "valueOf",
-        args = {java.lang.CharSequence.class}
-    )
-    @ToBeFixed(bug="1695243", explanation="should add @throws clause into javadoc of "
-        + "SpannableString#valueOf(CharSequence) when param CharSequence is null")
     public void testValueOf() {
         String text = "test valueOf";
         SpannableString spannable = SpannableString.valueOf(text);
@@ -67,13 +48,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setSpan",
-        args = {java.lang.Object.class, int.class, int.class, int.class}
-    )
-    @ToBeFixed(bug="1695243", explanation="should add @throws clause into javadoc of "
-        + "SpannableString#setSpan(Object,int, int, int) when index is out of bounds")
     public void testSetSpan() {
         String text = "hello, world";
         SpannableString spannable = new SpannableString(text);
@@ -104,11 +78,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "removeSpan",
-        args = {java.lang.Object.class}
-    )
     public void testRemoveSpan() {
         SpannableString spannable = new SpannableString("hello, world");
 
@@ -132,13 +101,6 @@
         assertEquals(0, spannable.getSpanFlags(underlineSpan));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "subSequence",
-        args = {int.class, int.class}
-    )
-    @ToBeFixed(bug="1695243", explanation="should add @throws clause into javadoc of "
-        + "SpannableString#subSequence(int, int) when index is out of bounds")
     public void testSubSequence() {
         String text = "hello, world";
         SpannableString spannable = new SpannableString(text);
diff --git a/tests/tests/text/src/android/text/cts/Spannable_FactoryTest.java b/tests/tests/text/src/android/text/cts/Spannable_FactoryTest.java
index 31218b2..eca6d6d 100644
--- a/tests/tests/text/src/android/text/cts/Spannable_FactoryTest.java
+++ b/tests/tests/text/src/android/text/cts/Spannable_FactoryTest.java
@@ -20,21 +20,9 @@
 import android.text.Spannable;
 import android.text.SpannableString;
 import android.text.Spannable.Factory;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
-@TestTargetClass(Factory.class)
 public class Spannable_FactoryTest extends AndroidTestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "newSpannable",
-        args = {java.lang.CharSequence.class}
-    )
-    @ToBeFixed(bug="1695243", explanation="should add @throws clause into javadoc of "
-        + "Spannable.Factory#newSpannable(CharSequence) when param CharSequence is null")
     public void testNewSpannable() {
         final String text = "test newSpannable";
         Factory factory = Spannable.Factory.getInstance();
@@ -51,11 +39,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getInstance",
-        args = {}
-    )
     public void testGetInstance() {
         Spannable.Factory factory = Spannable.Factory.getInstance();
         assertNotNull(factory);
diff --git a/tests/tests/text/src/android/text/cts/SpannedStringTest.java b/tests/tests/text/src/android/text/cts/SpannedStringTest.java
index 5b1cc6c..3c9b41b 100644
--- a/tests/tests/text/src/android/text/cts/SpannedStringTest.java
+++ b/tests/tests/text/src/android/text/cts/SpannedStringTest.java
@@ -18,22 +18,8 @@
 
 import android.test.AndroidTestCase;
 import android.text.SpannedString;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
-@TestTargetClass(SpannedString.class)
 public class SpannedStringTest extends AndroidTestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor(s) of {@link SpannedString}",
-        method = "SpannedString",
-        args = {java.lang.CharSequence.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of " +
-            " constructor SpannedString(CharSequence) when param CharSequence is null")
     public void testConstructor() {
         new SpannedString("test");
 
@@ -44,14 +30,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link SpannedString#valueOf(CharSequence)}",
-        method = "valueOf",
-        args = {java.lang.CharSequence.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of " +
-            "SpannedString#valueOf(CharSequence) when param CharSequence is null")
     public void testValueOf() {
         String text = "test valueOf";
         SpannedString spanned = SpannedString.valueOf(text);
@@ -67,14 +45,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link SpannedString#subSequence(int, int)}",
-        method = "subSequence",
-        args = {int.class, int.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of " +
-            "SpannedString#subSequence(int, int) when index is out of bounds")
     public void testSubSequence() {
         String text = "hello, world";
         SpannedString spanned = new SpannedString(text);
diff --git a/tests/tests/text/src/android/text/cts/StaticLayoutTest.java b/tests/tests/text/src/android/text/cts/StaticLayoutTest.java
index a806e0a..b4fb8ab 100644
--- a/tests/tests/text/src/android/text/cts/StaticLayoutTest.java
+++ b/tests/tests/text/src/android/text/cts/StaticLayoutTest.java
@@ -23,13 +23,7 @@
 import android.text.TextPaint;
 import android.text.TextUtils;
 import android.text.Layout.Alignment;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
-@TestTargetClass(StaticLayout.class)
 public class StaticLayoutTest extends AndroidTestCase {
     private static final float SPACE_MULTI = 1.0f;
     private static final float SPACE_ADD = 0.0f;
@@ -93,31 +87,6 @@
     /**
      * Constructor test
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "StaticLayout",
-            args = {java.lang.CharSequence.class, int.class, int.class,
-                    android.text.TextPaint.class, int.class, android.text.Layout.Alignment.class,
-                    float.class, float.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "StaticLayout",
-            args = {java.lang.CharSequence.class, int.class, int.class,
-                    android.text.TextPaint.class, int.class, android.text.Layout.Alignment.class,
-                    float.class, float.class, boolean.class,
-                    android.text.TextUtils.TruncateAt.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "StaticLayout",
-            args = {java.lang.CharSequence.class, android.text.TextPaint.class, int.class,
-            android.text.Layout.Alignment.class, float.class, float.class, boolean.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc "
-        + " of StaticLayout constructors when input null parameters")
     public void testConstructor() {
         new StaticLayout(LAYOUT_TEXT, mDefaultPaint, DEFAULT_OUTER_WIDTH,
                 DEFAULT_ALIGN, SPACE_MULTI, SPACE_ADD, true);
@@ -142,12 +111,6 @@
      *  if you ask for a position below the bottom of the text, you get the last line.
      *  Test 4 values containing -1, 0, normal number and > count
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLineForVertical",
-        args = {int.class}
-    )
-     @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testGetLineForVertical() {
         assertEquals(0, mDefaultLayout.getLineForVertical(-1));
         assertEquals(0, mDefaultLayout.getLineForVertical(0));
@@ -158,11 +121,6 @@
     /**
      * Return the number of lines of text in this layout.
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLineCount",
-        args = {}
-    )
     public void testGetLineCount() {
         assertEquals(LINE_COUNT, mDefaultLayout.getLineCount());
     }
@@ -173,13 +131,6 @@
      * A line of text contains top and bottom in height. this method just get the top of a line
      * Test 4 values containing -1, 0, normal number and > count
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLineTop",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc "
-        +    " of StaticLayout#getLineTop(int) when line is out of bound")
     public void testGetLineTop() {
         assertTrue(mDefaultLayout.getLineTop(0) >= 0);
         assertTrue(mDefaultLayout.getLineTop(1) > mDefaultLayout.getLineTop(0));
@@ -202,13 +153,6 @@
      * This method just like getLineTop, descent means the bottom pixel of the line
      * Test 4 values containing -1, 0, normal number and > count
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLineDescent",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc "
-        + " of StaticLayout#getLineDescent(int) when line is out of bound")
     public void testGetLineDescent() {
         assertTrue(mDefaultLayout.getLineDescent(0) > 0);
         assertTrue(mDefaultLayout.getLineDescent(1) > 0);
@@ -230,13 +174,6 @@
      * Returns the primary directionality of the paragraph containing the specified line.
      * By default, each line should be same
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getParagraphDirection",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc "
-        + " of StaticLayout#getParagraphDirection(int) when line is out of bound")
     public void testGetParagraphDirection() {
         assertEquals(mDefaultLayout.getParagraphDirection(0),
                 mDefaultLayout.getParagraphDirection(1));
@@ -259,13 +196,6 @@
      * Test 4 values containing -1, 0, normal number and > count
      * Each line's offset must >= 0
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLineStart",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc "
-        + " of StaticLayout#getLineStart(int) when line is out of bound")
     public void testGetLineStart() {
         assertTrue(mDefaultLayout.getLineStart(0) >= 0);
         assertTrue(mDefaultLayout.getLineStart(1) >= 0);
@@ -286,13 +216,6 @@
     /*
      * Returns whether the specified line contains one or more tabs.
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLineContainsTab",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc "
-        + " of StaticLayout#getLineContainsTab(int) when line is out of bound")
     public void testGetContainsTab() {
         assertTrue(mDefaultLayout.getLineContainsTab(0));
         assertFalse(mDefaultLayout.getLineContainsTab(1));
@@ -317,13 +240,6 @@
      * We can not check the return value, for Directions's field is package private
      * So only check it not null
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLineDirections",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc "
-        + " of StaticLayout#getLineDirections(int) when line is out of bound")
     public void testGetLineDirections() {
         assertNotNull(mDefaultLayout.getLineDirections(0));
         assertNotNull(mDefaultLayout.getLineDirections(1));
@@ -345,11 +261,6 @@
      * Returns the (negative) number of extra pixels of ascent padding
      * in the top line of the Layout.
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getTopPadding",
-        args = {}
-    )
     public void testGetTopPadding() {
         assertTrue(mDefaultLayout.getTopPadding() < 0);
     }
@@ -357,11 +268,6 @@
     /**
      * Returns the number of extra pixels of descent padding in the bottom line of the Layout.
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getBottomPadding",
-        args = {}
-    )
     public void testGetBottomPadding() {
         assertTrue(mDefaultLayout.getBottomPadding() > 0);
     }
@@ -370,13 +276,6 @@
      * Returns the number of characters to be ellipsized away, or 0 if no ellipsis is to take place.
      * So each line must >= 0
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getEllipsisCount",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc "
-        + " of StaticLayout#getEllipsisCount(int) when line is out of bound")
     public void testGetEllipsisCount() {
         // Multilines (6 lines) and TruncateAt.START so no ellipsis at all
         mDefaultLayout = createEllipsizeStaticLayout(LAYOUT_TEXT,
@@ -468,13 +367,6 @@
      * relative to the start of the line.
      * (So 0 if the beginning of the line is ellipsized, not getLineStart().)
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getEllipsisStart",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc "
-        + " of StaticLayout#getEllipsisStart(int) when line is out of bound")
     public void testGetEllipsisStart() {
         mDefaultLayout = createEllipsizeStaticLayout();
         assertTrue(mDefaultLayout.getEllipsisStart(0) >= 0);
@@ -500,11 +392,6 @@
      * ellipsizedWidth if argument is not null
      * outerWidth if argument is null
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getEllipsizedWidth",
-        args = {}
-    )
     public void testGetEllipsizedWidth() {
         int ellipsizedWidth = 60;
         int outerWidth = 100;
diff --git a/tests/tests/text/src/android/text/cts/TextPaintTest.java b/tests/tests/text/src/android/text/cts/TextPaintTest.java
index 460e96c..fb34274 100644
--- a/tests/tests/text/src/android/text/cts/TextPaintTest.java
+++ b/tests/tests/text/src/android/text/cts/TextPaintTest.java
@@ -20,38 +20,13 @@
 import android.graphics.Typeface;
 import android.test.AndroidTestCase;
 import android.text.TextPaint;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
 /**
  * Test {@link TextPaint}.
  */
-@TestTargetClass(TextPaint.class)
 public class TextPaintTest extends AndroidTestCase {
     private static final int DEFAULT_PAINT_FLAGS = TextPaint.DEV_KERN_TEXT_FLAG;
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "TextPaint",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "TextPaint",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "TextPaint",
-            args = {android.graphics.Paint.class}
-        )
-    })
-    @ToBeFixed(bug="1417734", explanation="should add @throws clause for" +
-            " TextPaint#TextPaint(Paint) when the input Paint is null")
     public void testConstructor() {
         TextPaint textPaint;
 
@@ -63,13 +38,6 @@
                 textPaint.getFlags());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "set",
-        args = {android.text.TextPaint.class}
-    )
-    @ToBeFixed(bug="1417734", explanation="should add @throws clause for" +
-            " TextPaint#set(TextPaint) when the input TextPaint is null")
     public void testSet() {
         TextPaint textPaintSrc = new TextPaint(TextPaint.DITHER_FLAG);
         int[] drawableState = new int[] { 0, 1 };
diff --git a/tests/tests/text/src/android/text/cts/TextUtilsTest.java b/tests/tests/text/src/android/text/cts/TextUtilsTest.java
index 2e675ff..ac67c80 100755
--- a/tests/tests/text/src/android/text/cts/TextUtilsTest.java
+++ b/tests/tests/text/src/android/text/cts/TextUtilsTest.java
@@ -16,10 +16,6 @@
 
 package android.text.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
 import android.content.res.ColorStateList;
 import android.graphics.Canvas;
@@ -52,7 +48,6 @@
 /**
  * Test {@link TextUtils}.
  */
-@TestTargetClass(TextUtils.class)
 public class TextUtilsTest extends AndroidTestCase {
     private static String mEllipsis;
     private int mStart;
@@ -82,13 +77,6 @@
         return re.substring(0, re.indexOf("x"));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "commaEllipsize",
-        args = {CharSequence.class, TextPaint.class, float.class, String.class, String.class}
-    )
-    @ToBeFixed(bug = "1688347 ", explanation = "The javadoc for commaEllipsize() " +
-            "does not discuss any of the corner cases")
     public void testCommaEllipsize() {
         TextPaint p = new TextPaint();
         String text = "long, string, to, truncate";
@@ -141,15 +129,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "concat",
-        args = {CharSequence[].class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for concat() is incomplete." +
-            "1. doesn't explain @param and @return" +
-            "2. doesn't describe the expected result when parameter is empty" +
-            "3. doesn't discuss the case that parameter is expectional.")
     public void testConcat() {
         // issue 1695243
         // the javadoc for concat() doesn't describe the expected result when parameter is empty.
@@ -195,12 +174,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "copySpansFrom",
-        args = {Spanned.class, int.class, int.class, Class.class, Spannable.class, int.class}
-    )
-    @ToBeFixed(bug = "1688347", explanation = "the javadoc for copySpansFrom() does not exist.")
     public void testCopySpansFrom() {
         Object[] spans;
         String text = "content";
@@ -343,18 +316,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "ellipsize",
-        args = {CharSequence.class, TextPaint.class, float.class, TruncateAt.class}
-    )
-    @ToBeFixed(bug = "1688347", explanation = "" +
-            "1. the javadoc for ellipsize() is incomplete." +
-            "   - doesn't explain @param and @return" +
-            "   - doesn't describe expected behavior if user pass an exceptional argument." +
-            "2. ellipsize() is not defined for TruncateAt.MARQUEE. " +
-            "   In the code it looks like this does the same as MIDDLE. " +
-            "   In other methods, MARQUEE is equivalent to END, except for the first line.")
     public void testEllipsize() {
         TextPaint p = new TextPaint();
 
@@ -407,19 +368,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "ellipsize",
-        args = {CharSequence.class, TextPaint.class, float.class, TruncateAt.class,
-                boolean.class, EllipsizeCallback.class}
-    )
-    @ToBeFixed(bug = "1688347", explanation = "" +
-            "1. the javadoc for ellipsize() is incomplete." +
-            "   - doesn't explain @param and @return" +
-            "   - doesn't describe expected behavior if user pass an exceptional argument." +
-            "2. ellipsize() is not defined for TruncateAt.MARQUEE. " +
-            "   In the code it looks like this does the same as MIDDLE. " +
-            "   In other methods, MARQUEE is equivalent to END, except for the first line.")
     public void testEllipsizeCallback() {
         TextPaint p = new TextPaint();
 
@@ -570,11 +518,6 @@
         return buf.toString();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "equals",
-        args = {CharSequence.class, CharSequence.class}
-    )
     public void testEquals() {
         // compare with itself.
         // String is a subclass of CharSequence and overrides equals().
@@ -614,15 +557,6 @@
         assertFalse(TextUtils.equals(null, string));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "expandTemplate",
-        args = {CharSequence.class, CharSequence[].class}
-    )
-    @ToBeFixed(bug = "1695243", explanation =
-            "the javadoc for expandTemplate() is incomplete." +
-            "1. not clear what is supposed to happen if template or values is null." +
-            "2. doesn't discuss the case that ^0 in template string.")
     public void testExpandTemplate() {
         // ^1 at the start of template string.
         assertEquals("value1 template to be expanded",
@@ -751,12 +685,6 @@
         return array;
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getChars",
-        args = {CharSequence.class, int.class, int.class, char[].class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for getChars() does not exist.")
     public void testGetChars() {
         char[] destOriginal = "destination".toCharArray();
         char[] destResult = destOriginal.clone();
@@ -980,12 +908,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getOffsetAfter",
-        args = {CharSequence.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for getOffsetAfter() does not exist.")
     public void testGetOffsetAfter() {
         // the first '\uD800' is index 9, the second 'uD800' is index 16
         // the '\uDBFF' is index 26
@@ -1047,12 +969,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getOffsetBefore",
-        args = {CharSequence.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for getOffsetBefore() does not exist.")
     public void testGetOffsetBefore() {
         // the first '\uDC00' is index 10, the second 'uDC00' is index 17
         // the '\uDFFF' is index 27
@@ -1099,12 +1015,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getReverse",
-        args = {CharSequence.class, int.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for getReverse() does not exist.")
     public void testGetReverse() {
         String source = "string to be reversed";
         assertEquals("gnirts", TextUtils.getReverse(source, 0, "string".length()).toString());
@@ -1159,14 +1069,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getTrimmedLength",
-        args = {CharSequence.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for getReverse() is incomplete." +
-            "1. doesn't explain @param and @return." +
-            "2. doesn't discuss the case that parameter is expectional.")
     public void testGetTrimmedLength() {
         assertEquals("normalstring".length(), TextUtils.getTrimmedLength("normalstring"));
         assertEquals("normal string".length(), TextUtils.getTrimmedLength("normal string"));
@@ -1189,13 +1091,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "htmlEncode",
-        args = {String.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for htmlEncode() is incomplete." +
-            "1. doesn't discuss the case that parameter is expectional.")
     public void testHtmlEncode() {
         assertEquals("&lt;_html_&gt;\\ &amp;&quot;&apos;string&apos;&quot;",
                 TextUtils.htmlEncode("<_html_>\\ &\"'string'\""));
@@ -1208,12 +1103,6 @@
          }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "indexOf",
-        args = {CharSequence.class, char.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for indexOf() does not exist.")
     public void testIndexOf1() {
         String searchString = "string to be searched";
         final int INDEX_OF_FIRST_R = 2;     // first occurrence of 'r'
@@ -1240,12 +1129,6 @@
         assertEquals(INDEX_OF_FIRST_R, TextUtils.indexOf(mockCharSequence, 'r'));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "indexOf",
-        args = {CharSequence.class, char.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for indexOf() does not exist.")
     public void testIndexOf2() {
         String searchString = "string to be searched";
         final int INDEX_OF_FIRST_R = 2;
@@ -1280,12 +1163,6 @@
                 INDEX_OF_FIRST_R + 1));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "indexOf",
-        args = {CharSequence.class, char.class, int.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for indexOf() does not exist.")
     public void testIndexOf3() {
         String searchString = "string to be searched";
         final int INDEX_OF_FIRST_R = 2;
@@ -1331,12 +1208,6 @@
                 INDEX_OF_FIRST_R + 1, searchString.length()));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "indexOf",
-        args = {CharSequence.class, CharSequence.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for indexOf() does not exist.")
     public void testIndexOf4() {
         String searchString = "string to be searched by string";
         final int SEARCH_INDEX = 13;
@@ -1360,12 +1231,6 @@
         assertEquals(SEARCH_INDEX, TextUtils.indexOf(mockCharSequence, "search"));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "indexOf",
-        args = {CharSequence.class, CharSequence.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for indexOf() does not exist.")
     public void testIndexOf5() {
         String searchString = "string to be searched by string";
         final int INDEX_OF_FIRST_STRING = 0;
@@ -1410,12 +1275,6 @@
                 INDEX_OF_FIRST_STRING + 1));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "indexOf",
-        args = {CharSequence.class, CharSequence.class, int.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for indexOf() does not exist.")
     public void testIndexOf6() {
         String searchString = "string to be searched by string";
         final int INDEX_OF_FIRST_STRING = 0;
@@ -1467,12 +1326,6 @@
                 INDEX_OF_FIRST_STRING + 1, searchString.length()));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isDigitsOnly",
-        args = {CharSequence.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for isDigitsOnly() is incomplete.")
     public void testIsDigitsOnly() {
         assertFalse(TextUtils.isDigitsOnly("no digit"));
         assertFalse(TextUtils.isDigitsOnly("character and 56 digits"));
@@ -1487,11 +1340,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isEmpty",
-        args = {CharSequence.class}
-    )
     public void testIsEmpty() {
         assertFalse(TextUtils.isEmpty("not empty"));
         assertFalse(TextUtils.isEmpty("    "));
@@ -1499,12 +1347,6 @@
         assertTrue(TextUtils.isEmpty(null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isGraphic",
-        args = {char.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for isGraphic() is incomplete.")
     public void testIsGraphicChar() {
         assertTrue(TextUtils.isGraphic('a'));
         assertTrue(TextUtils.isGraphic("\uBA00"));
@@ -1535,12 +1377,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isGraphic",
-        args = {CharSequence.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for isGraphic() is incomplete.")
     public void testIsGraphicCharSequence() {
         assertTrue(TextUtils.isGraphic("printable characters"));
 
@@ -1557,12 +1393,6 @@
     }
 
     @SuppressWarnings("unchecked")
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "join",
-        args = {CharSequence.class, Iterable.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for join() is incomplete.")
     public void testJoin1() {
         ArrayList<CharSequence> charTokens = new ArrayList<CharSequence>();
         charTokens.add("string1");
@@ -1588,12 +1418,6 @@
         assertEquals("span 1;span 2;span 3", TextUtils.join(";", spannableStringTokens));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "join",
-        args = {CharSequence.class, Object[].class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for join() is incomplete.")
     public void testJoin2() {
         CharSequence[] charTokens = new CharSequence[] { "string1", "string2", "string3" };
         assertEquals("string1|string2|string3", TextUtils.join("|", charTokens));
@@ -1616,12 +1440,6 @@
         assertEquals("span 1;span 2;span 3", TextUtils.join(";", spannableStringTokens));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "lastIndexOf",
-        args = {CharSequence.class, char.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for lastIndexOf() does not exist.")
     public void testLastIndexOf1() {
         String searchString = "string to be searched";
         final int INDEX_OF_LAST_R = 16;
@@ -1647,12 +1465,6 @@
         assertEquals(INDEX_OF_LAST_R, TextUtils.lastIndexOf(mockCharSequence, 'r'));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "lastIndexOf",
-        args = {CharSequence.class, char.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for lastIndexOf() does not exist.")
     public void testLastIndexOf2() {
         String searchString = "string to be searched";
         final int INDEX_OF_FIRST_R = 2;
@@ -1687,12 +1499,6 @@
                 TextUtils.lastIndexOf(mockCharSequence, 'r', INDEX_OF_FIRST_R));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "lastIndexOf",
-        args = {CharSequence.class, char.class, int.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for lastIndexOf() does not exist.")
     public void testLastIndexOf3() {
         String searchString = "string to be searched";
         final int INDEX_OF_FIRST_R = 2;
@@ -1733,12 +1539,6 @@
                 INDEX_OF_SECOND_R - 1));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "regionMatches",
-        args = {CharSequence.class, int.class, CharSequence.class, int.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for regionMatches() does not exist.")
     public void testRegionMatches() {
         assertFalse(TextUtils.regionMatches("one", 0, "two", 0, "one".length()));
         assertTrue(TextUtils.regionMatches("one", 0, "one", 0, "one".length()));
@@ -1809,12 +1609,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "replace",
-        args = {CharSequence.class, String[].class, CharSequence[].class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for replace() is incomplete.")
     public void testReplace() {
         String template = "this is a string to be as the template for replacement";
 
@@ -1865,13 +1659,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "split",
-        args = {String.class, Pattern.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for split() is incomplete." +
-            "1. not clear what is supposed result if the pattern string is empty.")
     public void testSplitPattern() {
         String testString = "abccbadecdebz";
         assertEquals(calculateCharsCount(testString, "c") + 1,
@@ -1919,13 +1706,6 @@
         return count;
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "split",
-        args = {String.class, String.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for split() is incomplete." +
-            "1. not clear what is supposed result if the pattern string is empty.")
     public void testSplitString() {
         String testString = "abccbadecdebz";
         assertEquals(calculateCharsCount(testString, "c") + 1,
@@ -1955,13 +1735,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "stringOrSpannedString",
-        args = {CharSequence.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for" +
-            " stringOrSpannedString() does not exist.")
     public void testStringOrSpannedString() {
         assertNull(TextUtils.stringOrSpannedString(null));
 
@@ -1981,15 +1754,6 @@
                 TextUtils.stringOrSpannedString(stringBuffer).getClass());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "substring",
-        args = {CharSequence.class, int.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for substring() is incomplete." +
-            "1. doesn't explain @param and @return" +
-            "2. not clear what is supposed to happen if source is null." +
-            "3. doesn't explain the thrown IndexOutOfBoundsException")
     public void testSubString() {
         String string = "String";
         assertSame(string, TextUtils.substring(string, 0, string.length()));
@@ -2047,14 +1811,6 @@
         assertTrue(mockGetChars.hasCalledGetChars());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {CharSequence.class, Parcel.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for writeToParcel() is incomplete." +
-            "1. doesn't explain @param and @return" +
-            "2. not clear is it the supposed result when the CharSequence is null.")
     public void testWriteToParcel() {
         Parcelable.Creator<CharSequence> creator = TextUtils.CHAR_SEQUENCE_CREATOR;
         String string = "String";
@@ -2142,12 +1898,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getCapsMode",
-        args = {CharSequence.class, int.class, int.class}
-    )
-    @ToBeFixed(bug = "1586346", explanation = "return cap mode which is NOT set in reqModes")
     public void testGetCapsMode() {
         final int CAP_MODE_ALL = TextUtils.CAP_MODE_CHARACTERS
                 | TextUtils.CAP_MODE_WORDS | TextUtils.CAP_MODE_SENTENCES;
@@ -2232,13 +1982,6 @@
                 TextUtils.getCapsMode(testString, offset, CAP_MODE_ALL));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getCapsMode",
-        args = {CharSequence.class, int.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for substring() is incomplete." +
-            "1. doesn't describe the expected result when parameter is exceptional.")
     public void testGetCapsModeException() {
         String testString = "Start. Sentence word!No space before\n\t" +
                 "Paragraph? (\"\'skip begin\'\"). skip end";
@@ -2265,11 +2008,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dumpSpans",
-        args = {java.lang.CharSequence.class, android.util.Printer.class, java.lang.String.class}
-    )
     public void testDumpSpans() {
         StringBuilder builder = new StringBuilder();
         StringBuilderPrinter printer = new StringBuilderPrinter(builder);
diff --git a/tests/tests/text/src/android/text/cts/TextUtils_SimpleStringSplitterTest.java b/tests/tests/text/src/android/text/cts/TextUtils_SimpleStringSplitterTest.java
index b4fcfb0..70bfe54 100644
--- a/tests/tests/text/src/android/text/cts/TextUtils_SimpleStringSplitterTest.java
+++ b/tests/tests/text/src/android/text/cts/TextUtils_SimpleStringSplitterTest.java
@@ -20,23 +20,11 @@
 
 import android.test.AndroidTestCase;
 import android.text.TextUtils.SimpleStringSplitter;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
 /**
  * Test {@link SimpleStringSplitter}.
  */
-@TestTargetClass(SimpleStringSplitter.class)
 public class TextUtils_SimpleStringSplitterTest extends AndroidTestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor",
-        method = "TextUtils.SimpleStringSplitter",
-        args = {char.class}
-    )
     public void testConstructor() {
         new SimpleStringSplitter('|');
 
@@ -45,12 +33,6 @@
         new SimpleStringSplitter(Character.MIN_VALUE);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test hasNext method",
-        method = "hasNext",
-        args = {}
-    )
     public void testHasNext() {
         SimpleStringSplitter simpleStringSplitter = new SimpleStringSplitter('|');
         assertFalse(simpleStringSplitter.hasNext());
@@ -68,12 +50,6 @@
         assertFalse(simpleStringSplitter.hasNext());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test iterator method",
-        method = "iterator",
-        args = {}
-    )
     public void testIterator() {
         SimpleStringSplitter simpleStringSplitter = new SimpleStringSplitter('|');
 
@@ -91,14 +67,6 @@
         assertFalse(iterator.hasNext());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test next method",
-        method = "next",
-        args = {}
-    )
-    @ToBeFixed(bug="1436930", explanation="should throw NoSuchElementException " +
-            "when there are no more elements")
     public void testNext1() {
         SimpleStringSplitter simpleStringSplitter = new SimpleStringSplitter(',');
 
@@ -112,15 +80,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test next method",
-        method = "next",
-        args = {}
-    )
-    @ToBeFixed(bug="1448860", explanation="The comments on SimpleStringSplitter are quite" +
-            " specific that if the final char of the string to split is a delimiter then" +
-            " no empty string should be returned for the text after the delimiter")
     public void testNext2() {
         SimpleStringSplitter simpleStringSplitter = new SimpleStringSplitter(',');
 
@@ -137,12 +96,6 @@
         assertEquals("", simpleStringSplitter.next());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test remove method",
-        method = "remove",
-        args = {}
-    )
     public void testRemove() {
         SimpleStringSplitter simpleStringSplitter = new SimpleStringSplitter(',');
 
@@ -153,13 +106,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test setString method",
-        method = "setString",
-        args = {java.lang.String.class}
-    )
-    @ToBeFixed( bug = "1371108", explanation = "NullPointerException issue")
     public void testSetString() {
         SimpleStringSplitter simpleStringSplitter = new SimpleStringSplitter(',');
 
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 5d92a18..31ac271 100644
--- a/tests/tests/text/src/android/text/format/cts/DateFormatTest.java
+++ b/tests/tests/text/src/android/text/format/cts/DateFormatTest.java
@@ -16,10 +16,6 @@
 
 package android.text.format.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.ContentResolver;
 import android.content.Context;
@@ -34,7 +30,6 @@
 import java.util.Locale;
 import java.util.TimeZone;
 
-@TestTargetClass(DateFormat.class)
 public class DateFormatTest extends AndroidTestCase {
 
     private Context mContext;
@@ -75,11 +70,6 @@
     }
 
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "is24HourFormat",
-        args = {Context.class}
-    )
     public void testDateFormat() {
         Settings.System.putString(mContentResolver, Settings.System.TIME_12_24, "24");
         assertTrue(DateFormat.is24HourFormat(mContext));
@@ -87,48 +77,6 @@
         assertFalse(DateFormat.is24HourFormat(mContext));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTimeFormat",
-            args = {Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDateFormat",
-            args = {Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLongDateFormat",
-            args = {Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMediumDateFormat",
-            args = {Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDateFormatOrder",
-            args = {Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "format",
-            args = {CharSequence.class, Calendar.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "format",
-            args = {CharSequence.class, Date.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "format",
-            args = {CharSequence.class, long.class}
-        )
-    })
     @SuppressWarnings("deprecation")
     public void testFormatMethods() throws ParseException {
         if (!mDefaultLocale.equals(Locale.US)) {
@@ -176,7 +124,6 @@
         assertEquals(expectedString, actual.toString());
     }
 
-    @TestTargetNew(level = TestLevel.ADDITIONAL)
     public void test2038() {
         Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("GMT+00:00"));
 
diff --git a/tests/tests/text/src/android/text/format/cts/DateUtilsTest.java b/tests/tests/text/src/android/text/format/cts/DateUtilsTest.java
index 9e773cb..67f42b0 100644
--- a/tests/tests/text/src/android/text/format/cts/DateUtilsTest.java
+++ b/tests/tests/text/src/android/text/format/cts/DateUtilsTest.java
@@ -20,16 +20,11 @@
 import android.test.AndroidTestCase;
 import android.text.format.DateUtils;
 import dalvik.annotation.KnownFailure;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.Formatter;
 import java.util.Locale;
 
-@TestTargetClass(DateUtils.class)
 public class DateUtilsTest extends AndroidTestCase {
 
     private static final long MIN_DURATION = 1000;
@@ -46,11 +41,6 @@
         mBaseTime = System.currentTimeMillis();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getDayOfWeekString",
-        args = {int.class, int.class}
-    )
     public void testGetDayOfWeekString() {
         if (!LocaleUtils.isCurrentLocale(mContext, Locale.US)) {
             return;
@@ -71,11 +61,6 @@
                 DateUtils.getDayOfWeekString(Calendar.SUNDAY, 60));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getMonthString",
-        args = {int.class, int.class}
-    )
     public void testGetMonthString() {
         if (!LocaleUtils.isCurrentLocale(mContext, Locale.US)) {
             return;
@@ -92,11 +77,6 @@
         assertEquals("Jan", DateUtils.getMonthString(Calendar.JANUARY, 60));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getAMPMString",
-        args = {int.class}
-    )
     public void testGetAMPMString() {
         if (!LocaleUtils.isCurrentLocale(mContext, Locale.US)) {
             return;
@@ -105,38 +85,6 @@
         assertEquals("pm", DateUtils.getAMPMString(Calendar.PM));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRelativeTimeSpanString",
-            args = {long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRelativeTimeSpanString",
-            args = {long.class, long.class, long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRelativeTimeSpanString",
-            args = {long.class, long.class, long.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRelativeDateTimeString",
-            args = {Context.class, long.class, long.class, long.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRelativeTimeSpanString",
-            args = {Context.class, long.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRelativeTimeSpanString",
-            args = {Context.class, long.class}
-        )
-    })
 
     public void testGetSpanString() {
         if (!LocaleUtils.isCurrentLocale(mContext, Locale.US)) {
@@ -169,33 +117,6 @@
                 mBaseTime - DAY_DURATION).toString());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "formatElapsedTime",
-            args = {long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "formatElapsedTime",
-            args = {StringBuilder.class, long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "formatDateRange",
-            args = {Context.class, long.class, long.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "formatSameDayTime",
-            args = {long.class, long.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "formatDateTime",
-            args = {Context.class, long.class, int.class}
-        )
-    })
     @SuppressWarnings("deprecation")
     public void testFormatMethods() {
         if (!LocaleUtils.isCurrentLocale(mContext, Locale.US)) {
@@ -293,11 +214,6 @@
         assertTrue("1/19/2009".equals(actual) || "01/19/2009".equals(actual));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isToday",
-        args = {long.class}
-    )
     public void testIsToday() {
         assertTrue(DateUtils.isToday(mBaseTime));
         assertFalse(DateUtils.isToday(mBaseTime - DAY_DURATION));
@@ -307,8 +223,6 @@
      * DateUtils is broken beyond Integer.MAX_VALUE seconds of 1970.
      * http://code.google.com/p/android/issues/detail?id=13050
      */
-    @TestTargetNew(level = TestLevel.ADDITIONAL)
-    @KnownFailure("http://b/2519073")
     public void test2038() {
         assertEquals("00:00, Thursday, January 1, 1970", formatFull(0L));
 
diff --git a/tests/tests/text/src/android/text/format/cts/FormatterTest.java b/tests/tests/text/src/android/text/format/cts/FormatterTest.java
index 697667a..bf4a684 100644
--- a/tests/tests/text/src/android/text/format/cts/FormatterTest.java
+++ b/tests/tests/text/src/android/text/format/cts/FormatterTest.java
@@ -21,18 +21,9 @@
 
 import android.test.AndroidTestCase;
 import android.text.format.Formatter;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(Formatter.class)
 public class FormatterTest extends AndroidTestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "formatFileSize",
-        args = {android.content.Context.class, long.class}
-    )
     public void testFormatFileSize() {
         // test null Context
         assertEquals("", Formatter.formatFileSize(null, 0));
@@ -61,11 +52,6 @@
         assertEquals("-1.00B", Formatter.formatFileSize(mContext, -1));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "formatIpAddress",
-        args = {int.class}
-    )
     public void testFormatIpAddress() {
         assertEquals("1.0.168.192", Formatter.formatIpAddress(0xC0A80001));
         assertEquals("1.0.0.127", Formatter.formatIpAddress(0x7F000001));
diff --git a/tests/tests/text/src/android/text/format/cts/TimeTest.java b/tests/tests/text/src/android/text/format/cts/TimeTest.java
index 50c51da..1d24497 100644
--- a/tests/tests/text/src/android/text/format/cts/TimeTest.java
+++ b/tests/tests/text/src/android/text/format/cts/TimeTest.java
@@ -23,41 +23,9 @@
 import android.text.format.Time;
 import android.util.Log;
 import android.util.TimeFormatException;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(Time.class)
 public class TimeTest extends AndroidTestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Time",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Time",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Time",
-            args = {Time.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "toString",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrentTimezone",
-            args = {}
-        )
-    })
     public void testConstructor() {
         Time time = new Time();
         new Time(Time.getCurrentTimezone());
@@ -66,11 +34,6 @@
         assertTime(time, anotherTime);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "normalize",
-        args = {boolean.class}
-    )
     public void testNormalize() {
         final int expectedMonth = 3;
         final int expectedDate = 1;
@@ -96,11 +59,6 @@
         assertEquals(expectedDate, time.monthDay);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "switchTimezone",
-        args = {String.class}
-    )
     public void testSwitchTimezone() {
         String timeZone = "US/Pacific";
         String anotherTimeZone = "Asia/Chongqing";
@@ -110,18 +68,6 @@
         assertEquals(anotherTimeZone, time.timezone);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "set",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "set",
-            args = {Time.class}
-        )
-    })
     public void testSet() {
         final int year = 2008;
         final int month = 5;
@@ -152,28 +98,6 @@
         assertEquals(time.gmtoff, anotherTime.gmtoff);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWeekNumber",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "format2445",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "format3339",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "parse3339",
-            args = {String.class}
-        )
-    })
     public void testGetWeekNumber() {
         Time time = new Time();
         time.normalize(false);
@@ -200,11 +124,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isEpoch",
-        args = {Time.class}
-    )
     public void testIsEpoch() {
         Time time = new Time();
         assertTrue(Time.isEpoch(time));
@@ -213,18 +132,6 @@
         assertFalse(Time.isEpoch(time));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "after",
-            args = {Time.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "before",
-            args = {Time.class}
-        )
-    })
     public void testAfterBefore() {
         Time a = new Time(Time.TIMEZONE_UTC);
         Time b = new Time("America/Los_Angeles");
@@ -370,23 +277,6 @@
             new DateTest(2007, 10, 5, 2, 0, 60, 2007, 10, 5, 3, 0),
     };
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "normalize",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "set",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "toMillis",
-            args = {boolean.class}
-        )
-    })
     public void testNormalize1() throws Exception {
         Time local = new Time("America/Los_Angeles");
 
@@ -477,11 +367,6 @@
         }
     }
 
-    @TestTargetNew(
-         level = TestLevel.COMPLETE,
-         method = "switchTimezone",
-         args = {String.class}
-    )
     public void testSwitchTimezone0() throws Exception {
         final String timeZone = "America/Los_Angeles";
         Time t = new Time(Time.TIMEZONE_UTC);
@@ -490,21 +375,11 @@
         assertEquals(timeZone, t.timezone);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "Time",
-        args = {String.class}
-    )
     public void testCtor0() throws Exception {
         Time t = new Time(Time.TIMEZONE_UTC);
         assertEquals(Time.TIMEZONE_UTC, t.timezone);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getActualMaximum",
-        args = {int.class}
-    )
     public void testGetActualMaximum0() throws Exception {
         Time t = new Time(Time.TIMEZONE_UTC);
         assertEquals(59, t.getActualMaximum(Time.SECOND));
@@ -548,11 +423,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clear",
-        args = {String.class}
-    )
     public void testClear0() throws Exception {
         Time t = new Time(Time.getCurrentTimezone());
         t.clear(Time.TIMEZONE_UTC);
@@ -570,11 +440,6 @@
         assertEquals(-1, t.isDst);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "compare",
-        args = {Time.class, Time.class}
-    )
     public void testCompare0() throws Exception {
         Time a = new Time(Time.TIMEZONE_UTC);
         Time b = new Time("America/Los_Angeles");
@@ -609,22 +474,12 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "format",
-        args = {String.class}
-    )
     public void testFormat0() throws Exception {
         Time t = new Time(Time.TIMEZONE_UTC);
         String r = t.format("%Y%m%dT%H%M%S");
         assertEquals("19700101T000000", r);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setToNow",
-        args = {}
-    )
     public void testSetToNow0() throws Exception {
         Time t = new Time(Time.TIMEZONE_UTC);
         long currentTime = System.currentTimeMillis();
@@ -633,11 +488,6 @@
         assertEquals(currentTime, time, 999);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "toMillis",
-        args = {boolean.class}
-    )
     public void testMillis0() throws Exception {
         Time t = new Time(Time.TIMEZONE_UTC);
         t.set(0, 0, 0, 1, 1, 2006);
@@ -653,11 +503,6 @@
         assertEquals(1000, r);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "parse",
-        args = {String.class}
-    )
     public void testParse0() throws Exception {
         Time t = new Time(Time.TIMEZONE_UTC);
         assertFalse(t.parse("12345678T901234"));
@@ -671,11 +516,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "set",
-        args = {long.class}
-    )
     public void testSet0() throws Exception {
         Time t = new Time(Time.TIMEZONE_UTC);
         long time = System.currentTimeMillis();
@@ -690,11 +530,6 @@
         assertEquals(date.get(Calendar.SECOND), t.second);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "set",
-        args = {int.class, int.class, int.class, int.class, int.class, int.class}
-    )
     public void testSet1() throws Exception {
         final int year = 2008;
         final int month = 6;
@@ -775,18 +610,6 @@
         "Pacific/Midway",
     };
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "set",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "normalize",
-            args = {boolean.class}
-        )
-    })
     public void testGetJulianDay() throws Exception {
         Time time = new Time();
 
@@ -827,28 +650,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "set",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "normalize",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setJulianDay",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getJulianDay",
-            args = {long.class, long.class}
-        )
-    })
     public void testSetJulianDay() throws Exception {
         Time time = new Time();
 
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 ba2bcdd..6e9996c 100644
--- a/tests/tests/text/src/android/text/method/cts/ArrowKeyMovementMethodTest.java
+++ b/tests/tests/text/src/android/text/method/cts/ArrowKeyMovementMethodTest.java
@@ -16,10 +16,6 @@
 
 package android.text.method.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
 import android.os.SystemClock;
 import android.test.ActivityInstrumentationTestCase2;
@@ -45,7 +41,6 @@
  *
  * @see android.widget.cts.TextViewTest
  */
-@TestTargetClass(ArrowKeyMovementMethod.class)
 public class ArrowKeyMovementMethodTest extends ActivityInstrumentationTestCase2<StubActivity> {
     private static final String THREE_LINES_TEXT = "first line\nsecond line\nlast line";
     private static final int END_OF_ALL_TEXT = THREE_LINES_TEXT.length();
@@ -83,34 +78,14 @@
         assertTrue(mTextView.isFocused());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor ArrowKeyMovementMethod#ArrowKeyMovementMethod().",
-        method = "ArrowKeyMovementMethod",
-        args = {}
-    )
     public void testConstructor() {
         new ArrowKeyMovementMethod();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ArrowKeyMovementMethod#canSelectArbitrarily()}. "
-                + "It always returns true.",
-        method = "canSelectArbitrarily",
-        args = {}
-    )
     public void testCanSelectArbitrarily() {
         assertTrue(new ArrowKeyMovementMethod().canSelectArbitrarily());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ArrowKeyMovementMethod#getInstance()}. "
-                + "This is a method for creating singleton.",
-        method = "getInstance",
-        args = {}
-    )
     public void testGetInstance() {
         MovementMethod method0 = ArrowKeyMovementMethod.getInstance();
         assertNotNull(method0);
@@ -120,15 +95,6 @@
         assertSame(method0, method1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ArrowKeyMovementMethod#onTakeFocus(TextView, Spannable, int)}. "
-                + "Test the method after the widget get layouted.",
-        method = "onTakeFocus",
-        args = {TextView.class, Spannable.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. There is no "
-            + "document about the behaviour of this method.")
     public void testOnTakeFocus() throws Throwable {
         /*
          * The following assertions depend on whether the TextView has a layout.
@@ -185,30 +151,11 @@
         assertSelection(END_OF_ALL_TEXT);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ArrowKeyMovementMethod#onTakeFocus(TextView, Spannable, int)}. "
-                + "Test the method before the widget get layouted.",
-        method = "onTakeFocus",
-        args = {TextView.class, Spannable.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. There is no "
-            + "document about the behaviour of this method.")
     public void testOnTakeFoucusWithNullLayout() {
         initTextViewWithNullLayout();
         assertSelectEndOfContent();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ArrowKeyMovementMethod#onTakeFocus(TextView, Spannable, int)}. "
-                + "Test the method with null parameters.",
-        method = "onTakeFocus",
-        args = {TextView.class, Spannable.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. @throws clause "
-            + "should be added into javadoc of ArrowKeyMovementMethod#onTakeFocus(TextView, "
-            + "Spannable, int)} when the params view or text is null")
     public void testOnTakeFocusWithNullParameters() {
         initTextViewWithNullLayout();
         try {
@@ -226,15 +173,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ArrowKeyMovementMethod#onKeyDown(TextView, Spannable, int, "
-                + "KeyEvent)}. KeyEvent parameter is never read.",
-        method = "onKeyDown",
-        args = {TextView.class, Spannable.class, int.class, KeyEvent.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. There is no "
-            + "document about the behaviour of this method.")
     @UiThreadTest
     public void testOnKeyDownWithKeyCodeUp() {
         // first line
@@ -301,15 +239,6 @@
         assertSelection(correspondingIn1stLine);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ArrowKeyMovementMethod#onKeyDown(TextView, Spannable, int, "
-                + "KeyEvent)}. KeyEvent parameter is never read.",
-        method = "onKeyDown",
-        args = {TextView.class, Spannable.class, int.class, KeyEvent.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. There is no "
-            + "document about the behaviour of this method.")
     @UiThreadTest
     public void testOnKeyDownWithKeyCodeDown() {
         // first line
@@ -376,15 +305,6 @@
         assertSelection(correspondingIn3rdLine);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ArrowKeyMovementMethod#onKeyDown(TextView, Spannable, int, "
-                + "KeyEvent)}. KeyEvent parameter is never read.",
-        method = "onKeyDown",
-        args = {TextView.class, Spannable.class, int.class, KeyEvent.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. There is no "
-            + "document about the behaviour of this method.")
     @UiThreadTest
     public void testOnKeyDownWithKeyCodeLeft() {
         // first line
@@ -470,15 +390,6 @@
         assertSelection(END_OF_1ST_LINE);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ArrowKeyMovementMethod#onKeyDown(TextView, Spannable, int, "
-                + "KeyEvent)}. KeyEvent parameter is never read.",
-        method = "onKeyDown",
-        args = {TextView.class, Spannable.class, int.class, KeyEvent.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. There is no "
-            + "document about the behaviour of this method.")
     @UiThreadTest
     public void testOnKeyDownWithKeyCodeRight() {
         // first line
@@ -564,16 +475,6 @@
         assertSelection(START_OF_3RD_LINE);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ArrowKeyMovementMethod#onKeyDown(TextView, Spannable, int, "
-                + "KeyEvent)}. Test the method before the widget get layouted.",
-        method = "onKeyDown",
-        args = {TextView.class, Spannable.class, int.class, KeyEvent.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. @throws clause "
-            + "should be added into javadoc of ArrowKeyMovementMethod#onKeyDown(TextView, "
-            + "Spannable, int, KeyEvent)} when the view does not get layout")
     public void testOnKeyDownWithNullLayout() {
         initTextViewWithNullLayout();
         try {
@@ -585,14 +486,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ArrowKeyMovementMethod#onKeyOther(TextView, Spannable, KeyEvent)}.",
-        method = "onKeyOther",
-        args = {TextView.class, Spannable.class, KeyEvent.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. There is no "
-            + "document about the behaviour of this method.")
     @UiThreadTest
     public void testOnKeyOther() {
         // first line
@@ -629,15 +522,6 @@
                 new KeyEvent(0, 0, KeyEvent.ACTION_MULTIPLE, KeyEvent.KEYCODE_DPAD_RIGHT, 2)));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ArrowKeyMovementMethod#onKeyDown(TextView, Spannable, int, "
-                + "KeyEvent)}. Test the method with other key code except up, down, left ,right.",
-        method = "onKeyDown",
-        args = {TextView.class, Spannable.class, int.class, KeyEvent.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. There is no "
-            + "document about the behaviour of this method.")
     @UiThreadTest
     public void testOnKeyDownWithOtherKeyCode() {
         // first line
@@ -657,16 +541,7 @@
                         KeyEvent.KEYCODE_UNKNOWN)));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ArrowKeyMovementMethod#onTouchEvent(TextView, Spannable,"
-            + " MotionEvent)}. Test the method while the widget is focused.",
-        method = "onTouchEvent",
-        args = {TextView.class, Spannable.class, MotionEvent.class}
-    )
     @UiThreadTest
-    @ToBeFixed(bug = "1400249", explanation = "There is a side effect that the "
-            + "view scroll while dragging on the screen. Should be tested in functional test.")
     public void testOnTouchEvent() throws Throwable {
         long now = SystemClock.currentThreadTimeMillis();
         Selection.setSelection(mEditable, SPACE_IN_2ND_LINE);
@@ -680,16 +555,6 @@
         assertSelection(SPACE_IN_2ND_LINE);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ArrowKeyMovementMethod#onTouchEvent(TextView, Spannable, "
-                + "MotionEvent)}. Test the method before the widget get layouted.",
-        method = "onTouchEvent",
-        args = {TextView.class, Spannable.class, MotionEvent.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. @throws clause "
-            + "should be added into javadoc of ArrowKeyMovementMethod#onTouchEvent(TextView, "
-            + "Spannable, MotionEvent)} when the view does not get layout")
     public void testOnTouchEventWithNullLayout() {
         initTextViewWithNullLayout();
         mTextView.setFocusable(true);
@@ -701,16 +566,7 @@
                     MotionEvent.obtain(now, now, MotionEvent.ACTION_UP, 1, 1, 0)));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ArrowKeyMovementMethod#onTouchEvent(TextView, Spannable, "
-                + "MotionEvent)}. Test the method while the widget is not focused.",
-        method = "onTouchEvent",
-        args = {TextView.class, Spannable.class, MotionEvent.class}
-    )
     @UiThreadTest
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. There is no "
-            + "document about the behaviour of this method.")
     public void testOnTouchEventWithoutFocus() {
         long now = SystemClock.currentThreadTimeMillis();
         Selection.setSelection(mEditable, SPACE_IN_2ND_LINE);
@@ -719,16 +575,6 @@
         assertSelection(SPACE_IN_2ND_LINE);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ArrowKeyMovementMethod#onTouchEvent(TextView, Spannable, "
-            + "MotionEvent)}. Test the method with null parameters.",
-        method = "onTouchEvent",
-        args = {TextView.class, Spannable.class, MotionEvent.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. @throws clause "
-            + "should be added into javadoc of ArrowKeyMovementMethod#onTouchEvent(TextView, "
-            + "Spannable, MotionEvent)} when the params view, buffer or event is null")
     public void testOnTouchEventWithNullParameters() {
         initTextViewWithNullLayout();
         try {
@@ -755,16 +601,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ArrowKeyMovementMethod#initialize(TextView, Spannable)}. "
-                + "TextView parameter is never read.",
-        method = "initialize",
-        args = {TextView.class, Spannable.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. @throws clause "
-            + "should be added into javadoc of ArrowKeyMovementMethod#initialize(TextView, "
-            + "Spannable)} when the params text is null")
     public void testInitialize() {
         Spannable spannable = new SpannableString("test content");
         ArrowKeyMovementMethod method = new ArrowKeyMovementMethod();
@@ -790,15 +626,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ArrowKeyMovementMethod#onTrackballEvent(TextView, Spannable, "
-                + "MotionEvent)}. This method always returns false.",
-        method = "onTrackballEvent",
-        args = {TextView.class, Spannable.class, MotionEvent.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. "
-            + "There is no document about behaviour of this method.")
     public void testOnTrackballEven() {
         assertFalse(mArrowKeyMovementMethod.onTrackballEvent(mTextView, mEditable,
                 MotionEvent.obtain(0, 0, 0, 1, 1, 0)));
@@ -814,15 +641,6 @@
         assertFalse(mArrowKeyMovementMethod.onTrackballEvent(mTextView, mEditable, null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ArrowKeyMovementMethod#onKeyUp(TextView, Spannable, int, KeyEvent)}. "
-                + "It always returns false.",
-        method = "onKeyUp",
-        args = {TextView.class, Spannable.class, int.class, KeyEvent.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. "
-            + "There is no document about behaviour of this method.")
     public void testOnKeyUp() {
         ArrowKeyMovementMethod method = new ArrowKeyMovementMethod();
         SpannableString spannable = new SpannableString("Test Content");
diff --git a/tests/tests/text/src/android/text/method/cts/BaseKeyListenerTest.java b/tests/tests/text/src/android/text/method/cts/BaseKeyListenerTest.java
index 0383463..2f629d6 100644
--- a/tests/tests/text/src/android/text/method/cts/BaseKeyListenerTest.java
+++ b/tests/tests/text/src/android/text/method/cts/BaseKeyListenerTest.java
@@ -18,11 +18,6 @@
 
 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 android.app.Activity;
 import android.app.Instrumentation;
@@ -41,7 +36,6 @@
 /**
  * Test the main functionalities of the BaseKeyListener.
  */
-@TestTargetClass(BaseKeyListener.class)
 public class BaseKeyListenerTest extends
         ActivityInstrumentationTestCase2<KeyListenerStubActivity> {
     private static final CharSequence TEST_STRING = "123456";
@@ -153,20 +147,6 @@
      * 2. Set a selection and press DEL key, the selection is deleted.
      * 3. ACTION_MULTIPLE KEYCODE_UNKNOWN by inserting the event's text into the content.
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyDown",
-            args = {View.class, Editable.class, int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyOther",
-            args = {View.class, Editable.class, KeyEvent.class}
-        )
-    })
-    @ToBeFixed(bug = "1731439", explanation = "onKeyOther doesn't inserts the" +
-            " event's text into content.")
     public void testPressKey() {
         final CharSequence str = "123456";
         final MockBaseKeyListener baseKeyListener = new MockBaseKeyListener();
diff --git a/tests/tests/text/src/android/text/method/cts/CharacterPickerDialogTest.java b/tests/tests/text/src/android/text/method/cts/CharacterPickerDialogTest.java
index 5ad230c..1e7150b 100644
--- a/tests/tests/text/src/android/text/method/cts/CharacterPickerDialogTest.java
+++ b/tests/tests/text/src/android/text/method/cts/CharacterPickerDialogTest.java
@@ -16,10 +16,6 @@
 
 package android.text.method.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
 import android.app.Activity;
 import android.content.Context;
@@ -33,7 +29,6 @@
 import android.widget.Gallery;
 import android.widget.TextView;
 
-@TestTargetClass(CharacterPickerDialog.class)
 public class CharacterPickerDialogTest extends
         ActivityInstrumentationTestCase2<StubActivity> {
     private Activity mActivity;
@@ -48,13 +43,6 @@
         mActivity = getActivity();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "CharacterPickerDialog",
-        args = {Context.class, View.class, Editable.class, String.class, boolean.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, " +
-            "should add @throw in the javadoc.")
     public void testConstructor() {
         final CharSequence str = "123456";
         final Editable content = Editable.Factory.getInstance().newEditable(str);
@@ -69,21 +57,10 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onCreate",
-        args = {Bundle.class}
-    )
     public void testOnCreate() {
         // Do not test. Implementation details.
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "only position is read in this method",
-        method = "onItemClick",
-        args = {AdapterView.class, View.class, int.class, long.class}
-    )
     public void testOnItemClick() {
         final Gallery parent = new Gallery(mActivity);
         final CharSequence str = "123456";
@@ -125,11 +102,6 @@
         assertFalse(insertPickerDialog.isShowing());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onClick",
-        args = {View.class}
-    )
     public void testOnClick() {
         final CharSequence str = "123456";
         final Editable content = Editable.Factory.getInstance().newEditable(str);
diff --git a/tests/tests/text/src/android/text/method/cts/DateKeyListenerTest.java b/tests/tests/text/src/android/text/method/cts/DateKeyListenerTest.java
index 351f545..21321c0 100644
--- a/tests/tests/text/src/android/text/method/cts/DateKeyListenerTest.java
+++ b/tests/tests/text/src/android/text/method/cts/DateKeyListenerTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
 import android.app.Activity;
 import android.app.Instrumentation;
@@ -34,7 +30,6 @@
 /**
  * Test {@link DateKeyListener}.
  */
-@TestTargetClass(DateKeyListener.class)
 public class DateKeyListenerTest extends
         ActivityInstrumentationTestCase2<KeyListenerStubActivity> {
     private Activity mActivity;
@@ -54,20 +49,10 @@
         mTextView = (TextView) mActivity.findViewById(R.id.keylistener_textview);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "DateKeyListener",
-        args = {}
-    )
     public void testConstructor() {
         new DateKeyListener();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getInstance",
-        args = {}
-    )
     public void testGetInstance() {
         DateKeyListener listener1 = DateKeyListener.getInstance();
         DateKeyListener listener2 = DateKeyListener.getInstance();
@@ -77,11 +62,6 @@
         assertSame(listener1, listener2);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getAcceptedChars",
-        args = {}
-    )
     public void testGetAcceptedChars() {
         MyDataKeyListener dataKeyListener = new MyDataKeyListener();
 
@@ -89,12 +69,6 @@
                 dataKeyListener.getAcceptedChars());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getInputType",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete.")
     public void testGetInputType() {
         MyDataKeyListener dataKeyListener = new MyDataKeyListener();
 
diff --git a/tests/tests/text/src/android/text/method/cts/DateTimeKeyListenerTest.java b/tests/tests/text/src/android/text/method/cts/DateTimeKeyListenerTest.java
index daaedf4..69709f8 100644
--- a/tests/tests/text/src/android/text/method/cts/DateTimeKeyListenerTest.java
+++ b/tests/tests/text/src/android/text/method/cts/DateTimeKeyListenerTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
 import android.app.Activity;
 import android.app.Instrumentation;
@@ -35,7 +31,6 @@
 /**
  * Test {@link DateTimeKeyListener}.
  */
-@TestTargetClass(DateTimeKeyListener.class)
 public class DateTimeKeyListenerTest extends
         ActivityInstrumentationTestCase2<KeyListenerStubActivity> {
     private Activity mActivity;
@@ -55,20 +50,10 @@
         mTextView = (TextView) mActivity.findViewById(R.id.keylistener_textview);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "DateTimeKeyListener",
-        args = {}
-    )
     public void testConstructor() {
         new DateTimeKeyListener();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getInstance",
-        args = {}
-    )
     public void testGetInstance() {
         DateTimeKeyListener listener1 = DateTimeKeyListener.getInstance();
         DateTimeKeyListener listener2 = DateTimeKeyListener.getInstance();
@@ -78,11 +63,6 @@
         assertSame(listener1, listener2);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getAcceptedChars",
-        args = {}
-    )
     public void testGetAcceptedChars() {
         MyDateTimeKeyListener dataTimeKeyListener = new MyDateTimeKeyListener();
 
@@ -90,12 +70,6 @@
                 dataTimeKeyListener.getAcceptedChars());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getInputType",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete.")
     public void testGetInputType() {
         DateTimeKeyListener listener = DateTimeKeyListener.getInstance();
 
diff --git a/tests/tests/text/src/android/text/method/cts/DialerKeyListenerTest.java b/tests/tests/text/src/android/text/method/cts/DialerKeyListenerTest.java
index 0ca468c..a02bdfe 100644
--- a/tests/tests/text/src/android/text/method/cts/DialerKeyListenerTest.java
+++ b/tests/tests/text/src/android/text/method/cts/DialerKeyListenerTest.java
@@ -22,34 +22,15 @@
 import android.text.SpannableString;
 import android.text.method.DialerKeyListener;
 import android.view.KeyEvent;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
 /**
  * Test {@link DialerKeyListener}.
  */
-@TestTargetClass(DialerKeyListener.class)
 public class DialerKeyListenerTest extends TestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor(s) of {@link DialerKeyListener}",
-        method = "DialerKeyListener",
-        args = {}
-    )
     public void testConstructor() {
         new DialerKeyListener();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link DialerKeyListener#lookup(KeyEvent, Spannable)}",
-        method = "lookup",
-        args = {android.view.KeyEvent.class, android.text.Spannable.class}
-    )
-    @ToBeFixed(bug="1371108", explanation="NPE is not expected.")
     public void testLookup() {
         MockDialerKeyListener mockDialerKeyListener = new MockDialerKeyListener();
         final int[] events = { KeyEvent.KEYCODE_0, KeyEvent.KEYCODE_N, KeyEvent.KEYCODE_A };
@@ -71,12 +52,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link DialerKeyListener#getInstance()}",
-        method = "getInstance",
-        args = {}
-    )
     public void testGetInstance() {
         assertNotNull(DialerKeyListener.getInstance());
 
@@ -88,12 +63,6 @@
         assertSame(listener1, listener2);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link DialerKeyListener#getAcceptedChars()}",
-        method = "getAcceptedChars",
-        args = {}
-    )
     public void testGetAcceptedChars() {
         MockDialerKeyListener mockDialerKeyListener = new MockDialerKeyListener();
 
@@ -101,12 +70,6 @@
                 mockDialerKeyListener.getAcceptedChars());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link DialerKeyListener#getInputType()}",
-        method = "getInputType",
-        args = {}
-    )
     public void testGetInputType() {
         DialerKeyListener listener = DialerKeyListener.getInstance();
 
diff --git a/tests/tests/text/src/android/text/method/cts/DigitsKeyListenerTest.java b/tests/tests/text/src/android/text/method/cts/DigitsKeyListenerTest.java
index c228ade..0a1b5ae 100644
--- a/tests/tests/text/src/android/text/method/cts/DigitsKeyListenerTest.java
+++ b/tests/tests/text/src/android/text/method/cts/DigitsKeyListenerTest.java
@@ -18,11 +18,6 @@
 
 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 android.app.Activity;
 import android.app.Instrumentation;
@@ -38,7 +33,6 @@
 /**
  * Test {@link DigitsKeyListener}.
  */
-@TestTargetClass(DigitsKeyListener.class)
 public class DigitsKeyListenerTest extends
         ActivityInstrumentationTestCase2<KeyListenerStubActivity> {
     private Activity mActivity;
@@ -58,18 +52,6 @@
         mTextView = (TextView) mActivity.findViewById(R.id.keylistener_textview);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "DigitsKeyListener",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "DigitsKeyListener",
-            args = {boolean.class, boolean.class}
-        )
-    })
     public void testConstructor() {
         new DigitsKeyListener();
 
@@ -85,12 +67,6 @@
      * 4. filter Spanned("-a1.b2c3d"), return Spanned("123") and copy spans.
      * 5. filter "", return null
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "filter",
-        args = {CharSequence.class, int.class, int.class, Spanned.class, int.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testFilter1() {
         String source = "123456";
         String destString = "dest string";
@@ -137,12 +113,6 @@
      * 7. filter "-123456" but dest has '-' after dend, return ""
      * 8. filter "-123456" but dest has '-' before dstart, return "123456"
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "filter",
-        args = {CharSequence.class, int.class, int.class, Spanned.class, int.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testFilter2() {
         String source = "-123456";
         String destString = "dest string without sign and decimal";
@@ -207,12 +177,6 @@
      * 7. filter "123.456" but dest has '.' after dend, return "123456"
      * 8. filter "123.456" but dest has '.' before dstart, return "123456"
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "filter",
-        args = {CharSequence.class, int.class, int.class, Spanned.class, int.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testFilter3() {
         String source = "123.456";
         String destString = "dest string without sign and decimal";
@@ -279,12 +243,6 @@
      * 9. filter "-123.456" but dest has '-' after dend, return ""
      * 10. filter "-123.456" but dest has '-' before dstart, return "123.456"
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "filter",
-        args = {CharSequence.class, int.class, int.class, Spanned.class, int.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testFilter4() {
         String source = "-123.456";
         String destString = "dest string without sign and decimal";
@@ -439,8 +397,6 @@
      *  5. Press '.' key and this key could not be accepted,
      *     because text view accepts only one decimal point per field.
      */
-    @ToBeFixed(bug = "1728770", explanation = "unexpected IndexOutOfBoundsException occurs" +
-            " when set DigitsKeyListener with InputType.TYPE_NUMBER_FLAG_DECIMAL.")
     public void testDigitsKeyListener3() {
 //        final DigitsKeyListener digitsKeyListener = DigitsKeyListener.getInstance(false, true);
 //
@@ -486,8 +442,6 @@
      *  6. Press '.' key and this key could not be accepted,
      *     because text view accepts only one decimal point per field.
      */
-    @ToBeFixed(bug = "1728770", explanation = "unexpected IndexOutOfBoundsException occurs" +
-            " when set DigitsKeyListener with InputType.TYPE_NUMBER_FLAG_DECIMAL.")
     public void testDigitsKeyListener4() {
 //        final DigitsKeyListener digitsKeyListener = DigitsKeyListener.getInstance(true, true);
 //
@@ -578,11 +532,6 @@
         assertEquals("5", mTextView.getText().toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getInstance",
-        args = {}
-    )
     public void testGetInstance1() {
         DigitsKeyListener listener1 = DigitsKeyListener.getInstance();
         DigitsKeyListener listener2 = DigitsKeyListener.getInstance();
@@ -592,11 +541,6 @@
         assertSame(listener1, listener2);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getInstance",
-        args = {boolean.class, boolean.class}
-    )
     public void testGetInstance2() {
         DigitsKeyListener listener1 = DigitsKeyListener.getInstance(true, true);
         DigitsKeyListener listener2 = DigitsKeyListener.getInstance(true, true);
@@ -613,11 +557,6 @@
         assertSame(listener1, listener2);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getInstance",
-        args = {String.class}
-    )
     public void testGetInstance3() {
         DigitsKeyListener digitsKeyListener = DigitsKeyListener.getInstance("abcdefg");
         assertNotNull(digitsKeyListener);
@@ -626,12 +565,6 @@
         assertNotNull(digitsKeyListener);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getAcceptedChars",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete.")
     public void testGetAcceptedChars() {
         MyDigitsKeyListener digitsKeyListener = new MyDigitsKeyListener();
 
@@ -658,12 +591,6 @@
                 digitsKeyListener.getAcceptedChars());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getInputType",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete.")
     public void testGetInputType() {
         DigitsKeyListener digitsKeyListener = DigitsKeyListener.getInstance(false, false);
         int expected = InputType.TYPE_CLASS_NUMBER;
diff --git a/tests/tests/text/src/android/text/method/cts/HideReturnsTransformationMethodTest.java b/tests/tests/text/src/android/text/method/cts/HideReturnsTransformationMethodTest.java
index ffbff7f..d789c92 100644
--- a/tests/tests/text/src/android/text/method/cts/HideReturnsTransformationMethodTest.java
+++ b/tests/tests/text/src/android/text/method/cts/HideReturnsTransformationMethodTest.java
@@ -16,9 +16,6 @@
 
 package android.text.method.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.text.method.HideReturnsTransformationMethod;
 
@@ -27,36 +24,16 @@
 /**
  * Test {@link HideReturnsTransformationMethod}.
  */
-@TestTargetClass(HideReturnsTransformationMethod.class)
 public class HideReturnsTransformationMethodTest extends TestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor "
-                + "HideReturnsTransformationMethod#HideReturnsTransformationMethod().",
-        method = "HideReturnsTransformationMethod",
-        args = {}
-    )
     public void testConstructor() {
         new HideReturnsTransformationMethod();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link HideReturnsTransformationMethod#getOriginal()}.",
-        method = "getOriginal",
-        args = {}
-    )
     public void testGetOriginal() {
         MyHideReturnsTranformationMethod method = new MyHideReturnsTranformationMethod();
         TextMethodUtils.assertEquals(new char[] { '\r' }, method.getOriginal());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link HideReturnsTransformationMethod#getInstance()}.",
-        method = "getInstance",
-        args = {}
-    )
     public void testGetInstance() {
         HideReturnsTransformationMethod method0 = HideReturnsTransformationMethod.getInstance();
         assertNotNull(method0);
@@ -65,12 +42,6 @@
         assertSame(method0, method1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link HideReturnsTransformationMethod#getReplacement()}.",
-        method = "getReplacement",
-        args = {}
-    )
     public void testGetReplacement() {
         MyHideReturnsTranformationMethod method = new MyHideReturnsTranformationMethod();
         TextMethodUtils.assertEquals(new char[] { '\uFEFF' }, method.getReplacement());
diff --git a/tests/tests/text/src/android/text/method/cts/LinkMovementMethodTest.java b/tests/tests/text/src/android/text/method/cts/LinkMovementMethodTest.java
index cbfc327..b67f313 100644
--- a/tests/tests/text/src/android/text/method/cts/LinkMovementMethodTest.java
+++ b/tests/tests/text/src/android/text/method/cts/LinkMovementMethodTest.java
@@ -16,11 +16,6 @@
 
 package android.text.method.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.os.SystemClock;
 import android.test.ActivityInstrumentationTestCase2;
@@ -46,7 +41,6 @@
  *
  * @see android.widget.cts.TextViewTest
  */
-@TestTargetClass(LinkMovementMethod.class)
 public class LinkMovementMethodTest extends
         ActivityInstrumentationTestCase2<StubActivity> {
     private static final String CONTENT = "clickable\nunclickable\nclickable";
@@ -87,23 +81,10 @@
         mClickable1 = markClickable(CONTENT.lastIndexOf('\n'), CONTENT.length());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor LinkMovementMethod#LinkMovementMethod().",
-        method = "LinkMovementMethod",
-        args = {}
-    )
     public void testConstructor() {
         new LinkMovementMethod();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link LinkMovementMethod#getInstance()}. "
-                + "This is a method for creating singleton.",
-        method = "getInstance",
-        args = {}
-    )
     public void testGetInstance() {
         MovementMethod method0 = LinkMovementMethod.getInstance();
         assertTrue(method0 instanceof LinkMovementMethod);
@@ -113,16 +94,6 @@
         assertSame(method0, method1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link LinkMovementMethod#onTakeFocus(TextView, Spannable, int)}. "
-                + "The parameter textView is useless.",
-        method = "onTakeFocus",
-        args = {TextView.class, Spannable.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. @throws clause "
-            + "should be added into javadoc of LinkMovementMethod#onTakeFocus(TextView, Spannable, "
-            + "int) when the params text is null")
     public void testOnTakeFocus() {
         LinkMovementMethod method = new LinkMovementMethod();
         Spannable spannable = new SpannableString("test sequence");
@@ -165,16 +136,7 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link LinkMovementMethod#onKeyDown(TextView, Spannable, int, KeyEvent)}.",
-        method = "onKeyDown",
-        args = {TextView.class, Spannable.class, int.class, KeyEvent.class}
-    )
     @UiThreadTest
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. @throws clause "
-            + "should be added into javadoc of LinkMovementMethod#onKeyDown(TextView, Spannable, "
-            + "int, KeyEvent) when the params widget, buffer or event is null")
     public void testOnKeyDown() {
         // no selection
         assertSelection(mSpannable, -1);
@@ -262,15 +224,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link LinkMovementMethod#onKeyUp(TextView, Spannable, int, KeyEvent)}. "
-                + "It always returns false, and all parameters are never read.",
-        method = "onKeyUp",
-        args = {TextView.class, Spannable.class, int.class, KeyEvent.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. There is no "
-            + "document about the behaviour of this method.")
     public void testOnKeyUp() {
         LinkMovementMethod method = new LinkMovementMethod();
         // always returns false
@@ -281,16 +234,7 @@
                 new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_0)));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link LinkMovementMethod#onTouchEvent(TextView, Spannable, MotionEvent)} ",
-        method = "onTouchEvent",
-        args = {TextView.class, Spannable.class, MotionEvent.class}
-    )
     @UiThreadTest
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. @throws clause "
-            + "should be added into javadoc of LinkMovementMethod#onTouchEvent(TextView, "
-            + "Spannable, MotionEvent) when the params widget, buffer or event is null")
     public void testOnTouchEvent() {
         assertSelection(mSpannable, -1);
 
@@ -351,17 +295,7 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link LinkMovementMethod#up(TextView, Spannable)}. It is protected. "
-                + "Use extended class to test.",
-        method = "up",
-        args = {TextView.class, Spannable.class}
-    )
     @UiThreadTest
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. @throws clause "
-            + "should be added into javadoc of LinkMovementMethod#up(TextView, Spannable) "
-            + "when the params widget or buffer or is null")
     public void testUp() {
         final MyLinkMovementMethod method = new MyLinkMovementMethod();
         assertSelection(mSpannable, -1);
@@ -391,17 +325,7 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link LinkMovementMethod#down(TextView, Spannable)}. It is protected. "
-                + "Use extended class to test.",
-        method = "down",
-        args = {TextView.class, Spannable.class}
-    )
     @UiThreadTest
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. @throws clause "
-            + "should be added into javadoc of LinkMovementMethod#down(TextView, Spannable) "
-            + "when the params widget or buffer or is null")
     public void testDown() {
         final MyLinkMovementMethod method = new MyLinkMovementMethod();
         assertSelection(mSpannable, -1);
@@ -431,17 +355,7 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link LinkMovementMethod#left(TextView, Spannable)}. It is protected. "
-                + "Use extended class to test.",
-        method = "left",
-        args = {TextView.class, Spannable.class}
-    )
     @UiThreadTest
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. @throws clause "
-            + "should be added into javadoc of LinkMovementMethod#left(TextView, Spannable) "
-            + "when the params widget or buffer or is null")
     public void testLeft() {
         final MyLinkMovementMethod method = new MyLinkMovementMethod();
         assertSelection(mSpannable, -1);
@@ -471,17 +385,7 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link LinkMovementMethod#right(TextView, Spannable)}. It is protected. "
-                + "Use extended class to test.",
-        method = "right",
-        args = {TextView.class, Spannable.class}
-    )
     @UiThreadTest
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. @throws clause "
-            + "should be added into javadoc of LinkMovementMethod#right(TextView, Spannable) "
-            + "when the params widget or buffer or is null")
     public void testRight() {
         final MyLinkMovementMethod method = new MyLinkMovementMethod();
         assertSelection(mSpannable, -1);
@@ -511,36 +415,7 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link LinkMovementMethod#up(TextView, Spannable)}.",
-            method = "up",
-            args = {TextView.class, Spannable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link LinkMovementMethod#down(TextView, Spannable)}.",
-            method = "down",
-            args = {TextView.class, Spannable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link LinkMovementMethod#right(TextView, Spannable)}.",
-            method = "left",
-            args = {TextView.class, Spannable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link LinkMovementMethod#left(TextView, Spannable)}.",
-            method = "right",
-            args = {TextView.class, Spannable.class}
-        )
-    })
     @UiThreadTest
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. There is no "
-            + "document about the behaviour of these methods when the spannable text is not "
-            + "clickcable.")
     public void testMoveAroundUnclickable() {
         final MyLinkMovementMethod method = new MyLinkMovementMethod();
         mSpannable.removeSpan(mClickable0);
@@ -560,15 +435,6 @@
         assertSelection(mSpannable, -1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link LinkMovementMethod#initialize(TextView, Spannable)}.",
-        method = "initialize",
-        args = {TextView.class, Spannable.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. @throws clause "
-            + "should be added into javadoc of LinkMovementMethod#initialize(TextView, Spannable) "
-            + "when the params text is null")
     public void testInitialize() {
         LinkMovementMethod method = new LinkMovementMethod();
         Spannable spannable = new SpannableString("test sequence");
diff --git a/tests/tests/text/src/android/text/method/cts/MetaKeyKeyListenerTest.java b/tests/tests/text/src/android/text/method/cts/MetaKeyKeyListenerTest.java
index 6a67a5c..b4a18b2 100644
--- a/tests/tests/text/src/android/text/method/cts/MetaKeyKeyListenerTest.java
+++ b/tests/tests/text/src/android/text/method/cts/MetaKeyKeyListenerTest.java
@@ -16,11 +16,6 @@
 
 package android.text.method.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.test.AndroidTestCase;
 import android.text.Editable;
@@ -37,14 +32,7 @@
 /**
  * Test {@link MetaKeyKeyListener}.
  */
-@TestTargetClass(MetaKeyKeyListener.class)
 public class MetaKeyKeyListenerTest extends AndroidTestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onKeyDown",
-        args = {android.view.View.class, android.text.Editable.class, int.class,
-                android.view.KeyEvent.class}
-    )
     public void testPressKey() {
         final CharSequence str = "123456";
         final MetaKeyKeyListener numberKeyListener = new DateKeyListener();
@@ -70,12 +58,6 @@
         assertEquals('3', content.charAt(3));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onKeyUp",
-        args = {android.view.View.class, android.text.Editable.class, int.class,
-                android.view.KeyEvent.class}
-    )
     public void testReleaseKey() {
         final CharSequence str = "123456";
         final MetaKeyKeyListener numberKeyListener = new DateKeyListener();
@@ -101,11 +83,6 @@
         assertEquals(str.charAt(3), content.charAt(3));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "adjustMetaAfterKeypress",
-        args = {android.text.Spannable.class}
-    )
     public void testAdjustMetaAfterKeypress() {
         CharSequence str = "123456";
         Spannable content = Editable.Factory.getInstance().newEditable(str);
@@ -135,11 +112,6 @@
         assertEquals(Spanned.SPAN_POINT_POINT, content.getSpanFlags(Selection.SELECTION_END));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "adjustMetaAfterKeypress",
-        args = {long.class}
-    )
     public void testAdjustMetaAfterKeypress2() {
         long state = MetaKeyKeyListener.adjustMetaAfterKeypress(MetaKeyKeyListener.META_SHIFT_ON);
         assertEquals(MetaKeyKeyListener.META_SHIFT_ON, state);
@@ -154,11 +126,6 @@
         assertEquals(0, state);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "resetMetaState",
-        args = {android.text.Spannable.class}
-    )
     public void testResetMetaState() {
         CharSequence str = "123456";
         Spannable text = Editable.Factory.getInstance().newEditable(str);
@@ -185,18 +152,6 @@
         assertEquals(Spanned.SPAN_POINT_POINT, text.getSpanFlags(Selection.SELECTION_END));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMetaState",
-            args = {java.lang.CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMetaState",
-            args = {java.lang.CharSequence.class, int.class}
-        )
-    })
     public void testGetMetaState() {
         assertEquals(0, MetaKeyKeyListener.getMetaState("123456"));
         assertEquals(0, MetaKeyKeyListener.getMetaState("abc"));
@@ -223,18 +178,6 @@
                 MetaKeyKeyListener.getMetaState("@#$$#^$^", MetaKeyKeyListener.META_SYM_ON));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMetaState",
-            args = {long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMetaState",
-            args = {long.class, int.class}
-        )
-    })
     public void testGetMetaState2() {
         assertEquals(0, MetaKeyKeyListener.getMetaState(0));
         assertEquals(MetaKeyKeyListener.META_SHIFT_ON,
@@ -249,35 +192,18 @@
                 MetaKeyKeyListener.META_SYM_ON));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isMetaTracker",
-        args = {java.lang.CharSequence.class, java.lang.Object.class}
-    )
     public void testIsMetaTracker() {
         assertFalse(MetaKeyKeyListener.isMetaTracker("123456", new Object()));
         assertFalse(MetaKeyKeyListener.isMetaTracker("abc", new Object()));
         assertFalse(MetaKeyKeyListener.isMetaTracker("@#$$#^$^", new Object()));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isSelectingMetaTracker",
-        args = {java.lang.CharSequence.class, java.lang.Object.class}
-    )
     public void testIsSelectingMetaTracker() {
         assertFalse(MetaKeyKeyListener.isSelectingMetaTracker("123456", new Object()));
         assertFalse(MetaKeyKeyListener.isSelectingMetaTracker("abc", new Object()));
         assertFalse(MetaKeyKeyListener.isSelectingMetaTracker("@#$$#^$^", new Object()));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "resetLockedMeta",
-        args = {android.text.Spannable.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. @throws clause "
-            + "should be added into javadoc")
     public void testResetLockedMeta() {
         MockMetaKeyKeyListener mockMetaKeyKeyListener = new MockMetaKeyKeyListener();
 
@@ -301,11 +227,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "resetLockedMeta",
-        args = {long.class}
-    )
     public void testResetLockedMeta2() {
         long state = MetaKeyKeyListener.resetLockedMeta(MetaKeyKeyListener.META_CAP_LOCKED);
         assertEquals(0, state);
@@ -326,11 +247,6 @@
         assertEquals(MetaKeyKeyListener.META_SYM_ON, state);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clearMetaKeyState",
-        args = {android.view.View.class, android.text.Editable.class, int.class}
-    )
     public void testClearMetaKeyState() {
         final MetaKeyKeyListener numberKeyListener = new DateKeyListener();
         CharSequence str = "123456";
@@ -358,11 +274,6 @@
         assertEquals(Spanned.SPAN_POINT_POINT, text.getSpanFlags(Selection.SELECTION_END));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clearMetaKeyState",
-        args = {android.text.Editable.class, int.class}
-    )
     public void testClearMetaKeyState2() {
         CharSequence str = "123456";
         Editable text = Editable.Factory.getInstance().newEditable(str);
@@ -389,11 +300,6 @@
         assertEquals(Spanned.SPAN_POINT_POINT, text.getSpanFlags(Selection.SELECTION_END));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clearMetaKeyState",
-        args = {long.class, int.class}
-    )
     public void testClearMetaKeyState3() {
         final MetaKeyKeyListener metaKeyKeyListener = new MetaKeyKeyListener() {};
         long state = metaKeyKeyListener.clearMetaKeyState(MetaKeyKeyListener.META_CAP_LOCKED,
@@ -421,11 +327,6 @@
         assertEquals(MetaKeyKeyListener.META_SYM_ON, state);
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        method = "handleKeyDown",
-        args = {long.class, int.class, KeyEvent.class}
-    )
     public void testHandleKeyDown() {
         KeyEvent fullEvent = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_SHIFT_LEFT,
                 0, 0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0);
@@ -434,11 +335,6 @@
         assertEquals(0, state);
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        method = "handleKeyUp",
-        args = {long.class, int.class, KeyEvent.class}
-    )
     public void testHandleKeyUp() {
         KeyEvent fullEvent = new KeyEvent(0, 0, KeyEvent.ACTION_UP, KeyEvent.KEYCODE_SHIFT_LEFT,
                 0, 0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0);
diff --git a/tests/tests/text/src/android/text/method/cts/MultiTapKeyListenerTest.java b/tests/tests/text/src/android/text/method/cts/MultiTapKeyListenerTest.java
index d9bf6d9..3b4b259 100755
--- a/tests/tests/text/src/android/text/method/cts/MultiTapKeyListenerTest.java
+++ b/tests/tests/text/src/android/text/method/cts/MultiTapKeyListenerTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
 import android.app.Activity;
 import android.app.Instrumentation;
@@ -38,7 +34,6 @@
 
 import java.util.concurrent.TimeUnit;
 
-@TestTargetClass(MultiTapKeyListener.class)
 public class MultiTapKeyListenerTest extends
         ActivityInstrumentationTestCase2<KeyListenerStubActivity> {
     /**
@@ -61,11 +56,6 @@
         mTextView = (TextView) mActivity.findViewById(R.id.keylistener_textview);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "MultiTapKeyListener",
-        args = {android.text.method.TextKeyListener.Capitalize.class, boolean.class}
-    )
     public void testConstructor() {
         new MultiTapKeyListener(Capitalize.NONE, true);
 
@@ -74,12 +64,6 @@
         new MultiTapKeyListener(null, false);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "it is a non-operation method",
-        method = "onSpanAdded",
-        args = {Spannable.class, Object.class, int.class, int.class}
-    )
     public void testOnSpanAdded() {
         final MockMultiTapKeyListener multiTapKeyListener
                 = new MockMultiTapKeyListener(Capitalize.CHARACTERS, true);
@@ -97,13 +81,6 @@
         assertTrue(multiTapKeyListener.hadAddedSpan());
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        method = "onSpanChanged",
-        args = {Spannable.class, Object.class, int.class, int.class, int.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, " +
-            "should add @throws clause into javadoc")
     public void testOnSpanChanged() {
         final MultiTapKeyListener multiTapKeyListener
                 = MultiTapKeyListener.getInstance(true, Capitalize.CHARACTERS);
@@ -252,11 +229,6 @@
         mInstrumentation.waitForIdleSync();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getInstance",
-        args = {boolean.class, android.text.method.TextKeyListener.Capitalize.class}
-    )
     public void testGetInstance() {
         MultiTapKeyListener listener1 = MultiTapKeyListener.getInstance(false, Capitalize.NONE);
         MultiTapKeyListener listener2 = MultiTapKeyListener.getInstance(false, Capitalize.NONE);
@@ -272,12 +244,6 @@
         assertNotSame(listener4, listener1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "it is a non-operation method.",
-        method = "onSpanRemoved",
-        args = {android.text.Spannable.class, java.lang.Object.class, int.class, int.class}
-    )
     public void testOnSpanRemoved() {
         MultiTapKeyListener multiTapKeyListener =
                 new MultiTapKeyListener(Capitalize.CHARACTERS, true);
@@ -285,11 +251,6 @@
         multiTapKeyListener.onSpanRemoved(text, new Object(), 0, 0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getInputType",
-        args = {}
-    )
     public void testGetInputType() {
         MultiTapKeyListener listener = MultiTapKeyListener.getInstance(false, Capitalize.NONE);
         int expected = InputType.TYPE_CLASS_TEXT;
diff --git a/tests/tests/text/src/android/text/method/cts/NumberKeyListenerTest.java b/tests/tests/text/src/android/text/method/cts/NumberKeyListenerTest.java
index d9242c5..b8bf7ef 100644
--- a/tests/tests/text/src/android/text/method/cts/NumberKeyListenerTest.java
+++ b/tests/tests/text/src/android/text/method/cts/NumberKeyListenerTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
 import android.app.Activity;
 import android.app.Instrumentation;
@@ -38,7 +34,6 @@
 import android.widget.TextView.BufferType;
 
 
-@TestTargetClass(NumberKeyListener.class)
 public class NumberKeyListenerTest extends
         ActivityInstrumentationTestCase2<KeyListenerStubActivity> {
 
@@ -67,14 +62,6 @@
      * 4. Filter "12345 Android", return "12345".
      * 5. Filter Spanned("12345 Android"), return Spanned("12345") and copy spans.
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "paramters dest, dstart, dend are never read in the function",
-        method = "filter",
-        args = {CharSequence.class, int.class, int.class, Spanned.class, int.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, " +
-            "should add NPE description in javadoc.")
     public void testFilter() {
         mNumberKeyListener = new MockNumberKeyListener(MockNumberKeyListener.DIGITS);
         String source = "Android test";
@@ -117,12 +104,6 @@
      * If one of the chars in the getAcceptedChars() can be generated by the keyCode of this
      * key event, return the char; otherwise return '\0'.
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "lookup",
-        args = {android.view.KeyEvent.class, android.text.Spannable.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete.")
     public void testLookup() {
         mNumberKeyListener = new MockNumberKeyListener(MockNumberKeyListener.DIGITS);
         KeyEvent event1 = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_0);
@@ -142,12 +123,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "ok",
-        args = {char[].class, char.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete.")
     public void testOk() {
         mNumberKeyListener = new MockNumberKeyListener(MockNumberKeyListener.DIGITS);
 
@@ -167,11 +142,6 @@
      * 2. Press an unaccepted key if it exists, it will not be added.
      * 3. remove NumberKeyListener and press '0' key, '0' will not be added.
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onKeyDown",
-        args = {View.class, Editable.class, int.class, KeyEvent.class}
-    )
     public void testPressKey() {
         final CharSequence text = "123456";
         final MockNumberKeyListener numberKeyListener =
diff --git a/tests/tests/text/src/android/text/method/cts/PasswordTransformationMethodTest.java b/tests/tests/text/src/android/text/method/cts/PasswordTransformationMethodTest.java
index 6dde08d..6d647b2 100755
--- a/tests/tests/text/src/android/text/method/cts/PasswordTransformationMethodTest.java
+++ b/tests/tests/text/src/android/text/method/cts/PasswordTransformationMethodTest.java
@@ -16,12 +16,8 @@
 
 package android.text.method.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
+import android.cts.util.PollingCheck;
 import android.graphics.Rect;
 import android.provider.Settings.SettingNotFoundException;
 import android.provider.Settings.System;
@@ -30,7 +26,6 @@
 import android.text.method.PasswordTransformationMethod;
 import android.view.KeyCharacterMap;
 import android.view.View;
-import android.view.animation.cts.DelayedCheck;
 import android.widget.Button;
 import android.widget.EditText;
 import android.widget.LinearLayout;
@@ -39,7 +34,6 @@
 /**
  * Test {@link PasswordTransformationMethod}.
  */
-@TestTargetClass(PasswordTransformationMethod.class)
 public class PasswordTransformationMethodTest extends
         ActivityInstrumentationTestCase2<StubActivity> {
     private static final int EDIT_TXT_ID = 1;
@@ -107,37 +101,10 @@
         super.tearDown();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "PasswordTransformationMethod",
-        args = {}
-    )
     public void testConstructor() {
         new PasswordTransformationMethod();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "beforeTextChanged",
-            args = {CharSequence.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTextChanged",
-            args = {CharSequence.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "afterTextChanged",
-            args = {Editable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTransformation",
-            args = {CharSequence.class, View.class}
-        )
-    })
     public void testTextChangedCallBacks() throws Throwable {
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -175,7 +142,7 @@
         assertTrue(mMethod.hasCalledAfterTextChanged());
 
         // it will get transformed after a while
-        new DelayedCheck() {
+        new PollingCheck() {
             @Override
             protected boolean check() {
                 // "******"
@@ -185,13 +152,6 @@
         }.run();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getTransformation",
-        args = {CharSequence.class, View.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should check whether the source passed in is null,"
-            + "if null source is passed in, exception will be thrown when toString() is called")
     public void testGetTransformation() {
         PasswordTransformationMethod method = new PasswordTransformationMethod();
 
@@ -208,12 +168,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link PasswordTransformationMethod#getInstance()}.",
-        method = "getInstance",
-        args = {}
-    )
     public void testGetInstance() {
         PasswordTransformationMethod method0 = PasswordTransformationMethod.getInstance();
         assertNotNull(method0);
@@ -223,11 +177,6 @@
         assertSame(method0, method1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onFocusChanged",
-        args = {View.class, CharSequence.class, boolean.class, int.class, Rect.class}
-    )
     public void testOnFocusChanged() {
         // lose focus
         mMethod.reset();
diff --git a/tests/tests/text/src/android/text/method/cts/QwertyKeyListenerTest.java b/tests/tests/text/src/android/text/method/cts/QwertyKeyListenerTest.java
index c86dba3..c97edd9 100644
--- a/tests/tests/text/src/android/text/method/cts/QwertyKeyListenerTest.java
+++ b/tests/tests/text/src/android/text/method/cts/QwertyKeyListenerTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
 import android.app.Activity;
 import android.app.Instrumentation;
@@ -37,7 +33,6 @@
 import android.widget.TextView;
 import android.widget.TextView.BufferType;
 
-@TestTargetClass(QwertyKeyListener.class)
 public class QwertyKeyListenerTest extends
         ActivityInstrumentationTestCase2<KeyListenerStubActivity> {
     private Activity mActivity;
@@ -56,11 +51,6 @@
         mTextView = (TextView) mActivity.findViewById(R.id.keylistener_textview);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "QwertyKeyListener",
-        args = {TextKeyListener.Capitalize.class, boolean.class}
-    )
     public void testConstructor() {
         new QwertyKeyListener(Capitalize.NONE, false);
 
@@ -186,11 +176,6 @@
         mInstrumentation.waitForIdleSync();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getInstance",
-        args = {boolean.class, TextKeyListener.Capitalize.class}
-    )
     public void testGetInstance() {
         QwertyKeyListener listener1 = QwertyKeyListener.getInstance(true, Capitalize.WORDS);
         QwertyKeyListener listener2 = QwertyKeyListener.getInstance(true, Capitalize.WORDS);
@@ -206,13 +191,6 @@
         assertNotSame(listener4, listener3);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "markAsReplaced",
-        args = {Spannable.class, int.class, int.class, String.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, " +
-            "should add NPE description in javadoc.")
     public void testMarkAsReplaced() {
         SpannableStringBuilder content = new SpannableStringBuilder("123456");
 
@@ -246,11 +224,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getInputType",
-        args = {}
-    )
     public void testGetInputType() {
         QwertyKeyListener listener = QwertyKeyListener.getInstance(false, Capitalize.NONE);
         int expected = InputType.TYPE_CLASS_TEXT;
diff --git a/tests/tests/text/src/android/text/method/cts/ReplacementTransformationMethodTest.java b/tests/tests/text/src/android/text/method/cts/ReplacementTransformationMethodTest.java
index 07e0164..3c05f30 100644
--- a/tests/tests/text/src/android/text/method/cts/ReplacementTransformationMethodTest.java
+++ b/tests/tests/text/src/android/text/method/cts/ReplacementTransformationMethodTest.java
@@ -16,10 +16,6 @@
 
 package android.text.method.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
 import android.graphics.Rect;
 import android.test.ActivityInstrumentationTestCase2;
@@ -30,7 +26,6 @@
 /**
  * Test {@link ReplacementTransformationMethod}.
  */
-@TestTargetClass(ReplacementTransformationMethod.class)
 public class ReplacementTransformationMethodTest extends
         ActivityInstrumentationTestCase2<StubActivity> {
     private final char[] ORIGINAL = new char[] { '0', '1' };
@@ -51,11 +46,6 @@
         mEditText = new EditText(getActivity());
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL_COMPLETE,
-        method = "getTransformation",
-        args = {java.lang.CharSequence.class, android.view.View.class}
-    )
     public void testGetTransformation() {
         MyReplacementTransformationMethod method =
             new MyReplacementTransformationMethod(ORIGINAL, REPLACEMENT);
@@ -67,15 +57,6 @@
         // TODO cannot get transformed text from the view
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getTransformation",
-        args = {CharSequence.class, View.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. @throws clause "
-            + "should be added into javadoc of "
-            + "ReplacementTransformationMethod#getTransformation(CharSequence, android.view.View)"
-            + "when the params source is null")
     public void testGetTransformationWithAbnormalCharSequence() {
         ReplacementTransformationMethod method = new MyReplacementTransformationMethod(ORIGINAL,
                 REPLACEMENT);
@@ -90,11 +71,6 @@
         assertEquals("", method.getTransformation("", null).toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL_COMPLETE,
-        method = "getTransformation",
-        args = {CharSequence.class, View.class}
-    )
     public void testGetTransformationWithAbmornalReplacement() {
         // replacement has same chars
         ReplacementTransformationMethod method =
@@ -114,15 +90,6 @@
         // TODO cannot get transformed text from the view
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL_COMPLETE,
-        method = "getTransformation",
-        args = {CharSequence.class, View.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. @throws clause "
-            + "should be added into javadoc of "
-            + "ReplacementTransformationMethod#getTransformation(CharSequence, android.view.View)"
-            + "when threre is more chars in the original than replacement.")
     public void testGetTransformationWithAbmornalOriginal() {
         // original has same chars
         ReplacementTransformationMethod method =
@@ -143,12 +110,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        notes = "This is a blank method",
-        method = "onFocusChanged",
-        args = {View.class, CharSequence.class, boolean.class, int.class, Rect.class}
-    )
     public void testOnFocusChanged() {
         ReplacementTransformationMethod method = new MyReplacementTransformationMethod(ORIGINAL,
                 REPLACEMENT);
diff --git a/tests/tests/text/src/android/text/method/cts/ScrollingMovementMethodTest.java b/tests/tests/text/src/android/text/method/cts/ScrollingMovementMethodTest.java
index 78ebfa4..b119c9d 100755
--- a/tests/tests/text/src/android/text/method/cts/ScrollingMovementMethodTest.java
+++ b/tests/tests/text/src/android/text/method/cts/ScrollingMovementMethodTest.java
@@ -17,11 +17,6 @@
 package android.text.method.cts;
 
 import dalvik.annotation.KnownFailure;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.os.SystemClock;
 import android.test.ActivityInstrumentationTestCase2;
@@ -48,7 +43,6 @@
  *
  * @see android.widget.cts.TextViewTest
  */
-@TestTargetClass(ScrollingMovementMethod.class)
 public class ScrollingMovementMethodTest extends ActivityInstrumentationTestCase2<StubActivity> {
     private static final int LITTLE_SPACE = 20;
 
@@ -73,20 +67,10 @@
         mScaledTouchSlop = ViewConfiguration.get(getActivity()).getScaledTouchSlop();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "ScrollingMovementMethod",
-        args = {}
-    )
     public void testConstructor() {
         new ScrollingMovementMethod();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getInstance",
-        args = {}
-    )
     public void testGetInstance() {
         MovementMethod method0 = ScrollingMovementMethod.getInstance();
         assertTrue(method0 instanceof ScrollingMovementMethod);
@@ -95,14 +79,6 @@
         assertSame(method0, method1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test the method wtih horizontal motion event.",
-        method = "onTouchEvent",
-        args = {TextView.class, Spannable.class, MotionEvent.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. There is no "
-            + "document about the behaviour of this method.")
     public void testOnTouchEventHorizontalMotion() throws Throwable {
         /*
          * All these assertions depends on whether the TextView has a layout.The text view will not
@@ -209,14 +185,6 @@
         }));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test the method wtih vertical motion event.",
-        method = "onTouchEvent",
-        args = {TextView.class, Spannable.class, MotionEvent.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. There is no "
-            + "document about the behaviour of this method.")
     public void testOnTouchEventVerticalMotion() throws Throwable {
         /*
          * All these assertions depends on whether the TextView has a layout.The text view will not
@@ -320,16 +288,6 @@
         }));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test the method with null parameters.",
-        method = "onTouchEvent",
-        args = {TextView.class, Spannable.class, MotionEvent.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. @throws clause "
-            + "should be added into javadoc of "
-            + "ScrollingMovementMethod#onTouchEvent(TextView, Spannable, MotionEvent) "
-            + "when the param widget, buffer or text is null")
     public void testOnTouchEventExceptional() throws Throwable {
         /*
          * All these assertions depends on whether the TextView has a layout.The text view will not
@@ -404,23 +362,10 @@
         });
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "It always returns false.",
-        method = "canSelectArbitrarily",
-        args = {}
-    )
     public void testCanSelectArbitrarily() {
         assertFalse(new ScrollingMovementMethod().canSelectArbitrarily());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ScrollingMovementMethod#onKeyDown(TextView, Spannable, int, "
-                + "KeyEvent)}. The params event and buffer are never read.",
-        method = "onKeyDown",
-        args = {TextView.class, Spannable.class, int.class, KeyEvent.class}
-    )
     public void testOnKeyDownVerticalMovement() throws Throwable {
         /*
          * All these assertions depends on whether the TextView has a layout.The text view will not
@@ -456,12 +401,6 @@
         assertVisibleLineInTextView(0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "The params event and buffer are never read.",
-        method = "onKeyDown",
-        args = {TextView.class, Spannable.class, int.class, KeyEvent.class}
-    )
     public void testOnKeyDownHorizontalMovement() throws Throwable {
         /*
          * All these assertions depends on whether the TextView has a layout.The text view will not
@@ -515,16 +454,6 @@
         assertVisibleLineInTextView(0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "The params event and buffer are never read.",
-        method = "onKeyDown",
-        args = {TextView.class, Spannable.class, int.class, KeyEvent.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. @throws clause "
-            + "should be added into javadoc of "
-            + "ScrollingMovementMethod#onKeyDown(TextView, Spannable, int, KeyEvent) "
-            + "when the param widget, buffer or text is null")
     public void testOnKeyDownExceptions() throws Throwable {
         /*
          * All these assertions depends on whether the TextView has a layout.The text view will not
@@ -567,25 +496,6 @@
         });
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "The parameter buffer is never read.",
-            method = "down",
-            args = {android.widget.TextView.class, android.text.Spannable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "The parameter buffer is never read.",
-            method = "up",
-            args = {android.widget.TextView.class, android.text.Spannable.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. @throws clause "
-            + "should be added into javadoc of "
-            + "ScrollingMovementMethod#down(TextView, Spannable) and "
-            + "ScrollingMovementMethod#up(TextView, Spannable)"
-            + "when the param widget or buffer is null")
     public void testVerticalMovement() throws Throwable {
         /*
          * All these assertions depends on whether the TextView has a layout.The text view will not
@@ -676,41 +586,6 @@
         });
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyDown",
-            args = {TextView.class, Spannable.class, int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTouchEvent",
-            args = {TextView.class, Spannable.class, MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "up",
-            args = {TextView.class, Spannable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "down",
-            args = {TextView.class, Spannable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "left",
-            args = {TextView.class, Spannable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "right",
-            args = {TextView.class, Spannable.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. @throws clause "
-            + "should be added into javadoc of all these methods when the widget does not get "
-            + "layout")
     public void testMovementWithNullLayout() {
         assertNull(mTextView.getLayout());
         try {
@@ -756,24 +631,10 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "This is a blank method.",
-        method = "initialize",
-        args = {TextView.class, Spannable.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete.")
     public void testInitialize() {
         new ScrollingMovementMethod().initialize(null, null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "This method always returns false.",
-        method = "onTrackballEvent",
-        args = {TextView.class, Spannable.class, MotionEvent.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete.")
     public void testOnTrackballEvent() {
         long now = SystemClock.uptimeMillis();
         MotionEvent event = MotionEvent.obtain(now, now, 0, 2, -2, 0);
@@ -785,13 +646,6 @@
         assertFalse(mockMethod.onTrackballEvent(mTextView, null, event));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "It always returns false.",
-        method = "onKeyUp",
-        args = {TextView.class, Spannable.class, int.class, KeyEvent.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete.")
     public void testOnKeyUp() {
         ScrollingMovementMethod method = new ScrollingMovementMethod();
         SpannableString spannable = new SpannableString("Test Content");
@@ -806,16 +660,6 @@
         assertFalse(method.onKeyUp(view, spannable, KeyEvent.KEYCODE_0, null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "The parameter text is never read.",
-        method = "onTakeFocus",
-        args = {TextView.class, Spannable.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. @throws clause "
-            + "should be added into javadoc of "
-            + "ScrollingMovementMethod#onTakeFocus(TextView, Spannable, int) "
-            + "when the param text is null")
     public void testOnTakeFocus() throws Throwable {
         /*
          * All these assertions depends on whether the TextView has a layout.The text view will not
@@ -880,20 +724,6 @@
         });
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "The parameter buffer is never read.",
-            method = "left",
-            args = {TextView.class, Spannable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "The parameter buffer is never read.",
-            method = "right",
-            args = {TextView.class, Spannable.class}
-        )
-    })
     public void testHorizontalMovement() throws Throwable {
         /*
          * All these assertions depends on whether the TextView has a layout.The text view will not
@@ -949,13 +779,6 @@
         assertEquals(previousScrollX, mTextView.getScrollX());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onKeyOther",
-        args = {TextView.class, Spannable.class, KeyEvent.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. There is no "
-            + "document about the behaviour of this method.")
     public void testOnKeyOther() throws Throwable {
         runActionOnUiThread(new Runnable() {
             public void run() {
diff --git a/tests/tests/text/src/android/text/method/cts/SingleLineTransformationMethodTest.java b/tests/tests/text/src/android/text/method/cts/SingleLineTransformationMethodTest.java
index 5cb775b..8d88a8a 100644
--- a/tests/tests/text/src/android/text/method/cts/SingleLineTransformationMethodTest.java
+++ b/tests/tests/text/src/android/text/method/cts/SingleLineTransformationMethodTest.java
@@ -16,10 +16,6 @@
 
 package android.text.method.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.test.ActivityInstrumentationTestCase2;
 import android.text.method.SingleLineTransformationMethod;
@@ -29,27 +25,16 @@
 /**
  * Test {@link SingleLineTransformationMethod}.
  */
-@TestTargetClass(SingleLineTransformationMethod.class)
 public class SingleLineTransformationMethodTest
         extends ActivityInstrumentationTestCase2<StubActivity> {
     public SingleLineTransformationMethodTest() {
         super("com.android.cts.stub", StubActivity.class);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "SingleLineTransformationMethod",
-        args = {}
-    )
     public void testConstructor() {
         new SingleLineTransformationMethod();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getInstance",
-        args = {}
-    )
     public void testGetInstance() {
         SingleLineTransformationMethod method0 = SingleLineTransformationMethod.getInstance();
         assertNotNull(method0);
@@ -58,29 +43,12 @@
         assertSame(method0, method1);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getReplacement",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getOriginal",
-            args = {}
-        )
-    })
     public void testGetReplacement() {
         MySingleLineTranformationMethod method = new MySingleLineTranformationMethod();
         TextMethodUtils.assertEquals(new char[] { ' ', '\uFEFF' }, method.getReplacement());
         TextMethodUtils.assertEquals(new char[] { '\n', '\r' }, method.getOriginal());
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        method = "getTransformation",
-        args = {CharSequence.class, View.class}
-    )
     public void testGetTransformation() {
         SingleLineTransformationMethod method = SingleLineTransformationMethod.getInstance();
         CharSequence result = method.getTransformation("hello\nworld\r", null);
diff --git a/tests/tests/text/src/android/text/method/cts/TextKeyListenerTest.java b/tests/tests/text/src/android/text/method/cts/TextKeyListenerTest.java
index 484df03..a95267a 100644
--- a/tests/tests/text/src/android/text/method/cts/TextKeyListenerTest.java
+++ b/tests/tests/text/src/android/text/method/cts/TextKeyListenerTest.java
@@ -18,11 +18,6 @@
 
 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 android.app.Instrumentation;
 import android.os.SystemClock;
@@ -41,7 +36,6 @@
 import android.widget.TextView;
 import android.widget.TextView.BufferType;
 
-@TestTargetClass(TextKeyListener.class)
 public class TextKeyListenerTest extends
         ActivityInstrumentationTestCase2<KeyListenerStubActivity> {
     /**
@@ -64,24 +58,12 @@
         mTextView = (TextView) mActivity.findViewById(R.id.keylistener_textview);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "TextKeyListener",
-        args = {TextKeyListener.Capitalize.class, boolean.class}
-    )
     public void testConstructor() {
         new TextKeyListener(Capitalize.NONE, true);
 
         new TextKeyListener(null, true);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "shouldCap",
-        args = {TextKeyListener.Capitalize.class, CharSequence.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, " +
-            "should add NPE description in javadoc.")
     public void testShouldCap() {
         String str = "hello world! man";
 
@@ -114,12 +96,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "onSpanAdded is a non-operation function.",
-        method = "onSpanAdded",
-        args = {Spannable.class, Object.class, int.class, int.class}
-    )
     public void testOnSpanAdded() {
         final MockTextKeyListener textKeyListener
                 = new MockTextKeyListener(Capitalize.CHARACTERS, true);
@@ -139,11 +115,6 @@
         textKeyListener.release();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getInstance",
-        args = {boolean.class, TextKeyListener.Capitalize.class}
-    )
     public void testGetInstance1() {
         TextKeyListener listener1 = TextKeyListener.getInstance(true, Capitalize.WORDS);
         TextKeyListener listener2 = TextKeyListener.getInstance(true, Capitalize.WORDS);
@@ -164,11 +135,6 @@
         listener4.release();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getInstance",
-        args = {}
-    )
     public void testGetInstance2() {
         TextKeyListener listener1 = TextKeyListener.getInstance();
         TextKeyListener listener2 = TextKeyListener.getInstance();
@@ -181,13 +147,6 @@
         listener2.release();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onSpanChanged",
-        args = {Spannable.class, Object.class, int.class, int.class, int.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, " +
-            "should add @throws clause into javadoc")
     public void testOnSpanChanged() {
         TextKeyListener textKeyListener = TextKeyListener.getInstance();
         final Spannable text = new SpannableStringBuilder("123456");
@@ -202,11 +161,6 @@
         textKeyListener.release();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clear",
-        args = {Editable.class}
-    )
     @UiThreadTest
     public void testClear() {
         CharSequence text = "123456";
@@ -219,12 +173,6 @@
         assertEquals("", content.toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "onSpanRemoved is a non-operation function.",
-        method = "onSpanRemoved",
-        args = {Spannable.class, Object.class, int.class, int.class}
-    )
     public void testOnSpanRemoved() {
         TextKeyListener textKeyListener = new TextKeyListener(Capitalize.CHARACTERS, true);
         final Spannable text = new SpannableStringBuilder("123456");
@@ -249,23 +197,6 @@
      * 1. press KEYCODE_4 once. if it's ALPHA key board, text will be "4", if it's
      *    NUMERIC key board, text will be "g", else text will be "".
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyDown",
-            args = {View.class, Editable.class, int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyUp",
-            args = {View.class, Editable.class, int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "release",
-            args = {}
-        )
-    })
     public void testPressKey() {
         final TextKeyListener textKeyListener
                 = TextKeyListener.getInstance(false, Capitalize.NONE);
@@ -297,13 +228,6 @@
         textKeyListener.release();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onKeyOther",
-        args = {View.class, Editable.class, KeyEvent.class}
-    )
-    @ToBeFixed(bug = "1731439", explanation = "onKeyOther doesn't insert the" +
-            " event's text into content.")
     public void testOnKeyOther() {
         final String text = "abcd";
         final TextKeyListener textKeyListener
@@ -331,11 +255,6 @@
         textKeyListener.release();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getInputType",
-        args = {}
-    )
     public void testGetInputType() {
         TextKeyListener listener = TextKeyListener.getInstance(false, Capitalize.NONE);
         int expected = InputType.TYPE_CLASS_TEXT;
diff --git a/tests/tests/text/src/android/text/method/cts/TimeKeyListenerTest.java b/tests/tests/text/src/android/text/method/cts/TimeKeyListenerTest.java
index 8062adf..cf80f8d 100644
--- a/tests/tests/text/src/android/text/method/cts/TimeKeyListenerTest.java
+++ b/tests/tests/text/src/android/text/method/cts/TimeKeyListenerTest.java
@@ -18,9 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.app.Activity;
 import android.app.Instrumentation;
@@ -31,7 +28,6 @@
 import android.view.KeyEvent;
 import android.widget.TextView;
 
-@TestTargetClass(TimeKeyListener.class)
 public class TimeKeyListenerTest extends
         ActivityInstrumentationTestCase2<KeyListenerStubActivity> {
     private Activity mActivity;
@@ -51,20 +47,10 @@
         mTextView = (TextView) mActivity.findViewById(R.id.keylistener_textview);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "TimeKeyListener",
-        args = {}
-    )
     public void testConstructor() {
         new TimeKeyListener();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getInstance",
-        args = {}
-    )
     public void testGetInstance() {
         TimeKeyListener listener1 = TimeKeyListener.getInstance();
         TimeKeyListener listener2 = TimeKeyListener.getInstance();
@@ -74,22 +60,12 @@
         assertSame(listener1, listener2);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getAcceptedChars",
-        args = {}
-    )
     public void testGetAcceptedChars() {
         MyTimeKeyListener timeKeyListener = new MyTimeKeyListener();
         TextMethodUtils.assertEquals(TimeKeyListener.CHARACTERS,
                 timeKeyListener.getAcceptedChars());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getInputType",
-        args = {}
-    )
     public void testGetInputType() {
         TimeKeyListener listener = TimeKeyListener.getInstance();
         int expected = InputType.TYPE_CLASS_DATETIME
diff --git a/tests/tests/text/src/android/text/method/cts/TouchTest.java b/tests/tests/text/src/android/text/method/cts/TouchTest.java
index 7217db7..3071fd6 100755
--- a/tests/tests/text/src/android/text/method/cts/TouchTest.java
+++ b/tests/tests/text/src/android/text/method/cts/TouchTest.java
@@ -16,11 +16,6 @@
 
 package android.text.method.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.app.Activity;
 import android.os.SystemClock;
@@ -34,7 +29,6 @@
 import android.view.MotionEvent;
 import android.widget.TextView;
 
-@TestTargetClass(Touch.class)
 public class TouchTest extends ActivityInstrumentationTestCase2<StubActivity> {
     private Activity mActivity;
     private static final String LONG_TEXT = "Scrolls the specified widget to the specified " +
@@ -54,11 +48,6 @@
         mActivity = getActivity();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "scrollTo",
-        args = {TextView.class, Layout.class, int.class, int.class}
-    )
     public void testScrollTo() throws Throwable {
         final TextView tv = new TextView(mActivity);
         runTestOnUiThread(new Runnable() {
@@ -111,25 +100,6 @@
         assertEquals(5, tv.getScrollY());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInitialScrollX",
-            args = {TextView.class, Spannable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInitialScrollY",
-            args = {TextView.class, Spannable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onTouchEvent",
-            args = {TextView.class, Spannable.class, MotionEvent.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, " +
-            "should add @throws clause into javadoc.")
     public void testOnTouchEvent() throws Throwable {
         final TextView tv = new TextView(mActivity);
 
diff --git a/tests/tests/text/src/android/text/style/cts/AbsoluteSizeSpanTest.java b/tests/tests/text/src/android/text/style/cts/AbsoluteSizeSpanTest.java
index 9794cd3..bdd3d17 100644
--- a/tests/tests/text/src/android/text/style/cts/AbsoluteSizeSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/AbsoluteSizeSpanTest.java
@@ -16,11 +16,6 @@
 
 package android.text.style.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.os.Parcel;
 import android.text.TextPaint;
@@ -28,23 +23,7 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(AbsoluteSizeSpan.class)
 public class AbsoluteSizeSpanTest extends TestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of AbsoluteSizeSpan.",
-            method = "AbsoluteSizeSpan",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of AbsoluteSizeSpan.",
-            method = "AbsoluteSizeSpan",
-            args = {android.os.Parcel.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testConstructor() {
         new AbsoluteSizeSpan(0);
         new AbsoluteSizeSpan(-5);
@@ -60,13 +39,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link AbsoluteSizeSpan#getSize()}",
-        method = "getSize",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testGetSize() {
         AbsoluteSizeSpan absoluteSizeSpan = new AbsoluteSizeSpan(5);
         assertEquals(5, absoluteSizeSpan.getSize());
@@ -75,14 +47,6 @@
         assertEquals(-5, absoluteSizeSpan.getSize());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link AbsoluteSizeSpan#updateMeasureState(TextPaint)}",
-        method = "updateMeasureState",
-        args = {android.text.TextPaint.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of " +
-            "AbsoluteSizeSpan#updateMeasureState(TextPaint) when the input TextPaint is null")
     public void testUpdateMeasureState() {
         AbsoluteSizeSpan absoluteSizeSpan = new AbsoluteSizeSpan(1);
 
@@ -102,14 +66,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link AbsoluteSizeSpan#updateDrawState(TextPaint)}",
-        method = "updateDrawState",
-        args = {android.text.TextPaint.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of " +
-            "AbsoluteSizeSpan#updateDrawState(TextPaint) when the input TextPaint is null")
     public void testUpdateDrawState() {
         // new the AbsoluteSizeSpan instance
         AbsoluteSizeSpan absoluteSizeSpan = new AbsoluteSizeSpan(2);
@@ -131,37 +87,16 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test describeContents().",
-        method = "describeContents",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testDescribeContents() {
         AbsoluteSizeSpan absoluteSizeSpan = new AbsoluteSizeSpan(2);
         absoluteSizeSpan.describeContents();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getSpanTypeId().",
-        method = "getSpanTypeId",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testGetSpanTypeId() {
         AbsoluteSizeSpan absoluteSizeSpan = new AbsoluteSizeSpan(2);
         absoluteSizeSpan.getSpanTypeId();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test writeToParcel(Parcel dest, int flags).",
-        method = "writeToParcel",
-        args = {Parcel.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testWriteToParcel() {
         Parcel p = Parcel.obtain();
         try {
diff --git a/tests/tests/text/src/android/text/style/cts/AlignmentSpan_StandardTest.java b/tests/tests/text/src/android/text/style/cts/AlignmentSpan_StandardTest.java
index 7f4aab1..26ed21e 100644
--- a/tests/tests/text/src/android/text/style/cts/AlignmentSpan_StandardTest.java
+++ b/tests/tests/text/src/android/text/style/cts/AlignmentSpan_StandardTest.java
@@ -16,11 +16,6 @@
 
 package android.text.style.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.os.Parcel;
 import android.text.Layout.Alignment;
@@ -31,23 +26,7 @@
 /**
  * Test {@link Standard}.
  */
-@TestTargetClass(Standard.class)
 public class AlignmentSpan_StandardTest extends TestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of Standard.",
-            method = "AlignmentSpan.Standard",
-            args = {android.text.Layout.Alignment.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of Standard.",
-            method = "AlignmentSpan.Standard",
-            args = {android.os.Parcel.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testConstructor() {
         new Standard(Alignment.ALIGN_CENTER);
 
@@ -62,13 +41,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getAlignment().",
-        method = "getAlignment",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testGetAlignment() {
         Standard standard = new Standard(Alignment.ALIGN_NORMAL);
         assertEquals(Alignment.ALIGN_NORMAL, standard.getAlignment());
@@ -80,37 +52,16 @@
         assertEquals(Alignment.ALIGN_CENTER, standard.getAlignment());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test describeContents().",
-        method = "describeContents",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testDescribeContents() {
         Standard standard = new Standard(Alignment.ALIGN_NORMAL);
         standard.describeContents();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getSpanTypeId().",
-        method = "getSpanTypeId",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testGetSpanTypeId() {
         Standard standard = new Standard(Alignment.ALIGN_NORMAL);
         standard.getSpanTypeId();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test writeToParcel(Parcel dest, int flags).",
-        method = "writeToParcel",
-        args = {Parcel.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testWriteToParcel() {
         Parcel p = Parcel.obtain();
         try {
diff --git a/tests/tests/text/src/android/text/style/cts/BackgroundColorSpanTest.java b/tests/tests/text/src/android/text/style/cts/BackgroundColorSpanTest.java
index 9624d3a..690da5d 100644
--- a/tests/tests/text/src/android/text/style/cts/BackgroundColorSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/BackgroundColorSpanTest.java
@@ -16,11 +16,6 @@
 
 package android.text.style.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.graphics.Color;
 import android.os.Parcel;
@@ -29,23 +24,7 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(BackgroundColorSpan.class)
 public class BackgroundColorSpanTest extends TestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of BackgroundColorSpan.",
-            method = "BackgroundColorSpan",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of BackgroundColorSpan.",
-            method = "BackgroundColorSpan",
-            args = {android.os.Parcel.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testConstructor() {
         BackgroundColorSpan b = new BackgroundColorSpan(Color.GREEN);
 
@@ -59,14 +38,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link BackgroundColorSpan#updateDrawState(TextPaint)}",
-        method = "updateDrawState",
-        args = {android.text.TextPaint.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of " +
-            "BackgroundColorSpan#updateDrawState(TextPaint) when the input TextPaint is null")
     public void testUpdateDrawState() {
         BackgroundColorSpan backgroundColorSpan = new BackgroundColorSpan(Color.BLACK);
 
@@ -86,13 +57,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link BackgroundColorSpan#getBackgroundColor()}",
-        method = "getBackgroundColor",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testGetBackgroundColor() {
         BackgroundColorSpan backgroundColorSpan = new BackgroundColorSpan(Color.CYAN);
         assertEquals(Color.CYAN, backgroundColorSpan.getBackgroundColor());
@@ -101,37 +65,16 @@
         assertEquals(Color.GRAY, backgroundColorSpan.getBackgroundColor());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test describeContents().",
-        method = "describeContents",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testDescribeContents() {
         BackgroundColorSpan backgroundColorSpan = new BackgroundColorSpan(Color.RED);
         backgroundColorSpan.describeContents();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getSpanTypeId().",
-        method = "getSpanTypeId",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testGetSpanTypeId() {
         BackgroundColorSpan backgroundColorSpan = new BackgroundColorSpan(Color.RED);
         backgroundColorSpan.getSpanTypeId();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test writeToParcel(Parcel dest, int flags).",
-        method = "writeToParcel",
-        args = {Parcel.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testWriteToParcel() {
         Parcel p = Parcel.obtain();
         try {
diff --git a/tests/tests/text/src/android/text/style/cts/BulletSpanTest.java b/tests/tests/text/src/android/text/style/cts/BulletSpanTest.java
index 7a32cdd..18add4e 100644
--- a/tests/tests/text/src/android/text/style/cts/BulletSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/BulletSpanTest.java
@@ -16,11 +16,6 @@
 
 package android.text.style.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.graphics.Canvas;
 import android.graphics.Color;
@@ -32,35 +27,7 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(BulletSpan.class)
 public class BulletSpanTest extends TestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of BulletSpan.",
-            method = "BulletSpan",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of BulletSpan.",
-            method = "BulletSpan",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of BulletSpan.",
-            method = "BulletSpan",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of BulletSpan.",
-            method = "BulletSpan",
-            args = {android.os.Parcel.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testConstructor() {
         new BulletSpan();
         new BulletSpan(BulletSpan.STANDARD_GAP_WIDTH);
@@ -76,13 +43,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getLeadingMargin(boolean first). And the parameter first is never read",
-        method = "getLeadingMargin",
-        args = {boolean.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testGetLeadingMargin() {
         BulletSpan bulletSpan = new BulletSpan(1);
         int leadingMargin1 = bulletSpan.getLeadingMargin(true);
@@ -93,19 +53,6 @@
         assertTrue(leadingMargin2 > leadingMargin1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.TODO,
-        notes = "Test drawLeadingMargin(Canvas c, Paint p, int x, int dir, int top," +
-                " int baseline, int bottom, CharSequence text, int start, int end," +
-                " boolean first, Layout l). And the following parameters are never" +
-                " used in this method: baseline, end, first, l.",
-        method = "drawLeadingMargin",
-        args = {android.graphics.Canvas.class, android.graphics.Paint.class, int.class,
-                int.class, int.class, int.class, int.class, java.lang.CharSequence.class,
-                int.class, int.class, boolean.class, android.text.Layout.class}
-    )
-    @ToBeFixed(bug = "1400249", explanation = "have not found a reasonable way to test it" +
-            " automatically.")
     public void testDrawLeadingMargin() {
         BulletSpan bulletSpan = new BulletSpan(10, 20);
 
@@ -116,19 +63,6 @@
         bulletSpan.drawLeadingMargin(canvas, paint, 10, 0, 10, 0, 20, text, 0, 0, true, null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test drawLeadingMargin(Canvas c, Paint p, int x, int dir, int top," +
-                " int baseline, int bottom, CharSequence text, int start, int end," +
-                " boolean first, Layout l).",
-        method = "drawLeadingMargin",
-        args = {android.graphics.Canvas.class, android.graphics.Paint.class, int.class,
-                int.class, int.class, int.class, int.class, java.lang.CharSequence.class,
-                int.class, int.class, boolean.class, android.text.Layout.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws NullPointerException clause" +
-            " into javadoc when input null. And when try to use a String as the text," +
-            " there should not be a ClassCastException")
     public void testDrawLeadingMarginFailure() {
         // new the BulletSpan instance
         BulletSpan bulletSpan = new BulletSpan(10, 20);
@@ -149,37 +83,16 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test describeContents().",
-        method = "describeContents",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testDescribeContents() {
         BulletSpan bulletSpan = new BulletSpan();
         bulletSpan.describeContents();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getSpanTypeId().",
-        method = "getSpanTypeId",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testGetSpanTypeId() {
         BulletSpan bulletSpan = new BulletSpan();
         bulletSpan.getSpanTypeId();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test writeToParcel(Parcel dest, int flags).",
-        method = "writeToParcel",
-        args = {Parcel.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testWriteToParcel() {
         int leadingMargin1 = 0;
         int leadingMargin2 = 0;
diff --git a/tests/tests/text/src/android/text/style/cts/CharacterStyleTest.java b/tests/tests/text/src/android/text/style/cts/CharacterStyleTest.java
index 23a0306..49a811f 100644
--- a/tests/tests/text/src/android/text/style/cts/CharacterStyleTest.java
+++ b/tests/tests/text/src/android/text/style/cts/CharacterStyleTest.java
@@ -16,9 +16,6 @@
 
 package android.text.style.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.text.TextPaint;
 import android.text.style.CharacterStyle;
@@ -27,14 +24,7 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(CharacterStyle.class)
 public class CharacterStyleTest extends TestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CharacterStyle#wrap(CharacterStyle)}",
-        method = "wrap",
-        args = {android.text.style.CharacterStyle.class}
-    )
     public void testWrap() {
         // use a MetricAffectingSpan
         MetricAffectingSpan metricAffectingSpan = new SuperscriptSpan();
@@ -61,12 +51,6 @@
         assertTrue(result instanceof CharacterStyle);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CharacterStyle#getUnderlying()}",
-        method = "getUnderlying",
-        args = {}
-    )
     public void testGetUnderlying() {
         CharacterStyle expected = new MyCharacterStyle();
         assertSame(expected, expected.getUnderlying());
diff --git a/tests/tests/text/src/android/text/style/cts/ClickableSpanTest.java b/tests/tests/text/src/android/text/style/cts/ClickableSpanTest.java
index 58454b2..3ef6562 100644
--- a/tests/tests/text/src/android/text/style/cts/ClickableSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/ClickableSpanTest.java
@@ -16,10 +16,6 @@
 
 package android.text.style.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
 import android.graphics.Color;
 import android.text.TextPaint;
@@ -28,16 +24,7 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(ClickableSpan.class)
 public class ClickableSpanTest extends TestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ClickableSpan#updateDrawState(TextPaint)}",
-        method = "updateDrawState",
-        args = {android.text.TextPaint.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of " +
-            "ClickableSpan#updateDrawState(TextPaint) when the input TextPaint is null")
     public void testUpdateDrawState() {
         ClickableSpan clickableSpan = new MyClickableSpan();
 
diff --git a/tests/tests/text/src/android/text/style/cts/DrawableMarginSpanTest.java b/tests/tests/text/src/android/text/style/cts/DrawableMarginSpanTest.java
index fd69cf0..bea0944 100644
--- a/tests/tests/text/src/android/text/style/cts/DrawableMarginSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/DrawableMarginSpanTest.java
@@ -18,11 +18,6 @@
 
 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 android.graphics.Canvas;
 import android.graphics.Paint.FontMetricsInt;
@@ -35,23 +30,7 @@
 import android.text.TextPaint;
 import android.text.style.DrawableMarginSpan;
 
-@TestTargetClass(DrawableMarginSpan.class)
 public class DrawableMarginSpanTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of DrawableMarginSpan.",
-            method = "DrawableMarginSpan",
-            args = {android.graphics.drawable.Drawable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of DrawableMarginSpan.",
-            method = "DrawableMarginSpan",
-            args = {android.graphics.drawable.Drawable.class, int.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testConstructor() {
         Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
 
@@ -60,13 +39,6 @@
         new DrawableMarginSpan(null, -1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getLeadingMargin(boolean first). The input parameter is never used.",
-        method = "getLeadingMargin",
-        args = {boolean.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testGetLeadingMargin() {
         Drawable drawable = mContext.getResources().getDrawable(R.drawable.scenery);
 
@@ -79,20 +51,6 @@
         assertTrue(leadingMargin2 > leadingMargin1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test drawLeadingMargin(Canvas c, Paint p, int x, int dir, int top," +
-                " int baseline, int bottom, CharSequence text, int start, int end," +
-                " boolean first, Layout layout). And the following parameters are never" +
-                " used in this method: p, top, baseline, bottom, start, end, first",
-        method = "drawLeadingMargin",
-        args = {android.graphics.Canvas.class, android.graphics.Paint.class, int.class,
-                int.class, int.class, int.class, int.class, java.lang.CharSequence.class,
-                int.class, int.class, boolean.class, android.text.Layout.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws NullPointerException clause" +
-            " into javadoc when input null. And when try to use a String as the text," +
-            " there should not be a ClassCastException")
     public void testDrawLeadingMargin() {
         Drawable drawable = mContext.getResources().getDrawable(R.drawable.scenery);
         DrawableMarginSpan drawableMarginSpan = new DrawableMarginSpan(drawable, 0);
@@ -135,17 +93,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test chooseHeight(CharSequence text, int start, int end, int istartv," +
-                " int v, FontMetricsInt fm).",
-        method = "chooseHeight",
-        args = {java.lang.CharSequence.class, int.class, int.class, int.class, int.class,
-                android.graphics.Paint.FontMetricsInt.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws NullPointerException clause" +
-            " into javadoc when input null. And when try to use a String as the text," +
-            " there should not be a ClassCastException")
     public void testChooseHeight() {
         Drawable drawable = mContext.getResources().getDrawable(R.drawable.scenery);
         DrawableMarginSpan drawableMarginSpan = new DrawableMarginSpan(drawable, 0);
diff --git a/tests/tests/text/src/android/text/style/cts/DynamicDrawableSpanTest.java b/tests/tests/text/src/android/text/style/cts/DynamicDrawableSpanTest.java
index 39e9fb9..0cd072a 100644
--- a/tests/tests/text/src/android/text/style/cts/DynamicDrawableSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/DynamicDrawableSpanTest.java
@@ -18,11 +18,6 @@
 
 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 android.graphics.Canvas;
 import android.graphics.Rect;
@@ -31,29 +26,7 @@
 import android.test.AndroidTestCase;
 import android.text.style.DynamicDrawableSpan;
 
-@TestTargetClass(DynamicDrawableSpan.class)
 public class DynamicDrawableSpanTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of DynamicDrawableSpan.",
-            method = "DynamicDrawableSpan",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of DynamicDrawableSpan.",
-            method = "DynamicDrawableSpan",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getVerticalAlignment().",
-            method = "getVerticalAlignment",
-            args = {}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc for constructor DynamicDrawableSpan()")
     public void testConstructor() {
         DynamicDrawableSpan d = new MyDynamicDrawableSpan();
         assertEquals(DynamicDrawableSpan.ALIGN_BOTTOM, d.getVerticalAlignment());
@@ -65,16 +38,6 @@
         assertEquals(DynamicDrawableSpan.ALIGN_BOTTOM, d.getVerticalAlignment());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getSize(Paint paint, CharSequence text, int start, int end," +
-                " FontMetricsInt fm). And the following parameters are never used in" +
-                " this method: paint, text, start, end",
-        method = "getSize",
-        args = {android.graphics.Paint.class, java.lang.CharSequence.class, int.class,
-                int.class, android.graphics.Paint.FontMetricsInt.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testGetSize() {
         DynamicDrawableSpan dynamicDrawableSpan = new MyDynamicDrawableSpan();
         FontMetricsInt fm = new FontMetricsInt();
@@ -97,16 +60,6 @@
         assertEquals(rect.right, dynamicDrawableSpan.getSize(null, null, 0, 0, null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test draw(Canvas canvas, CharSequence text, int start, int end, float x," +
-                " int top, int y, int bottom, Paint paint). And the following parameters are" +
-                " never used in this method: text, start, end, top, y, paint",
-        method = "draw",
-        args = {android.graphics.Canvas.class, java.lang.CharSequence.class, int.class, int.class,
-                float.class, int.class, int.class, int.class, android.graphics.Paint.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testDraw() {
         DynamicDrawableSpan dynamicDrawableSpan = new MyDynamicDrawableSpan();
         Canvas canvas = new Canvas();
diff --git a/tests/tests/text/src/android/text/style/cts/ForegroundColorSpanTest.java b/tests/tests/text/src/android/text/style/cts/ForegroundColorSpanTest.java
index d7f84d5..bacf89b 100644
--- a/tests/tests/text/src/android/text/style/cts/ForegroundColorSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/ForegroundColorSpanTest.java
@@ -16,11 +16,6 @@
 
 package android.text.style.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.graphics.Color;
 import android.os.Parcel;
@@ -29,23 +24,7 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(ForegroundColorSpan.class)
 public class ForegroundColorSpanTest extends TestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of ForegroundColorSpan.",
-            method = "ForegroundColorSpan",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of ForegroundColorSpan.",
-            method = "ForegroundColorSpan",
-            args = {android.os.Parcel.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testConstructor() {
         ForegroundColorSpan f = new ForegroundColorSpan(Color.GREEN);
 
@@ -59,13 +38,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ForegroundColorSpan#getForegroundColor()}",
-        method = "getForegroundColor",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testGetForegroundColor() {
         ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.BLUE);
         assertEquals(Color.BLUE, foregroundColorSpan.getForegroundColor());
@@ -74,13 +46,6 @@
         assertEquals(Color.BLACK, foregroundColorSpan.getForegroundColor());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ForegroundColorSpan#updateDrawState(TextPaint)}",
-        method = "updateDrawState",
-        args = {android.text.TextPaint.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testUpdateDrawState() {
         ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.CYAN);
 
@@ -102,37 +67,16 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test describeContents().",
-        method = "describeContents",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testDescribeContents() {
         ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.RED);
         foregroundColorSpan.describeContents();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getSpanTypeId().",
-        method = "getSpanTypeId",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testGetSpanTypeId() {
         ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.RED);
         foregroundColorSpan.getSpanTypeId();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test writeToParcel(Parcel dest, int flags).",
-        method = "writeToParcel",
-        args = {Parcel.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testWriteToParcel() {
         Parcel p = Parcel.obtain();
         try {
diff --git a/tests/tests/text/src/android/text/style/cts/IconMarginSpanTest.java b/tests/tests/text/src/android/text/style/cts/IconMarginSpanTest.java
index f3ff25a..f9442ce 100644
--- a/tests/tests/text/src/android/text/style/cts/IconMarginSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/IconMarginSpanTest.java
@@ -16,11 +16,6 @@
 
 package android.text.style.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
@@ -33,7 +28,6 @@
 import android.text.TextPaint;
 import android.text.style.IconMarginSpan;
 
-@TestTargetClass(IconMarginSpan.class)
 public class IconMarginSpanTest extends AndroidTestCase {
     private static final int WIDTH = 80;
     private static final int HEIGHT = 120;
@@ -41,34 +35,12 @@
     private static final Bitmap BITMAP_80X120 =
         Bitmap.createBitmap(COLOR, WIDTH, HEIGHT, Bitmap.Config.RGB_565);
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of IconMarginSpan.",
-            method = "IconMarginSpan",
-            args = {android.graphics.Bitmap.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of IconMarginSpan.",
-            method = "IconMarginSpan",
-            args = {android.graphics.Bitmap.class, int.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testConstructor() {
         new IconMarginSpan(BITMAP_80X120);
         new IconMarginSpan(BITMAP_80X120, 1);
         new IconMarginSpan(null, -1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getLeadingMargin(boolean first). And the parameter is never used.",
-        method = "getLeadingMargin",
-        args = {boolean.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testGetLeadingMargin() {
         IconMarginSpan iconMarginSpan = new IconMarginSpan(BITMAP_80X120, 1);
         int leadingMargin1 = iconMarginSpan.getLeadingMargin(true);
@@ -79,18 +51,6 @@
         assertTrue(leadingMargin2 > leadingMargin1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test drawLeadingMargin(Canvas c, Paint p, int x, int dir, int top," +
-                " int baseline, int bottom, CharSequence text, int start, int end," +
-                " boolean first, Layout layout). And the following parameters are never" +
-                " used in this method: top, baseline, bottom, start, end, first",
-        method = "drawLeadingMargin",
-        args = {android.graphics.Canvas.class, android.graphics.Paint.class, int.class,
-                int.class, int.class, int.class, int.class, java.lang.CharSequence.class,
-                int.class, int.class, boolean.class, android.text.Layout.class}
-    )
-    @ToBeFixed(bug="1695243", explanation="miss javadoc")
     public void testDrawLeadingMargin() {
         IconMarginSpan iconMarginSpan = new IconMarginSpan(BITMAP_80X120, 0);
         Canvas c = new Canvas();
@@ -115,17 +75,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test chooseHeight(CharSequence text, int start, int end, int istartv," +
-                " int v, FontMetricsInt fm).",
-        method = "chooseHeight",
-        args = {java.lang.CharSequence.class, int.class, int.class, int.class, int.class,
-                android.graphics.Paint.FontMetricsInt.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc, should add @throws" +
-            " NullPointerException clause into javadoc when input null. And when try to" +
-            " use a String as the text, there should not be a ClassCastException")
     public void testChooseHeight() {
         IconMarginSpan iconMarginSpan = new IconMarginSpan(BITMAP_80X120, 0);
 
diff --git a/tests/tests/text/src/android/text/style/cts/ImageSpanTest.java b/tests/tests/text/src/android/text/style/cts/ImageSpanTest.java
index 470e060..1499d62 100644
--- a/tests/tests/text/src/android/text/style/cts/ImageSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/ImageSpanTest.java
@@ -18,11 +18,6 @@
 
 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 android.content.Context;
 import android.graphics.Bitmap;
@@ -34,71 +29,7 @@
 import android.text.style.ImageSpan;
 import android.widget.cts.WidgetTestUtils;
 
-@TestTargetClass(ImageSpan.class)
 public class ImageSpanTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of ImageSpan.",
-            method = "ImageSpan",
-            args = {android.graphics.Bitmap.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of ImageSpan.",
-            method = "ImageSpan",
-            args = {android.graphics.Bitmap.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of ImageSpan.",
-            method = "ImageSpan",
-            args = {android.graphics.drawable.Drawable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of ImageSpan.",
-            method = "ImageSpan",
-            args = {android.graphics.drawable.Drawable.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of ImageSpan.",
-            method = "ImageSpan",
-            args = {android.graphics.drawable.Drawable.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of ImageSpan.",
-            method = "ImageSpan",
-            args = {android.graphics.drawable.Drawable.class, java.lang.String.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of ImageSpan.",
-            method = "ImageSpan",
-            args = {android.content.Context.class, android.net.Uri.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of ImageSpan.",
-            method = "ImageSpan",
-            args = {android.content.Context.class, android.net.Uri.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of ImageSpan.",
-            method = "ImageSpan",
-            args = {android.content.Context.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of ImageSpan.",
-            method = "ImageSpan",
-            args = {android.content.Context.class, int.class, int.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "some constructors miss javadoc")
     public void testConstructor() {
         int width = 80;
         int height = 120;
@@ -138,12 +69,6 @@
         new ImageSpan((Context) null, -1, -1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getSource().",
-        method = "getSource",
-        args = {}
-    )
     public void testGetSource() {
         Drawable d = mContext.getResources().getDrawable(R.drawable.pass);
 
@@ -159,12 +84,6 @@
         assertEquals(source, imageSpan.getSource());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getDrawable().",
-        method = "getDrawable",
-        args = {}
-    )
     public void testGetDrawable() {
         Drawable drawable = mContext.getResources().getDrawable(R.drawable.pass);
 
diff --git a/tests/tests/text/src/android/text/style/cts/LeadingMarginSpan_StandardTest.java b/tests/tests/text/src/android/text/style/cts/LeadingMarginSpan_StandardTest.java
index 9ebd8e8..cbca876 100644
--- a/tests/tests/text/src/android/text/style/cts/LeadingMarginSpan_StandardTest.java
+++ b/tests/tests/text/src/android/text/style/cts/LeadingMarginSpan_StandardTest.java
@@ -16,11 +16,6 @@
 
 package android.text.style.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.os.Parcel;
 import android.text.style.LeadingMarginSpan;
@@ -28,29 +23,7 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(Standard.class)
 public class LeadingMarginSpan_StandardTest extends TestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of Standard.",
-            method = "LeadingMarginSpan.Standard",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of Standard.",
-            method = "LeadingMarginSpan.Standard",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of Standard.",
-            method = "LeadingMarginSpan.Standard",
-            args = {android.os.Parcel.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testConstructor() {
         new Standard(1, 2);
         new Standard(3);
@@ -68,13 +41,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getLeadingMargin(boolean first).",
-        method = "getLeadingMargin",
-        args = {boolean.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testGetLeadingMargin() {
         int first = 4;
         int rest = 5;
@@ -88,52 +54,21 @@
         assertEquals(-1, standard.getLeadingMargin(false));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test drawLeadingMargin(Canvas c, Paint p, int x, int dir, int top," +
-                " int baseline, int bottom, CharSequence text, int start, int end," +
-                " boolean first, Layout layout).",
-        method = "drawLeadingMargin",
-        args = {android.graphics.Canvas.class, android.graphics.Paint.class, int.class,
-                int.class, int.class, int.class, int.class, java.lang.CharSequence.class,
-                int.class, int.class, boolean.class, android.text.Layout.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testDrawLeadingMargin() {
         Standard standard = new LeadingMarginSpan.Standard(10);
         standard.drawLeadingMargin(null, null, 0, 0, 0, 0, 0, null, 0, 0, false, null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test describeContents().",
-        method = "describeContents",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testDescribeContents() {
         Standard standard = new Standard(1);
         standard.describeContents();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getSpanTypeId().",
-        method = "getSpanTypeId",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testGetSpanTypeId() {
         Standard standard = new Standard(1);
         standard.getSpanTypeId();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test writeToParcel(Parcel dest, int flags).",
-        method = "writeToParcel",
-        args = {Parcel.class, int.class}
-    )
     public void testWriteToParcel() {
         Parcel p = Parcel.obtain();
         try {
diff --git a/tests/tests/text/src/android/text/style/cts/MaskFilterSpanTest.java b/tests/tests/text/src/android/text/style/cts/MaskFilterSpanTest.java
index 103b75b..0ed33c9 100644
--- a/tests/tests/text/src/android/text/style/cts/MaskFilterSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/MaskFilterSpanTest.java
@@ -16,10 +16,6 @@
 
 package android.text.style.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
 import android.graphics.MaskFilter;
 import android.text.TextPaint;
@@ -27,28 +23,13 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(MaskFilterSpan.class)
 public class MaskFilterSpanTest extends TestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor(s) of {@link MaskFilterSpan}",
-        method = "MaskFilterSpan",
-        args = {android.graphics.MaskFilter.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testConstructor() {
         MaskFilter mf = new MaskFilter();
         new MaskFilterSpan(mf);
         new MaskFilterSpan(null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link MaskFilterSpan#updateDrawState(TextPaint)}",
-        method = "updateDrawState",
-        args = {android.text.TextPaint.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testUpdateDrawState() {
         MaskFilter mf = new MaskFilter();
         MaskFilterSpan maskFilterSpan = new MaskFilterSpan(mf);
@@ -67,13 +48,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link MaskFilterSpan#getMaskFilter()}",
-        method = "getMaskFilter",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testGetMaskFilter() {
         MaskFilter expected = new MaskFilter();
 
diff --git a/tests/tests/text/src/android/text/style/cts/MetricAffectingSpanTest.java b/tests/tests/text/src/android/text/style/cts/MetricAffectingSpanTest.java
index 58fa8ac..af6533c 100644
--- a/tests/tests/text/src/android/text/style/cts/MetricAffectingSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/MetricAffectingSpanTest.java
@@ -16,9 +16,6 @@
 
 package android.text.style.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.text.TextPaint;
 import android.text.style.CharacterStyle;
@@ -27,14 +24,7 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(MetricAffectingSpan.class)
 public class MetricAffectingSpanTest extends TestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link MetricAffectingSpan#getUnderlying()}",
-        method = "getUnderlying",
-        args = {}
-    )
     public void testGetUnderlying() {
         MetricAffectingSpan metricAffectingSpan = new MyMetricAffectingSpan();
         assertSame(metricAffectingSpan, metricAffectingSpan.getUnderlying());
diff --git a/tests/tests/text/src/android/text/style/cts/QuoteSpanTest.java b/tests/tests/text/src/android/text/style/cts/QuoteSpanTest.java
index 8f99fa6..a19c926 100644
--- a/tests/tests/text/src/android/text/style/cts/QuoteSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/QuoteSpanTest.java
@@ -16,11 +16,6 @@
 
 package android.text.style.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.graphics.Canvas;
 import android.graphics.Color;
@@ -30,29 +25,7 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(QuoteSpan.class)
 public class QuoteSpanTest extends TestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of QuoteSpan.",
-            method = "QuoteSpan",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of QuoteSpan.",
-            method = "QuoteSpan",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of QuoteSpan.",
-            method = "QuoteSpan",
-            args = {android.os.Parcel.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testConstructor() {
         new QuoteSpan();
         QuoteSpan q = new QuoteSpan(Color.RED);
@@ -67,13 +40,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getLeadingMargin(boolean first).",
-        method = "getLeadingMargin",
-        args = {boolean.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testGetLeadingMargin() {
         QuoteSpan quoteSpan = new QuoteSpan();
 
@@ -81,13 +47,6 @@
         quoteSpan.getLeadingMargin(false);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getColor().",
-        method = "getColor",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testGetColor() {
         QuoteSpan quoteSpan = new QuoteSpan(Color.BLACK);
         assertEquals(Color.BLACK, quoteSpan.getColor());
@@ -96,18 +55,6 @@
         assertEquals(Color.BLUE, quoteSpan.getColor());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test drawLeadingMargin(Canvas c, Paint p, int x, int dir, int top," +
-                " int baseline, int bottom, CharSequence text, int start, int end," +
-                " boolean first, Layout layout).",
-        method = "drawLeadingMargin",
-        args = {android.graphics.Canvas.class, android.graphics.Paint.class, int.class,
-                int.class, int.class, int.class, int.class, java.lang.CharSequence.class,
-                int.class, int.class, boolean.class, android.text.Layout.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc, and have not found a reasonable" +
-            " way to test it automatically.")
     public void testDrawLeadingMargin() {
         QuoteSpan quoteSpan = new QuoteSpan();
 
@@ -123,36 +70,16 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test describeContents().",
-        method = "describeContents",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testDescribeContents() {
         QuoteSpan quoteSpan = new QuoteSpan(Color.RED);
         quoteSpan.describeContents();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getSpanTypeId().",
-        method = "getSpanTypeId",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testGetSpanTypeId() {
         QuoteSpan quoteSpan = new QuoteSpan(Color.RED);
         quoteSpan.getSpanTypeId();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test writeToParcel(Parcel dest, int flags).",
-        method = "writeToParcel",
-        args = {Parcel.class, int.class}
-    )
     public void testWriteToParcel() {
         Parcel p = Parcel.obtain();
         try {
diff --git a/tests/tests/text/src/android/text/style/cts/RasterizerSpanTest.java b/tests/tests/text/src/android/text/style/cts/RasterizerSpanTest.java
index 614abaa..8c5f71e 100644
--- a/tests/tests/text/src/android/text/style/cts/RasterizerSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/RasterizerSpanTest.java
@@ -16,10 +16,6 @@
 
 package android.text.style.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
 import android.graphics.Rasterizer;
 import android.text.TextPaint;
@@ -27,15 +23,7 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(RasterizerSpan.class)
 public class RasterizerSpanTest extends TestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor(s) of {@link RasterizerSpan}",
-        method = "RasterizerSpan",
-        args = {android.graphics.Rasterizer.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testConstructor() {
         Rasterizer r = new Rasterizer();
 
@@ -43,13 +31,6 @@
         new RasterizerSpan(null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link RasterizerSpan#getRasterizer()}",
-        method = "getRasterizer",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testGetRasterizer() {
         Rasterizer expected = new Rasterizer();
 
@@ -60,13 +41,6 @@
         assertNull(rasterizerSpan.getRasterizer());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link RasterizerSpan#updateDrawState(TextPaint)}",
-        method = "updateDrawState",
-        args = {android.text.TextPaint.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testUpdateDrawState() {
         Rasterizer rasterizer = new Rasterizer();
         RasterizerSpan rasterizerSpan = new RasterizerSpan(rasterizer);
diff --git a/tests/tests/text/src/android/text/style/cts/RelativeSizeSpanTest.java b/tests/tests/text/src/android/text/style/cts/RelativeSizeSpanTest.java
index 712ccd2..5f67a0a 100644
--- a/tests/tests/text/src/android/text/style/cts/RelativeSizeSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/RelativeSizeSpanTest.java
@@ -16,11 +16,6 @@
 
 package android.text.style.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.os.Parcel;
 import android.text.TextPaint;
@@ -28,20 +23,7 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(RelativeSizeSpan.class)
 public class RelativeSizeSpanTest extends TestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "RelativeSizeSpan",
-            args = {float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "RelativeSizeSpan",
-            args = {android.os.Parcel.class}
-        )
-    })
     public void testConstructor() {
         RelativeSizeSpan relativeSizeSpan = new RelativeSizeSpan(1.0f);
 
@@ -57,11 +39,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSizeChange",
-        args = {}
-    )
     public void testGetSizeChange() {
         RelativeSizeSpan relativeSizeSpan = new RelativeSizeSpan(2.0f);
         assertEquals(2.0f, relativeSizeSpan.getSizeChange());
@@ -70,12 +47,6 @@
         assertEquals(-2.0f, relativeSizeSpan.getSizeChange());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "updateMeasureState",
-        args = {android.text.TextPaint.class}
-    )
-    @ToBeFixed(bug="1695243", explanation="miss javadoc")
     public void testUpdateMeasureState() {
         float proportion = 3.0f;
         RelativeSizeSpan relativeSizeSpan = new RelativeSizeSpan(proportion);
@@ -100,12 +71,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "updateDrawState",
-        args = {android.text.TextPaint.class}
-    )
-    @ToBeFixed(bug="1695243", explanation="miss javadoc")
     public void testUpdateDrawState() {
         float proportion = 3.0f;
         RelativeSizeSpan relativeSizeSpan = new RelativeSizeSpan(proportion);
@@ -130,31 +95,16 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
         RelativeSizeSpan relativeSizeSpan = new RelativeSizeSpan(2.0f);
         relativeSizeSpan.describeContents();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSpanTypeId",
-        args = {}
-    )
     public void testGetSpanTypeId() {
         RelativeSizeSpan relativeSizeSpan = new RelativeSizeSpan(2.0f);
         relativeSizeSpan.getSpanTypeId();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {Parcel.class, int.class}
-    )
     public void testWriteToParcel() {
         Parcel p = Parcel.obtain();
         try {
diff --git a/tests/tests/text/src/android/text/style/cts/ReplacementSpanTest.java b/tests/tests/text/src/android/text/style/cts/ReplacementSpanTest.java
index e724a60..2af12a1 100644
--- a/tests/tests/text/src/android/text/style/cts/ReplacementSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/ReplacementSpanTest.java
@@ -22,30 +22,13 @@
 import android.graphics.Paint.FontMetricsInt;
 import android.text.TextPaint;
 import android.text.style.ReplacementSpan;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(ReplacementSpan.class)
 public class ReplacementSpanTest extends TestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test updateMeasureState(TextPaint p). this method does nothing",
-        method = "updateMeasureState",
-        args = {android.text.TextPaint.class}
-    )
     public void testUpdateMeasureState() {
         ReplacementSpan replacementSpan = new MockReplacementSpan();
         replacementSpan.updateMeasureState(null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test updateDrawState(TextPaint ds). this method does nothing",
-        method = "updateDrawState",
-        args = {android.text.TextPaint.class}
-    )
     public void testUpdateDrawState() {
         ReplacementSpan replacementSpan = new MockReplacementSpan();
         replacementSpan.updateDrawState(null);
diff --git a/tests/tests/text/src/android/text/style/cts/ScaleXSpanTest.java b/tests/tests/text/src/android/text/style/cts/ScaleXSpanTest.java
index d9feb55..2ec9f65 100644
--- a/tests/tests/text/src/android/text/style/cts/ScaleXSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/ScaleXSpanTest.java
@@ -16,11 +16,6 @@
 
 package android.text.style.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.os.Parcel;
 import android.text.TextPaint;
@@ -28,20 +23,7 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(ScaleXSpan.class)
 public class ScaleXSpanTest extends TestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ScaleXSpan",
-            args = {float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ScaleXSpan",
-            args = {android.os.Parcel.class}
-        )
-    })
     public void testConstructor() {
         ScaleXSpan scaleXSpan = new ScaleXSpan(1.5f);
 
@@ -57,12 +39,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "updateDrawState",
-        args = {android.text.TextPaint.class}
-    )
-    @ToBeFixed(bug="1695243", explanation="miss javadoc")
     public void testUpdateDrawState() {
         float proportion = 3.0f;
         ScaleXSpan scaleXSpan = new ScaleXSpan(proportion);
@@ -84,12 +60,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "updateMeasureState",
-        args = {android.text.TextPaint.class}
-    )
-    @ToBeFixed(bug="1695243", explanation="miss javadoc")
     public void testUpdateMeasureState() {
         float proportion = 3.0f;
         ScaleXSpan scaleXSpan = new ScaleXSpan(proportion);
@@ -111,12 +81,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getScaleX",
-        args = {}
-    )
-    @ToBeFixed(bug="1695243", explanation="miss javadoc")
     public void testGetScaleX() {
         ScaleXSpan scaleXSpan = new ScaleXSpan(5.0f);
         assertEquals(5.0f, scaleXSpan.getScaleX());
@@ -125,31 +89,16 @@
         assertEquals(-5.0f, scaleXSpan.getScaleX());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
         ScaleXSpan scaleXSpan = new ScaleXSpan(5.0f);
         scaleXSpan.describeContents();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSpanTypeId",
-        args = {}
-    )
     public void testGetSpanTypeId() {
         ScaleXSpan scaleXSpan = new ScaleXSpan(5.0f);
         scaleXSpan.getSpanTypeId();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {Parcel.class, int.class}
-    )
     public void testWriteToParcel() {
         Parcel p = Parcel.obtain();
         try {
diff --git a/tests/tests/text/src/android/text/style/cts/StrikethroughSpanTest.java b/tests/tests/text/src/android/text/style/cts/StrikethroughSpanTest.java
index f3ede8d..a3c3d9d 100644
--- a/tests/tests/text/src/android/text/style/cts/StrikethroughSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/StrikethroughSpanTest.java
@@ -16,11 +16,6 @@
 
 package android.text.style.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.os.Parcel;
 import android.text.TextPaint;
@@ -28,20 +23,7 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(StrikethroughSpan.class)
 public class StrikethroughSpanTest extends TestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "StrikethroughSpan",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "StrikethroughSpan",
-            args = {android.os.Parcel.class}
-        )
-    })
     public void testConstructor() {
         StrikethroughSpan strikethroughSpan = new StrikethroughSpan();
 
@@ -55,12 +37,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "updateDrawState",
-        args = {android.text.TextPaint.class}
-    )
-    @ToBeFixed(bug="1695243", explanation="miss javadoc")
     public void testUpdateDrawState() {
         StrikethroughSpan strikethroughSpan = new StrikethroughSpan();
 
@@ -79,31 +55,16 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
         StrikethroughSpan strikethroughSpan = new StrikethroughSpan();
         strikethroughSpan.describeContents();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSpanTypeId",
-        args = {}
-    )
     public void testGetSpanTypeId() {
         StrikethroughSpan strikethroughSpan = new StrikethroughSpan();
         strikethroughSpan.getSpanTypeId();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {Parcel.class, int.class}
-    )
     public void testWriteToParcel() {
         Parcel p = Parcel.obtain();
         try {
diff --git a/tests/tests/text/src/android/text/style/cts/StyleSpanTest.java b/tests/tests/text/src/android/text/style/cts/StyleSpanTest.java
index c5098b4..753dca4 100644
--- a/tests/tests/text/src/android/text/style/cts/StyleSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/StyleSpanTest.java
@@ -16,11 +16,6 @@
 
 package android.text.style.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.graphics.Typeface;
 import android.os.Parcel;
@@ -29,20 +24,7 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(StyleSpan.class)
 public class StyleSpanTest extends TestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "StyleSpan",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "StyleSpan",
-            args = {android.os.Parcel.class}
-        )
-    })
     public void testConstructor() {
         StyleSpan styleSpan = new StyleSpan(2);
 
@@ -58,11 +40,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getStyle",
-        args = {}
-    )
     public void testGetStyle() {
         StyleSpan styleSpan = new StyleSpan(2);
         assertEquals(2, styleSpan.getStyle());
@@ -71,12 +48,6 @@
         assertEquals(-2, styleSpan.getStyle());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "updateMeasureState",
-        args = {android.text.TextPaint.class}
-    )
-    @ToBeFixed(bug="1695243", explanation="miss javadoc")
     public void testUpdateMeasureState() {
         StyleSpan styleSpan = new StyleSpan(Typeface.BOLD);
 
@@ -100,12 +71,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "updateDrawState",
-        args = {android.text.TextPaint.class}
-    )
-    @ToBeFixed(bug="1695243", explanation="miss javadoc")
     public void testUpdateDrawState() {
         StyleSpan styleSpan = new StyleSpan(Typeface.BOLD);
 
@@ -128,31 +93,16 @@
             // expected, test success.
         }
     }
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
         StyleSpan styleSpan = new StyleSpan(Typeface.BOLD);
         styleSpan.describeContents();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSpanTypeId",
-        args = {}
-    )
     public void testGetSpanTypeId() {
         StyleSpan styleSpan = new StyleSpan(Typeface.BOLD);
         styleSpan.getSpanTypeId();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {Parcel.class, int.class}
-    )
     public void testWriteToParcel() {
         Parcel p = Parcel.obtain();
         try {
diff --git a/tests/tests/text/src/android/text/style/cts/SubscriptSpanTest.java b/tests/tests/text/src/android/text/style/cts/SubscriptSpanTest.java
index 3201400..314b342 100644
--- a/tests/tests/text/src/android/text/style/cts/SubscriptSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/SubscriptSpanTest.java
@@ -16,11 +16,6 @@
 
 package android.text.style.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.os.Parcel;
 import android.text.TextPaint;
@@ -28,20 +23,7 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(SubscriptSpan.class)
 public class SubscriptSpanTest extends TestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "SubscriptSpan",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "SubscriptSpan",
-            args = {android.os.Parcel.class}
-        )
-    })
     public void testConstructor() {
         SubscriptSpan subscriptSpan = new SubscriptSpan();
 
@@ -55,12 +37,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "updateMeasureState",
-        args = {android.text.TextPaint.class}
-    )
-    @ToBeFixed(bug="1695243", explanation="miss javadoc")
     public void testUpdateMeasureState() {
         // the expected result is: tp.baselineShift -= (int) (tp.ascent() / 2)
         SubscriptSpan subscriptSpan = new SubscriptSpan();
@@ -81,12 +57,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "updateDrawState",
-        args = {android.text.TextPaint.class}
-    )
-    @ToBeFixed(bug="1695243", explanation="miss javadoc")
     public void testUpdateDrawState() {
         // the expected result is: tp.baselineShift -= (int) (tp.ascent() / 2)
         SubscriptSpan subscriptSpan = new SubscriptSpan();
@@ -107,31 +77,16 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
         SubscriptSpan subscriptSpan = new SubscriptSpan();
         subscriptSpan.describeContents();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSpanTypeId",
-        args = {}
-    )
     public void testGetSpanTypeId() {
         SubscriptSpan subscriptSpan = new SubscriptSpan();
         subscriptSpan.getSpanTypeId();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {Parcel.class, int.class}
-    )
     public void testWriteToParcel() {
         Parcel p = Parcel.obtain();
         try {
diff --git a/tests/tests/text/src/android/text/style/cts/SuperscriptSpanTest.java b/tests/tests/text/src/android/text/style/cts/SuperscriptSpanTest.java
index 3628d08..92a2db4 100644
--- a/tests/tests/text/src/android/text/style/cts/SuperscriptSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/SuperscriptSpanTest.java
@@ -16,11 +16,6 @@
 
 package android.text.style.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.os.Parcel;
 import android.text.TextPaint;
@@ -28,20 +23,7 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(SuperscriptSpan.class)
 public class SuperscriptSpanTest extends TestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "SuperscriptSpan",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "SuperscriptSpan",
-            args = {android.os.Parcel.class}
-        )
-    })
     public void testConstructor() {
         SuperscriptSpan superscriptSpan = new SuperscriptSpan();
 
@@ -55,12 +37,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "updateMeasureState",
-        args = {android.text.TextPaint.class}
-    )
-    @ToBeFixed(bug="1695243", explanation="miss javadoc")
     public void testUpdateMeasureState() {
         // the expected result is: tp.baselineShift += (int) (tp.ascent() / 2)
         SuperscriptSpan superscriptSpan = new SuperscriptSpan();
@@ -81,12 +57,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "updateDrawState",
-        args = {android.text.TextPaint.class}
-    )
-    @ToBeFixed(bug="1695243", explanation="miss javadoc")
     public void testUpdateDrawState() {
         // the expected result is: tp.baselineShift += (int) (tp.ascent() / 2)
         SuperscriptSpan superscriptSpan = new SuperscriptSpan();
@@ -107,31 +77,16 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
         SuperscriptSpan superscriptSpan = new SuperscriptSpan();
         superscriptSpan.describeContents();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSpanTypeId",
-        args = {}
-    )
     public void testGetSpanTypeId() {
         SuperscriptSpan superscriptSpan = new SuperscriptSpan();
         superscriptSpan.getSpanTypeId();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {Parcel.class, int.class}
-    )
     public void testWriteToParcel() {
         Parcel p = Parcel.obtain();
         try {
diff --git a/tests/tests/text/src/android/text/style/cts/TabStopSpan_StandardTest.java b/tests/tests/text/src/android/text/style/cts/TabStopSpan_StandardTest.java
index bdea9a6..f9397f0 100644
--- a/tests/tests/text/src/android/text/style/cts/TabStopSpan_StandardTest.java
+++ b/tests/tests/text/src/android/text/style/cts/TabStopSpan_StandardTest.java
@@ -19,31 +19,14 @@
 import junit.framework.TestCase;
 import android.text.style.TabStopSpan;
 import android.text.style.TabStopSpan.Standard;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(Standard.class)
 public class TabStopSpan_StandardTest extends TestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor(s) of Standard.",
-        method = "TabStopSpan.Standard",
-        args = {int.class}
-    )
     public void testConstructor() {
         new TabStopSpan.Standard(3);
 
         new TabStopSpan.Standard(-3);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getTabStop().",
-        method = "getTabStop",
-        args = {}
-    )
     public void testGetTabStop() {
         Standard standard = new Standard(3);
         assertEquals(3, standard.getTabStop());
diff --git a/tests/tests/text/src/android/text/style/cts/TextAppearanceSpanTest.java b/tests/tests/text/src/android/text/style/cts/TextAppearanceSpanTest.java
index 4e03848..2d45566 100644
--- a/tests/tests/text/src/android/text/style/cts/TextAppearanceSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/TextAppearanceSpanTest.java
@@ -16,11 +16,6 @@
 
 package android.text.style.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.content.res.ColorStateList;
 import android.graphics.Color;
@@ -29,34 +24,7 @@
 import android.text.TextPaint;
 import android.text.style.TextAppearanceSpan;
 
-@TestTargetClass(TextAppearanceSpan.class)
 public class TextAppearanceSpanTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "TextAppearanceSpan",
-            args = {android.content.Context.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "TextAppearanceSpan",
-            args = {android.content.Context.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "TextAppearanceSpan",
-            args = {java.lang.String.class, int.class, int.class,
-                    android.content.res.ColorStateList.class,
-                    android.content.res.ColorStateList.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "TextAppearanceSpan",
-            args = {android.os.Parcel.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws NullPointerException clause" +
-            " into javadoc when input Context is null")
     public void testConstructor() {
         new TextAppearanceSpan(mContext, 1);
         new TextAppearanceSpan(mContext, 1, 1);
@@ -91,11 +59,6 @@
         new TextAppearanceSpan(null, -1, -1, null, null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getFamily",
-        args = {}
-    )
     public void testGetFamily() {
         TextAppearanceSpan textAppearanceSpan = new TextAppearanceSpan(mContext, 1);
         assertNull(textAppearanceSpan.getFamily());
@@ -111,12 +74,6 @@
         assertEquals("sans", textAppearanceSpan.getFamily());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "updateMeasureState",
-        args = {android.text.TextPaint.class}
-    )
-    @ToBeFixed(bug="1695243", explanation="miss javadoc")
     public void testUpdateMeasureState() {
         int[][] states = new int[][] { new int[0], new int[0] };
         int[] colors = new int[] { Color.rgb(0, 0, 255), Color.BLACK };
@@ -139,11 +96,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getTextColor",
-        args = {}
-    )
     public void testGetTextColor() {
         int[][] states = new int[][] { new int[0], new int[0] };
         int[] colors = new int[] { Color.rgb(0, 0, 255), Color.BLACK };
@@ -156,11 +108,6 @@
         assertNull(textAppearanceSpan.getTextColor());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getTextSize",
-        args = {}
-    )
     public void testGetTextSize() {
         TextAppearanceSpan textAppearanceSpan = new TextAppearanceSpan(mContext, 1);
         assertEquals(-1, textAppearanceSpan.getTextSize());
@@ -176,11 +123,6 @@
         assertEquals(6, textAppearanceSpan.getTextSize());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getTextStyle",
-        args = {}
-    )
     public void testGetTextStyle() {
         TextAppearanceSpan textAppearanceSpan = new TextAppearanceSpan(mContext, 1);
         assertEquals(0, textAppearanceSpan.getTextStyle());
@@ -196,11 +138,6 @@
         assertEquals(1, textAppearanceSpan.getTextStyle());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLinkTextColor",
-        args = {}
-    )
     public void testGetLinkTextColor() {
         int[][] states = new int[][] { new int[0], new int[0] };
         int[] colors = new int[] { Color.rgb(0, 0, 255), Color.BLACK };
@@ -213,12 +150,6 @@
         assertNull(textAppearanceSpan.getLinkTextColor());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "updateDrawState",
-        args = {android.text.TextPaint.class}
-    )
-    @ToBeFixed(bug="1695243", explanation="miss javadoc")
     public void testUpdateDrawState() {
         int[][] states = new int[][] { new int[0], new int[0] };
         int[] colors = new int[] { Color.rgb(0, 0, 255), Color.BLACK };
@@ -244,31 +175,16 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
         TextAppearanceSpan textAppearanceSpan = new TextAppearanceSpan(mContext, 1);
         textAppearanceSpan.describeContents();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSpanTypeId",
-        args = {}
-    )
     public void testGetSpanTypeId() {
         TextAppearanceSpan textAppearanceSpan = new TextAppearanceSpan(mContext, 1);
         textAppearanceSpan.getSpanTypeId();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {Parcel.class, int.class}
-    )
     public void testWriteToParcel() {
         Parcel p = Parcel.obtain();
         String family = "sans";
diff --git a/tests/tests/text/src/android/text/style/cts/TypefaceSpanTest.java b/tests/tests/text/src/android/text/style/cts/TypefaceSpanTest.java
index 651b55f..7a05167 100644
--- a/tests/tests/text/src/android/text/style/cts/TypefaceSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/TypefaceSpanTest.java
@@ -16,11 +16,6 @@
 
 package android.text.style.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.graphics.Typeface;
 import android.os.Parcel;
@@ -29,25 +24,9 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(TypefaceSpan.class)
 public class TypefaceSpanTest extends TestCase {
     private static final String FAMILY = "monospace";
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of TypefaceSpan.",
-            method = "TypefaceSpan",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of TypefaceSpan.",
-            method = "TypefaceSpan",
-            args = {android.os.Parcel.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testConstructor() {
         TypefaceSpan t = new TypefaceSpan(FAMILY);
 
@@ -61,25 +40,11 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getFamily().",
-        method = "getFamily",
-        args = {}
-    )
     public void testGetFamily() {
         TypefaceSpan typefaceSpan = new TypefaceSpan(FAMILY);
         assertEquals(FAMILY, typefaceSpan.getFamily());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test updateMeasureState(TextPaint paint).",
-        method = "updateMeasureState",
-        args = {android.text.TextPaint.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws NullPointerException clause" +
-            " into javadoc when input TextPaint is null")
     public void testUpdateMeasureState() {
         TypefaceSpan typefaceSpan = new TypefaceSpan(FAMILY);
 
@@ -100,14 +65,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test updateDrawState(TextPaint ds).",
-        method = "updateDrawState",
-        args = {android.text.TextPaint.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws NullPointerException clause" +
-            " into javadoc when input TextPaint is null")
     public void testUpdateDrawState() {
         TypefaceSpan typefaceSpan = new TypefaceSpan(FAMILY);
 
@@ -128,37 +85,16 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test describeContents().",
-        method = "describeContents",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testDescribeContents() {
         TypefaceSpan typefaceSpan = new TypefaceSpan(FAMILY);
         typefaceSpan.describeContents();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getSpanTypeId().",
-        method = "getSpanTypeId",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testGetSpanTypeId() {
         TypefaceSpan typefaceSpan = new TypefaceSpan(FAMILY);
         typefaceSpan.getSpanTypeId();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test writeToParcel(Parcel dest, int flags).",
-        method = "writeToParcel",
-        args = {Parcel.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testWriteToParcel() {
         Parcel p = Parcel.obtain();
         try {
diff --git a/tests/tests/text/src/android/text/style/cts/URLSpanTest.java b/tests/tests/text/src/android/text/style/cts/URLSpanTest.java
index db5b7be..3209b66 100644
--- a/tests/tests/text/src/android/text/style/cts/URLSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/URLSpanTest.java
@@ -18,11 +18,6 @@
 
 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 android.app.Activity;
 import android.app.Instrumentation;
@@ -32,7 +27,6 @@
 import android.text.style.URLSpan;
 import android.widget.TextView;
 
-@TestTargetClass(URLSpan.class)
 public class URLSpanTest extends ActivityInstrumentationTestCase2<URLSpanStubActivity> {
     // The scheme of TEST_URL must be "ctstest" to launch MockURLSpanTestActivity
     private static final String TEST_URL = "ctstest://urlSpan/test";
@@ -48,21 +42,6 @@
         mActivity = getActivity();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of URLSpan.",
-            method = "URLSpan",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of URLSpan.",
-            method = "URLSpan",
-            args = {android.os.Parcel.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testConstructor() {
         URLSpan urlSpan = new URLSpan(TEST_URL);
 
@@ -76,24 +55,11 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getURL().",
-        method = "getURL",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testGetURL() {
         URLSpan urlSpan = new URLSpan(TEST_URL);
         assertEquals(TEST_URL, urlSpan.getURL());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test onClick(View widget).",
-        method = "onClick",
-        args = {android.view.View.class}
-    )
     public void testOnClick() {
         final URLSpan urlSpan = new URLSpan(TEST_URL);
         final TextView textView = (TextView) mActivity.findViewById(R.id.url);
@@ -117,14 +83,6 @@
         newActivity.finish();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test onClick(View widget).",
-        method = "onClick",
-        args = {android.view.View.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws NullPointerException clause" +
-            " into javadoc when input View is null")
     public void testOnClickFailure() {
         URLSpan urlSpan = new URLSpan(TEST_URL);
 
@@ -136,34 +94,16 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test describeContents().",
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
         URLSpan urlSpan = new URLSpan(TEST_URL);
         urlSpan.describeContents();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getSpanTypeId().",
-        method = "getSpanTypeId",
-        args = {}
-    )
     public void testGetSpanTypeId() {
         URLSpan urlSpan = new URLSpan(TEST_URL);
         urlSpan.getSpanTypeId();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test writeToParcel(Parcel dest, int flags).",
-        method = "writeToParcel",
-        args = {Parcel.class, int.class}
-    )
     public void testWriteToParcel() {
         Parcel p = Parcel.obtain();
         try {
diff --git a/tests/tests/text/src/android/text/style/cts/UnderlineSpanTest.java b/tests/tests/text/src/android/text/style/cts/UnderlineSpanTest.java
index 1d7e02d..4f200d2 100644
--- a/tests/tests/text/src/android/text/style/cts/UnderlineSpanTest.java
+++ b/tests/tests/text/src/android/text/style/cts/UnderlineSpanTest.java
@@ -16,11 +16,6 @@
 
 package android.text.style.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.os.Parcel;
 import android.text.TextPaint;
@@ -28,23 +23,7 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(UnderlineSpan.class)
 public class UnderlineSpanTest extends TestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of UnderlineSpan.",
-            method = "UnderlineSpan",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of UnderlineSpan.",
-            method = "UnderlineSpan",
-            args = {android.os.Parcel.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc")
     public void testConstructor() {
         new UnderlineSpan();
 
@@ -56,14 +35,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link UnderlineSpan#updateDrawState(TextPaint)}",
-        method = "updateDrawState",
-        args = {android.text.TextPaint.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws NullPointerException clause" +
-        " into javadoc when input TextPaint is null")
     public void testUpdateDrawState() {
         UnderlineSpan underlineSpan = new UnderlineSpan();
 
@@ -82,34 +53,16 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test describeContents().",
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
         UnderlineSpan underlineSpan = new UnderlineSpan();
         underlineSpan.describeContents();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getSpanTypeId().",
-        method = "getSpanTypeId",
-        args = {}
-    )
     public void testGetSpanTypeId() {
         UnderlineSpan underlineSpan = new UnderlineSpan();
         underlineSpan.getSpanTypeId();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test writeToParcel(Parcel dest, int flags).",
-        method = "writeToParcel",
-        args = {Parcel.class, int.class}
-    )
     public void testWriteToParcel() {
         Parcel p = Parcel.obtain();
         try {
diff --git a/tests/tests/text/src/android/text/util/cts/LinkifyTest.java b/tests/tests/text/src/android/text/util/cts/LinkifyTest.java
index 2c45c77..404f9d7 100644
--- a/tests/tests/text/src/android/text/util/cts/LinkifyTest.java
+++ b/tests/tests/text/src/android/text/util/cts/LinkifyTest.java
@@ -16,9 +16,6 @@
 
 package android.text.util.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.test.AndroidTestCase;
 import android.text.Spannable;
@@ -35,7 +32,6 @@
 /**
  * Test {@link Linkify}.
  */
-@TestTargetClass(Linkify.class)
 public class LinkifyTest extends AndroidTestCase {
     private static final Pattern LINKIFY_TEST_PATTERN = Pattern.compile(
             "(test:)?[a-zA-Z0-9]+(\\.pattern)?");
@@ -71,22 +67,10 @@
         }
     };
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor of {@link Linkify}",
-        method = "Linkify",
-        args = {}
-    )
     public void testConstructor() {
         new Linkify();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link Linkify#addLinks(Spannable, int)}",
-        method = "addLinks",
-        args = {android.text.Spannable.class, int.class}
-    )
     public void testAddLinks1() {
         SpannableString spannable = new SpannableString("name@gmail.com, "
                 + "123456789, tel:(0812)1234567 "
@@ -119,12 +103,6 @@
         assertFalse(Linkify.addLinks((Spannable) null, 0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link Linkify#addLinks(TextView, int)}",
-        method = "addLinks",
-        args = {android.widget.TextView.class, int.class}
-    )
     public void testAddLinks2() {
         String text = "www.google.com, name@gmail.com";
         TextView tv = new TextView(mContext);
@@ -152,13 +130,6 @@
         assertFalse(Linkify.addLinks((TextView)null, 0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link Linkify#addLinks(TextView, Pattern, String)}",
-        method = "addLinks",
-        args = {android.widget.TextView.class, java.util.regex.Pattern.class,
-                java.lang.String.class}
-    )
     public void testAddLinks3() {
         String text = "Alan, Charlie";
         TextView tv = new TextView(mContext);
@@ -201,15 +172,6 @@
         assertEquals("test:AZ0101.pattern", spans[1].getURL());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link Linkify#addLinks(TextView, Pattern, String, MatchFilter,"
-                + " TransformFilter)}",
-        method = "addLinks",
-        args = {android.widget.TextView.class, java.util.regex.Pattern.class,
-                java.lang.String.class, android.text.util.Linkify.MatchFilter.class,
-                android.text.util.Linkify.TransformFilter.class}
-    )
     public void testAddLinks4() {
         TextView tv = new TextView(mContext);
 
@@ -262,12 +224,6 @@
         assertEquals("test:12", spans[1].getURL());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link Linkify#addLinks(Spannable, Pattern, String)}",
-        method = "addLinks",
-        args = {android.text.Spannable.class, java.util.regex.Pattern.class, java.lang.String.class}
-    )
     public void testAddLinks5() {
         String text = "google.pattern, test:AZ0101.pattern";
 
@@ -298,15 +254,6 @@
         assertEquals("test:AZ0101.pattern", spans[1].getURL());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link Linkify#addLinks(Spannable, Pattern, String, MatchFilter,"
-            + " TransformFilter)}",
-        method = "addLinks",
-        args = {android.text.Spannable.class, java.util.regex.Pattern.class, java.lang.String.class,
-                android.text.util.Linkify.MatchFilter.class,
-                android.text.util.Linkify.TransformFilter.class}
-    )
     public void testAddLinks6() {
         String text = "FilterUpperCase.pattern, 12.345.pattern";
 
diff --git a/tests/tests/text/src/android/text/util/cts/Rfc822TokenTest.java b/tests/tests/text/src/android/text/util/cts/Rfc822TokenTest.java
index 35cefcd..fc826df 100644
--- a/tests/tests/text/src/android/text/util/cts/Rfc822TokenTest.java
+++ b/tests/tests/text/src/android/text/util/cts/Rfc822TokenTest.java
@@ -16,11 +16,6 @@
 
 package android.text.util.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.test.AndroidTestCase;
 import android.text.util.Rfc822Token;
@@ -28,13 +23,7 @@
 /**
  * Test {@link Rfc822Token}.
  */
-@TestTargetClass(Rfc822Token.class)
 public class Rfc822TokenTest extends AndroidTestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "Rfc822Token",
-        args = {java.lang.String.class, java.lang.String.class, java.lang.String.class}
-    )
     public void testConstructor() {
         final String name = "John Doe";
         final String address = "jdoe@example.net";
@@ -60,18 +49,6 @@
         assertNull(rfc822Token4.getComment());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setName",
-            args = {java.lang.String.class}
-        )
-    })
     public void testAccessName() {
         String name = "John Doe";
         final String address = "jdoe@example.net";
@@ -91,13 +68,6 @@
         assertNull(rfc822Token.getName());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "quoteComment",
-        args = {java.lang.String.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for quoteComment() is incomplete." +
-            "1. not clear what is supposed to happen if comment is null.")
     public void testQuoteComment() {
         assertEquals("work", Rfc822Token.quoteComment("work"));
 
@@ -111,18 +81,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getComment",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setComment",
-            args = {java.lang.String.class}
-        )
-    })
     public void testAccessComment() {
         final String name = "John Doe";
         final String address = "jdoe@example.net";
@@ -142,18 +100,6 @@
         assertNull(rfc822Token.getComment());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAddress",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAddress",
-            args = {java.lang.String.class}
-        )
-    })
     public void testAccessAddress() {
         final String name = "John Doe";
         String address = "jdoe@example.net";
@@ -173,11 +119,6 @@
         assertNull(rfc822Token.getAddress());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "toString",
-        args = {}
-    )
     public void testToString() {
         Rfc822Token rfc822Token1 = new Rfc822Token("John Doe", "jdoe@example.net", "work");
         assertEquals("John Doe (work) <jdoe@example.net>", rfc822Token1.toString());
@@ -200,15 +141,6 @@
         assertEquals("", rfc822Token6.toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        notes = "the phrase 'likely to cause trouble outside of a quoted string' is not testable",
-        method = "quoteNameIfNecessary",
-        args = {java.lang.String.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation =
-            "the javadoc for quoteNameIfNecessary() is incomplete." +
-            "1. not clear what is supposed to happen if name is null.")
     public void testQuoteNameIfNecessary() {
         assertEquals("UPPERlower space 0123456789",
                 Rfc822Token.quoteNameIfNecessary("UPPERlower space 0123456789"));
@@ -225,14 +157,6 @@
         assertEquals("", Rfc822Token.quoteNameIfNecessary(""));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link Rfc822Token#quoteName(String)}",
-        method = "quoteName",
-        args = {java.lang.String.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for quoteName() is incomplete." +
-            "1. not clear what is supposed to happen if name is null.")
     public void testQuoteName() {
         assertEquals("John Doe", Rfc822Token.quoteName("John Doe"));
         assertEquals("\\\"John Doe\\\"", Rfc822Token.quoteName("\"John Doe\""));
diff --git a/tests/tests/text/src/android/text/util/cts/Rfc822TokenizerTest.java b/tests/tests/text/src/android/text/util/cts/Rfc822TokenizerTest.java
index 1c29d6b..4d145f1 100644
--- a/tests/tests/text/src/android/text/util/cts/Rfc822TokenizerTest.java
+++ b/tests/tests/text/src/android/text/util/cts/Rfc822TokenizerTest.java
@@ -16,10 +16,6 @@
 
 package android.text.util.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
 import android.test.AndroidTestCase;
 import android.text.util.Rfc822Token;
@@ -28,24 +24,11 @@
 /**
  * Test {@link Rfc822Tokenizer}.
  */
-@TestTargetClass(Rfc822Tokenizer.class)
 public class Rfc822TokenizerTest extends AndroidTestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "Rfc822Tokenizer",
-        args = {}
-    )
     public void testConstructor() {
         new Rfc822Tokenizer();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "findTokenStart",
-        args = {java.lang.CharSequence.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for findTokenStart() is incomplete." +
-            "1. not clear what is supposed to happen if text is null.")
     public void testFindTokenStart() {
         Rfc822Tokenizer rfc822Tokenizer = new Rfc822Tokenizer();
 
@@ -78,14 +61,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "findTokenEnd",
-        args = {java.lang.CharSequence.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for findTokenEnd() is incomplete." +
-            "1. not clear what is supposed to happen if text is null." +
-            "2. not clear whether it is supposed result if cursor is exceptional value.")
     public void testFindTokenEnd() {
         Rfc822Tokenizer rfc822Tokenizer = new Rfc822Tokenizer();
 
@@ -121,13 +96,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "terminateToken",
-        args = {java.lang.CharSequence.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for terminateToken() is incomplete." +
-            "1. not clear what is supposed result if text is null.")
     public void testTerminateToken() {
         Rfc822Tokenizer rfc822Tokenizer = new Rfc822Tokenizer();
 
@@ -142,16 +110,6 @@
         assertEquals(text + comma + space, rfc822Tokenizer.terminateToken(null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT ,
-        notes = "Broken syntax tolerance is hard to specify",
-        method = "tokenize",
-        args = {java.lang.CharSequence.class}
-    )
-    @ToBeFixed(bug = "", explanation = "" +
-            "1. the comment doesn't be cleaned before find next token." +
-            "2. the javadoc for findTokenEnd() is incomplete." +
-            "   - not clear what is supposed result if text is null.")
     public void testTokenize() {
         Rfc822Token[] tokens = Rfc822Tokenizer.tokenize("");
         assertEquals(0, tokens.length);
diff --git a/tests/tests/theme/Android.mk b/tests/tests/theme/Android.mk
new file mode 100644
index 0000000..95f55fb
--- /dev/null
+++ b/tests/tests/theme/Android.mk
@@ -0,0 +1,34 @@
+# Copyright (C) 2012 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_PACKAGE_NAME := CtsThemeTestCases
+
+# Don't include this package in any target.
+LOCAL_MODULE_TAGS := optional
+
+# When built, explicitly put it in the data partition.
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+# All tests should include android.test.runner.
+LOCAL_JAVA_LIBRARIES := android.test.runner
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/theme/AndroidManifest.xml b/tests/tests/theme/AndroidManifest.xml
new file mode 100644
index 0000000..f41183a
--- /dev/null
+++ b/tests/tests/theme/AndroidManifest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.cts.theme">
+
+    <application>
+        <uses-library android:name="android.test.runner" />        
+        <activity android:name="android.theme.cts.DeviceDefaultActivity" />        
+    </application>
+
+    <instrumentation android:name="android.test.InstrumentationTestRunner"
+            android:targetPackage="com.android.cts.theme"
+            android:label="CTS tests for themes"/>
+</manifest>
+
diff --git a/tests/tests/theme/res/layout/empty.xml b/tests/tests/theme/res/layout/empty.xml
new file mode 100644
index 0000000..f6047ac
--- /dev/null
+++ b/tests/tests/theme/res/layout/empty.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        />
diff --git a/tests/tests/theme/src/android/theme/cts/DeviceDefaultActivity.java b/tests/tests/theme/src/android/theme/cts/DeviceDefaultActivity.java
new file mode 100644
index 0000000..139a48f
--- /dev/null
+++ b/tests/tests/theme/src/android/theme/cts/DeviceDefaultActivity.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.theme.cts;
+
+import com.android.cts.theme.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.Window;
+import android.view.WindowManager;
+
+public class DeviceDefaultActivity extends Activity {
+
+    public static final String EXTRA_THEME_ID = "themeId";
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        Window window = getWindow();
+        window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
+
+        int themeId = getIntent().getIntExtra(EXTRA_THEME_ID, -1);
+        setTheme(themeId);
+
+        setContentView(R.layout.empty);
+    }
+}
diff --git a/tests/tests/theme/src/android/theme/cts/DeviceDefaultTest.java b/tests/tests/theme/src/android/theme/cts/DeviceDefaultTest.java
new file mode 100644
index 0000000..086dce1
--- /dev/null
+++ b/tests/tests/theme/src/android/theme/cts/DeviceDefaultTest.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.theme.cts;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.test.ActivityInstrumentationTestCase2;
+
+public class DeviceDefaultTest extends ActivityInstrumentationTestCase2<DeviceDefaultActivity> {
+
+    public DeviceDefaultTest() {
+        super(DeviceDefaultActivity.class);
+    }
+
+    public void testGetActionBar_DeviceDefault() {
+        assertActionBar(android.R.style.Theme_DeviceDefault);
+    }
+
+    public void testGetActionBar_DeviceDefault_Dialog() {
+        assertNoActionBar(android.R.style.Theme_DeviceDefault_Dialog);
+    }
+
+    public void testGetActionBar_DeviceDefault_MinWidth() {
+        assertNoActionBar(android.R.style.Theme_DeviceDefault_Dialog_MinWidth);
+    }
+
+    public void testGetActionBar_DeviceDefault_Dialog_NoActionBar() {
+        assertNoActionBar(android.R.style.Theme_DeviceDefault_Dialog_NoActionBar);
+    }
+
+    public void testGetActionBar_DeviceDefault_Dialog_NoActionBar_MinWidth() {
+        assertNoActionBar(android.R.style.Theme_DeviceDefault_Dialog_NoActionBar_MinWidth);
+    }
+
+    public void testGetActionBar_DeviceDefault_DialogWhenLarge() {
+        assertActionBarWhenLarge(android.R.style.Theme_DeviceDefault_DialogWhenLarge);
+    }
+
+    public void testGetActionBar_DeviceDefault_DialogWhenLarge_NoActionBar() {
+        assertNoActionBar(android.R.style.Theme_DeviceDefault_DialogWhenLarge_NoActionBar);
+    }
+
+    public void testGetActionBar_DeviceDefault_InputMethod() {
+        assertNoActionBar(android.R.style.Theme_DeviceDefault_InputMethod);
+    }
+
+    public void testGetActionBar_DeviceDefault_Light() {
+        assertActionBar(android.R.style.Theme_DeviceDefault_Light);
+    }
+
+    public void testGetActionBar_DeviceDefault_Light_DarkActionBar() {
+        assertActionBar(android.R.style.Theme_DeviceDefault_Light_DarkActionBar);
+    }
+
+    public void testGetActionBar_DeviceDefault_Light_Dialog() {
+        assertNoActionBar(android.R.style.Theme_DeviceDefault_Light_Dialog);
+    }
+
+    public void testGetActionBar_DeviceDefault_Light_Dialog_MinWidth() {
+        assertNoActionBar(android.R.style.Theme_DeviceDefault_Light_Dialog_MinWidth);
+    }
+
+    public void testGetActionBar_DeviceDefault_Light_Dialog_NoActionBar() {
+        assertNoActionBar(android.R.style.Theme_DeviceDefault_Light_Dialog_NoActionBar);
+    }
+
+    public void testGetActionBar_DeviceDefault_Light_Dialog_NoActionBar_MinWidth() {
+        assertNoActionBar(android.R.style.Theme_DeviceDefault_Light_Dialog_NoActionBar_MinWidth);
+    }
+
+    public void testGetActionBar_DeviceDefault_Light_DialogWhenLarge() {
+        assertActionBarWhenLarge(android.R.style.Theme_Holo_Light_DialogWhenLarge);
+    }
+
+    public void testGetActionBar_DeviceDefault_Light_DialogWhenLarge_NoActionBar() {
+        assertNoActionBar(android.R.style.Theme_DeviceDefault_Light_DialogWhenLarge_NoActionBar);
+    }
+
+    public void testGetActionBar_DeviceDefault_Light_NoActionBar() {
+        assertNoActionBar(android.R.style.Theme_DeviceDefault_Light_NoActionBar);
+    }
+
+    public void testGetActionBar_DeviceDefault_Light_NoActionBar_Fullscreen() {
+        assertNoActionBar(android.R.style.Theme_DeviceDefault_Light_NoActionBar_Fullscreen);
+    }
+
+    public void testGetActionBar_DeviceDefault_Panel() {
+        assertNoActionBar(android.R.style.Theme_DeviceDefault_Panel);
+    }
+
+    public void testGetActionBar_DeviceDefault_Wallpaper() {
+        assertActionBar(android.R.style.Theme_DeviceDefault_Wallpaper);
+    }
+
+    public void testGetActionBar_DeviceDefault_Wallpaper_NoTitleBar() {
+        assertNoActionBar(android.R.style.Theme_DeviceDefault_Wallpaper_NoTitleBar);
+    }
+
+    private void assertActionBar(int themeId) {
+        assertGetActionBar(themeId, true);
+    }
+
+    private void assertNoActionBar(int themeId) {
+        assertGetActionBar(themeId, false);
+    }
+
+    private void assertGetActionBar(int themeId, boolean actionBar) {
+        Activity activity = startActivity(themeId);
+        if (actionBar) {
+            assertNotNull(activity.getActionBar());
+        } else {
+            assertNull(activity.getActionBar());
+        }
+    }
+
+    private void assertActionBarWhenLarge(int themeId) {
+        Activity activity = startActivity(themeId);
+        if (isLargeScreen(activity)) {
+            // Large screens will have dialogs which don't have action bars...
+            assertNoActionBar(themeId);
+        } else {
+            assertActionBar(themeId);
+        }
+    }
+
+    private boolean isLargeScreen(Context context) {
+        Configuration config = context.getResources().getConfiguration();
+        int size = config.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK;
+        return config.isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_LARGE);
+    }
+
+    private Activity startActivity(int themeId) {
+        setActivityIntent(new Intent().putExtra(DeviceDefaultActivity.EXTRA_THEME_ID, themeId));
+        return getActivity();
+    }
+}
diff --git a/tests/tests/util/Android.mk b/tests/tests/util/Android.mk
index cc65d12..d66e5e4 100644
--- a/tests/tests/util/Android.mk
+++ b/tests/tests/util/Android.mk
@@ -32,5 +32,4 @@
 # uncomment when dalvik.annotation.Test* are removed or part of SDK
 #LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
-
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/util/src/android/util/cts/AndroidExceptionTest.java b/tests/tests/util/src/android/util/cts/AndroidExceptionTest.java
index 5e05631..17304b6 100644
--- a/tests/tests/util/src/android/util/cts/AndroidExceptionTest.java
+++ b/tests/tests/util/src/android/util/cts/AndroidExceptionTest.java
@@ -18,37 +18,12 @@
 
 import android.util.AndroidException;
 import android.test.AndroidTestCase;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(AndroidException.class)
 public class AndroidExceptionTest extends AndroidTestCase {
 
     private static final String NAME = "Test_AndroidException";
     private static final Exception CAUSE = new Exception();
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test exception methods",
-            method = "AndroidException",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test exception methods",
-            method = "AndroidException",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test exception methods",
-            method = "AndroidException",
-            args = {java.lang.Exception.class}
-        )
-    })
     public void testAndroidException() {
         try {
             throw new AndroidException();
diff --git a/tests/tests/util/src/android/util/cts/AndroidRuntimeExceptionTest.java b/tests/tests/util/src/android/util/cts/AndroidRuntimeExceptionTest.java
index f908ffc..8e8d84a 100644
--- a/tests/tests/util/src/android/util/cts/AndroidRuntimeExceptionTest.java
+++ b/tests/tests/util/src/android/util/cts/AndroidRuntimeExceptionTest.java
@@ -18,37 +18,12 @@
 
 import android.test.AndroidTestCase;
 import android.util.AndroidRuntimeException;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(AndroidRuntimeException.class)
 public class AndroidRuntimeExceptionTest extends AndroidTestCase {
 
     private static final String NAME = "Test_AndroidRuntimeException";
     private static final Exception CAUSE = new Exception();
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test AndroidRuntimeException",
-            method = "AndroidRuntimeException",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test AndroidRuntimeException",
-            method = "AndroidRuntimeException",
-            args = {java.lang.Exception.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test AndroidRuntimeException",
-            method = "AndroidRuntimeException",
-            args = {java.lang.String.class}
-        )
-    })
     public void testAndroidRuntimeException() {
         try {
             throw new AndroidRuntimeException();
diff --git a/tests/tests/util/src/android/util/cts/DebugUtilsTest.java b/tests/tests/util/src/android/util/cts/DebugUtilsTest.java
index ab56dbe..203b4ef 100644
--- a/tests/tests/util/src/android/util/cts/DebugUtilsTest.java
+++ b/tests/tests/util/src/android/util/cts/DebugUtilsTest.java
@@ -17,17 +17,8 @@
 
 import junit.framework.TestCase;
 import android.util.DebugUtils;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(DebugUtils.class)
 public class DebugUtilsTest extends TestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isObjectSelected",
-        args = {Object.class}
-    )
     public void testIsObjectSelected(){
         // note: because System.getenv("ANDROID_OBJECT_FILTER") always returns null, can't test
         // the case that the method isObjectSelected return true
diff --git a/tests/tests/util/src/android/util/cts/DisplayMetricsTest.java b/tests/tests/util/src/android/util/cts/DisplayMetricsTest.java
index 50aaa8e..821bb09 100644
--- a/tests/tests/util/src/android/util/cts/DisplayMetricsTest.java
+++ b/tests/tests/util/src/android/util/cts/DisplayMetricsTest.java
@@ -20,12 +20,7 @@
 import android.util.DisplayMetrics;
 import android.view.Display;
 import android.view.WindowManager;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(DisplayMetrics.class)
 public class DisplayMetricsTest extends AndroidTestCase {
     private Display initDisplay() {
         WindowManager windowManager = (WindowManager) getContext()
@@ -36,26 +31,6 @@
         return display;
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link DisplayMetrics}",
-            method = "DisplayMetrics",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: setTo",
-            method = "setTo",
-            args = {DisplayMetrics.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: setToDefaults",
-            method = "setToDefaults",
-            args = {}
-        )
-    })
     public void testDisplayMetricsOp() {
         DisplayMetrics outMetrics = new DisplayMetrics();
         outMetrics.setToDefaults();
diff --git a/tests/tests/util/src/android/util/cts/FloatMathTest.java b/tests/tests/util/src/android/util/cts/FloatMathTest.java
index 7528a23..4d0b572 100644
--- a/tests/tests/util/src/android/util/cts/FloatMathTest.java
+++ b/tests/tests/util/src/android/util/cts/FloatMathTest.java
@@ -17,45 +17,8 @@
 
 import junit.framework.TestCase;
 import android.util.FloatMath;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(FloatMath.class)
 public class FloatMathTest extends TestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test float math related methods",
-            method = "ceil",
-            args = {float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test float math related methods",
-            method = "floor",
-            args = {float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test float math related methods",
-            method = "cos",
-            args = {float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test float math related methods",
-            method = "sin",
-            args = {float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test float math related methods",
-            method = "sqrt",
-            args = {float.class}
-        )
-    })
     public void testFloatMathMethods() {
         // ceil
         assertEquals(8.0f, FloatMath.ceil(7.2f));
diff --git a/tests/tests/util/src/android/util/cts/LogPrinterTest.java b/tests/tests/util/src/android/util/cts/LogPrinterTest.java
index 6d2a9af..7411f9c 100644
--- a/tests/tests/util/src/android/util/cts/LogPrinterTest.java
+++ b/tests/tests/util/src/android/util/cts/LogPrinterTest.java
@@ -19,11 +19,7 @@
 import android.test.AndroidTestCase;
 import android.util.Log;
 import android.util.LogPrinter;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(LogPrinter.class)
 public class LogPrinterTest extends AndroidTestCase {
     private final String mTag="LogPrinterTest";
     @Override
@@ -31,11 +27,6 @@
         super.setUp();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "LogPrinter",
-        args = {int.class, String.class}
-    )
     public void testConstructor() {
         int[] priorities = { Log.ASSERT, Log.DEBUG, Log.ERROR, Log.INFO,
                 Log.VERBOSE, Log.WARN };
@@ -44,11 +35,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "println",
-        args = {String.class}
-    )
     public void testPrintln() {
         LogPrinter logPrinter = new LogPrinter(Log.DEBUG, mTag);
         String mMessage = "testMessage";
diff --git a/tests/tests/util/src/android/util/cts/LogTest.java b/tests/tests/util/src/android/util/cts/LogTest.java
index 5d921cb..80d0111 100644
--- a/tests/tests/util/src/android/util/cts/LogTest.java
+++ b/tests/tests/util/src/android/util/cts/LogTest.java
@@ -18,106 +18,15 @@
 
 import android.test.AndroidTestCase;
 import android.util.Log;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
 /**
  * 
  * Test Log
  *
  */
-@TestTargetClass(Log.class)
 public class LogTest extends AndroidTestCase{
     private static final String TAG = "LogTest";
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Log operations.",
-            method = "d",
-            args = {java.lang.String.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Log operations.",
-            method = "d",
-            args = {java.lang.String.class, java.lang.String.class, java.lang.Throwable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Log operations.",
-            method = "e",
-            args = {java.lang.String.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Log operations.",
-            method = "e",
-            args = {java.lang.String.class, java.lang.String.class, java.lang.Throwable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Log operations.",
-            method = "getStackTraceString",
-            args = {java.lang.Throwable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Log operations.",
-            method = "i",
-            args = {java.lang.String.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Log operations.",
-            method = "i",
-            args = {java.lang.String.class, java.lang.String.class, java.lang.Throwable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Log operations.",
-            method = "isLoggable",
-            args = {java.lang.String.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Log operations.",
-            method = "println",
-            args = {int.class, java.lang.String.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Log operations.",
-            method = "v",
-            args = {java.lang.String.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Log operations.",
-            method = "v",
-            args = {java.lang.String.class, java.lang.String.class, java.lang.Throwable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Log operations.",
-            method = "w",
-            args = {java.lang.String.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Log operations.",
-            method = "w",
-            args = {java.lang.String.class, java.lang.String.class, java.lang.Throwable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test Log operations.",
-            method = "w",
-            args = {java.lang.String.class, java.lang.Throwable.class}
-        )
-    })
     public void testLogOperations() {
         final String msg = "Test Log operations.";
         Exception tr = null;
diff --git a/tests/tests/util/src/android/util/cts/MonthDisplayHelperTest.java b/tests/tests/util/src/android/util/cts/MonthDisplayHelperTest.java
index c51e430..fc4dda1 100644
--- a/tests/tests/util/src/android/util/cts/MonthDisplayHelperTest.java
+++ b/tests/tests/util/src/android/util/cts/MonthDisplayHelperTest.java
@@ -20,12 +20,7 @@
 
 import android.test.AndroidTestCase;
 import android.util.MonthDisplayHelper;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(MonthDisplayHelper.class)
 public class MonthDisplayHelperTest extends AndroidTestCase {
     private MonthDisplayHelper mHelper;
     @Override
@@ -33,20 +28,6 @@
         super.setUp();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of MonthDisplayHelper.",
-            method = "MonthDisplayHelper",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of MonthDisplayHelper.",
-            method = "MonthDisplayHelper",
-            args = {int.class, int.class}
-        )
-    })
     public void testConstructor() {
 
         try {
@@ -84,20 +65,6 @@
 
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getNumberOfDaysInMonth().",
-            method = "getNumberOfDaysInMonth",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getNumberOfDaysInMonth().",
-            method = "MonthDisplayHelper",
-            args = {int.class, int.class}
-        )
-    })
     public void testNumberOfDaysInCurrentMonth() {
         assertEquals(30, new MonthDisplayHelper(2007, Calendar.SEPTEMBER)
                 .getNumberOfDaysInMonth());
@@ -107,26 +74,6 @@
         .getNumberOfDaysInMonth());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test nextMonth().",
-            method = "nextMonth",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test nextMonth().",
-            method = "getDigitsForRow",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test nextMonth().",
-            method = "getMonth",
-            args = {}
-        )
-    })
     public void testNextMonth() {
         mHelper = new MonthDisplayHelper(2007, Calendar.AUGUST, Calendar.SUNDAY);
 
@@ -140,20 +87,6 @@
                 .getDigitsForRow(0));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getRowOf(int day).",
-            method = "getRowOf",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getRowOf(int day).",
-            method = "MonthDisplayHelper",
-            args = {int.class, int.class}
-        )
-    })
     public void testGetRowOf() {
         mHelper = new MonthDisplayHelper(2007,
                 Calendar.AUGUST, Calendar.SUNDAY);
@@ -165,32 +98,6 @@
         assertEquals(3, mHelper.getRowOf(19));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getWeekStartDay().",
-            method = "getWeekStartDay",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getWeekStartDay().",
-            method = "getOffset",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getWeekStartDay().",
-            method = "MonthDisplayHelper",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getWeekStartDay().",
-            method = "MonthDisplayHelper",
-            args = {int.class, int.class, int.class}
-        )
-    })
     public void testHelperProperties() {
         mHelper = new MonthDisplayHelper(2007, Calendar.AUGUST, Calendar.SUNDAY);
 
@@ -201,26 +108,6 @@
         assertEquals(3, mHelper.getOffset());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getDigitsForRow(int row).",
-            method = "getDigitsForRow",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getDigitsForRow(int row).",
-            method = "MonthDisplayHelper",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getDigitsForRow(int row).",
-            method = "MonthDisplayHelper",
-            args = {int.class, int.class, int.class}
-        )
-    })
     public void testMonthRows() {
         mHelper = new MonthDisplayHelper(2007, Calendar.SEPTEMBER);
 
@@ -244,20 +131,6 @@
                 .getDigitsForRow(5));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getFirstDayOfMonth().",
-            method = "getFirstDayOfMonth",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getFirstDayOfMonth().",
-            method = "MonthDisplayHelper",
-            args = {int.class, int.class}
-        )
-    })
     public void testFirstDayOfMonth() {
 
         assertEquals("august 2007", Calendar.WEDNESDAY, new MonthDisplayHelper(
@@ -268,20 +141,6 @@
                         .getFirstDayOfMonth());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getColumnOf(int day).",
-            method = "getColumnOf",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getColumnOf(int day).",
-            method = "MonthDisplayHelper",
-            args = {int.class, int.class}
-        )
-    })
     public void testGetColumnOf() {
         mHelper= new MonthDisplayHelper(2007,
                 Calendar.AUGUST, Calendar.SUNDAY);
@@ -293,12 +152,6 @@
         assertEquals(0, mHelper.getColumnOf(26));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getDayAt(int row, int column).",
-        method = "getDayAt",
-        args = {int.class, int.class}
-    )
     public void testGetDayAt() {
         mHelper = new MonthDisplayHelper(2007,
                 Calendar.AUGUST, Calendar.SUNDAY);
@@ -306,32 +159,6 @@
         assertEquals(30, mHelper.getDayAt(0, 1));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test previousMonth().",
-            method = "previousMonth",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test previousMonth().",
-            method = "getDigitsForRow",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test previousMonth().",
-            method = "getYear",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test previousMonth().",
-            method = "getMonth",
-            args = {}
-        )
-    })
     public void testPrevMonth() {
         mHelper = new MonthDisplayHelper(2007, Calendar.SEPTEMBER,
                 Calendar.SUNDAY);
@@ -353,12 +180,6 @@
         assertEquals(Calendar.DECEMBER, mHelper.getMonth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test isWithinCurrentMonth(int row, int column).",
-        method = "isWithinCurrentMonth",
-        args = {int.class, int.class}
-    )
     public void testIsWithinCurrentMonth() {
         mHelper = new MonthDisplayHelper(2007, Calendar.SEPTEMBER,
                 Calendar.SUNDAY);
diff --git a/tests/tests/util/src/android/util/cts/PrintStreamPrinterTest.java b/tests/tests/util/src/android/util/cts/PrintStreamPrinterTest.java
index 6ac33eb..ed39119 100755
--- a/tests/tests/util/src/android/util/cts/PrintStreamPrinterTest.java
+++ b/tests/tests/util/src/android/util/cts/PrintStreamPrinterTest.java
@@ -26,11 +26,7 @@
 import java.io.PrintStream;
 import android.test.AndroidTestCase;
 import android.util.PrintStreamPrinter;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
-@TestTargetClass(PrintStreamPrinter.class)
 public class PrintStreamPrinterTest extends AndroidTestCase {
     private File mFile;
     @Override
@@ -42,20 +38,10 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "PrintStreamPrinter",
-        args = {PrintStream.class}
-    )
     public void testConstructor() throws FileNotFoundException {
         new PrintStreamPrinter(new PrintStream(mFile));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "println",
-        args = {String.class}
-    )
     public void testPrintln() throws FileNotFoundException, SecurityException, IOException {
         PrintStreamPrinter printStreamPrinter = null;
         final String message = "testMessageOfPrintStreamPrinter";
diff --git a/tests/tests/util/src/android/util/cts/PrintWriterPrinterTest.java b/tests/tests/util/src/android/util/cts/PrintWriterPrinterTest.java
index 3c36bf3..77f2d19 100644
--- a/tests/tests/util/src/android/util/cts/PrintWriterPrinterTest.java
+++ b/tests/tests/util/src/android/util/cts/PrintWriterPrinterTest.java
@@ -27,12 +27,7 @@
 import android.content.Context;
 import android.test.AndroidTestCase;
 import android.util.PrintWriterPrinter;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(PrintWriterPrinter.class)
 public class PrintWriterPrinterTest extends AndroidTestCase {
     private File mFile;
     @Override
@@ -44,12 +39,6 @@
             mFile.createNewFile();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor(s) of PrintWriterPrinter.",
-        method = "PrintWriterPrinter",
-        args = {java.io.PrintWriter.class}
-    )
     public void testConstructor() {
 
         PrintWriterPrinter printWriterPrinter = null;
@@ -62,12 +51,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test println(String x).",
-        method = "println",
-        args = {java.lang.String.class}
-    )
     public void testPrintln() {
         PrintWriterPrinter printWriterPrinter = null;
         String mMessage = "testMessage";
diff --git a/tests/tests/util/src/android/util/cts/SparseArrayTest.java b/tests/tests/util/src/android/util/cts/SparseArrayTest.java
index da80f4d..dfb722b 100644
--- a/tests/tests/util/src/android/util/cts/SparseArrayTest.java
+++ b/tests/tests/util/src/android/util/cts/SparseArrayTest.java
@@ -18,12 +18,7 @@
 
 import android.test.AndroidTestCase;
 import android.util.SparseArray;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(SparseArray.class)
 public class SparseArrayTest extends AndroidTestCase {
     private static final int[] KEYS = {12, 23, 4, 6, 8, 1, 3, -12, 0, -3, 11, 14, -23};
     private static final Integer[] VALUES = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
@@ -31,78 +26,6 @@
     private static final int NON_EXISTED_KEY = 123;
     private static final Integer VALUE_FOR_NON_EXISTED_KEY = -1;
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "SparseArray",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "append",
-            args = {int.class, java.lang.Object.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "clear",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "delete",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "remove",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "get",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "get",
-            args = {int.class, java.lang.Object.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "indexOfKey",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "indexOfValue",
-            args = {java.lang.Object.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "keyAt",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "put",
-            args = {int.class, java.lang.Object.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setValueAt",
-            args = {int.class, java.lang.Object.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "size",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "valueAt",
-            args = {int.class}
-        )
-    })
     public void testSparseArrayWithDefaultCapacity() {
         SparseArray<Integer> sparseArray = new SparseArray<Integer>();
         assertEquals(0, sparseArray.size());
@@ -168,78 +91,6 @@
         assertEquals(0, sparseArray.size());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "SparseArray",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "append",
-            args = {int.class, java.lang.Object.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "clear",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "delete",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "remove",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "get",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "get",
-            args = {int.class, java.lang.Object.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "indexOfKey",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "indexOfValue",
-            args = {java.lang.Object.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "keyAt",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "put",
-            args = {int.class, java.lang.Object.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setValueAt",
-            args = {int.class, java.lang.Object.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "size",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "valueAt",
-            args = {int.class}
-        )
-    })
     public void testSparseArrayWithSpecifiedCapacity() {
         SparseArray<Integer> sparseArray = new SparseArray<Integer>(5);
         assertEquals(0, sparseArray.size());
diff --git a/tests/tests/util/src/android/util/cts/SparseBooleanArrayTest.java b/tests/tests/util/src/android/util/cts/SparseBooleanArrayTest.java
index 0dcce87..0914d46 100644
--- a/tests/tests/util/src/android/util/cts/SparseBooleanArrayTest.java
+++ b/tests/tests/util/src/android/util/cts/SparseBooleanArrayTest.java
@@ -18,12 +18,7 @@
 
 import android.test.AndroidTestCase;
 import android.util.SparseBooleanArray;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(SparseBooleanArray.class)
 public class SparseBooleanArrayTest extends AndroidTestCase {
     private static final int[] KEYS   = {12, 23, 4, 6, 8, 1, 3, -12, 0, -3, 11, 14, -23};
     private static final boolean[] VALUES =
@@ -36,68 +31,6 @@
         super.setUp();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "SparseBooleanArray",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "append",
-            args = {int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "clear",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "delete",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "get",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "get",
-            args = {int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "indexOfKey",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "indexOfValue",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "keyAt",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "put",
-            args = {int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "size",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "valueAt",
-            args = {int.class}
-        )
-    })
     public void testSparseBooleanArrayWithDefaultCapacity() {
         SparseBooleanArray sparseBooleanArray = new SparseBooleanArray();
         assertEquals(0, sparseBooleanArray.size());
@@ -154,68 +87,6 @@
         assertEquals(0, sparseBooleanArray.size());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "SparseBooleanArray",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "append",
-            args = {int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "clear",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "delete",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "get",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "get",
-            args = {int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "indexOfKey",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "indexOfValue",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "keyAt",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "put",
-            args = {int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "size",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "valueAt",
-            args = {int.class}
-        )
-    })
     public void testSparseBooleanArrayWithSpecifiedCapacity() {
         SparseBooleanArray sparseBooleanArray = new SparseBooleanArray(5);
         assertEquals(0, sparseBooleanArray.size());
diff --git a/tests/tests/util/src/android/util/cts/SparseIntArrayTest.java b/tests/tests/util/src/android/util/cts/SparseIntArrayTest.java
index 5229118..a3637a1 100644
--- a/tests/tests/util/src/android/util/cts/SparseIntArrayTest.java
+++ b/tests/tests/util/src/android/util/cts/SparseIntArrayTest.java
@@ -21,12 +21,7 @@
 
 import java.util.Arrays;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(SparseIntArray.class)
 public class SparseIntArrayTest extends AndroidTestCase {
     private static final int[] KEYS   = {12, 23, 4, 6, 8, 1, 3, -12, 0, -3, 11, 14, -23};
     private static final int[] VALUES = {0,  1,  2, 3, 4, 5, 6, 7,   8,  9, 10, 11,  12};
@@ -38,80 +33,6 @@
         super.setUp();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test SparseIntArray with default capacity.",
-            method = "SparseIntArray",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test SparseIntArray with default capacity.",
-            method = "append",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test SparseIntArray with default capacity.",
-            method = "clear",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test SparseIntArray with default capacity.",
-            method = "delete",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test SparseIntArray with default capacity.",
-            method = "get",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test SparseIntArray with default capacity.",
-            method = "get",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test SparseIntArray with default capacity.",
-            method = "indexOfKey",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test SparseIntArray with default capacity.",
-            method = "indexOfValue",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test SparseIntArray with default capacity.",
-            method = "keyAt",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test SparseIntArray with default capacity.",
-            method = "put",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test SparseIntArray with default capacity.",
-            method = "size",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test SparseIntArray with default capacity.",
-            method = "valueAt",
-            args = {int.class}
-        )
-    })
     public void testSparseIntArrayWithDefaultCapacity() {
         SparseIntArray sparseIntArray = new SparseIntArray();
         assertEquals(0, sparseIntArray.size());
@@ -161,80 +82,6 @@
         assertEquals(0, sparseIntArray.size());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test SparseIntArray with specified capacity.",
-            method = "SparseIntArray",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test SparseIntArray with specified capacity.",
-            method = "append",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test SparseIntArray with specified capacity.",
-            method = "clear",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test SparseIntArray with specified capacity.",
-            method = "delete",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test SparseIntArray with specified capacity.",
-            method = "get",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test SparseIntArray with specified capacity.",
-            method = "get",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test SparseIntArray with specified capacity.",
-            method = "indexOfKey",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test SparseIntArray with specified capacity.",
-            method = "indexOfValue",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test SparseIntArray with specified capacity.",
-            method = "keyAt",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test SparseIntArray with specified capacity.",
-            method = "put",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test SparseIntArray with specified capacity.",
-            method = "size",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test SparseIntArray with specified capacity.",
-            method = "valueAt",
-            args = {int.class}
-        )
-    })
     public void testSparseIntArrayWithSpecifiedCapacity() {
         SparseIntArray sparseIntArray = new SparseIntArray(5);
         assertEquals(0, sparseIntArray.size());
@@ -283,14 +130,6 @@
         assertEquals(0, sparseIntArray.size());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test SparseIntArray with specified capacity.",
-            method = "removeAt",
-            args = {int.class}
-        )
-    })
     public void testSparseIntArrayRemoveAt() {
         final int[] testData = {
             13, 42, 85932, 885932, -6, Integer.MAX_VALUE, 0, Integer.MIN_VALUE };
diff --git a/tests/tests/util/src/android/util/cts/StateSetTest.java b/tests/tests/util/src/android/util/cts/StateSetTest.java
index 494671f..cf71b7d 100644
--- a/tests/tests/util/src/android/util/cts/StateSetTest.java
+++ b/tests/tests/util/src/android/util/cts/StateSetTest.java
@@ -19,15 +19,10 @@
 import android.R;
 import android.test.AndroidTestCase;
 import android.util.StateSet;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
 /**
  * Test StateSet
  */
-@TestTargetClass(StateSet.class)
 public class StateSetTest extends AndroidTestCase {
 
     @Override
@@ -35,12 +30,6 @@
         super.setUp();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test trim state set.",
-        method = "trimStateSet",
-        args = {int[].class, int.class}
-    )
     public void testTrimStateSet() {
         // state set's old size is equal to new size
         int[] stateSet = {1, 2, 3};
@@ -53,12 +42,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test dump state set",
-        method = "dump",
-        args = {int[].class}
-    )
     public void testDump() {
         int[] stateSet = {R.attr.state_window_focused,
                           R.attr.state_pressed,
@@ -70,26 +53,6 @@
         assertEquals("W P S F E ", string);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "stateSetMatches",
-            args = {int[].class, int[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "isWildCard",
-            args = {int[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "stateSetMatches",
-            args = {int[].class, int.class}
-        )
-    })
     public void testStateSetMatches() throws Exception {
          int[] stateSpec1 = new int[2];
          int[] stateSet1 = new int[3];
diff --git a/tests/tests/util/src/android/util/cts/StringBuilderPrinterTest.java b/tests/tests/util/src/android/util/cts/StringBuilderPrinterTest.java
index 574d298..c45f369 100644
--- a/tests/tests/util/src/android/util/cts/StringBuilderPrinterTest.java
+++ b/tests/tests/util/src/android/util/cts/StringBuilderPrinterTest.java
@@ -17,27 +17,8 @@
 
 import android.test.AndroidTestCase;
 import android.util.StringBuilderPrinter;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(StringBuilderPrinter.class)
 public class StringBuilderPrinterTest extends AndroidTestCase{
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test methods: StringBuilderPrinter and println",
-            method = "StringBuilderPrinter",
-            args = {java.lang.StringBuilder.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test methods: StringBuilderPrinter and println",
-            method = "println",
-            args = {java.lang.String.class}
-        )
-    })
     public void testStringBuilderPrinter(){
         StringBuilder strBuilder = new StringBuilder("Hello");
         StringBuilderPrinter strBuilderPrinter = new StringBuilderPrinter(strBuilder);
diff --git a/tests/tests/util/src/android/util/cts/TimeUtilsTest.java b/tests/tests/util/src/android/util/cts/TimeUtilsTest.java
index 47e37a0..f1014db 100644
--- a/tests/tests/util/src/android/util/cts/TimeUtilsTest.java
+++ b/tests/tests/util/src/android/util/cts/TimeUtilsTest.java
@@ -16,10 +16,6 @@
 package android.util.cts;
 
 import dalvik.annotation.KnownFailure;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.util.TimeUtils;
 
@@ -28,16 +24,7 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(TimeUtils.class)
 public class TimeUtilsTest extends TestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: getTimeZone",
-            method = "getTimeZone",
-            args = {int.class, boolean.class, long.class, String.class}
-        )
-    })
     public void testUnitedStates() throws Exception {
         String[] mainstream = new String[] {
             "America/New_York", // Eastern
@@ -63,14 +50,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: getTimeZone",
-            method = "getTimeZone",
-            args = {int.class, boolean.class, long.class, String.class}
-        )
-    })
     public void testWeirdUnitedStates() throws Exception {
         String[] weird = new String[] {
             "America/Phoenix", // Mountain, no DST
@@ -88,14 +67,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: getTimeZone",
-            method = "getTimeZone",
-            args = {int.class, boolean.class, long.class, String.class}
-        )
-    })
     public void testOld() throws Exception {
         String[] old = new String[] {
             "America/Indiana/Indianapolis", // Eastern, formerly no DST
@@ -112,14 +83,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: getTimeZone",
-            method = "getTimeZone",
-            args = {int.class, boolean.class, long.class, String.class}
-        )
-    })
     @KnownFailure(value="bug 2323433, needs investigation")
     public void testWorld() throws Exception {
         String[] world = new String[] {
@@ -443,14 +406,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: getTimeZone",
-            method = "getTimeZone",
-            args = {int.class, boolean.class, long.class, String.class}
-        )
-    })
     public void testWorldWeird() throws Exception {
         String[] world = new String[] {
             // Distinguisable from Sydney only when DST not in effect
diff --git a/tests/tests/util/src/android/util/cts/TimingLoggerTest.java b/tests/tests/util/src/android/util/cts/TimingLoggerTest.java
index e616468..4fab540 100644
--- a/tests/tests/util/src/android/util/cts/TimingLoggerTest.java
+++ b/tests/tests/util/src/android/util/cts/TimingLoggerTest.java
@@ -15,51 +15,14 @@
  */
 package android.util.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.test.AndroidTestCase;
 import android.util.TimingLogger;
 
-@TestTargetClass(TimingLogger.class)
 public class TimingLoggerTest extends AndroidTestCase{
     private static final String LOG_TAG = "TimingLoggerTest";
     private static final int SLEEPING_MSEC = 100;
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test TimingLogger",
-            method = "TimingLogger",
-            args = {java.lang.String.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test TimingLogger",
-            method = "addSplit",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test TimingLogger",
-            method = "dumpToLog",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test TimingLogger",
-            method = "reset",
-            args = {java.lang.String.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test TimingLogger",
-            method = "reset",
-            args = {}
-        )
-    })
     public void testTimingLogger() {
         TimingLogger timings = new TimingLogger(LOG_TAG, "testTimingLogger");
 
diff --git a/tests/tests/util/src/android/util/cts/TypedValueTest.java b/tests/tests/util/src/android/util/cts/TypedValueTest.java
index d3e7ec9..5cd7463 100644
--- a/tests/tests/util/src/android/util/cts/TypedValueTest.java
+++ b/tests/tests/util/src/android/util/cts/TypedValueTest.java
@@ -18,32 +18,15 @@
 
 
 import junit.framework.TestCase;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 import android.util.DisplayMetrics;
 import android.util.TypedValue;
 
-@TestTargetClass(TypedValue.class)
 public class TypedValueTest extends TestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor(s) of {@link TypedValue}",
-        method = "TypedValue",
-        args = {}
-    )
     public void testConstructor() {
         new TypedValue();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getFloat().",
-        method = "getFloat",
-        args = {}
-    )
     public void testGetFloat() {
         final float EXPECTED = Float.intBitsToFloat(99);
         TypedValue tv = new TypedValue();
@@ -51,20 +34,6 @@
         assertEquals(EXPECTED, tv.getFloat());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test complexToDimension().",
-            method = "complexToDimension",
-            args = {int.class, DisplayMetrics.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test complexToDimensionPixelOffset().",
-            method = "complexToDimensionPixelOffset",
-            args = {int.class, DisplayMetrics.class}
-        )
-    })
     public void testComplexToDimension() {
         DisplayMetrics dm = new DisplayMetrics();
         dm.density = 1.1f;
@@ -79,12 +48,6 @@
         assertEquals((int)EXPECTED, TypedValue.complexToDimensionPixelOffset(10, dm));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test setTo().",
-        method = "setTo",
-        args = {TypedValue.class}
-    )
     public void testSetTo() {
         TypedValue tv1 = new TypedValue();
         TypedValue tv2 = new TypedValue();
@@ -105,12 +68,6 @@
         assertEquals(5, tv2.type);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getFraction().",
-        method = "getFraction",
-        args = {float.class, float.class}
-    )
     public void testGetFraction() {
         // set the expected value
         final float EXPECTED = TypedValue.complexToFraction(10, 1.1f, 2.1f) ;
@@ -119,12 +76,6 @@
         assertEquals(EXPECTED, tv.getFraction(1.1f, 2.1f));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test complexToDimensionPixelSize().",
-        method = "complexToDimensionPixelSize",
-        args = {int.class, DisplayMetrics.class}
-    )
     public void testComplexToDimensionPixelSize() {
         DisplayMetrics dm = new DisplayMetrics();
         dm.density = 1.1f;
@@ -144,14 +95,6 @@
 
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test complexToFraction().",
-            method = "complexToFraction",
-            args = {int.class, float.class, float.class}
-        )
-    })
     public void testComplexToFraction() {
 
         final int data1 = 1;
@@ -167,12 +110,6 @@
         assertEquals(expected2, TypedValue.complexToFraction(data2, base2, pbase2));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test toString().",
-        method = "toString",
-        args = {}
-    )
     public void testToString() {
 
         TypedValue tv = new TypedValue();
@@ -188,12 +125,6 @@
         assertNotNull(tv.toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test applyDimension().",
-        method = "applyDimension",
-        args = {int.class, float.class, DisplayMetrics.class}
-    )
     public void testApplyDimension() {
         DisplayMetrics dm = new DisplayMetrics();
         dm.density = 1.1f;
@@ -216,12 +147,6 @@
         assertEquals(0.0f, TypedValue.applyDimension(-1, 10, dm));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test coerceToString().",
-        method = "coerceToString",
-        args = {}
-    )
     public void testCoerceToString1() {
         TypedValue tv = new TypedValue();
         tv.assetCookie = 1;
@@ -237,12 +162,6 @@
         assertNotNull(tv.coerceToString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test coerceToString().",
-        method = "coerceToString",
-        args = {int.class, int.class}
-    )
     public void testCoerceToString2() {
         assertNull(TypedValue.coerceToString(TypedValue.TYPE_NULL, 10));
         assertNotNull(TypedValue.coerceToString(TypedValue.TYPE_REFERENCE, 10));
@@ -259,12 +178,6 @@
         assertNull(TypedValue.coerceToString(-1, 10));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test complexToFloat().",
-        method = "complexToFloat",
-        args = {int.class}
-    )
     public void testComplexToFloat() {
 
         final int complex1 = 1;
@@ -278,12 +191,6 @@
         assertEquals(expected3, TypedValue.complexToFloat(complex3));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getDimension().",
-        method = "getDimension",
-        args = {DisplayMetrics.class}
-    )
     public void testGetDimension() {
         DisplayMetrics dm = new DisplayMetrics();
         dm.density = 1.1f;
@@ -299,12 +206,6 @@
         assertEquals(TypedValue.complexToDimension(10, dm), tv.getDimension(dm));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test complexToDimensionNoisy().",
-        method = "complexToDimensionNoisy",
-        args = {int.class, DisplayMetrics.class}
-    )
     public void testComplexToDimensionNoisy() {
         DisplayMetrics dm = new DisplayMetrics();
         dm.density = 1.1f;
diff --git a/tests/tests/util/src/android/util/cts/XmlEncodingTest.java b/tests/tests/util/src/android/util/cts/XmlEncodingTest.java
index 7e5ceb5..4c0c34b 100644
--- a/tests/tests/util/src/android/util/cts/XmlEncodingTest.java
+++ b/tests/tests/util/src/android/util/cts/XmlEncodingTest.java
@@ -29,16 +29,11 @@
 import org.xml.sax.Locator;
 import org.xml.sax.SAXException;
 
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
 /**
  * TestCases for android.util.Xml.Encoding.
  */
 //FIXME: This is a duplicated testcase. Need to improve the coverage tool in future.
-@TestTargetClass(Xml.Encoding.class)
 public class XmlEncodingTest extends TestCase {
 
     private static final String STR_ISO_8859_1 = "ISO-8859-1";
@@ -73,20 +68,6 @@
     private static final String STR_START_TAG = "start:";
     private static final String STR_CHARACTERS_TAG = "characters:";
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test valueOf(String name).",
-            method = "valueOf",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test valueOf(String name).",
-            method = "values",
-            args = {}
-        )
-    })
     public void testValueOf() {
 
         // test US-ASCII
diff --git a/tests/tests/util/src/android/util/cts/XmlTest.java b/tests/tests/util/src/android/util/cts/XmlTest.java
index d72901a..5ac8aca 100644
--- a/tests/tests/util/src/android/util/cts/XmlTest.java
+++ b/tests/tests/util/src/android/util/cts/XmlTest.java
@@ -30,10 +30,6 @@
 import android.util.Xml;
 import android.util.Xml.Encoding;
 
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
 import java.io.BufferedReader;
 import java.io.ByteArrayInputStream;
@@ -49,7 +45,6 @@
 /**
  * TestCase for android.util.Xml. 
  */
-@TestTargetClass(Xml.class)
 public class XmlTest extends AndroidTestCase {
 
     private static final String STR_INVALIDATE_EN_CODING = "invalidateEnCoding";
@@ -89,22 +84,10 @@
     final String sourceStr = "<" + TAG_TEST + "><" + TAG_SON + " " + ATT_NAME + "=\"" + STR_ABC
             + "\"/></" + TAG_TEST + ">";
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor(s) of Xml.",
-        method = "Xml",
-        args = {}
-    )
     public void testConstructor() {
         new Xml();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test parse(String xml, ContentHandler contentHandler).",
-        method = "parse",
-        args = {java.lang.String.class, org.xml.sax.ContentHandler.class}
-    )
     public void testParseStringContentHandler() {
         final String xmlStr = "<Test><Son name=\"abc\"/></Test>";
         DefaultContentHandler dc = new DefaultContentHandler();
@@ -204,12 +187,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test parse(Reader in, ContentHandler contentHandler).",
-        method = "parse",
-        args = {java.io.Reader.class, org.xml.sax.ContentHandler.class}
-    )
     public void testParseReaderContentHander() {
         ByteArrayOutputStream bout = new ByteArrayOutputStream();
         DataOutputStream dout = new DataOutputStream(bout);
@@ -258,13 +235,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test parse(InputStream in, Encoding encoding, ContentHandler contentHandler).",
-        method = "parse",
-        args = {java.io.InputStream.class, android.util.Xml.Encoding.class, 
-                org.xml.sax.ContentHandler.class}
-    )
     public void testParseInputStreamEncodingContentHandler() {
 
         // test US-ASCII
@@ -396,20 +366,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test newSerializer() and newPullParser().",
-            method = "newSerializer",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test newSerializer() and newPullParser().",
-            method = "newPullParser",
-            args = {}
-        )
-    })
     public void testNewSerializer() {
         XmlSerializer xs = Xml.newSerializer();
         assertNotNull(xs);
@@ -418,12 +374,6 @@
         assertNotNull(xp);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test findEncodingByName(String encodingName).",
-        method = "findEncodingByName",
-        args = {java.lang.String.class}
-    )
     public void testFindEncodingByName() {
 
         try {
@@ -443,12 +393,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test asAttributeSet(XmlPullParser parser).",
-        method = "asAttributeSet",
-        args = {org.xmlpull.v1.XmlPullParser.class}
-    )
     public void testAsAttributeSet() {
         XmlResourceParser xp = getContext().getResources().getLayout(
                 com.android.cts.stub.R.layout.xml_test);
diff --git a/tests/tests/view/Android.mk b/tests/tests/view/Android.mk
index 037ae9a..4d82d91 100644
--- a/tests/tests/view/Android.mk
+++ b/tests/tests/view/Android.mk
@@ -29,5 +29,4 @@
 
 LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
 
-include $(BUILD_PACKAGE)
-
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/view/src/android/view/animation/cts/AccelerateDecelerateInterpolatorTest.java b/tests/tests/view/src/android/view/animation/cts/AccelerateDecelerateInterpolatorTest.java
index b14328e..20ddb83 100644
--- a/tests/tests/view/src/android/view/animation/cts/AccelerateDecelerateInterpolatorTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/AccelerateDecelerateInterpolatorTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.app.Activity;
 import android.content.res.XmlResourceParser;
@@ -36,7 +32,6 @@
 import android.view.animation.Interpolator;
 import android.view.animation.Transformation;
 
-@TestTargetClass(AccelerateDecelerateInterpolator.class)
 public class AccelerateDecelerateInterpolatorTest
         extends ActivityInstrumentationTestCase2<AnimationTestStubActivity> {
 
@@ -55,18 +50,6 @@
         mActivity = getActivity();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AccelerateDecelerateInterpolator",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AccelerateDecelerateInterpolator",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        )
-    })
     public void testConstructor() {
         new AccelerateDecelerateInterpolator();
 
@@ -76,14 +59,6 @@
         new AccelerateDecelerateInterpolator(mActivity, attrs);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test case will accelerate then decelerate AlphaAnimation. It will change"
-              + " alpha from 0.0 to 1.0, the rate of changing alpha starts out slowly, then"
-              + " accelerates to the middle, and then decelerates to the end",
-        method = "getInterpolation",
-        args = {float.class}
-    )
     public void testAccelerateDecelerateInterpolator() {
         final View animWindow = mActivity.findViewById(R.id.anim_window);
 
@@ -130,12 +105,6 @@
         assertTrue(delta3 > delta4);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getInterpolation(float), call it directly.",
-        method = "getInterpolation",
-        args = {float.class}
-    )
     public void testGetInterpolation() {
         Interpolator interpolator = new AccelerateDecelerateInterpolator();
 
diff --git a/tests/tests/view/src/android/view/animation/cts/AccelerateInterpolatorTest.java b/tests/tests/view/src/android/view/animation/cts/AccelerateInterpolatorTest.java
index eb7154a..c009533 100644
--- a/tests/tests/view/src/android/view/animation/cts/AccelerateInterpolatorTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/AccelerateInterpolatorTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.app.Activity;
 import android.content.res.XmlResourceParser;
@@ -36,7 +32,6 @@
 import android.view.animation.Interpolator;
 import android.view.animation.Transformation;
 
-@TestTargetClass(AccelerateInterpolator.class)
 public class AccelerateInterpolatorTest
         extends ActivityInstrumentationTestCase2<AnimationTestStubActivity> {
 
@@ -56,23 +51,6 @@
         mActivity = getActivity();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AccelerateInterpolator",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AccelerateInterpolator",
-            args = {float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AccelerateInterpolator",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        )
-    })
     public void testConstructor() {
         new AccelerateInterpolator();
 
@@ -83,13 +61,6 @@
         new AccelerateInterpolator(mActivity, attrs);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test case will accelerate AlphaAnimation. It will change alpha from 0.1 to"
-              + " 0.9, the rate of change alpha starts out slowly and then accelerates.",
-        method = "getInterpolation",
-        args = {float.class}
-    )
     public void testAccelerateInterpolator() {
         final View animWindow = mActivity.findViewById(R.id.anim_window);
 
@@ -177,12 +148,6 @@
         assertTrue(delta5 < delta1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getInterpolation(float), call it directly",
-        method = "getInterpolation",
-        args = {float.class}
-    )
     public void testGetInterpolation() {
         final float input = 0.25f;
         Interpolator interpolator1 = new AccelerateInterpolator(1.0f);
diff --git a/tests/tests/view/src/android/view/animation/cts/AlphaAnimationTest.java b/tests/tests/view/src/android/view/animation/cts/AlphaAnimationTest.java
index 74df1b5..bcd4ccd 100644
--- a/tests/tests/view/src/android/view/animation/cts/AlphaAnimationTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/AlphaAnimationTest.java
@@ -22,32 +22,13 @@
 import android.util.Xml;
 import android.view.animation.AlphaAnimation;
 import android.view.animation.Transformation;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
 import com.android.cts.stub.R;
 
 /**
  * Test {@link AlphaAnimation}.
  */
-@TestTargetClass(AlphaAnimation.class)
 public class AlphaAnimationTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link AlphaAnimation}",
-            method = "AlphaAnimation",
-            args = {float.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link AlphaAnimation}",
-            method = "AlphaAnimation",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        )
-    })
     public void testConstructor() {
         XmlResourceParser parser = mContext.getResources().getAnimation(R.anim.alpha);
         AttributeSet attrs = Xml.asAttributeSet(parser);
@@ -56,38 +37,16 @@
         new AlphaAnimation(0.0f, 1.0f);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link AlphaAnimation#willChangeBounds()}. This method always" +
-                    " returns false, a alpha animation will not affect the bounds",
-            method = "willChangeBounds",
-            args = {}
-        )
-    })
     public void testWillChangeBounds() {
         AlphaAnimation animation = new AlphaAnimation(mContext, null);
         assertFalse(animation.willChangeBounds());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test {@link AlphaAnimation#willChangeTransformationMatrix()}. This method" +
-                " always returns false, a alpha animation will not affect the matrix",
-        method = "willChangeTransformationMatrix",
-        args = {}
-    )
     public void testWillChangeTransformationMatrix() {
         AlphaAnimation animation = new AlphaAnimation(0.0f, 0.5f);
         assertFalse(animation.willChangeTransformationMatrix());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link AlphaAnimation#applyTransformation(float, Transformation)}",
-        method = "applyTransformation",
-        args = {float.class, android.view.animation.Transformation.class}
-    )
     public void testApplyTransformation() {
         MyAlphaAnimation animation = new MyAlphaAnimation(0.0f, 1.0f);
         Transformation transformation = new Transformation();
diff --git a/tests/tests/view/src/android/view/animation/cts/AnimationSetTest.java b/tests/tests/view/src/android/view/animation/cts/AnimationSetTest.java
index 8c8c5aa..b42c239 100644
--- a/tests/tests/view/src/android/view/animation/cts/AnimationSetTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/AnimationSetTest.java
@@ -35,13 +35,7 @@
 
 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;
 
-@TestTargetClass(AnimationSet.class)
 public class AnimationSetTest
         extends ActivityInstrumentationTestCase2<AnimationTestStubActivity> {
 
@@ -66,18 +60,6 @@
         mActivity = getActivity();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AnimationSet",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AnimationSet",
-            args = {Context.class, AttributeSet.class}
-        )
-    })
     public void testConstructor() {
         new AnimationSet(true);
 
@@ -89,13 +71,6 @@
         new AnimationSet(mActivity, attr);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "initialize",
-        args = {int.class, int.class, int.class, int.class}
-    )
-    @ToBeFixed( bug = "1695243", explanation = "Android API javadocs are incomplete."
-            +"It does not only initialize this animation with the dimensions.")
     public void testInitialize() {
         final AnimationSet animationSet = createAnimationSet();
         animationSet.setDuration(ANIMATIONSET_DURATION);
@@ -133,11 +108,6 @@
         return animationSet;
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setFillAfter",
-        args = {boolean.class}
-    )
     public void testSetFillAfter() {
         final AnimationSet animationSet = createAnimationSet();
         assertFalse(animationSet.getFillAfter());
@@ -155,11 +125,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setFillBefore",
-        args = {boolean.class}
-    )
     public void testSetFillBefore() {
         final AnimationSet animationSet = createAnimationSet();
         assertTrue(animationSet.getFillBefore());
@@ -177,18 +142,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDuration",
-            args = {long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDuration",
-            args = {}
-        )
-    })
     public void testAccessDuration() {
         final AnimationSet animationSet = createAnimationSet();
         assertEquals(LONG_CHILD_DURATION, animationSet.getDuration());
@@ -203,11 +156,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "restrictDuration",
-        args = {long.class}
-    )
     public void testRestrictDuration() {
         final AnimationSet animationSet = new AnimationSet(false);
         Animation child = null;
@@ -240,11 +188,6 @@
         assertTrue(originChildRepeatCount[2] > children.get(2).getRepeatCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "computeDurationHint",
-        args = {}
-    )
     public void testComputeDurationHint() {
         final AnimationSet animationSet = createAnimationSet();
         final List<Animation> children = animationSet.getAnimations();
@@ -255,11 +198,6 @@
         assertEquals(expectedDuration, animationSet.computeDurationHint());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "scaleCurrentDuration",
-        args = {float.class}
-    )
     public void testScaleCurrentDuration() {
         final AnimationSet animationSet = createAnimationSet();
         List<Animation> children = animationSet.getAnimations();
@@ -276,18 +214,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRepeatMode",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRepeatMode",
-            args = {}
-        )
-    })
     public void testAccessRepeatMode() {
         final AnimationSet animationSet = createAnimationSet();
         animationSet.setRepeatMode(Animation.RESTART);
@@ -307,23 +233,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setStartOffset",
-            args = {long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStartOffset",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "reset",
-            args = {}
-        )
-    })
     public void testAccessStartOffset() {
         final AnimationSet animationSet = createAnimationSet();
         assertEquals(0, animationSet.getStartOffset());
@@ -351,18 +260,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setStartTime",
-            args = {long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStartTime",
-            args = {}
-        )
-    })
     public void testAccessStartTime() {
         final AnimationSet animationSet = createAnimationSet();
         final long[] originChildStartTime = {1000, 2000, 3000};
@@ -384,11 +281,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getTransformation",
-        args = {long.class, Transformation.class}
-    )
     public void testGetTransformation() {
         final View animWindowParent = mActivity.findViewById(R.id.anim_window_parent);
         final View animWindow = mActivity.findViewById(R.id.anim_window);
@@ -433,18 +325,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addAnimation",
-            args = {Animation.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAnimations",
-            args = {}
-        )
-    })
     public void testAccessAnimations() {
         final AnimationSet animationSet = new AnimationSet(true);
         final Animation animation1 = new AlphaAnimation(0.0f, 1.0f);
@@ -461,18 +341,6 @@
         assertSame(animation3, children.get(2));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "willChangeTransformationMatrix",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "willChangeBounds",
-            args = {}
-        )
-    })
     public void testWillChangeTransformationMatrix() {
         final AnimationSet animationSet = new AnimationSet(true);
         assertFalse(animationSet.willChangeTransformationMatrix());
@@ -490,11 +358,6 @@
         assertTrue(animationSet.willChangeBounds());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clone",
-        args = {}
-    )
     public void testClone() throws CloneNotSupportedException {
         final MyAnimationSet animationSet = new MyAnimationSet(false);
         final Animation alpha = new AlphaAnimation(0.0f, 1.0f);
diff --git a/tests/tests/view/src/android/view/animation/cts/AnimationTest.java b/tests/tests/view/src/android/view/animation/cts/AnimationTest.java
index 6343da6..a76951c 100644
--- a/tests/tests/view/src/android/view/animation/cts/AnimationTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/AnimationTest.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 android.app.Activity;
 import android.content.res.XmlResourceParser;
+import android.cts.util.PollingCheck;
 import android.test.ActivityInstrumentationTestCase2;
 import android.util.AttributeSet;
 import android.util.Xml;
@@ -42,7 +38,6 @@
 /**
  * Test {@link Animation}.
  */
-@TestTargetClass(Animation.class)
 public class AnimationTest extends ActivityInstrumentationTestCase2<AnimationTestStubActivity> {
     private static final float ALPHA_DELTA = 0.001f;
 
@@ -65,20 +60,6 @@
         mActivity = getActivity();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link Animation}",
-            method = "Animation",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link Animation}",
-            method = "Animation",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        )
-    })
     public void testConstructor() {
         XmlResourceParser parser = mActivity.getResources().getAnimation(R.anim.alpha);
         AttributeSet attrs = Xml.asAttributeSet(parser);
@@ -89,35 +70,6 @@
         };
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link Animation#ensureInterpolator()}",
-            method = "ensureInterpolator",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link Animation#getInterpolator()}",
-            method = "getInterpolator",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link Animation#setInterpolator(Context, int)}",
-            method = "setInterpolator",
-            args = {android.content.Context.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link Animation#setInterpolator(Interpolator)}",
-            method = "setInterpolator",
-            args = {android.view.animation.Interpolator.class}
-        )
-    })
-    @ToBeFixed(bug = "1561186", explanation = "javadoc of setInterpolator(Interpolator) " +
-            "conflicts with ensureInterpolator()'s. can not get the specific default " +
-            "Interpolator type")
     public void testAccessInterpolator() {
         // check default interpolator
         MyAnimation myAnimation = new MyAnimation();
@@ -144,20 +96,6 @@
         assertTrue(interpolator instanceof AccelerateInterpolator);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "check default fillAfter",
-            method = "getFillAfter",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "check default fillBefore",
-            method = "getFillBefore",
-            args = {}
-        )
-    })
     public void testDefaultFill() {
         Animation animation = new Animation() {
         };
@@ -165,48 +103,6 @@
         assertFalse(animation.getFillAfter());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link Animation#getFillAfter()}",
-            method = "getFillAfter",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link Animation#setFillAfter(boolean)}",
-            method = "setFillAfter",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link Animation#getFillBefore()}",
-            method = "getFillBefore",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link Animation#setFillBefore(boolean)}",
-            method = "setFillBefore",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link Animation#isFillEnabled()}",
-            method = "isFillEnabled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link Animation#setFillEnabled(boolean)}",
-            method = "setFillEnabled",
-            args = {boolean.class}
-        )
-    })
-    @ToBeFixed(bug = "1698355", explanation = "When isFillEnabled() is false," +
-            " it's the same as setting fillBefore and fillAfter to true. But javadoc of" +
-            " setFillEnabled(boolean) says \"fillBefore and fillAfter are ignored\"," +
-            " it's unclear.")
     public void testAccessFill() {
         View animWindow = mActivity.findViewById(R.id.anim_window);
         // XML file of R.anim.accelerate_alpha
@@ -273,12 +169,6 @@
         assertEquals(0.9f, alpha, ALPHA_DELTA);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link Animation#computeDurationHint()}",
-        method = "computeDurationHint",
-        args = {}
-    )
     public void testComputeDurationHint() {
         // start offset is 0, duration is 2000, repeat count is 0.
         Animation animation = AnimationUtils.loadAnimation(mActivity, R.anim.decelerate_alpha);
@@ -293,44 +183,6 @@
         assertEquals(8400, animation.computeDurationHint());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link Animation#getRepeatMode()}. It cannot be set in XML",
-            method = "getRepeatMode",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link Animation#setRepeatMode(int)}. It cannot be set in XML",
-            method = "setRepeatMode",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link Animation#getRepeatCount()}.",
-            method = "getRepeatCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link Animation#setRepeatCount(int)}.",
-            method = "setRepeatCount",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link Animation#getDuration()}",
-            method = "getDuration",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link Animation#setDuration(long)}.",
-            method = "setDuration",
-            args = {long.class}
-        )
-    })
     public void testRepeatAnimation() {
         // check default repeatMode
         Animation animation = new Animation() {
@@ -355,7 +207,7 @@
         // test repeat mode REVERSE
         anim.setRepeatCount(1);
         anim.setRepeatMode(Animation.REVERSE);
-        // we have to DelayedCheck the animation status on test thread,
+        // we have to PollingCheck the animation status on test thread,
         // it cannot be done on UI thread, so we invoke runOnMainSync method here.
         getInstrumentation().runOnMainSync(new Runnable() {
             public void run() {
@@ -364,7 +216,7 @@
         });
 
         // check whether animation has started
-        new DelayedCheck() {
+        new PollingCheck() {
             @Override
             protected boolean check() {
                 return anim.hasStarted();
@@ -386,7 +238,7 @@
 
         // wait for animation has ended.
         // timeout is larger than duration, in case the system is sluggish
-        new DelayedCheck(duration * 2 + 1000) {
+        new PollingCheck(duration * 2 + 1000) {
             @Override
             protected boolean check() {
                 return anim.hasEnded();
@@ -414,7 +266,7 @@
 
         // test repeat mode RESTART
         anim.setRepeatMode(Animation.RESTART);
-        // we have to DelayedCheck the animation status on test thread,
+        // we have to PollingCheck the animation status on test thread,
         // it cannot be done on UI thread, so we invoke runOnMainSync method here.
         getInstrumentation().runOnMainSync(new Runnable() {
             public void run() {
@@ -423,7 +275,7 @@
         });
 
         // check whether animation has started
-        new DelayedCheck() {
+        new PollingCheck() {
             @Override
             protected boolean check() {
                 return anim.hasStarted();
@@ -445,7 +297,7 @@
 
         // wait for animation has ended.
         // timeout is larger than duration, in case the system is sluggish
-        new DelayedCheck(duration * 2 + 1000) {
+        new PollingCheck(duration * 2 + 1000) {
             @Override
             protected boolean check() {
                 return anim.hasEnded();
@@ -472,20 +324,6 @@
         assertTrue(delta3 > delta4);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link Animation#getStartOffset()}",
-            method = "getStartOffset",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link Animation#setStartOffset(long)}",
-            method = "setStartOffset",
-            args = {long.class}
-        )
-    })
     public void testAccessStartOffset() {
         final long startOffset = 800;
         // check default startOffset
@@ -529,50 +367,6 @@
         assertTrue(alpha4 > 0.1f);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test run an accelerate alpha animation",
-            method = "getStartTime",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test run an accelerate alpha animation",
-            method = "setStartTime",
-            args = {long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test run an accelerate alpha animation",
-            method = "hasStarted",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test run an accelerate alpha animation",
-            method = "hasEnded",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test run an accelerate alpha animation",
-            method = "reset",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test run an accelerate alpha animation",
-            method = "startNow",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test run an accelerate alpha animation",
-            method = "getTransformation",
-            args = {long.class, android.view.animation.Transformation.class}
-        )
-    })
     public void testRunAccelerateAlpha() {
         // check default startTime
         Animation animation = new Animation() {
@@ -600,21 +394,6 @@
         assertEquals(currentTime, anim.getStartTime(), 100);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link Animation#getTransformation(long, Transformation)}",
-            method = "getTransformation",
-            args = {long.class, android.view.animation.Transformation.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link Animation#applyTransformation(float, Transformation)}",
-            method = "applyTransformation",
-            args = {float.class, android.view.animation.Transformation.class}
-        )
-    })
-    @ToBeFixed(bug = "1698355", explanation = "getTransformation is very poorly documented.")
     public void testGetTransformation() {
         final View animWindow = mActivity.findViewById(R.id.anim_window);
 
@@ -627,7 +406,7 @@
         final Animation anim = AnimationUtils.loadAnimation(mActivity, R.anim.accelerate_alpha);
         assertFalse(anim.hasStarted());
 
-        // we have to DelayedCheck the animation status on test thread,
+        // we have to PollingCheck the animation status on test thread,
         // it cannot be done on UI thread, so we invoke runOnMainSync method here.
         getInstrumentation().runOnMainSync(new Runnable() {
             public void run() {
@@ -636,7 +415,7 @@
         });
 
         // check whether animation has started
-        new DelayedCheck() {
+        new PollingCheck() {
             @Override
             protected boolean check() {
                 return anim.hasStarted();
@@ -662,7 +441,7 @@
 
         // wait for animation has ended.
         // timeout is larger than duration, in case the system is sluggish
-        new DelayedCheck(2000) {
+        new PollingCheck(2000) {
             @Override
             protected boolean check() {
                 return anim.hasEnded();
@@ -683,20 +462,6 @@
         assertTrue(delta3 < delta4);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link Animation#getZAdjustment()}",
-            method = "getZAdjustment",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link Animation#setZAdjustment(int)}",
-            method = "setZAdjustment",
-            args = {int.class}
-        )
-    })
     public void testAccessZAdjustment() {
         // check default zAdjustment
         Animation animation = new Animation() {
@@ -713,20 +478,6 @@
         assertEquals(Animation.ZORDER_BOTTOM, animation.getZAdjustment());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link Animation#initialize(int, int, int, int)}}",
-            method = "initialize",
-            args = {int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link Animation#isInitialized()}",
-            method = "isInitialized",
-            args = {}
-        )
-    })
     public void testInitialize() {
         Animation animation = new Animation() {
         };
@@ -736,12 +487,6 @@
         assertTrue(animation.isInitialized());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link Animation#resolveSize(int, float, int, int)}",
-        method = "resolveSize",
-        args = {int.class, float.class, int.class, int.class}
-    )
     public void testResolveSize() {
         MyAnimation myAnimation = new MyAnimation();
 
@@ -759,12 +504,6 @@
         assertEquals(10.0f, myAnimation.resolveSize(unknownType, 10.0f, 3, 4));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link Animation#restrictDuration(long)}",
-        method = "restrictDuration",
-        args = {long.class}
-    )
     public void testRestrictDuration() {
         Animation animation = new Animation() {
         };
@@ -787,12 +526,6 @@
         assertEquals(1, animation.getRepeatCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link Animation#scaleCurrentDuration(float)}",
-        method = "scaleCurrentDuration",
-        args = {float.class}
-    )
     public void testScaleCurrentDuration() {
         Animation animation = new Animation() {
         };
@@ -810,20 +543,6 @@
         assertEquals(-10, animation.getDuration());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link Animation#setAnimationListener(AnimationListener)}",
-            method = "setAnimationListener",
-            args = {android.view.animation.Animation.AnimationListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link Animation#getTransformation(long, Transformation)}",
-            method = "getTransformation",
-            args = {long.class, android.view.animation.Transformation.class}
-        )
-    })
     public void testSetAnimationListener() {
         final View animWindow = mActivity.findViewById(R.id.anim_window);
 
@@ -876,12 +595,6 @@
         assertFalse(listener.hasAnimationEnded());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link Animation#start()}",
-        method = "start",
-        args = {}
-    )
     public void testStart() {
         Animation animation = AnimationUtils.loadAnimation(mActivity, R.anim.accelerate_alpha);
         animation.setStartTime(0);
@@ -890,12 +603,6 @@
         assertEquals(Animation.START_ON_FIRST_FRAME, animation.getStartTime());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link Animation#startNow()}",
-        method = "startNow",
-        args = {}
-    )
     public void testStartNow() {
         Animation animation = AnimationUtils.loadAnimation(mActivity, R.anim.accelerate_alpha);
         animation.setStartTime(0);
@@ -905,12 +612,6 @@
         assertEquals(currentTime, animation.getStartTime(), 100);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link Animation#willChangeBounds()}, this method always returns true",
-        method = "willChangeBounds",
-        args = {}
-    )
     public void testWillChangeBounds() {
         Animation animation = new Animation() {
         };
@@ -918,13 +619,6 @@
         assertTrue(animation.willChangeBounds());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link Animation#willChangeTransformationMatrix()}," +
-                " this method always returns true",
-        method = "willChangeTransformationMatrix",
-        args = {}
-    )
     public void testWillChangeTransformationMatrix() {
         Animation animation = new Animation() {
         };
@@ -932,11 +626,6 @@
         assertTrue(animation.willChangeTransformationMatrix());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clone",
-        args = {}
-    )
     public void testClone() throws CloneNotSupportedException {
         MyAnimation myAnimation = new MyAnimation();
         myAnimation.setDuration(3000);
diff --git a/tests/tests/view/src/android/view/animation/cts/AnimationUtilsTest.java b/tests/tests/view/src/android/view/animation/cts/AnimationUtilsTest.java
index 8482efa..e2fe6f3 100644
--- a/tests/tests/view/src/android/view/animation/cts/AnimationUtilsTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/AnimationUtilsTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.Context;
 import android.test.ActivityInstrumentationTestCase2;
@@ -33,7 +29,6 @@
 import android.view.animation.Interpolator;
 import android.view.animation.LayoutAnimationController;
 
-@TestTargetClass(AnimationUtils.class)
 public class AnimationUtilsTest extends
         ActivityInstrumentationTestCase2<AnimationTestStubActivity> {
 
@@ -49,23 +44,6 @@
         mActivity = (AnimationTestStubActivity) getActivity();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "loadAnimation",
-            args = {Context.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "loadInterpolator",
-            args = {Context.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "loadLayoutAnimation",
-            args = {Context.class, int.class}
-        )
-    })
     public void testLoad() {
         // XML file of com.android.cts.stub.R.anim.anim_alpha
         // <alpha xmlns:android="http://schemas.android.com/apk/res/android"
@@ -96,23 +74,6 @@
         assertEquals(0.1f, controller.getDelay(), 0.001f);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "makeInAnimation",
-            args = {Context.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "makeOutAnimation",
-            args = {Context.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "makeInChildBottomAnimation",
-            args = {Context.class}
-        )
-    })
     public void testMakeAnimation() {
         Animation inAnimation = AnimationUtils.makeInAnimation(mActivity, true);
         assertNotNull(inAnimation);
@@ -123,11 +84,6 @@
         // TODO: How to assert these Animations.
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "currentAnimationTimeMillis",
-        args = {}
-    )
     public void testCurrentAnimationTimeMillis() {
         long time1 = AnimationUtils.currentAnimationTimeMillis();
         assertTrue(time1 > 0);
diff --git a/tests/tests/view/src/android/view/animation/cts/CycleInterpolatorTest.java b/tests/tests/view/src/android/view/animation/cts/CycleInterpolatorTest.java
index cff963f..56cb32c 100644
--- a/tests/tests/view/src/android/view/animation/cts/CycleInterpolatorTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/CycleInterpolatorTest.java
@@ -31,15 +31,10 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 /**
  * Test {@link CycleInterpolator}.
  */
-@TestTargetClass(CycleInterpolator.class)
 public class CycleInterpolatorTest
         extends ActivityInstrumentationTestCase2<AnimationTestStubActivity> {
 
@@ -59,18 +54,6 @@
         mActivity = getActivity();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "CycleInterpolator",
-            args = {float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "CycleInterpolator",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        )
-    })
     public void testConstructors() {
         new CycleInterpolator(1.0f);
 
@@ -209,11 +192,6 @@
         assertEquals(delta12, delta4, ALPHA_DELTA);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getInterpolation",
-        args = {float.class}
-    )
     public void testGetInterpolation() {
         CycleInterpolator cycleInterpolator = new CycleInterpolator(2.0f);
         final float out1 = cycleInterpolator.getInterpolation(0.0f);
diff --git a/tests/tests/view/src/android/view/animation/cts/DecelerateInterpolatorTest.java b/tests/tests/view/src/android/view/animation/cts/DecelerateInterpolatorTest.java
index 10f5887..5bae1f7 100644
--- a/tests/tests/view/src/android/view/animation/cts/DecelerateInterpolatorTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/DecelerateInterpolatorTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.app.Activity;
 import android.content.res.XmlResourceParser;
@@ -39,7 +35,6 @@
 /**
  * Test {@link DecelerateInterpolator}.
  */
-@TestTargetClass(DecelerateInterpolator.class)
 public class DecelerateInterpolatorTest
         extends ActivityInstrumentationTestCase2<AnimationTestStubActivity> {
 
@@ -59,26 +54,6 @@
         mActivity = getActivity();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link DecelerateInterpolator}",
-            method = "DecelerateInterpolator",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link DecelerateInterpolator}",
-            method = "DecelerateInterpolator",
-            args = {float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link DecelerateInterpolator}",
-            method = "DecelerateInterpolator",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        )
-    })
     public void testConstructor() {
         new DecelerateInterpolator();
 
@@ -89,13 +64,6 @@
         new DecelerateInterpolator(mActivity, attrs);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test case will decelerate AlphaAnimation. It will change alpha from 0.0 to"
-                + " 1.0, the rate of change alpha starts out quickly and then decelerates.",
-        method = "getInterpolation",
-        args = {float.class}
-    )
     public void testDecelerateInterpolator() {
         final View animWindow = mActivity.findViewById(R.id.anim_window);
 
@@ -183,12 +151,6 @@
         assertTrue(delta5 > delta1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link DecelerateInterpolator#getInterpolation(float)}.",
-        method = "getInterpolation",
-        args = {float.class}
-    )
     public void testGetInterpolation() {
         final float input = 0.25f;
         Interpolator interpolator1 = new DecelerateInterpolator(1.0f);
diff --git a/tests/tests/view/src/android/view/animation/cts/GridLayoutAnimationControllerTest.java b/tests/tests/view/src/android/view/animation/cts/GridLayoutAnimationControllerTest.java
index 0392366..80c40fa 100644
--- a/tests/tests/view/src/android/view/animation/cts/GridLayoutAnimationControllerTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/GridLayoutAnimationControllerTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.Context;
 import android.content.res.XmlResourceParser;
@@ -38,7 +34,6 @@
 import android.widget.AbsListView;
 import android.widget.GridView;
 
-@TestTargetClass(GridLayoutAnimationController.class)
 public class GridLayoutAnimationControllerTest
     extends ActivityInstrumentationTestCase2<GridLayoutAnimStubActivity> {
 
@@ -77,23 +72,6 @@
         mGridView = mActivity.getGridView();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "GridLayoutAnimationController",
-            args = {Context.class, AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "GridLayoutAnimationController",
-            args = {Animation.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "GridLayoutAnimationController",
-            args = {Animation.class, float.class, float.class}
-        )
-    })
     public void testConstructor() {
         XmlResourceParser parser = mActivity.getResources().getAnimation(
                 R.anim.accelerate_decelerate_alpha);
@@ -107,28 +85,6 @@
         new GridLayoutAnimationController(mDefaultAnimation, 0.5f, 0.5f);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getColumnDelay",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setColumnDelay",
-            args = {float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRowDelay",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRowDelay",
-            args = {float.class}
-        )
-    })
     public void testAccessDelay() throws InterruptedException {
         float delay = 1.5f;
         long maxDuration = 13000;
@@ -218,18 +174,6 @@
         assertTrue(alpha < 1.0f);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDirection",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDirection",
-            args = {int.class}
-        )
-    })
     public void testAccessDirection() throws InterruptedException {
         mController.setDirection(GridLayoutAnimationController.DIRECTION_BOTTOM_TO_TOP);
         assertEquals(GridLayoutAnimationController.DIRECTION_BOTTOM_TO_TOP,
@@ -322,11 +266,6 @@
         assertIsRunningAnimation(transformation3.getAlpha());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getDelayForView",
-        args = {View.class}
-    )
     public void testGetDelayForView() throws Throwable {
         Animation animation = AnimationUtils.loadAnimation(mActivity, R.anim.decelerate_alpha);
         animation.setFillAfter(true);
@@ -398,18 +337,6 @@
         return layoutParams;
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDirectionPriority",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDirectionPriority",
-            args = {int.class}
-        )
-    })
     public void testAccessDirectionPriority() throws InterruptedException {
         // Before setting DirectionPriority, childAnimation7 will be later than childAnimation2,
         // and childAnimation8 will be later than childAnimation3
@@ -474,11 +401,6 @@
         assertIsRunningAnimation(transformation2.getAlpha());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "willOverlap",
-        args = {}
-    )
     public void testWillOverlap() {
         GridLayoutAnimationController controller = new GridLayoutAnimationController(
                 mDefaultAnimation);
diff --git a/tests/tests/view/src/android/view/animation/cts/GridLayoutAnimationController_AnimationParametersTest.java b/tests/tests/view/src/android/view/animation/cts/GridLayoutAnimationController_AnimationParametersTest.java
index 050438d..5fa9217 100644
--- a/tests/tests/view/src/android/view/animation/cts/GridLayoutAnimationController_AnimationParametersTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/GridLayoutAnimationController_AnimationParametersTest.java
@@ -16,22 +16,13 @@
 
 package android.view.animation.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.test.AndroidTestCase;
 import android.view.animation.GridLayoutAnimationController;
 import android.view.animation.GridLayoutAnimationController.AnimationParameters;
 
-@TestTargetClass(AnimationParameters.class)
 public class GridLayoutAnimationController_AnimationParametersTest extends AndroidTestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "GridLayoutAnimationController.AnimationParameters",
-        args = {}
-    )
     public void testConstructor() {
         new GridLayoutAnimationController.AnimationParameters();
     }
diff --git a/tests/tests/view/src/android/view/animation/cts/LayoutAnimationControllerTest.java b/tests/tests/view/src/android/view/animation/cts/LayoutAnimationControllerTest.java
index c736bf8..cccf0a6 100644
--- a/tests/tests/view/src/android/view/animation/cts/LayoutAnimationControllerTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/LayoutAnimationControllerTest.java
@@ -18,11 +18,6 @@
 
 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 android.app.ListActivity;
 import android.content.Context;
@@ -44,7 +39,6 @@
 import android.widget.AbsListView;
 import android.widget.ListView;
 
-@TestTargetClass(LayoutAnimationController.class)
 public class LayoutAnimationControllerTest
         extends ActivityInstrumentationTestCase2<LayoutAnimStubActivity> {
 
@@ -77,18 +71,6 @@
         mController = new LayoutAnimationController(mDefaultAnimation, DEFAULT_DELAY);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getOrder",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOrder",
-            args = {int.class}
-        )
-    })
     public void testAccessOrder() throws InterruptedException {
 
         mController.setOrder(LayoutAnimationController.ORDER_NORMAL);
@@ -177,18 +159,6 @@
         assertEquals(1.0f, transformation3.getAlpha(), DELTA);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDelay",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDelay",
-            args = {float.class}
-        )
-    })
     public void testAccessDelay() throws InterruptedException {
         mController.setOrder(LayoutAnimationController.ORDER_NORMAL);
         float delay = 1.5f;
@@ -259,23 +229,6 @@
         assertTrue(alpha < 1.0f);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAnimation",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAnimation",
-            args = {Animation.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAnimation",
-            args = {Context.class, int.class}
-        )
-    })
     public void testAccessAnimation() throws InterruptedException {
         Animation animation = AnimationUtils.loadAnimation(mActivity, R.anim.decelerate_alpha);
         animation.setFillAfter(true);
@@ -347,23 +300,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInterpolator",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setInterpolator",
-            args = {Interpolator.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setInterpolator",
-            args = {Context.class, int.class}
-        )
-    })
     public void testAccessInterpolator() throws InterruptedException {
         DecelerateInterpolator interpolator = new DecelerateInterpolator(1.0f);
         mController.setInterpolator(interpolator);
@@ -393,23 +329,6 @@
         assertTrue(delta2 > delta1);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "LayoutAnimationController",
-            args = {Context.class, AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "LayoutAnimationController",
-            args = {Animation.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "LayoutAnimationController",
-            args = {Animation.class, float.class}
-        )
-    })
     public void testConstructor() {
         XmlResourceParser parser = mActivity.getResources().getAnimation(
                 R.anim.accelerate_decelerate_alpha);
@@ -420,11 +339,6 @@
         assertEquals(DEFAULT_DELAY, controller.getDelay());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getDelayForView",
-        args = {View.class}
-    )
     public void testGetDelayForView() throws Throwable {
         Animation animation = AnimationUtils.loadAnimation(mActivity, R.anim.decelerate_alpha);
         animation.setFillAfter(true);
@@ -466,11 +380,6 @@
         return layoutParams;
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getTransformedIndex",
-        args = {AnimationParameters.class}
-    )
     public void testGetTransformedIndex() {
         Animation animation = AnimationUtils.loadAnimation(mActivity, R.anim.decelerate_alpha);
         animation.setFillAfter(true);
@@ -497,11 +406,6 @@
         assertEquals(0, controller.getTransformedIndex(animationParams));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "start",
-        args = {}
-    )
     public void testStart() {
         Animation animation = new ScaleAnimation(0.0f, 10.0f, 0.0f, 20.0f);
         animation.setStartTime(500);
@@ -513,23 +417,12 @@
         assertEquals(Animation.START_ON_FIRST_FRAME, controller.getAnimation().getStartTime());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isDone",
-        args = {}
-    )
-    @ToBeFixed(bug = "1799434", explanation = "isDone() always return true")
     public void testIsDone() throws InterruptedException {
         AnimationTestUtils.assertRunController(getInstrumentation(), mListView, mController,
                 DEFAULT_MAX_DURATION);
         assertTrue(mController.isDone());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getAnimationForView",
-        args = {View.class}
-    )
     public void testGetAnimationForView() throws InterruptedException {
         Animation animation = AnimationUtils.loadAnimation(mActivity, R.anim.decelerate_alpha);
         animation.setFillAfter(true);
@@ -549,11 +442,6 @@
         assertEquals(2000, childAnimation3.getStartOffset());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "willOverlap",
-        args = {}
-    )
     public void testWillOverlap() {
         LayoutAnimationController controller = new LayoutAnimationController(mDefaultAnimation);
 
diff --git a/tests/tests/view/src/android/view/animation/cts/LayoutAnimationController_AnimationParametersTest.java b/tests/tests/view/src/android/view/animation/cts/LayoutAnimationController_AnimationParametersTest.java
index 258223e..21fd97b 100644
--- a/tests/tests/view/src/android/view/animation/cts/LayoutAnimationController_AnimationParametersTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/LayoutAnimationController_AnimationParametersTest.java
@@ -16,21 +16,12 @@
 
 package android.view.animation.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.test.AndroidTestCase;
 import android.view.animation.LayoutAnimationController;
 
-@TestTargetClass(LayoutAnimationController.AnimationParameters.class)
 public class LayoutAnimationController_AnimationParametersTest extends AndroidTestCase {
 
-    @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "LayoutAnimationController.AnimationParameters",
-            args = {}
-        )
     public void testConstructor() {
         new LayoutAnimationController.AnimationParameters();
     }
diff --git a/tests/tests/view/src/android/view/animation/cts/LinearInterpolatorTest.java b/tests/tests/view/src/android/view/animation/cts/LinearInterpolatorTest.java
index 523bf4f..ff9e734 100644
--- a/tests/tests/view/src/android/view/animation/cts/LinearInterpolatorTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/LinearInterpolatorTest.java
@@ -28,15 +28,10 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 /**
  * Test {@link LinearInterpolator}.
  */
-@TestTargetClass(LinearInterpolator.class)
 public class LinearInterpolatorTest extends ActivityInstrumentationTestCase2<AnimationTestStubActivity> {
 
     private Activity mActivity;
@@ -56,28 +51,11 @@
         mActivity = getActivity();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "LinearInterpolator",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "LinearInterpolator",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        )
-    })
     public void testConstructor() {
         new LinearInterpolator();
         new LinearInterpolator(mActivity, null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getInterpolation",
-        args = {float.class}
-    )
     public void testGetInterpolation() {
         LinearInterpolator interpolator = new LinearInterpolator();
         final float delta1 = interpolator.getInterpolation(0.1f)
diff --git a/tests/tests/view/src/android/view/animation/cts/RotateAnimationTest.java b/tests/tests/view/src/android/view/animation/cts/RotateAnimationTest.java
index a6d99c1..0bc7ab0 100644
--- a/tests/tests/view/src/android/view/animation/cts/RotateAnimationTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/RotateAnimationTest.java
@@ -30,12 +30,7 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(android.view.animation.RotateAnimation.class)
 public class RotateAnimationTest
         extends ActivityInstrumentationTestCase2<AnimationTestStubActivity> {
 
@@ -56,33 +51,6 @@
         mActivity = getActivity();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "RotateAnimation",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "RotateAnimation",
-            args = {float.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "RotateAnimation",
-            args = {float.class, float.class, float.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "RotateAnimation",
-            args = {float.class, float.class, int.class, float.class, int.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "RotateAnimation",
-            args = {float.class, float.class}
-        )
-    })
     public void testConstructors() {
 
         // Test with null AttributeSet
@@ -111,18 +79,6 @@
         new RotateAnimation(-0.6f, -0.6f, Animation.ABSOLUTE, -0.6f, Animation.ABSOLUTE, -0.6f);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "applyTransformation",
-            args = {float.class, android.view.animation.Transformation.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "initialize",
-            args = {int.class, int.class, int.class, int.class}
-        )
-    })
     public void testRotateAgainstOrigin(){
         final View animWindowParent = mActivity.findViewById(R.id.anim_window_parent);
         final View animWindow = mActivity.findViewById(R.id.anim_window);
@@ -174,18 +130,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "applyTransformation",
-            args = {float.class, android.view.animation.Transformation.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "initialize",
-            args = {int.class, int.class, int.class, int.class}
-        )
-    })
     public void testRotateAgainstPoint(){
         final View animWindowParent = mActivity.findViewById(R.id.anim_window_parent);
         final View animWindow = mActivity.findViewById(R.id.anim_window);
diff --git a/tests/tests/view/src/android/view/animation/cts/ScaleAnimationTest.java b/tests/tests/view/src/android/view/animation/cts/ScaleAnimationTest.java
index 28f06ee..243dace 100644
--- a/tests/tests/view/src/android/view/animation/cts/ScaleAnimationTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/ScaleAnimationTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.res.XmlResourceParser;
 import android.graphics.Matrix;
@@ -33,7 +29,6 @@
 import android.view.animation.ScaleAnimation;
 import android.view.animation.Transformation;
 
-@TestTargetClass(android.view.animation.ScaleAnimation.class)
 public class ScaleAnimationTest
         extends ActivityInstrumentationTestCase2<AnimationTestStubActivity> {
     private static long DURATION = 1000;
@@ -58,29 +53,6 @@
         mActivity = getActivity();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ScaleAnimation",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ScaleAnimation",
-            args = {float.class, float.class, float.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ScaleAnimation",
-            args = {float.class, float.class, float.class, float.class, float.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ScaleAnimation",
-            args = {float.class, float.class, float.class, float.class, int.class, float.class,
-                    int.class, float.class}
-        )
-    })
     public void testConstructors() {
         final XmlResourceParser parser = mActivity.getResources().getAnimation(
                 R.anim.anim_scale);
@@ -96,19 +68,6 @@
         new ScaleAnimation(FROM_X, TO_X, FROM_Y, TO_Y, PIVOT_X, PIVOT_Y);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Use applyTransformation directly",
-            method = "applyTransformation",
-            args = {float.class, android.view.animation.Transformation.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "initialize",
-            args = {int.class, int.class, int.class, int.class}
-        )
-    })
     public void testApplyTransformation() {
         final Transformation transformation = new Transformation();
         transformation.setTransformationType(Transformation.TYPE_MATRIX);
@@ -143,12 +102,6 @@
         assertTrue(Math.abs(trans2Y) < Math.abs(trans3Y));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Use applyTransformation indirectly with Animation#getTransformation",
-        method = "applyTransformation",
-        args = {float.class, android.view.animation.Transformation.class}
-    )
     public void testApplyTransformationIndirectly() {
         final View animWindow = mActivity.findViewById(R.id.anim_window);
         final Transformation transformation = new Transformation();
diff --git a/tests/tests/view/src/android/view/animation/cts/TransformationTest.java b/tests/tests/view/src/android/view/animation/cts/TransformationTest.java
index be19d11..7fe8c36 100644
--- a/tests/tests/view/src/android/view/animation/cts/TransformationTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/TransformationTest.java
@@ -19,31 +19,13 @@
 import android.graphics.Matrix;
 import android.test.AndroidTestCase;
 import android.view.animation.Transformation;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
-@TestTargetClass(Transformation.class)
 public class TransformationTest extends AndroidTestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "Transformation",
-        args = {}
-    )
     public void testConstructor() {
         new Transformation();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "compose",
-        args = {Transformation.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "{@link Transformation#compose(Transformation t)}"
-            + "needs to update Javadoc to declare how it composed.")
     public void testCompose() {
         final Transformation t1 = new Transformation();
         final Transformation t2 = new Transformation();
@@ -70,11 +52,6 @@
         assertEquals(Transformation.TYPE_ALPHA, t2.getTransformationType());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clear",
-        args = {}
-    )
     public void testClear() {
         final Transformation t1 = new Transformation();
         final Transformation t2 = new Transformation();
@@ -104,18 +81,6 @@
         assertEquals(expected.getTransformationType(), actual.getTransformationType());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTransformationType",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTransformationType",
-            args = {}
-        )
-    })
     public void testAccessTransformationType() {
         final Transformation transformation = new Transformation();
 
@@ -135,11 +100,6 @@
         assertEquals(Transformation.TYPE_BOTH, transformation.getTransformationType());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "set",
-        args = {Transformation.class}
-    )
     public void testSet() {
         final Transformation t1 = new Transformation();
         t1.setAlpha(0.0f);
@@ -148,18 +108,6 @@
         assertTransformationEquals(t1, t2);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAlpha",
-            args = {float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAlpha",
-            args = {}
-        )
-    })
     public void testAccessAlpha() {
         final Transformation transformation = new Transformation();
 
@@ -173,28 +121,11 @@
         assertEquals(1.0f, transformation.getAlpha());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "toString",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "toShortString",
-            args = {}
-        )
-    })
     public void testToString() {
         assertNotNull(new Transformation().toString());
         assertNotNull(new Transformation().toShortString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getMatrix",
-        args = {}
-    )
     public void testGetMatrix() {
         final Matrix expected = new Matrix();
         final Transformation transformation = new Transformation();
diff --git a/tests/tests/view/src/android/view/animation/cts/TranslateAnimationTest.java b/tests/tests/view/src/android/view/animation/cts/TranslateAnimationTest.java
index a48c489..959e506 100644
--- a/tests/tests/view/src/android/view/animation/cts/TranslateAnimationTest.java
+++ b/tests/tests/view/src/android/view/animation/cts/TranslateAnimationTest.java
@@ -30,12 +30,7 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(android.view.animation.TranslateAnimation.class)
 public class TranslateAnimationTest
         extends ActivityInstrumentationTestCase2<AnimationTestStubActivity> {
 
@@ -62,29 +57,6 @@
         mActivity = getActivity();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "TranslateAnimation",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "TranslateAnimation",
-            args = {float.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "TranslateAnimation",
-            args = {float.class, float.class, float.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "TranslateAnimation",
-            args = {int.class, float.class, int.class, float.class,
-                    int.class, float.class, int.class, float.class}
-        )
-    })
     public void testConstructors() {
 
         // Test with null AttributeSet
@@ -111,19 +83,6 @@
                 Animation.RELATIVE_TO_SELF, -0.6f, Animation.RELATIVE_TO_SELF, -0.6f);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "applyTransformation",
-                args = {float.class, android.view.animation.Transformation.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test initialize wiht delta type Animation#ABSOLUTE",
-            method = "initialize",
-            args = {int.class, int.class, int.class, int.class}
-        )
-    })
     public void testApplyTransformation(){
         final View animWindow = mActivity.findViewById(R.id.anim_window);
         final Transformation transformation = new Transformation();
@@ -182,11 +141,6 @@
         assertEquals(TO_Y_DELTA, values[Matrix.MTRANS_Y], POSITION_DELTA);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "initialize",
-        args = {int.class, int.class, int.class, int.class}
-    )
     public void testInitialize() {
         final View parent = mActivity.findViewById(R.id.anim_window_parent);
         final View animWindow = mActivity.findViewById(R.id.anim_window);
diff --git a/tests/tests/view/src/android/view/cts/AbsSavedStateTest.java b/tests/tests/view/src/android/view/cts/AbsSavedStateTest.java
index 3b9c8ef..3662e2c 100644
--- a/tests/tests/view/src/android/view/cts/AbsSavedStateTest.java
+++ b/tests/tests/view/src/android/view/cts/AbsSavedStateTest.java
@@ -20,37 +20,12 @@
 import android.os.Parcelable;
 import android.test.InstrumentationTestCase;
 import android.view.AbsSavedState;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(AbsSavedState.class)
 public class AbsSavedStateTest extends InstrumentationTestCase {
 
     // constant for test of writeToParcel
     public static final int TEST_NUMBER = 1;
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor and describeContents of AbsSavedState",
-            method = "AbsSavedState",
-            args = {android.os.Parcelable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor and describeContents of AbsSavedState",
-            method = "AbsSavedState",
-            args = {android.os.Parcel.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor and describeContents of AbsSavedState",
-            method = "describeContents",
-            args = {}
-        )
-    })
     public void testConstructor() {
         MockParcelable superState = new MockParcelable();
         assertNotNull(superState);
@@ -63,12 +38,6 @@
         assertEquals(0, savedState.describeContents());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getSuperState function",
-        method = "getSuperState",
-        args = {}
-    )
     public void testGetSuperState() {
         MockParcelable superState = new MockParcelable();
         assertNotNull(superState);
@@ -77,12 +46,6 @@
         assertSame(superState, savedState.getSuperState());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test writeToParcel function",
-        method = "writeToParcel",
-        args = {android.os.Parcel.class, int.class}
-    )
     public void testWriteToParcel() {
         MockParcelable superState = new MockParcelable();
         assertNotNull(superState);
diff --git a/tests/tests/view/src/android/view/cts/ChoreographerTest.java b/tests/tests/view/src/android/view/cts/ChoreographerTest.java
new file mode 100644
index 0000000..b0e50d4
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/ChoreographerTest.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.cts;
+
+import android.test.AndroidTestCase;
+import android.view.Choreographer;
+
+public class ChoreographerTest extends AndroidTestCase {
+    private static final long NOMINAL_VSYNC_PERIOD = 16;
+
+    private Choreographer mChoreographer = Choreographer.getInstance();
+
+    public void testFrameDelay() {
+        assertTrue(Choreographer.getFrameDelay() > 0);
+
+        long oldFrameDelay = Choreographer.getFrameDelay();
+        long newFrameDelay = oldFrameDelay * 2;
+        Choreographer.setFrameDelay(newFrameDelay);
+        assertEquals(newFrameDelay, Choreographer.getFrameDelay());
+
+        Choreographer.setFrameDelay(oldFrameDelay);
+    }
+
+    public void testPostAnimationCallbackEventuallyRunsCallbacks() {
+        MockRunnable addedCallback1 = new MockRunnable();
+        MockRunnable addedCallback2 = new MockRunnable();
+        MockRunnable removedCallback = new MockRunnable();
+        try {
+            // Add and remove a few callbacks.
+            mChoreographer.postAnimationCallback(addedCallback1);
+            mChoreographer.postAnimationCallback(addedCallback2);
+            mChoreographer.postAnimationCallback(removedCallback);
+            mChoreographer.removeAnimationCallback(removedCallback);
+
+            // Sleep for a couple of frames.
+            sleep(NOMINAL_VSYNC_PERIOD * 3);
+
+            // We expect the remaining callbacks to have been invoked once.
+            assertEquals(1, addedCallback1.invocationCount);
+            assertEquals(1, addedCallback2.invocationCount);
+            assertEquals(0, removedCallback.invocationCount);
+
+            // If we post a callback again, then it should be invoked again.
+            mChoreographer.postAnimationCallback(addedCallback1);
+            sleep(NOMINAL_VSYNC_PERIOD * 3);
+
+            assertEquals(2, addedCallback1.invocationCount);
+            assertEquals(1, addedCallback2.invocationCount);
+            assertEquals(0, removedCallback.invocationCount);
+        } finally {
+            mChoreographer.removeAnimationCallback(addedCallback1);
+            mChoreographer.removeAnimationCallback(addedCallback2);
+            mChoreographer.removeAnimationCallback(removedCallback);
+        }
+    }
+
+    public void testPostDrawCallbackEventuallyRunsCallbacks() {
+        MockRunnable addedCallback1 = new MockRunnable();
+        MockRunnable addedCallback2 = new MockRunnable();
+        MockRunnable removedCallback = new MockRunnable();
+        try {
+            // Add and remove a few callbacks.
+            mChoreographer.postDrawCallback(addedCallback1);
+            mChoreographer.postDrawCallback(addedCallback2);
+            mChoreographer.postDrawCallback(removedCallback);
+            mChoreographer.removeDrawCallback(removedCallback);
+
+            // Sleep for a couple of frames.
+            sleep(NOMINAL_VSYNC_PERIOD * 3);
+
+            // We expect the remaining callbacks to have been invoked once.
+            assertEquals(1, addedCallback1.invocationCount);
+            assertEquals(1, addedCallback2.invocationCount);
+            assertEquals(0, removedCallback.invocationCount);
+
+            // If we post a callback again, then it should be invoked again.
+            mChoreographer.postDrawCallback(addedCallback1);
+            sleep(NOMINAL_VSYNC_PERIOD * 3);
+
+            assertEquals(2, addedCallback1.invocationCount);
+            assertEquals(1, addedCallback2.invocationCount);
+            assertEquals(0, removedCallback.invocationCount);
+        } finally {
+            mChoreographer.removeDrawCallback(addedCallback1);
+            mChoreographer.removeDrawCallback(addedCallback2);
+            mChoreographer.removeDrawCallback(removedCallback);
+        }
+    }
+
+    public void testPostAnimationCallbackThrowsIfRunnableIsNull() {
+        try {
+            mChoreographer.postAnimationCallback(null);
+            fail("Expected IllegalArgumentException");
+        } catch (IllegalArgumentException ex) {
+            // expected
+        }
+    }
+
+    public void testRemoveAnimationCallbackThrowsIfRunnableIsNull() {
+        try {
+            mChoreographer.removeAnimationCallback(null);
+            fail("Expected IllegalArgumentException");
+        } catch (IllegalArgumentException ex) {
+            // expected
+        }
+    }
+
+    public void testPostDrawCallbackThrowsIfRunnableIsNull() {
+        try {
+            mChoreographer.postDrawCallback(null);
+            fail("Expected IllegalArgumentException");
+        } catch (IllegalArgumentException ex) {
+            // expected
+        }
+    }
+
+    public void testRemoveDrawCallbackThrowsIfRunnableIsNull() {
+        try {
+            mChoreographer.removeDrawCallback(null);
+            fail("Expected IllegalArgumentException");
+        } catch (IllegalArgumentException ex) {
+            // expected
+        }
+    }
+
+    private void sleep(long time) {
+        try {
+            Thread.sleep(time);
+        } catch (InterruptedException e) {
+            fail(e.getMessage());
+        }
+    }
+
+    private static final class MockRunnable implements Runnable {
+        public int invocationCount;
+
+        @Override
+        public void run() {
+            invocationCount += 1;
+        }
+    }
+}
diff --git a/tests/tests/view/src/android/view/cts/ContextThemeWrapperTest.java b/tests/tests/view/src/android/view/cts/ContextThemeWrapperTest.java
index 86e34f8..33d1682 100644
--- a/tests/tests/view/src/android/view/cts/ContextThemeWrapperTest.java
+++ b/tests/tests/view/src/android/view/cts/ContextThemeWrapperTest.java
@@ -25,13 +25,7 @@
 
 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;
 
-@TestTargetClass(ContextThemeWrapper.class)
 public class ContextThemeWrapperTest extends AndroidTestCase {
     private static final int SYSTEM_DEFAULT_THEME = 0;
 
@@ -48,21 +42,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors.",
-            method = "ContextThemeWrapper",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors.",
-            method = "ContextThemeWrapper",
-            args = {android.content.Context.class, int.class}
-        )
-    })
-    @ToBeFixed(bug="1695243", explanation="Javadocs need update for the constructors.")
     public void testConstructor() {
         // new the ContextThemeWrapper instance
         new ContextThemeWrapper();
@@ -71,20 +50,6 @@
         new ContextThemeWrapper(getContext(), R.style.TextAppearance);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test setTheme.",
-            method = "setTheme",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getTheme.",
-            method = "getTheme",
-            args = {}
-        )
-    })
     public void testAccessTheme() {
         Context context = getContext();
         ContextThemeWrapper contextThemeWrapper = new ContextThemeWrapper(
@@ -98,20 +63,6 @@
         assertEqualsTextAppearanceStyle(ta);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getSystemService.",
-            method = "getSystemService",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test onApplyThemeResource.",
-            method = "onApplyThemeResource",
-            args = {android.content.res.Resources.Theme.class, int.class, boolean.class}
-        )
-    })
     public void testGetSystemService() {
         // new the ContextThemeWrapper instance
         Context context = getContext();
@@ -127,12 +78,6 @@
                 contextThemeWrapper.getSystemService(Context.LAYOUT_INFLATER_SERVICE));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test attachBaseContext.",
-        method = "attachBaseContext",
-        args = {android.content.Context.class}
-    )
     public void testAttachBaseContext() {
         assertTrue((new ContextThemeWrapper() {
             public boolean test() {
diff --git a/tests/tests/view/src/android/view/cts/DisplayTest.java b/tests/tests/view/src/android/view/cts/DisplayTest.java
index 498fdfa..489282a 100644
--- a/tests/tests/view/src/android/view/cts/DisplayTest.java
+++ b/tests/tests/view/src/android/view/cts/DisplayTest.java
@@ -21,53 +21,9 @@
 import android.util.DisplayMetrics;
 import android.view.Display;
 import android.view.WindowManager;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
-@TestTargetClass(Display.class)
 public class DisplayTest extends AndroidTestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDisplayId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getHeight",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWidth",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            notes = "don't know what orientation the default display has",
-            method = "getOrientation",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMetrics",
-            args = {DisplayMetrics.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPixelFormat",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRefreshRate",
-            args = {}
-        )
-    })
     /**
      * Test the properties of Display, they are:
      * 1 index of this display
@@ -78,7 +34,6 @@
      * 6 refresh rate of this display in frames per second
      * 7 Initialize a DisplayMetrics object from this display's data
      */
-    @ToBeFixed(bug="1695243", explanation="don't know what orientation the default display has")
     public void testGetDisplayAttrs() {
         Context con = getContext();
         WindowManager windowManager = (WindowManager) con.getSystemService(Context.WINDOW_SERVICE);
diff --git a/tests/tests/view/src/android/view/cts/FocusFinderTest.java b/tests/tests/view/src/android/view/cts/FocusFinderTest.java
index 1c52ee6..6e54603 100644
--- a/tests/tests/view/src/android/view/cts/FocusFinderTest.java
+++ b/tests/tests/view/src/android/view/cts/FocusFinderTest.java
@@ -16,9 +16,6 @@
 
 package android.view.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.graphics.Rect;
 import android.test.ActivityInstrumentationTestCase2;
@@ -27,7 +24,6 @@
 import android.view.ViewGroup;
 import android.widget.Button;
 
-@TestTargetClass(FocusFinder.class)
 public class FocusFinderTest extends ActivityInstrumentationTestCase2<FocusFinderStubActivity> {
 
     private FocusFinder mFocusFinder;
@@ -52,24 +48,12 @@
         mBottomRight = getActivity().bottomRightButton;
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test method getInstance",
-        method = "getInstance",
-        args = {}
-    )
     public void testGetInstance() {
         mFocusFinder = null;
         mFocusFinder = FocusFinder.getInstance();
         assertNotNull(mFocusFinder);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test method findNextFocus",
-        method = "findNextFocus",
-        args = {ViewGroup.class, View.class, int.class}
-    )
     public void testFindNextFocus() {
         /*
          * Go clockwise around the buttons from the top left searching for focus.
@@ -96,12 +80,6 @@
         assertEquals(expectedNextFocus, actualNextFocus);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test method findNextFocusFromRect",
-        method = "findNextFocusFromRect",
-        args = {ViewGroup.class, Rect.class, int.class}
-    )
     public void testFindNextFocusFromRect() {
         /*
          * Create a small rectangle on the border between the top left and top right buttons.
@@ -142,12 +120,6 @@
         assertEquals(expectedNextFocus, actualNextFocus);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test findNearestTouchable",
-        method = "findNearestTouchable",
-        args = {ViewGroup.class, int.class, int.class, int.class, int[].class}
-    )
     public void testFindNearestTouchable() {
         /*
          * Table layout with two rows and coordinates are relative to those parent rows.
diff --git a/tests/tests/view/src/android/view/cts/GestureDetectorTest.java b/tests/tests/view/src/android/view/cts/GestureDetectorTest.java
index be01c6e..3c6bf63 100644
--- a/tests/tests/view/src/android/view/cts/GestureDetectorTest.java
+++ b/tests/tests/view/src/android/view/cts/GestureDetectorTest.java
@@ -24,12 +24,7 @@
 import android.view.GestureDetector.OnDoubleTapListener;
 import android.view.GestureDetector.OnGestureListener;
 import android.view.GestureDetector.SimpleOnGestureListener;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(GestureDetector.class)
 public class GestureDetectorTest extends
         ActivityInstrumentationTestCase2<GestureDetectorStubActivity> {
 
@@ -58,32 +53,6 @@
         mActivity.onSingleTapConfirmed = false;
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test method GestureDetector",
-            method = "GestureDetector",
-            args = {OnGestureListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test method GestureDetector",
-            method = "GestureDetector",
-            args = {OnGestureListener.class, Handler.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test method GestureDetector",
-            method = "GestureDetector",
-            args = {Context.class, OnGestureListener.class, Handler.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test method GestureDetector",
-            method = "GestureDetector",
-            args = {Context.class, OnGestureListener.class}
-         )
-    })
     public void testConstructor() {
 
         new GestureDetector(mContext, new SimpleOnGestureListener(), new Handler());
@@ -99,38 +68,10 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test method onTouchEvent",
-            method = "onTouchEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test method onTouchEvent",
-            method = "setOnDoubleTapListener",
-            args = {OnDoubleTapListener.class}
-        )
-    })
     public void testOnTouchEvent() {
         GestureDetectorTestUtil.testGestureDetector(this, mActivity);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test setIsLongpressEnabled",
-            method = "setIsLongpressEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test setIsLongpressEnabled",
-            method = "isLongpressEnabled",
-            args = {}
-        )
-    })
     public void testLongpressEnabled() {
         mGestureDetector.setIsLongpressEnabled(true);
         assertTrue(mGestureDetector.isLongpressEnabled());
diff --git a/tests/tests/view/src/android/view/cts/GravityTest.java b/tests/tests/view/src/android/view/cts/GravityTest.java
index 1b5d06d..86bbb2c 100644
--- a/tests/tests/view/src/android/view/cts/GravityTest.java
+++ b/tests/tests/view/src/android/view/cts/GravityTest.java
@@ -17,11 +17,6 @@
 package android.view.cts;
 
 import android.view.View;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.graphics.Rect;
 import android.test.AndroidTestCase;
@@ -30,7 +25,6 @@
 /**
  * Test {@link Gravity}.
  */
-@TestTargetClass(Gravity.class)
 public class GravityTest extends AndroidTestCase {
     private Rect mInRect;
     private Rect mOutRect;
@@ -42,12 +36,6 @@
         mOutRect = new Rect();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor(s) of {@link Gravity}",
-        method = "Gravity",
-        args = {}
-    )
     public void testConstructor() {
         new Gravity();
     }
@@ -57,22 +45,6 @@
         Gravity.apply(gravity, w, h, mInRect, mOutRect, layoutDirection);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "apply",
-            args = {int.class, int.class, int.class, android.graphics.Rect.class,
-                    android.graphics.Rect.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "apply",
-            args = {int.class, int.class, int.class, android.graphics.Rect.class, int.class,
-                    int.class, android.graphics.Rect.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Incorrect javadoc for apply. FILL gravities also" +
-            "respect the adjustment parameters.")
     public void testApply() {
         mInRect = new Rect(10, 20, 30, 40);
         Gravity.apply(Gravity.TOP, 2, 3, mInRect, mOutRect);
@@ -286,24 +258,12 @@
         assertEquals(35, mOutRect.bottom);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link Gravity#isVertical(int)}",
-        method = "isVertical",
-        args = {int.class}
-    )
     public void testIsVertical() {
         assertFalse(Gravity.isVertical(-1));
         assertTrue(Gravity.isVertical(Gravity.VERTICAL_GRAVITY_MASK));
         assertFalse(Gravity.isVertical(Gravity.NO_GRAVITY));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link Gravity#isHorizontal(int)}",
-        method = "isHorizontal",
-        args = {int.class}
-    )
     public void testIsHorizontal() {
         assertFalse(Gravity.isHorizontal(-1));
         assertTrue(Gravity.isHorizontal(Gravity.HORIZONTAL_GRAVITY_MASK));
@@ -311,11 +271,6 @@
         assertFalse(Gravity.isHorizontal(Gravity.NO_GRAVITY));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "applyDisplay",
-        args = {int.class, android.graphics.Rect.class, android.graphics.Rect.class}
-    )
     public void testApplyDisplay() {
         Rect display = new Rect(20, 30, 40, 50);
         Rect inoutRect = new Rect(10, 10, 30, 60);
diff --git a/tests/tests/view/src/android/view/cts/InflateExceptionTest.java b/tests/tests/view/src/android/view/cts/InflateExceptionTest.java
index 66ecf65..665eb07 100644
--- a/tests/tests/view/src/android/view/cts/InflateExceptionTest.java
+++ b/tests/tests/view/src/android/view/cts/InflateExceptionTest.java
@@ -17,39 +17,8 @@
 
 import junit.framework.TestCase;
 import android.view.InflateException;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(InflateException.class)
 public class InflateExceptionTest extends TestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test InflateException",
-            method = "InflateException",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test InflateException",
-            method = "InflateException",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test InflateException",
-            method = "InflateException",
-            args = {java.lang.String.class, java.lang.Throwable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test InflateException",
-            method = "InflateException",
-            args = {java.lang.Throwable.class}
-        )
-    })
    public void testInflateException(){
        InflateException ne = null;
        boolean isThrowed = false;
diff --git a/tests/tests/view/src/android/view/cts/KeyCharacterMapTest.java b/tests/tests/view/src/android/view/cts/KeyCharacterMapTest.java
index 156dc49..85f91ca 100644
--- a/tests/tests/view/src/android/view/cts/KeyCharacterMapTest.java
+++ b/tests/tests/view/src/android/view/cts/KeyCharacterMapTest.java
@@ -16,10 +16,6 @@
 
 package android.view.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.test.AndroidTestCase;
 import android.text.TextUtils;
@@ -27,7 +23,6 @@
 import android.view.KeyEvent;
 import android.view.KeyCharacterMap.KeyData;
 
-@TestTargetClass(KeyCharacterMap.class)
 public class KeyCharacterMapTest extends AndroidTestCase {
 
     private KeyCharacterMap mKeyCharacterMap;
@@ -39,11 +34,6 @@
         mKeyCharacterMap = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isPrintingKey",
-        args = {int.class}
-    )
     public void testIsPrintingKey() throws Exception {
 
         assertFalse(mKeyCharacterMap.isPrintingKey(KeyEvent.KEYCODE_UNKNOWN));
@@ -261,22 +251,12 @@
         assertFalse(mKeyCharacterMap.isPrintingKey(KeyEvent.KEYCODE_PROG_BLUE));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "load",
-        args = {int.class}
-    )
     public void testLoad() throws Exception {
         mKeyCharacterMap = null;
         mKeyCharacterMap = KeyCharacterMap.load(KeyCharacterMap.BUILT_IN_KEYBOARD);
         assertNotNull(mKeyCharacterMap);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getNumber",
-        args = {int.class}
-    )
     public void testGetNumber() throws Exception {
         assertEquals('0', mKeyCharacterMap.getNumber(KeyEvent.KEYCODE_0));
         assertEquals('1', mKeyCharacterMap.getNumber(KeyEvent.KEYCODE_1));
@@ -292,11 +272,6 @@
         assertEquals('#', mKeyCharacterMap.getNumber(KeyEvent.KEYCODE_POUND));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getMatch",
-        args = {int.class, char[].class}
-    )
     public void testGetMatch1() throws Exception {
         try {
             mKeyCharacterMap.getMatch(KeyEvent.KEYCODE_0, null);
@@ -316,11 +291,6 @@
         return events[0].getKeyCode();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getMatch",
-        args = {int.class, char[].class, int.class}
-    )
     public void testGetMatch2() throws Exception {
         try {
             mKeyCharacterMap.getMatch(KeyEvent.KEYCODE_0, null, 1);
@@ -334,27 +304,10 @@
         assertEquals('B', mKeyCharacterMap.getMatch(getCharacterKeyCode('B'), chars));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getKeyboardType",
-        args = {}
-    )
     public void testGetKeyboardType() throws Exception {
         mKeyCharacterMap.getKeyboardType();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getEvents",
-            args = {char[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "getDisplayLabel",
-            args = {int.class}
-        )
-    })
     public void testGetEvents() {
         try {
             mKeyCharacterMap.getEvents(null);
@@ -368,38 +321,6 @@
         mKeyCharacterMap.getEvents(charsArray);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getKeyData",
-            args = {int.class, android.view.KeyCharacterMap.KeyData.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "get",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "finalize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "getDeadChar",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "deviceHasKey",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "deviceHasKeys",
-            args = {int[].class}
-        )
-    })
     public void testGetKeyData() throws Exception {
         KeyData result = new KeyData();
         result.meta = new char[2];
diff --git a/tests/tests/view/src/android/view/cts/KeyEventTest.java b/tests/tests/view/src/android/view/cts/KeyEventTest.java
index 6689ca4..7c1f1c7 100644
--- a/tests/tests/view/src/android/view/cts/KeyEventTest.java
+++ b/tests/tests/view/src/android/view/cts/KeyEventTest.java
@@ -16,11 +16,6 @@
 
 package android.view.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.os.Parcel;
 import android.os.Parcelable;
@@ -36,7 +31,6 @@
 /**
  * Test {@link KeyEvent}.
  */
-@TestTargetClass(KeyEvent.class)
 public class KeyEventTest extends AndroidTestCase {
     private KeyEvent mKeyEvent;
     private long mDownTime;
@@ -51,58 +45,6 @@
         mEventTime = SystemClock.uptimeMillis();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link KeyEvent}",
-            method = "KeyEvent",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link KeyEvent}",
-            method = "KeyEvent",
-            args = {android.view.KeyEvent.class, long.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link KeyEvent}",
-            method = "KeyEvent",
-            args = {long.class, long.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link KeyEvent}",
-            method = "KeyEvent",
-            args = {long.class, long.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link KeyEvent}",
-            method = "KeyEvent",
-            args = {long.class, long.class, int.class, int.class, int.class, int.class,
-                    int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link KeyEvent}",
-            method = "KeyEvent",
-            args = {long.class, long.class, int.class, int.class, int.class, int.class,
-                    int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link KeyEvent}",
-            method = "KeyEvent",
-            args = {long.class, String.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link KeyEvent}",
-            method = "KeyEvent",
-            args = {android.view.KeyEvent.class}
-        )
-    })
     public void testConstructor() {
         new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_0);
 
@@ -124,12 +66,6 @@
         new KeyEvent(mDownTime, "test", 0, KeyEvent.FLAG_SOFT_KEYBOARD);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link KeyEvent#getCharacters()}",
-        method = "getCharacters",
-        args = {}
-    )
     public void testGetCharacters() {
         String characters = "android_test";
         mKeyEvent = new KeyEvent(mDownTime, characters, 0, KeyEvent.FLAG_SOFT_KEYBOARD);
@@ -141,22 +77,10 @@
         assertNull(mKeyEvent.getCharacters());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link KeyEvent#getMaxKeyCode()}",
-        method = "getMaxKeyCode",
-        args = {}
-    )
     public void testGetMaxKeyCode() {
         assertTrue(KeyEvent.getMaxKeyCode() > 0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link KeyEvent#isShiftPressed()}",
-        method = "isShiftPressed",
-        args = {}
-    )
     public void testIsShiftPressed() {
         assertFalse(mKeyEvent.isShiftPressed());
         mKeyEvent = new KeyEvent(mDownTime, mEventTime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_0, 5,
@@ -167,23 +91,11 @@
         assertFalse(mKeyEvent.isShiftPressed());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link KeyEvent#getDeadChar(int, int)}",
-        method = "getDeadChar",
-        args = {int.class, int.class}
-    )
     public void testGetDeadChar() {
         // decimal number of &egrave; is 232.
         assertEquals(232, KeyEvent.getDeadChar('`', 'e'));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link KeyEvent#getKeyData(KeyData)}",
-        method = "getKeyData",
-        args = {android.view.KeyCharacterMap.KeyData.class}
-    )
     public void testGetKeyData() {
         KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_Z);
         KeyData keyData = new KeyData();
@@ -197,12 +109,6 @@
         assertEquals(0, keyData.meta[3]);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link KeyEvent#dispatch(Callback)}",
-        method = "dispatch",
-        args = {android.view.KeyEvent.Callback.class}
-    )
     public void testDispatch() {
         MockCallback callback = new MockCallback();
         mKeyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_0);
@@ -244,12 +150,6 @@
         assertEquals(KeyEvent.KEYCODE_0, callback.getKeyCode());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link KeyEvent#getMetaState()}",
-        method = "getMetaState",
-        args = {}
-    )
     public void testGetMetaState() {
         int metaState = KeyEvent.META_ALT_ON;
         mKeyEvent = new KeyEvent(mDownTime, mEventTime, KeyEvent.ACTION_MULTIPLE,
@@ -257,36 +157,18 @@
         assertEquals(metaState, mKeyEvent.getMetaState());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link KeyEvent#getEventTime()}",
-        method = "getEventTime",
-        args = {}
-    )
     public void testGetEventTime() {
         mKeyEvent = new KeyEvent(mDownTime, mEventTime, KeyEvent.ACTION_DOWN,
                 KeyEvent.KEYCODE_0, 5);
         assertEquals(mEventTime, mKeyEvent.getEventTime());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link KeyEvent#getDownTime()}",
-        method = "getDownTime",
-        args = {}
-    )
     public void testGetDownTime() {
         mKeyEvent = new KeyEvent(mDownTime, mEventTime, KeyEvent.ACTION_DOWN,
                 KeyEvent.KEYCODE_0, 5);
         assertEquals(mDownTime, mKeyEvent.getDownTime());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link KeyEvent#getUnicodeChar()}",
-        method = "getUnicodeChar",
-        args = {}
-    )
     public void testGetUnicodeChar1() {
         // 48 is Unicode character of '0'
         assertEquals(48, mKeyEvent.getUnicodeChar());
@@ -302,12 +184,6 @@
         assertEquals(0, mKeyEvent.getUnicodeChar());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link KeyEvent#getUnicodeChar(int)}",
-        method = "getUnicodeChar",
-        args = {int.class}
-    )
     public void testGetUnicodeChar2() {
         // 48 is Unicode character of '0'
         assertEquals(48, mKeyEvent.getUnicodeChar(MetaKeyKeyListener.META_CAP_LOCKED));
@@ -323,12 +199,6 @@
         assertEquals(0, mKeyEvent.getUnicodeChar(0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link KeyEvent#getNumber()}",
-        method = "getNumber",
-        args = {}
-    )
     public void testGetNumber() {
         // 48 is associated with key '0'
         assertEquals(48, mKeyEvent.getNumber());
@@ -338,12 +208,6 @@
         assertEquals(51, mKeyEvent.getNumber());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link KeyEvent#isSymPressed()}",
-        method = "isSymPressed",
-        args = {}
-    )
     public void testIsSymPressed() {
         mKeyEvent = new KeyEvent(mDownTime, mEventTime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_0, 5,
                 KeyEvent.META_SYM_ON);
@@ -354,12 +218,6 @@
         assertFalse(mKeyEvent.isSymPressed());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link KeyEvent#getDeviceId()}",
-        method = "getDeviceId",
-        args = {}
-    )
     public void testGetDeviceId() {
         int deviceId = 1;
         mKeyEvent = new KeyEvent(mDownTime, mEventTime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_0, 5,
@@ -367,23 +225,11 @@
         assertEquals(deviceId, mKeyEvent.getDeviceId());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link KeyEvent#toString()}",
-        method = "toString",
-        args = {}
-    )
     public void testToString() {
         // make sure it does not throw any exception.
         mKeyEvent.toString();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link KeyEvent#isAltPressed()}",
-        method = "isAltPressed",
-        args = {}
-    )
     public void testIsAltPressed() {
         mKeyEvent = new KeyEvent(mDownTime, mEventTime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_0, 5,
                 KeyEvent.META_ALT_ON);
@@ -593,25 +439,10 @@
         assertFalse(ev.hasModifiers(KeyEvent.META_SHIFT_LEFT_ON));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link KeyEvent#getDisplayLabel()}",
-        method = "getDisplayLabel",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testGetDisplayLabel() {
         assertTrue(mKeyEvent.getDisplayLabel() > 0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link KeyEvent#isSystem()}",
-        method = "isSystem",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, " +
-            "javadoc does not tell user the system key set.")
     public void testIsSystem() {
         mKeyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MENU);
         assertTrue(mKeyEvent.isSystem());
@@ -656,14 +487,6 @@
         assertFalse(mKeyEvent.isSystem());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link KeyEvent#isPrintingKey()}",
-        method = "isPrintingKey",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, " +
-            "javadoc does not tell user the printing key set.")
     public void testIsPrintingKey() {
         mKeyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, Character.SPACE_SEPARATOR);
         assertTrue(mKeyEvent.isPrintingKey());
@@ -684,12 +507,6 @@
         assertTrue(mKeyEvent.isPrintingKey());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link KeyEvent#getMatch(char[])}",
-        method = "getMatch",
-        args = {char[].class}
-    )
     public void testGetMatch1() {
         char[] codes1 = new char[] { '0', '1', '2' };
         assertEquals('0', mKeyEvent.getMatch(codes1));
@@ -702,22 +519,10 @@
         assertEquals('S', mKeyEvent.getMatch(codes3));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link KeyEvent#getAction()}",
-        method = "getAction",
-        args = {}
-    )
     public void testGetAction() {
         assertEquals(KeyEvent.ACTION_DOWN, mKeyEvent.getAction());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link KeyEvent#getRepeatCount()}",
-        method = "getRepeatCount",
-        args = {}
-    )
     public void testGetRepeatCount() {
         int repeatCount = 1;
         mKeyEvent = new KeyEvent(mDownTime, mEventTime, KeyEvent.ACTION_MULTIPLE,
@@ -725,12 +530,6 @@
         assertEquals(repeatCount, mKeyEvent.getRepeatCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link KeyEvent#writeToParcel(Parcel, int)}",
-        method = "writeToParcel",
-        args = {android.os.Parcel.class, int.class}
-    )
     public void testWriteToParcel() {
         Parcel parcel = Parcel.obtain();
         mKeyEvent.writeToParcel(parcel, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
@@ -750,34 +549,15 @@
         assertEquals(mKeyEvent.getEventTime(), keyEvent.getEventTime());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link KeyEvent#describeContents()}, this function always returns 0",
-        method = "describeContents",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete.")
     public void testDescribeContents() {
         // make sure it never shrow any exception.
         mKeyEvent.describeContents();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link KeyEvent#getKeyCode()}",
-        method = "getKeyCode",
-        args = {}
-    )
     public void testGetKeyCode() {
         assertEquals(KeyEvent.KEYCODE_0, mKeyEvent.getKeyCode());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link KeyEvent#getFlags()}",
-        method = "getFlags",
-        args = {}
-    )
     public void testGetFlags() {
         mKeyEvent = new KeyEvent(mDownTime, mEventTime, KeyEvent.ACTION_DOWN,
                 KeyEvent.KEYCODE_0, 5, KeyEvent.META_SHIFT_ON, 1, 1, KeyEvent.FLAG_WOKE_HERE);
@@ -788,12 +568,6 @@
         assertEquals(KeyEvent.FLAG_SOFT_KEYBOARD, mKeyEvent.getFlags());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link KeyEvent#getScanCode()}",
-        method = "getScanCode",
-        args = {}
-    )
     public void testGetScanCode() {
         int scanCode = 1;
         mKeyEvent = new KeyEvent(mDownTime, mEventTime, KeyEvent.ACTION_DOWN,
@@ -801,11 +575,6 @@
         assertEquals(scanCode, mKeyEvent.getScanCode());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "changeAction",
-        args = {android.view.KeyEvent.class, int.class}
-    )
     public void testChangeAction() {
         mKeyEvent = new KeyEvent(mDownTime, mEventTime, KeyEvent.ACTION_DOWN,
                 KeyEvent.KEYCODE_0, 5, KeyEvent.META_SHIFT_ON, 1, 1, KeyEvent.FLAG_WOKE_HERE);
@@ -822,11 +591,6 @@
         assertEquals(mKeyEvent.getRepeatCount(), newEvent.getRepeatCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "changeFlags",
-        args = {android.view.KeyEvent.class, int.class}
-    )
     public void testChangeFlags() {
         mKeyEvent = new KeyEvent(mDownTime, mEventTime, KeyEvent.ACTION_DOWN,
                 KeyEvent.KEYCODE_0, 5, KeyEvent.META_SHIFT_ON, 1, 1, KeyEvent.FLAG_WOKE_HERE);
@@ -843,11 +607,6 @@
         assertEquals(mKeyEvent.getRepeatCount(), newEvent.getRepeatCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "changeTimeRepeat",
-        args = {android.view.KeyEvent.class, long.class, int.class}
-    )
     public void testChangeTimeRepeat() {
         mKeyEvent = new KeyEvent(mDownTime, mEventTime, KeyEvent.ACTION_DOWN,
                 KeyEvent.KEYCODE_0, 5, KeyEvent.META_SHIFT_ON, 1, 1, KeyEvent.FLAG_WOKE_HERE);
diff --git a/tests/tests/view/src/android/view/cts/LayoutInflaterTest.java b/tests/tests/view/src/android/view/cts/LayoutInflaterTest.java
index f5bd8f4..b33a312 100644
--- a/tests/tests/view/src/android/view/cts/LayoutInflaterTest.java
+++ b/tests/tests/view/src/android/view/cts/LayoutInflaterTest.java
@@ -19,10 +19,6 @@
 import com.android.cts.stub.R;
 import com.android.internal.util.XmlUtils;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import org.xmlpull.v1.XmlPullParser;
 
@@ -45,7 +41,6 @@
 import android.view.LayoutInflater.Filter;
 import android.widget.LinearLayout;
 
-@TestTargetClass(LayoutInflater.class)
 public class LayoutInflaterTest extends AndroidTestCase {
 
     private LayoutInflater mLayoutInflater;
@@ -76,26 +71,6 @@
                 .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "from",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "LayoutInflater",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "LayoutInflater",
-            args = {android.view.LayoutInflater.class, android.content.Context.class}
-        )
-    })
     public void testFrom() {
         mLayoutInflater = null;
         mLayoutInflater = LayoutInflater.from(mContext);
@@ -109,44 +84,6 @@
         assertNotNull(layoutInflater);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setFilter",
-            args = {android.view.LayoutInflater.Filter.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "getFilter",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setFactory",
-            args = {android.view.LayoutInflater.Factory.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "getFactory",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "getContext",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "cloneInContext",
-            args = {android.content.Context.class}
-        )
-    })
     public void testAccessLayoutInflaterProperties() {
         mLayoutInflater.setFilter(mFilter);
         assertSame(mFilter, mLayoutInflater.getFilter());
@@ -193,12 +130,6 @@
         return attrs;
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "",
-        method = "createView",
-        args = {java.lang.String.class, java.lang.String.class, android.util.AttributeSet.class}
-    )
     public void testCreateView() {
 
         AttributeSet attrs = getAttrs();
@@ -275,20 +206,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "inflate",
-            args = {int.class, android.view.ViewGroup.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onCreateView",
-            args = {java.lang.String.class, android.util.AttributeSet.class}
-        )
-    })
     public void testInflate() {
         View view = mLayoutInflater.inflate(
                 com.android.cts.stub.R.layout.inflater_layout, null);
@@ -313,20 +230,6 @@
         assertEquals(1, mLayout.getChildCount());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "inflate",
-            args = {int.class, android.view.ViewGroup.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onCreateView",
-            args = {java.lang.String.class, android.util.AttributeSet.class}
-        )
-    })
     public void testInflate2() {
         View view = mLayoutInflater.inflate(
                 R.layout.inflater_layout, null, false);
@@ -358,20 +261,6 @@
         assertEquals(1, mLayout.getChildCount());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "inflate",
-            args = {org.xmlpull.v1.XmlPullParser.class, android.view.ViewGroup.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onCreateView",
-            args = {java.lang.String.class, android.util.AttributeSet.class}
-        )
-    })
     public void testInflate3() {
         XmlResourceParser parser = getContext().getResources().getLayout(
                 R.layout.inflater_layout);
@@ -417,20 +306,6 @@
         assertEquals(3, mLayout.getChildCount());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "inflate",
-            args = {org.xmlpull.v1.XmlPullParser.class, android.view.ViewGroup.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onCreateView",
-            args = {java.lang.String.class, android.util.AttributeSet.class}
-        )
-    })
     public void testInflate4() {
        XmlResourceParser parser = getContext().getResources().getLayout(
                R.layout.inflater_layout);
diff --git a/tests/tests/view/src/android/view/cts/MenuInflaterTest.java b/tests/tests/view/src/android/view/cts/MenuInflaterTest.java
index 6b516f2..cf1047e 100644
--- a/tests/tests/view/src/android/view/cts/MenuInflaterTest.java
+++ b/tests/tests/view/src/android/view/cts/MenuInflaterTest.java
@@ -19,11 +19,6 @@
 import com.android.cts.stub.R;
 import com.android.internal.view.menu.MenuBuilder;
 
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
 import android.app.Activity;
 import android.content.Context;
@@ -40,7 +35,6 @@
 /**
  * Test {@link MenuInflater}.
  */
-@TestTargetClass(MenuInflater.class)
 public class MenuInflaterTest extends ActivityInstrumentationTestCase2<MenuInflaterStubActivity> {
     private MenuInflater mMenuInflater;
 
@@ -57,24 +51,10 @@
         mMenuInflater = mActivity.getMenuInflater();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor.",
-        method = "MenuInflater",
-        args = {android.content.Context.class}
-    )
     public void testConstructor() {
         new MenuInflater(mActivity);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link MenuInflater#inflate(int, Menu)}",
-        method = "inflate",
-        args = {int.class, android.view.Menu.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "MenuInflater#inflate(int, Menu) when param menu is null")
     public void testInflate() {
         Menu menu = new MenuBuilder(mActivity);
         assertEquals(0, menu.size());
@@ -96,11 +76,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "inflate",
-        args = {int.class, android.view.Menu.class}
-    )
     // Check wheher the objects are created correctly from xml files
     public void testInflateFromXml(){
         // the visibility and shortcut
diff --git a/tests/tests/view/src/android/view/cts/MotionEventTest.java b/tests/tests/view/src/android/view/cts/MotionEventTest.java
index 945cefc..cdedca4 100644
--- a/tests/tests/view/src/android/view/cts/MotionEventTest.java
+++ b/tests/tests/view/src/android/view/cts/MotionEventTest.java
@@ -16,11 +16,6 @@
 
 package android.view.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.graphics.Matrix;
 import android.os.Parcel;
@@ -36,7 +31,6 @@
 /**
  * Test {@link MotionEvent}.
  */
-@TestTargetClass(MotionEvent.class)
 public class MotionEventTest extends AndroidTestCase {
     private MotionEvent mMotionEvent1;
     private MotionEvent mMotionEvent2;
@@ -77,78 +71,6 @@
         super.tearDown();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "obtain",
-            args = {long.class, long.class, int.class, float.class, float.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getX",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDownTime",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getEventTime",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getX",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getY",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRawX",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRawY",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMetaState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDeviceId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPressure",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getXPrecision",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getYPrecision",
-            args = {}
-        )
-    })
     public void testObtain1() {
         mMotionEvent1 = MotionEvent.obtain(mDownTime, mEventTime,
                 MotionEvent.ACTION_DOWN, X_3F, Y_4F, META_STATE);
@@ -169,11 +91,6 @@
         assertEquals(1.0f, mMotionEvent1.getYPrecision(), DELTA);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "obtain",
-        args = {MotionEvent.class}
-    )
     public void testObtain2() {
         MotionEvent motionEvent = MotionEvent.obtain(mDownTime, mEventTime,
                 MotionEvent.ACTION_DOWN, X_3F, Y_4F, META_STATE);
@@ -195,12 +112,6 @@
         assertEquals(motionEvent.getYPrecision(), mMotionEvent1.getYPrecision(), DELTA);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "obtain",
-        args = {long.class, long.class, int.class, float.class, float.class, float.class,
-                float.class, int.class, float.class, float.class, int.class, int.class}
-    )
     public void testObtain3() {
         mMotionEvent1 = null;
         mMotionEvent1 = MotionEvent.obtain(mDownTime, mEventTime,
@@ -223,18 +134,6 @@
         assertEquals(Y_PRECISION_4F, mMotionEvent1.getYPrecision(), DELTA);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAction",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAction",
-            args = {int.class}
-        )
-    })
     public void testAccessAction() {
         assertEquals(MotionEvent.ACTION_MOVE, mMotionEvent1.getAction());
 
@@ -251,29 +150,11 @@
         assertEquals(MotionEvent.ACTION_DOWN, mMotionEvent1.getAction());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "describeContents",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testDescribeContents() {
         // make sure this method never throw any exception.
         mMotionEvent2.describeContents();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getEdgeFlags",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEdgeFlags",
-            args = {int.class}
-        )
-    })
     public void testAccessEdgeFlags() {
         assertEquals(EDGE_FLAGS, mMotionEvent2.getEdgeFlags());
 
@@ -282,11 +163,6 @@
         assertEquals(edgeFlags, mMotionEvent2.getEdgeFlags());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {Parcel.class, int.class}
-    )
     public void testWriteToParcel() {
         Parcel parcel = Parcel.obtain();
         mMotionEvent2.writeToParcel(parcel, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
@@ -304,21 +180,11 @@
         assertEquals(mMotionEvent2.getDeviceId(), motionEvent.getDeviceId());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "toString",
-        args = {}
-    )
     public void testToString() {
         // make sure this method never throw exception.
         mMotionEvent2.toString();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "offsetLocation",
-        args = {float.class, float.class}
-    )
     public void testOffsetLocation() {
         assertEquals(X_3F, mMotionEvent2.getX(), DELTA);
         assertEquals(Y_4F, mMotionEvent2.getY(), DELTA);
@@ -330,11 +196,6 @@
         assertEquals(Y_4F + offsetY, mMotionEvent2.getY(), DELTA);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setLocation",
-        args = {float.class, float.class}
-    )
     public void testSetLocation() {
         assertEquals(X_3F, mMotionEvent2.getX(), DELTA);
         assertEquals(Y_4F, mMotionEvent2.getY(), DELTA);
@@ -352,11 +213,6 @@
         assertEquals(newLocationY, mMotionEvent2.getY(), DELTA);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getHistoricalX",
-        args = {int.class}
-    )
     public void testGetHistoricalX() {
         float x = X_3F + 5.0f;
         mMotionEvent2.addBatch(mEventTime, x, 5.0f, 1.0f, 0.0f, 0);
@@ -366,11 +222,6 @@
         assertEquals(x, mMotionEvent2.getHistoricalX(1), DELTA);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getHistoricalY",
-        args = {int.class}
-    )
     public void testGetHistoricalY() {
         float y = Y_4F + 5.0f;
         mMotionEvent2.addBatch(mEventTime, 5.0f, y, 1.0f, 0.0f, 0);
@@ -380,11 +231,6 @@
         assertEquals(y, mMotionEvent2.getHistoricalY(1), DELTA);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getHistoricalSize",
-        args = {int.class}
-    )
     public void testGetHistoricalSize() {
         float size = 0.5f;
         mMotionEvent2.addBatch(mEventTime, 5.0f, 5.0f, 1.0f, size, 0);
@@ -394,11 +240,6 @@
         assertEquals(size, mMotionEvent2.getHistoricalSize(1), DELTA);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getHistoricalPressure",
-        args = {int.class}
-    )
     public void testGetHistoricalPressure() {
         float pressure = 0.5f;
         mMotionEvent2.addBatch(mEventTime, 5.0f, 5.0f, pressure, 0.0f, 0);
@@ -408,11 +249,6 @@
         assertEquals(pressure, mMotionEvent2.getHistoricalPressure(1), DELTA);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getHistoricalEventTime",
-        args = {int.class}
-    )
     public void testGetHistoricalEventTime() {
         long eventTime = mEventTime + 5l;
         mMotionEvent2.addBatch(eventTime, 5.0f, 5.0f, 0.0f, 1.0f, 0);
@@ -422,12 +258,6 @@
         assertEquals(eventTime, mMotionEvent2.getHistoricalEventTime(1));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addBatch",
-        args = {long.class, float.class, float.class, float.class, float.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testAddBatch() {
         long eventTime = SystemClock.uptimeMillis();
         float x = 10.0f;
@@ -460,11 +290,6 @@
         assertEquals(size, mMotionEvent2.getHistoricalSize(1), DELTA);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getHistorySize",
-        args = {}
-    )
     public void testGetHistorySize() {
         long eventTime = SystemClock.uptimeMillis();
         float x = 10.0f;
@@ -480,11 +305,6 @@
         assertEquals(1, mMotionEvent2.getHistorySize());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "recycle",
-        args = {}
-    )
     public void testRecycle() {
         mMotionEvent2.setAction(MotionEvent.ACTION_MOVE);
         assertEquals(0, mMotionEvent2.getHistorySize());
@@ -502,11 +322,6 @@
         mMotionEvent2 = null; // since it was recycled, don't try to recycle again in tear down
     }
 
-    @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "transform",
-            args = {}
-        )
     public void testTransformShouldThrowWhenMatrixIsNull() {
         try {
             mMotionEvent1.transform(null);
@@ -515,11 +330,6 @@
         }
     }
 
-    @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "transform",
-            args = {}
-        )
     public void testTransformShouldApplyMatrixToPointsAndPreserveRawPosition() {
         // Generate some points on a circle.
         // Each point 'i' is a point on a circle of radius ROTATION centered at (3,2) at an angle
diff --git a/tests/tests/view/src/android/view/cts/OrientationEventListenerTest.java b/tests/tests/view/src/android/view/cts/OrientationEventListenerTest.java
index 130f01b..f5062ff 100644
--- a/tests/tests/view/src/android/view/cts/OrientationEventListenerTest.java
+++ b/tests/tests/view/src/android/view/cts/OrientationEventListenerTest.java
@@ -16,11 +16,6 @@
 
 package android.view.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.content.Context;
 import android.hardware.Sensor;
@@ -31,58 +26,19 @@
 /**
  * Test {@link OrientationEventListener}.
  */
-@TestTargetClass(OrientationEventListener.class)
 public class OrientationEventListenerTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "OrientationEventListener",
-            args = {Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "OrientationEventListener",
-            args = {Context.class, int.class}
-        )
-    })
     public void testConstructor() {
         new MockOrientationEventListener(mContext);
 
         new MockOrientationEventListener(mContext, SensorManager.SENSOR_DELAY_UI);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            notes = "Test {@link OrientationEventListener#enable()}. "
-                    + "This method is simply called to make sure that no exception is thrown. "
-                    + "The registration of the listener can not be tested because there is "
-                    + "no way to simulate sensor events",
-            method = "enable",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            notes = "Test {@link OrientationEventListener#disable()}. "
-                    + "This method is simply called to make sure that no exception is thrown. "
-                    + "The registration of the listener can not be tested because there is "
-                    + "no way to simulate sensor events",
-            method = "disable",
-            args = {}
-        )
-    })
-    @ToBeFixed(explanation = "Can not simulate sensor events on the emulator.")
     public void testEnableAndDisable() {
         MockOrientationEventListener listener = new MockOrientationEventListener(mContext);
         listener.enable();
         listener.disable();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "canDetectOrientation",
-        args = {}
-    )
     public void testCanDetectOrientation() {
         SensorManager sm = (SensorManager)mContext.getSystemService(Context.SENSOR_SERVICE);
         // Orientation can only be detected if there is an accelerometer
diff --git a/tests/tests/view/src/android/view/cts/OrientationListenerTest.java b/tests/tests/view/src/android/view/cts/OrientationListenerTest.java
index b3437cd..114cf5f 100644
--- a/tests/tests/view/src/android/view/cts/OrientationListenerTest.java
+++ b/tests/tests/view/src/android/view/cts/OrientationListenerTest.java
@@ -16,11 +16,6 @@
 
 package android.view.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.content.Context;
 import android.hardware.SensorManager;
@@ -30,7 +25,6 @@
 /**
  * Test {@link OrientationListener}.
  */
-@TestTargetClass(OrientationListener.class)
 public class OrientationListenerTest extends AndroidTestCase {
     private Context mContext;
 
@@ -40,60 +34,19 @@
         mContext = getContext();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor OrientationListener#OrientationListener(Context).",
-            method = "OrientationListener",
-            args = {Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor OrientationListener#OrientationListener(Context, int).",
-            method = "OrientationListener",
-            args = {Context.class, int.class}
-        )
-    })
     public void testConstructor() {
         new MockOrientationListener(mContext);
 
         new MockOrientationListener(mContext, SensorManager.SENSOR_DELAY_UI);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link OrientationListener#enable()}. "
-                    + "This method is simply called to make sure that no exception is thrown. "
-                    + "The registration of the listener can not be tested because there is no way "
-                    + "to simulate sensor events on the emulator",
-            method = "enable",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link OrientationListener#disable()}. "
-                    + "This method is simply called to make sure that no exception is thrown. "
-                    + "The registration of the listener can not be tested because there is no way "
-                    + "to simulate sensor events on the emulator",
-            method = "disable",
-            args = {}
-        )
-    })
-    @ToBeFixed(explanation = "Can not simulate sensor events on the emulator.")
-    public void testRegistrationOfOrientationListener() {
+    public void testRegisterationOfOrientationListener() {
         // these methods are called to assure that no exception is thrown
         MockOrientationListener listener = new MockOrientationListener(mContext);
         listener.disable();
         listener.enable();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link OrientationListener#onAccuracyChanged(int, int)}.",
-        method = "onAccuracyChanged",
-        args = {int.class, int.class}
-    )
     public void testOnAccuracyChanged() {
         // this method is called to assure that no exception is thrown
         new MockOrientationListener(mContext).onAccuracyChanged(SensorManager.SENSOR_ACCELEROMETER,
@@ -103,12 +56,6 @@
                 SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link OrientationListener#onSensorChanged(int , float[])}.",
-        method = "onSensorChanged",
-        args = {int.class, float[].class}
-    )
     public void testOnSensorChanged() {
         // this method is called to assure that no exception is thrown
         MockOrientationListener listener = new MockOrientationListener(mContext);
@@ -127,16 +74,6 @@
                 mockData);
     }
 
-    @TestTargetNew(
-        level = TestLevel.TODO,
-        notes = "Test {@link OrientationListener#onOrientationChanged(int)}. "
-                + "This test does not check callback of the "
-                + "{@link OrientationListener#onOrientationChanged(int)} "
-                + "because there is no way to simulate the sensor events on the emulator.",
-        method = "onSensorChanged",
-        args = {int.class, float[].class}
-    )
-    @ToBeFixed(explanation = "Can not simulate sensor events on the emulator.")
     public void testOnOrientationChanged() {
         MockOrientationListener listener = new MockOrientationListener(mContext);
         listener.enable();
diff --git a/tests/tests/view/src/android/view/cts/SoundEffectConstantsTest.java b/tests/tests/view/src/android/view/cts/SoundEffectConstantsTest.java
index 5c1bc52..e1a047e 100644
--- a/tests/tests/view/src/android/view/cts/SoundEffectConstantsTest.java
+++ b/tests/tests/view/src/android/view/cts/SoundEffectConstantsTest.java
@@ -19,12 +19,7 @@
 import android.test.AndroidTestCase;
 import android.view.SoundEffectConstants;
 import android.view.View;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(SoundEffectConstants.class)
 public class SoundEffectConstantsTest extends AndroidTestCase {
 
     @Override
@@ -33,12 +28,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getContantForFocusDirection.",
-        method = "getContantForFocusDirection",
-        args = {int.class}
-    )
     public void testgetContantForFocusDirection() {
 
         assertEquals(SoundEffectConstants.NAVIGATION_RIGHT,
diff --git a/tests/tests/view/src/android/view/cts/SurfaceHolder_BadSurfaceTypeExceptionTest.java b/tests/tests/view/src/android/view/cts/SurfaceHolder_BadSurfaceTypeExceptionTest.java
index 82378d7..7571453 100644
--- a/tests/tests/view/src/android/view/cts/SurfaceHolder_BadSurfaceTypeExceptionTest.java
+++ b/tests/tests/view/src/android/view/cts/SurfaceHolder_BadSurfaceTypeExceptionTest.java
@@ -17,27 +17,8 @@
 
 import junit.framework.TestCase;
 import android.view.SurfaceHolder.BadSurfaceTypeException;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(BadSurfaceTypeException.class)
 public class SurfaceHolder_BadSurfaceTypeExceptionTest extends TestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test BadSurfaceTypeException",
-            method = "SurfaceHolder.BadSurfaceTypeException",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test BadSurfaceTypeException",
-            method = "SurfaceHolder.BadSurfaceTypeException",
-            args = {java.lang.String.class}
-        )
-    })
     public void testBadSurfaceTypeException(){
         BadSurfaceTypeException ne = null;
         boolean isThrowed = false;
diff --git a/tests/tests/view/src/android/view/cts/SurfaceViewTest.java b/tests/tests/view/src/android/view/cts/SurfaceViewTest.java
index 50db42a..4c0fafe 100644
--- a/tests/tests/view/src/android/view/cts/SurfaceViewTest.java
+++ b/tests/tests/view/src/android/view/cts/SurfaceViewTest.java
@@ -28,12 +28,7 @@
 import android.view.SurfaceHolder;
 import android.view.SurfaceView;
 import android.view.cts.SurfaceViewStubActivity.MockSurfaceView;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(SurfaceView.class)
 public class SurfaceViewTest extends ActivityInstrumentationTestCase2<SurfaceViewStubActivity> {
     private static final long WAIT_TIME = 1000;
 
@@ -53,76 +48,12 @@
         mMockSurfaceView = getActivity().getSurfaceView();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link SurfaceView}",
-            method = "SurfaceView",
-            args = {Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link SurfaceView}",
-            method = "SurfaceView",
-            args = {Context.class, AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link SurfaceView}",
-            method = "SurfaceView",
-            args = {Context.class, AttributeSet.class, int.class}
-        )
-    })
     public void testConstructor() {
         new SurfaceView(mContext);
         new SurfaceView(mContext, null);
         new SurfaceView(mContext, null, 0);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: draw",
-            method = "draw",
-            args = {Canvas.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: dispatchDraw",
-            method = "dispatchDraw",
-            args = {Canvas.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: gatherTransparentRegion",
-            method = "gatherTransparentRegion",
-            args = {Region.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: getHolder",
-            method = "getHolder",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: onAttachedToWindow",
-            method = "onAttachedToWindow",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: onMeasure",
-            method = "onMeasure",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: onWindowVisibilityChanged",
-            method = "onWindowVisibilityChanged",
-            args = {int.class}
-        )
-    })
     public void testSurfaceView() {
         final int left = 40;
         final int top = 30;
@@ -160,12 +91,6 @@
         assertTrue(actual instanceof SurfaceHolder);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test method: onSizeChanged",
-        method = "onSizeChanged",
-        args = {int.class, int.class, int.class, int.class}
-    )
     @UiThreadTest
     /**
      * check point:
@@ -190,12 +115,6 @@
         assertEquals(bottom - top, mMockSurfaceView.getHeight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test method: onScrollChanged",
-        method = "onScrollChanged",
-        args = {int.class, int.class, int.class, int.class}
-    )
     @UiThreadTest
     /**
      * check point:
@@ -216,12 +135,6 @@
         assertEquals(scrollToY, mMockSurfaceView.getScrollY());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test method: onDetachedFromWindow",
-        method = "onDetachedFromWindow",
-        args = {}
-    )
     public void testOnDetachedFromWindow() {
         MockSurfaceView mockSurfaceView = getActivity().getSurfaceView();
         assertFalse(mockSurfaceView.isDetachedFromWindow());
diff --git a/tests/tests/view/src/android/view/cts/Surface_OutOfResourcesExceptionTest.java b/tests/tests/view/src/android/view/cts/Surface_OutOfResourcesExceptionTest.java
index 7c9fbc5..a98e818 100644
--- a/tests/tests/view/src/android/view/cts/Surface_OutOfResourcesExceptionTest.java
+++ b/tests/tests/view/src/android/view/cts/Surface_OutOfResourcesExceptionTest.java
@@ -19,27 +19,10 @@
 import android.test.AndroidTestCase;
 import android.view.Surface;
 import android.view.Surface.OutOfResourcesException;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(OutOfResourcesException.class)
 public class Surface_OutOfResourcesExceptionTest extends AndroidTestCase {
     private static final String NAME = "Test_Surface_OutOfResourcesException";
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Surface.OutOfResourcesException",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Surface.OutOfResourcesException",
-            args = {java.lang.String.class}
-        )
-    })
     public void testConstructor() {
         new Surface.OutOfResourcesException();
         new Surface.OutOfResourcesException(NAME);
diff --git a/tests/tests/view/src/android/view/cts/TouchDelegateTest.java b/tests/tests/view/src/android/view/cts/TouchDelegateTest.java
index 0a78d1f..4e582a1 100644
--- a/tests/tests/view/src/android/view/cts/TouchDelegateTest.java
+++ b/tests/tests/view/src/android/view/cts/TouchDelegateTest.java
@@ -16,10 +16,6 @@
 
 package android.view.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.app.Activity;
 import android.app.Instrumentation;
@@ -34,7 +30,6 @@
 import android.widget.Button;
 import android.widget.LinearLayout;
 
-@TestTargetClass(TouchDelegate.class)
 public class TouchDelegateTest extends ActivityInstrumentationTestCase2<MockActivity> {
     private static final int WRAP_CONTENT = ViewGroup.LayoutParams.WRAP_CONTENT;
     private static final int ACTION_DOWN = MotionEvent.ACTION_DOWN;
@@ -85,20 +80,6 @@
         mButton.getHitRect(mRect);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link TouchDelegate}",
-            method = "TouchDelegate",
-            args = {Rect.class, View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test method: MotionEvent",
-            method = "onTouchEvent",
-            args = {MotionEvent.class}
-        )
-    })
     @UiThreadTest
     public void testOnTouchEvent() {
         // test callback of onTouchEvent
diff --git a/tests/tests/view/src/android/view/cts/VelocityTrackerTest.java b/tests/tests/view/src/android/view/cts/VelocityTrackerTest.java
index 3a68233..970ac3c 100644
--- a/tests/tests/view/src/android/view/cts/VelocityTrackerTest.java
+++ b/tests/tests/view/src/android/view/cts/VelocityTrackerTest.java
@@ -16,10 +16,6 @@
 
 package android.view.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.test.AndroidTestCase;
 import android.view.MotionEvent;
@@ -27,7 +23,6 @@
 /**
  * Test {@link VelocityTracker}.
  */
-@TestTargetClass(VelocityTracker.class)
 public class VelocityTrackerTest extends AndroidTestCase {
     private static final float ERROR_TOLERANCE = 0.0001f;
 
@@ -36,22 +31,12 @@
         super.setUp();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "obtain",
-        args = {}
-    )
     public void testObtain() {
         VelocityTracker vt = VelocityTracker.obtain();
         assertNotNull(vt);
         vt.recycle();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "recycle",
-        args = {}
-    )
     public void testRecycle() {
         VelocityTracker vt = VelocityTracker.obtain();
         assertNotNull(vt);
@@ -61,33 +46,6 @@
         assertEquals(vt, vt2);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "computeCurrentVelocity",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getXVelocity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getYVelocity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addMovement",
-            args = {android.view.MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "clear",
-            args = {}
-        )
-    })
     public void testComputeCurrentVelocity() {
         // XVelocity & YVelocity calculated by the original algorithm from android
         float XVelocity;
diff --git a/tests/tests/view/src/android/view/cts/ViewConfigurationTest.java b/tests/tests/view/src/android/view/cts/ViewConfigurationTest.java
index 8784ff1..38e9130 100644
--- a/tests/tests/view/src/android/view/cts/ViewConfigurationTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewConfigurationTest.java
@@ -19,15 +19,10 @@
 import android.content.Context;
 import android.test.InstrumentationTestCase;
 import android.view.ViewConfiguration;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
 
 /**
  * Test {@link ViewConfiguration}.
  */
-@TestTargetClass(ViewConfiguration.class)
 public class ViewConfigurationTest extends InstrumentationTestCase {
 
     @Override
@@ -35,83 +30,6 @@
         super.setUp();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "getScrollBarSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "getFadingEdgeLength",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "getPressedStateDuration",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "getLongPressTimeout",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "getTapTimeout",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "getJumpTapTimeout",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "getEdgeSlop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "getTouchSlop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "getWindowTouchSlop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "getMinimumFlingVelocity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "getMaximumDrawingCacheSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "getZoomControlsTimeout",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "getGlobalActionKeyTimeout",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "getScrollFriction",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "getDoubleTapTimeout",
-            args = {}
-        )
-    })
     @SuppressWarnings("deprecation")
     public void testStaticValues() {
         ViewConfiguration.getScrollBarSize();
@@ -131,65 +49,11 @@
         ViewConfiguration.getDoubleTapTimeout();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "ViewConfiguration",
-            args = {}
-        )
-    })
     @SuppressWarnings("deprecation")
     public void testConstructor() {
         new ViewConfiguration();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "get",
-            args = {Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "getScaledDoubleTapSlop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "getScaledEdgeSlop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "getScaledFadingEdgeLength",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "getScaledMaximumDrawingCacheSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "getScaledMinimumFlingVelocity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "getScaledScrollBarSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "getScaledTouchSlop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "getScaledWindowTouchSlop",
-            args = {}
-        )
-    })
     public void testInstanceValues() {
         ViewConfiguration vc = ViewConfiguration.get(getInstrumentation().getTargetContext());
         assertNotNull(vc);
diff --git a/tests/tests/view/src/android/view/cts/ViewDebugTest.java b/tests/tests/view/src/android/view/cts/ViewDebugTest.java
index 46ff90e..2ba7397 100644
--- a/tests/tests/view/src/android/view/cts/ViewDebugTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewDebugTest.java
@@ -16,11 +16,6 @@
 
 package android.view.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.test.AndroidTestCase;
 import android.view.View;
@@ -29,36 +24,12 @@
 import android.view.ViewDebug.RecyclerTraceType;
 import android.widget.TextView;
 
-@TestTargetClass(ViewDebug.class)
 public class ViewDebugTest extends AndroidTestCase {
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "ViewDebug",
-        args = {}
-    )
     public void testConstructor() {
         new ViewDebug();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "startRecyclerTracing",
-            args = {String.class, View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "trace",
-            args = {View.class, RecyclerTraceType.class, int[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "stopRecyclerTracing",
-            args = {}
-        )
-    })
-    @ToBeFixed(bug = "1852451", explanation = "compiling error when set TRACE_RECYCLER to true")
     public void testRecyclerTracing() {
         final String recyclerTracePrefix = "ViewDebugTest";
         View ownerView = new View(getContext());
@@ -73,30 +44,6 @@
         ViewDebug.stopRecyclerTracing();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "startHierarchyTracing",
-            args = {String.class, View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "trace",
-            args = {View.class, HierarchyTraceType.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "stopHierarchyTracing",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "dumpCapturedView",
-            args = {String.class, Object.class}
-        )
-    })
-    @ToBeFixed(bug = "1852451", explanation = "throw IllegalStateException when set"
-              + "TRACE_HIERARCHY to true")
     public void testHierarchyTracing() {
         final String hierarchyTracePrefix = "ViewDebugTest";
         View v1 = new View(getContext());
diff --git a/tests/tests/view/src/android/view/cts/ViewGroupTest.java b/tests/tests/view/src/android/view/cts/ViewGroupTest.java
index 2498700..3e9eef3 100644
--- a/tests/tests/view/src/android/view/cts/ViewGroupTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewGroupTest.java
@@ -18,11 +18,6 @@
 
 import com.android.internal.util.XmlUtils;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.app.cts.CTSResult;
 import android.content.Context;
@@ -63,7 +58,6 @@
 
 import java.util.ArrayList;
 
-@TestTargetClass(ViewGroup.class)
 public class ViewGroupTest extends InstrumentationTestCase implements CTSResult{
 
     private Context mContext;
@@ -81,34 +75,12 @@
         mContext = getInstrumentation().getTargetContext();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ViewGroup",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ViewGroup",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ViewGroup",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
     public void testConstructor() {
         new MockViewGroup(mContext);
         new MockViewGroup(mContext, null);
         new MockViewGroup(mContext, null, 0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addFocusables",
-        args = {java.util.ArrayList.class, int.class}
-    )
     public void testAddFocusables() {
         MockViewGroup vg = new MockViewGroup(mContext);
         vg.setFocusable(true);
@@ -129,18 +101,6 @@
         assertEquals(1, list.size());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addStatesFromChildren",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAddStatesFromChildren",
-            args = {boolean.class}
-        )
-    })
     public void testAddStatesFromChildren() {
         MockViewGroup vg = new MockViewGroup(mContext);
         TextView textView = new TextView(mContext);
@@ -153,18 +113,6 @@
         assertTrue(vg.isDrawableStateChangedCalled);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addTouchables",
-            args = {java.util.ArrayList.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getChildAt",
-            args = {int.class}
-        )
-    })
     public void testAddTouchables() {
         MockViewGroup vg = new MockViewGroup(mContext);
         vg.setFocusable(true);
@@ -197,11 +145,6 @@
         assertNull(v);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addView",
-        args = {android.view.View.class}
-    )
     public void testAddView() {
         MockViewGroup vg = new MockViewGroup(mContext);
         TextView textView = new TextView(mContext);
@@ -212,11 +155,6 @@
         assertEquals(1, vg.getChildCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addView",
-        args = {android.view.View.class, int.class}
-    )
     public void testAddViewWithParaViewInt() {
         MockViewGroup vg = new MockViewGroup(mContext);
         TextView textView = new TextView(mContext);
@@ -227,11 +165,6 @@
         assertEquals(1, vg.getChildCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addView",
-        args = {android.view.View.class, android.view.ViewGroup.LayoutParams.class}
-    )
     public void testAddViewWithParaViewLayoutPara() {
         MockViewGroup vg = new MockViewGroup(mContext);
         TextView textView = new TextView(mContext);
@@ -243,11 +176,6 @@
         assertEquals(1, vg.getChildCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addView",
-        args = {android.view.View.class, int.class, int.class}
-    )
     public void testAddViewWithParaViewIntInt() {
         final int width = 100;
         final int height = 200;
@@ -263,11 +191,6 @@
         assertEquals(1, vg.getChildCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addView",
-        args = {android.view.View.class, int.class, android.view.ViewGroup.LayoutParams.class}
-    )
     public void testAddViewWidthParaViewIntLayoutParam() {
         MockViewGroup vg = new MockViewGroup(mContext);
         TextView textView = new TextView(mContext);
@@ -279,11 +202,6 @@
         assertEquals(1, vg.getChildCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addViewInLayout",
-        args = {android.view.View.class, int.class, android.view.ViewGroup.LayoutParams.class}
-    )
     public void testAddViewInLayout() {
         MockViewGroup vg = new MockViewGroup(mContext);
         TextView textView = new TextView(mContext);
@@ -299,12 +217,6 @@
         assertFalse(vg.isRequestLayoutCalled);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "attachLayoutAnimationParameters",
-        args = {android.view.View.class, android.view.ViewGroup.LayoutParams.class, int.class,
-                int.class}
-    )
     public void testAttachLayoutAnimationParameters() {
         MockViewGroup vg = new MockViewGroup(mContext);
         ViewGroup.LayoutParams param = new ViewGroup.LayoutParams(10, 10);
@@ -314,11 +226,6 @@
         assertEquals(1, param.layoutAnimationParameters.index);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "attachViewToParent",
-        args = {android.view.View.class, int.class, android.view.ViewGroup.LayoutParams.class}
-    )
     public void testAttachViewToParent() {
         MockViewGroup vg = new MockViewGroup(mContext);
         vg.setFocusable(true);
@@ -334,12 +241,6 @@
         assertSame(child, vg.getChildAt(0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addViewInLayout",
-        args = {android.view.View.class, int.class, android.view.ViewGroup.LayoutParams.class,
-                boolean.class}
-    )
     public void testAddViewInLayoutWithParamViewIntLayB() {
         MockViewGroup vg = new MockViewGroup(mContext);
         TextView textView = new TextView(mContext);
@@ -356,11 +257,6 @@
         assertFalse(vg.isRequestLayoutCalled);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "bringChildToFront",
-        args = {android.view.View.class}
-    )
     public void testBringChildToFront() {
         MockViewGroup vg = new MockViewGroup(mContext);
         TextView textView1 = new TextView(mContext);
@@ -385,11 +281,6 @@
         assertSame(textView1, vg.getChildAt(0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "canAnimate",
-        args = {}
-    )
     public void testCanAnimate() {
         MockViewGroup vg = new MockViewGroup(mContext);
 
@@ -401,11 +292,6 @@
         assertTrue(vg.canAnimate());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "checkLayoutParams",
-        args = {android.view.ViewGroup.LayoutParams.class}
-    )
     public void testCheckLayoutParams() {
         MockViewGroup view = new MockViewGroup(mContext);
         assertFalse(view.checkLayoutParams(null));
@@ -413,11 +299,6 @@
         assertTrue(view.checkLayoutParams(new ViewGroup.LayoutParams(100, 200)));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "childDrawableStateChanged",
-        args = {android.view.View.class}
-    )
     public void testChildDrawableStateChanged() {
         MockViewGroup vg = new MockViewGroup(mContext);
         vg.setAddStatesFromChildren(true);
@@ -426,11 +307,6 @@
         assertTrue(vg.isRefreshDrawableStateCalled);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "cleanupLayoutState",
-        args = {android.view.View.class}
-    )
     public void testCleanupLayoutState() {
         MockViewGroup vg = new MockViewGroup(mContext);
         TextView textView = new TextView(mContext);
@@ -441,18 +317,6 @@
         assertFalse(textView.isLayoutRequested());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "clearChildFocus",
-            args = {android.view.View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFocusedChild",
-            args = {}
-        )
-    })
     public void testClearChildFocus() {
         MockViewGroup vg = new MockViewGroup(mContext);
         TextView textView = new TextView(mContext);
@@ -467,11 +331,6 @@
         assertNull(vg.getFocusedChild());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clearDisappearingChildren",
-        args = {}
-    )
     public void testClearDisappearingChildren() {
 
         Canvas canvas = new Canvas();
@@ -500,11 +359,6 @@
         assertEquals(0, vg.drawChildCalledTime);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clearFocus",
-        args = {}
-    )
     public void testClearFocus() {
         MockViewGroup vg = new MockViewGroup(mContext);
         MockTextView textView = new MockTextView(mContext);
@@ -515,11 +369,6 @@
         assertTrue(textView.isClearFocusCalled);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "detachAllViewsFromParent",
-        args = {}
-    )
     public void testDetachAllViewsFromParent() {
         MockViewGroup vg = new MockViewGroup(mContext);
         TextView textView = new TextView(mContext);
@@ -532,11 +381,6 @@
         assertNull(textView.getParent());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "detachViewFromParent",
-        args = {int.class}
-    )
     public void testDetachViewFromParent() {
         MockViewGroup vg = new MockViewGroup(mContext);
         TextView textView = new TextView(mContext);
@@ -550,11 +394,6 @@
         assertNull(textView.getParent());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "detachViewFromParent",
-        args = {android.view.View.class}
-    )
     public void testDetachViewFromParentWithParamView() {
         MockViewGroup vg = new MockViewGroup(mContext);
         TextView textView = new TextView(mContext);
@@ -569,11 +408,6 @@
         assertNull(vg.getParent());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "detachViewsFromParent",
-        args = {int.class, int.class}
-    )
     public void testDetachViewsFromParent() {
         MockViewGroup vg = new MockViewGroup(mContext);
         TextView textView1 = new TextView(mContext);
@@ -592,11 +426,6 @@
         assertNull(textView2.getParent());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dispatchDraw",
-        args = {android.graphics.Canvas.class}
-    )
     public void testDispatchDraw() {
         MockViewGroup vg = new MockViewGroup(mContext);
         Canvas canvas = new Canvas();
@@ -606,11 +435,6 @@
         assertSame(canvas, vg.canvas);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dispatchFreezeSelfOnly",
-        args = {android.util.SparseArray.class}
-    )
     @SuppressWarnings("unchecked")
     public void testDispatchFreezeSelfOnly() {
         MockViewGroup vg = new MockViewGroup(mContext);
@@ -623,11 +447,6 @@
         assertEquals(1, container.size());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dispatchKeyEvent",
-        args = {android.view.KeyEvent.class}
-    )
     public void testDispatchKeyEvent() {
         MockViewGroup vg = new MockViewGroup(mContext);
         KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER);
@@ -641,18 +460,6 @@
         assertTrue(vg.dispatchKeyEvent(event));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchRestoreInstanceState",
-            args = {android.util.SparseArray.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchSaveInstanceState",
-            args = {android.util.SparseArray.class}
-        )
-    })
     @SuppressWarnings("unchecked")
     public void testDispatchSaveInstanceState() {
         MockViewGroup vg = new MockViewGroup(mContext);
@@ -674,11 +481,6 @@
         assertTrue(textView.isDispatchRestoreInstanceStateCalled);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dispatchSetPressed",
-        args = {boolean.class}
-    )
     public void testDispatchSetPressed() {
         MockViewGroup vg = new MockViewGroup(mContext);
         MockTextView textView = new MockTextView(mContext);
@@ -691,11 +493,6 @@
         assertFalse(textView.isPressed());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dispatchSetSelected",
-        args = {boolean.class}
-    )
     public void testDispatchSetSelected() {
         MockViewGroup vg = new MockViewGroup(mContext);
         MockTextView textView = new MockTextView(mContext);
@@ -708,11 +505,6 @@
         assertFalse(textView.isSelected());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dispatchThawSelfOnly",
-        args = {android.util.SparseArray.class}
-    )
     @SuppressWarnings("unchecked")
     public void testDispatchThawSelfOnly() {
         MockViewGroup vg = new MockViewGroup(mContext);
@@ -725,11 +517,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dispatchTouchEvent",
-        args = {android.view.MotionEvent.class}
-    )
     public void testDispatchTouchEvent() {
         MockViewGroup vg = new MockViewGroup(mContext);
 
@@ -769,11 +556,6 @@
         assertSame(me, mMotionEvent);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dispatchTrackballEvent",
-        args = {android.view.MotionEvent.class}
-    )
     public void testDispatchTrackballEvent() {
         MockViewGroup vg = new MockViewGroup(mContext);
         MotionEvent me = MotionEvent.obtain(SystemClock.uptimeMillis(),
@@ -788,11 +570,6 @@
         assertTrue(vg.dispatchTrackballEvent(me));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dispatchUnhandledMove",
-        args = {android.view.View.class, int.class}
-    )
     public void testDispatchUnhandledMove() {
         MockViewGroup vg = new MockViewGroup(mContext);
         MockTextView textView = new MockTextView(mContext);
@@ -804,11 +581,6 @@
         assertTrue(vg.dispatchUnhandledMove(textView, View.FOCUS_DOWN));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dispatchWindowFocusChanged",
-        args = {boolean.class}
-    )
     public void testDispatchWindowFocusChanged() {
         MockViewGroup vg = new MockViewGroup(mContext);
         MockTextView textView = new MockTextView(mContext);
@@ -821,11 +593,6 @@
         assertFalse(textView.isPressed());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dispatchWindowVisibilityChanged",
-        args = {int.class}
-    )
     public void testDispatchWindowVisibilityChanged() {
         int expected = 10;
         MockViewGroup vg = new MockViewGroup(mContext);
@@ -836,11 +603,6 @@
         assertEquals(expected, textView.visibility);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawableStateChanged",
-        args = {}
-    )
     public void testDrawableStateChanged() {
         MockViewGroup vg = new MockViewGroup(mContext);
         MockTextView textView = new MockTextView(mContext);
@@ -852,11 +614,6 @@
         assertTrue(textView.mIsRefreshDrawableStateCalled);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawChild",
-        args = {android.graphics.Canvas.class, android.view.View.class, long.class}
-    )
     public void testDrawChild() {
         MockViewGroup vg = new MockViewGroup(mContext);
         MockTextView textView = new MockTextView(mContext);
@@ -870,11 +627,6 @@
         assertTrue(textView.isDrawCalled);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "findFocus",
-        args = {}
-    )
     public void testFindFocus() {
         MockViewGroup vg = new MockViewGroup(mContext);
 
@@ -888,11 +640,6 @@
         assertSame(vg, vg.findFocus());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "fitSystemWindows",
-        args = {android.graphics.Rect.class}
-    )
     public void testFitSystemWindows() {
         Rect rect = new Rect(1, 1, 100, 100);
         MockViewGroup vg = new MockViewGroup(mContext);
@@ -931,11 +678,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "focusableViewAvailable",
-        args = {android.view.View.class}
-    )
     public void testFocusableViewAvailable() {
         MockViewGroup vg = new MockViewGroup(mContext);
         MockView son = new MockView(mContext);
@@ -947,11 +689,6 @@
         assertTrue(vg.isFocusableViewAvailable);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "focusSearch",
-        args = {android.view.View.class, int.class}
-    )
     public void testFocusSearch() {
         MockViewGroup vg = new MockViewGroup(mContext);
         MockTextView textView = new MockTextView(mContext);
@@ -962,12 +699,6 @@
         assertSame(textView, son.focusSearch(textView, 1));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "gatherTransparentRegion",
-        args = {android.graphics.Region.class}
-    )
-    @ToBeFixed(bug = "1391284", explanation = "Currently this function always return true")
     public void testGatherTransparentRegion() {
         Region region = new Region();
         MockViewGroup vg = new MockViewGroup(mContext);
@@ -981,11 +712,6 @@
         assertTrue(vg.gatherTransparentRegion(null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "generateDefaultLayoutParams",
-        args = {}
-    )
     public void testGenerateDefaultLayoutParams(){
         MockViewGroup vg = new MockViewGroup(mContext);
         LayoutParams lp = vg.generateDefaultLayoutParams();
@@ -994,11 +720,6 @@
         assertEquals(LayoutParams.WRAP_CONTENT, lp.height);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "generateLayoutParams",
-        args = {android.util.AttributeSet.class}
-    )
     public void testGenerateLayoutParamsWithParaAttributeSet() throws Exception{
         MockViewGroup vg = new MockViewGroup(mContext);
         XmlResourceParser set = mContext.getResources().getLayout(
@@ -1010,11 +731,6 @@
         assertEquals(25, lp.width);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "generateLayoutParams",
-        args = {android.view.ViewGroup.LayoutParams.class}
-    )
     public void testGenerateLayoutParams() {
         MockViewGroup vg = new MockViewGroup(mContext);
         LayoutParams p = new LayoutParams(LayoutParams.WRAP_CONTENT,
@@ -1022,22 +738,12 @@
         assertSame(p, vg.generateLayoutParams(p));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getChildDrawingOrder",
-        args = {int.class, int.class}
-    )
     public void testGetChildDrawingOrder() {
         MockViewGroup vg = new MockViewGroup(mContext);
         assertEquals(1, vg.getChildDrawingOrder(0, 1));
         assertEquals(2, vg.getChildDrawingOrder(0, 2));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getChildMeasureSpec",
-        args = {int.class, int.class, int.class}
-    )
     public void testGetChildMeasureSpec() {
         int spec = 1;
         int padding = 1;
@@ -1051,21 +757,11 @@
                 ViewGroup.getChildMeasureSpec(spec, padding, childDimension));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getChildStaticTransformation",
-        args = {android.view.View.class, android.view.animation.Transformation.class}
-    )
     public void testGetChildStaticTransformation() {
         MockViewGroup vg = new MockViewGroup(mContext);
         assertFalse(vg.getChildStaticTransformation(null, null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getChildVisibleRect",
-        args = {android.view.View.class, android.graphics.Rect.class, android.graphics.Point.class}
-    )
     public void testGetChildVisibleRect() {
         MockViewGroup vg = new MockViewGroup(mContext);
         MockTextView textView = new MockTextView(mContext);
@@ -1082,11 +778,6 @@
         assertTrue(vg.getChildVisibleRect(textView, rect, p));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getDescendantFocusability",
-        args = {}
-    )
     public void testGetDescendantFocusability() {
         MockViewGroup vg = new MockViewGroup(mContext);
         final int FLAG_MASK_FOCUSABILITY = 0x60000;
@@ -1096,11 +787,6 @@
         assertFalse((vg.getDescendantFocusability() & FLAG_MASK_FOCUSABILITY) == 0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLayoutAnimation",
-        args = {}
-    )
     public void testGetLayoutAnimation() {
         MockViewGroup vg = new MockViewGroup(mContext);
 
@@ -1112,18 +798,6 @@
         assertSame(la, vg.getLayoutAnimation());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLayoutAnimationListener",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setLayoutAnimationListener",
-            args = {android.view.animation.Animation.AnimationListener.class}
-        )
-    })
     public void testGetLayoutAnimationListener() {
         MockViewGroup vg = new MockViewGroup(mContext);
 
@@ -1144,11 +818,6 @@
         assertSame(al, vg.getLayoutAnimationListener());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getPersistentDrawingCache",
-        args = {}
-    )
     public void testGetPersistentDrawingCache() {
         MockViewGroup vg = new MockViewGroup(mContext);
         final int mPersistentDrawingCache1 = 2;
@@ -1159,11 +828,6 @@
         assertEquals(mPersistentDrawingCache2, vg.getPersistentDrawingCache());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "hasFocus",
-        args = {}
-    )
     public void testHasFocus() {
         MockViewGroup vg = new MockViewGroup(mContext);
         assertFalse(vg.hasFocus());
@@ -1176,11 +840,6 @@
         assertTrue(vg.hasFocus());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "hasFocusable",
-        args = {}
-    )
     public void testHasFocusable() {
         MockViewGroup vg = new MockViewGroup(mContext);
         assertFalse(vg.hasFocusable());
@@ -1190,11 +849,6 @@
         assertTrue(vg.hasFocusable());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "indexOfChild",
-        args = {android.view.View.class}
-    )
     public void testIndexOfChild() {
         MockViewGroup vg = new MockViewGroup(mContext);
         TextView textView = new TextView(mContext);
@@ -1214,18 +868,6 @@
         getInstrumentation().getTargetContext().startActivity(intent);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "invalidateChild",
-            args = {android.view.View.class, android.graphics.Rect.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "invalidateChildInParent",
-            args = {int[].class, android.graphics.Rect.class}
-        )
-    })
     public void testInvalidateChild() {
         ViewGroupStubActivity.setResult(this);
         setupActivity(ViewGroupStubActivity.ACTION_INVALIDATE_CHILD);
@@ -1244,18 +886,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isAlwaysDrawnWithCacheEnabled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAlwaysDrawnWithCacheEnabled",
-            args = {boolean.class}
-        )
-    })
     public void testIsAlwaysDrawnWithCacheEnabled() {
         MockViewGroup vg = new MockViewGroup(mContext);
 
@@ -1267,18 +897,6 @@
         assertTrue(vg.isAlwaysDrawnWithCacheEnabled());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isAnimationCacheEnabled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAnimationCacheEnabled",
-            args = {boolean.class}
-        )
-    })
     public void testIsAnimationCacheEnabled() {
         MockViewGroup vg = new MockViewGroup(mContext);
 
@@ -1290,11 +908,6 @@
         assertTrue(vg.isAnimationCacheEnabled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isChildrenDrawnWithCacheEnabled",
-        args = {}
-    )
     public void testIsChildrenDrawnWithCacheEnabled() {
         MockViewGroup vg = new MockViewGroup(mContext);
 
@@ -1304,11 +917,6 @@
         assertTrue(vg.isChildrenDrawnWithCacheEnabled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "measureChild",
-        args = {android.view.View.class, int.class, int.class}
-    )
     public void testMeasureChild() {
         final int width = 100;
         final int height = 200;
@@ -1327,11 +935,6 @@
                 son.mHeightMeasureSpec);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "measureChildren",
-        args = {int.class, int.class}
-    )
     public void testMeasureChildren() {
         final int widthMeasureSpec = 100;
         final int heightMeasureSpec = 200;
@@ -1352,11 +955,6 @@
         assertEquals(1, vg.measureChildCalledTime);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "measureChildWithMargins",
-        args = {android.view.View.class, int.class, int.class, int.class, int.class}
-    )
     public void testMeasureChildWithMargins() {
         final int width = 10;
         final int height = 20;
@@ -1385,11 +983,6 @@
                 son.mHeightMeasureSpec);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "offsetDescendantRectToMyCoords",
-        args = {android.view.View.class, android.graphics.Rect.class}
-    )
     public void testOffsetDescendantRectToMyCoords() {
         MockViewGroup vg = new MockViewGroup(mContext);
         MockTextView textView = new MockTextView(mContext);
@@ -1411,11 +1004,6 @@
         assertEquals(1, rect.right);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "offsetRectIntoDescendantCoords",
-        args = {android.view.View.class, android.graphics.Rect.class}
-    )
     public void testOffsetRectIntoDescendantCoords() {
         MockViewGroup vg = new MockViewGroup(mContext);
         vg.setFrame(10, 20, 30, 40);
@@ -1439,11 +1027,6 @@
         assertEquals(6, rect.right);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onAnimationEnd",
-        args = {}
-    )
     public void testOnAnimationEnd() {
         // this function is a call back function it should be tested in ViewGroup#drawChild.
         MockViewGroup father = new MockViewGroup(mContext);
@@ -1474,11 +1057,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onAnimationStart",
-        args = {}
-    )
     public void testOnAnimationStart() {
         // This is a call back method. It should be tested in ViewGroup#drawChild.
         MockViewGroup father = new MockViewGroup(mContext);
@@ -1499,11 +1077,6 @@
         assertTrue(son.isOnAnimationStartCalled);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onCreateDrawableState",
-        args = {int.class}
-    )
     public void testOnCreateDrawableState() {
         MockViewGroup vg = new MockViewGroup(mContext);
         // Call back function. Called in View#getDrawableState()
@@ -1512,11 +1085,6 @@
         assertEquals(1, data.length);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onInterceptTouchEvent",
-        args = {android.view.MotionEvent.class}
-    )
     public void testOnInterceptTouchEvent() {
         MockViewGroup vg = new MockViewGroup(mContext);
         MotionEvent me = MotionEvent.obtain(SystemClock.uptimeMillis(),
@@ -1527,11 +1095,6 @@
         assertTrue(vg.isOnInterceptTouchEventCalled);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onLayout",
-        args = {boolean.class, int.class, int.class, int.class, int.class}
-    )
     public void testOnLayout() {
         final int left = 1;
         final int top = 2;
@@ -1545,11 +1108,6 @@
         assertEquals(bottom, mv.bottom);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onRequestFocusInDescendants",
-        args = {int.class, android.graphics.Rect.class}
-    )
     public void testOnRequestFocusInDescendants() {
         MockViewGroup vg = new MockViewGroup(mContext);
 
@@ -1557,18 +1115,6 @@
         assertTrue(vg.isOnRequestFocusInDescendantsCalled);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeAllViews",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getChildCount",
-            args = {}
-        )
-    })
     public void testRemoveAllViews() {
         MockViewGroup vg = new MockViewGroup(mContext);
         MockTextView textView = new MockTextView(mContext);
@@ -1582,11 +1128,6 @@
         assertNull(textView.getParent());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "removeAllViewsInLayout",
-        args = {}
-    )
     public void testRemoveAllViewsInLayout() {
         MockViewGroup father = new MockViewGroup(mContext);
         MockViewGroup son = new MockViewGroup(mContext);
@@ -1605,11 +1146,6 @@
         assertSame(son, textView.getParent());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "removeDetachedView",
-        args = {android.view.View.class, boolean.class}
-    )
     public void testRemoveDetachedView() {
         MockViewGroup father = new MockViewGroup(mContext);
         MockViewGroup son1 = new MockViewGroup(mContext);
@@ -1638,11 +1174,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "removeView",
-        args = {android.view.View.class}
-    )
     public void testRemoveView() {
         MockViewGroup father = new MockViewGroup(mContext);
         MockViewGroup son = new MockViewGroup(mContext);
@@ -1657,11 +1188,6 @@
         assertNull(son.getParent());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "removeViewAt",
-        args = {int.class}
-    )
     public void testRemoveViewAt() {
         MockViewGroup father = new MockViewGroup(mContext);
         MockViewGroup son = new MockViewGroup(mContext);
@@ -1684,11 +1210,6 @@
         assertNull(son.getParent());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "removeViewInLayout",
-        args = {android.view.View.class}
-    )
     public void testRemoveViewInLayout() {
         MockViewGroup father = new MockViewGroup(mContext);
         MockViewGroup son = new MockViewGroup(mContext);
@@ -1703,11 +1224,6 @@
         assertNull(son.getParent());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "removeViews",
-        args = {int.class, int.class}
-    )
     public void testRemoveViews() {
         MockViewGroup father = new MockViewGroup(mContext);
         MockViewGroup son1 = new MockViewGroup(mContext);
@@ -1728,11 +1244,6 @@
         assertNull(son2.getParent());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "removeViewsInLayout",
-        args = {int.class, int.class}
-    )
     public void testRemoveViewsInLayout() {
         MockViewGroup father = new MockViewGroup(mContext);
         MockViewGroup son1 = new MockViewGroup(mContext);
@@ -1753,11 +1264,6 @@
         assertNull(son2.getParent());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "requestChildFocus",
-        args = {android.view.View.class, android.view.View.class}
-    )
     public void testRequestChildFocus() {
         MockViewGroup vg = new MockViewGroup(mContext);
         TextView textView = new TextView(mContext);
@@ -1771,21 +1277,11 @@
         assertNull(vg.getFocusedChild());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "requestChildRectangleOnScreen",
-        args = {android.view.View.class, android.graphics.Rect.class, boolean.class}
-    )
     public void testRequestChildRectangleOnScreen() {
         MockViewGroup vg = new MockViewGroup(mContext);
         assertFalse(vg.requestChildRectangleOnScreen(null, null, false));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "requestDisallowInterceptTouchEvent",
-        args = {boolean.class}
-    )
     public void testRequestDisallowInterceptTouchEvent() {
         MockViewGroup father = new MockViewGroup(mContext);
         MockView son = new MockView(mContext);
@@ -1796,11 +1292,6 @@
         assertTrue(father.isRequestDisallowInterceptTouchEventCalled);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "requestFocus",
-        args = {int.class, android.graphics.Rect.class}
-    )
     public void testRequestFocus() {
         MockViewGroup vg = new MockViewGroup(mContext);
 
@@ -1808,11 +1299,6 @@
         assertTrue(vg.isOnRequestFocusInDescendantsCalled);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "requestTransparentRegion",
-        args = {android.view.View.class}
-    )
     public void testRequestTransparentRegion() {
         MockViewGroup father = new MockViewGroup(mContext);
         MockView son1 = new MockView(mContext);
@@ -1823,11 +1309,6 @@
         assertTrue(father.isRequestTransparentRegionCalled);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "scheduleLayoutAnimation",
-        args = {}
-    )
     public void testScheduleLayoutAnimation() {
         MockViewGroup vg = new MockViewGroup(mContext);
         Animation animation = new AlphaAnimation(mContext, null);
@@ -1854,11 +1335,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setAddStatesFromChildren",
-        args = {boolean.class}
-    )
     public void testSetAddStatesFromChildren() {
         MockViewGroup vg = new MockViewGroup(mContext);
         vg.setAddStatesFromChildren(true);
@@ -1868,11 +1344,6 @@
         assertFalse(vg.addStatesFromChildren());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setChildrenDrawingCacheEnabled",
-        args = {boolean.class}
-    )
     public void testSetChildrenDrawingCacheEnabled() {
         MockViewGroup vg = new MockViewGroup(mContext);
 
@@ -1885,11 +1356,6 @@
         assertTrue(vg.isAnimationCacheEnabled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setChildrenDrawnWithCacheEnabled",
-        args = {boolean.class}
-    )
     public void testSetChildrenDrawnWithCacheEnabled() {
         MockViewGroup vg = new MockViewGroup(mContext);
 
@@ -1902,11 +1368,6 @@
         assertFalse(vg.isChildrenDrawnWithCacheEnabled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setClipChildren",
-        args = {boolean.class}
-    )
     public void testSetClipChildren() {
         Bitmap bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
 
@@ -1964,11 +1425,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setClipToPadding",
-        args = {boolean.class}
-    )
     public void testSetClipToPadding() {
         final int frameLeft = 1;
         final int frameTop = 2;
@@ -2002,11 +1458,6 @@
         assertEquals(0, canvas.mBottom);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setDescendantFocusability",
-        args = {int.class}
-    )
     public void testSetDescendantFocusability() {
         MockViewGroup vg = new MockViewGroup(mContext);
         final int FLAG_MASK_FOCUSABILITY = 0x60000;
@@ -2021,11 +1472,6 @@
                 ViewGroup.FOCUS_BEFORE_DESCENDANTS) == 0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setOnHierarchyChangeListener",
-        args = {android.view.ViewGroup.OnHierarchyChangeListener.class}
-    )
     public void testSetOnHierarchyChangeListener() {
         MockViewGroup father = new MockViewGroup(mContext);
         MockViewGroup son = new MockViewGroup(mContext);
@@ -2038,11 +1484,6 @@
         assertSame(son, listener.sChild);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setPadding",
-        args = {int.class, int.class, int.class, int.class}
-    )
     public void testSetPadding() {
         final int left = 1;
         final int top = 2;
@@ -2061,11 +1502,6 @@
         assertEquals(right, vg.getPaddingRight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setPersistentDrawingCache",
-        args = {int.class}
-    )
     public void testSetPersistentDrawingCache() {
         MockViewGroup vg = new MockViewGroup(mContext);
         vg.setPersistentDrawingCache(1);
@@ -2073,11 +1509,6 @@
                 .getPersistentDrawingCache());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "showContextMenuForChild",
-        args = {android.view.View.class}
-    )
     public void testShowContextMenuForChild() {
         MockViewGroup father = new MockViewGroup(mContext);
         MockViewGroup son = new MockViewGroup(mContext);
@@ -2087,18 +1518,6 @@
         assertTrue(father.isShowContextMenuForChildCalled);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startLayoutAnimation",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setLayoutAnimation",
-            args = {android.view.animation.LayoutAnimationController.class}
-        )
-    })
     public void testStartLayoutAnimation() {
         MockViewGroup vg = new MockViewGroup(mContext);
         RotateAnimation animation = new RotateAnimation(0.1f, 0.1f);
@@ -2111,11 +1530,6 @@
         assertTrue(vg.isLayoutRequested());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "updateViewLayout",
-        args = {android.view.View.class, android.view.ViewGroup.LayoutParams.class}
-    )
     public void testUpdateViewLayout() {
         MockViewGroup father = new MockViewGroup(mContext);
         MockViewGroup son = new MockViewGroup(mContext);
@@ -2127,11 +1541,6 @@
         assertEquals(param.height, son.getLayoutParams().height);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "debug",
-        args = {int.class}
-    )
     public void testDebug() {
         final int EXPECTED = 100;
         MockViewGroup father = new MockViewGroup(mContext);
@@ -2142,23 +1551,6 @@
         assertEquals(EXPECTED + 1, son.debugDepth);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchKeyEventPreIme",
-            args = {KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchKeyShortcutEvent",
-            args = {KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setStaticTransformationsEnabled",
-            args = {boolean.class}
-        )
-    })
     public void testDispatchKeyEventPreIme() {
         MockViewGroup vg = new MockViewGroup(mContext);
         KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER);
diff --git a/tests/tests/view/src/android/view/cts/ViewGroup_LayoutParamsTest.java b/tests/tests/view/src/android/view/cts/ViewGroup_LayoutParamsTest.java
index f38b899..37bac7c 100644
--- a/tests/tests/view/src/android/view/cts/ViewGroup_LayoutParamsTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewGroup_LayoutParamsTest.java
@@ -31,32 +31,10 @@
 import com.android.cts.stub.R;
 import com.android.internal.util.XmlUtils;
 
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(ViewGroup.LayoutParams.class)
 public class ViewGroup_LayoutParamsTest extends AndroidTestCase {
     private ViewGroup.LayoutParams mLayoutParams;
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ViewGroup.LayoutParams",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ViewGroup.LayoutParams",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ViewGroup.LayoutParams",
-            args = {android.view.ViewGroup.LayoutParams.class}
-        )
-    })
     public void testConstructor() throws XmlPullParserException, IOException {
         // new the MarginLayoutParams instance
         XmlResourceParser parser = mContext.getResources().getLayout(
@@ -70,12 +48,6 @@
         new ViewGroup.LayoutParams(temp);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test setBaseAttributes(TypedArray, int, int)",
-        method = "setBaseAttributes",
-        args = {android.content.res.TypedArray.class, int.class, int.class}
-    )
     public void testSetBaseAttributes() throws XmlPullParserException, IOException {
         MockLayoutParams mockLayoutParams = new MockLayoutParams(240, 320);
 
diff --git a/tests/tests/view/src/android/view/cts/ViewGroup_MarginLayoutParamsTest.java b/tests/tests/view/src/android/view/cts/ViewGroup_MarginLayoutParamsTest.java
index b395fc7..5f257e4 100644
--- a/tests/tests/view/src/android/view/cts/ViewGroup_MarginLayoutParamsTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewGroup_MarginLayoutParamsTest.java
@@ -27,12 +27,7 @@
 import com.android.internal.util.XmlUtils;
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
-@TestTargetClass(ViewGroup.MarginLayoutParams.class)
 public class ViewGroup_MarginLayoutParamsTest extends AndroidTestCase {
 
     private ViewGroup.MarginLayoutParams mMarginLayoutParams;
@@ -43,32 +38,6 @@
         mMarginLayoutParams = null;
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test MarginLayoutParams constructor",
-            method = "ViewGroup.MarginLayoutParams",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test MarginLayoutParams constructor",
-            method = "ViewGroup.MarginLayoutParams",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test MarginLayoutParams constructor",
-            method = "ViewGroup.MarginLayoutParams",
-            args = {android.view.ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test MarginLayoutParams constructor",
-            method = "ViewGroup.MarginLayoutParams",
-            args = {android.view.ViewGroup.MarginLayoutParams.class}
-        )
-    })
     public void testConstructor() {
         mMarginLayoutParams = null;
         // new the MarginLayoutParams instance
@@ -101,12 +70,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test setMargins function",
-        method = "setMargins",
-        args = {int.class, int.class, int.class, int.class}
-    )
     public void testSetMargins() {
 
         // new the MarginLayoutParams instance
diff --git a/tests/tests/view/src/android/view/cts/ViewStubTest.java b/tests/tests/view/src/android/view/cts/ViewStubTest.java
index 388e8e9..07834d2 100644
--- a/tests/tests/view/src/android/view/cts/ViewStubTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewStubTest.java
@@ -19,11 +19,6 @@
 import com.android.cts.stub.R;
 
 import dalvik.annotation.KnownFailure;
-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;
 
@@ -42,7 +37,6 @@
 /**
  * Test {@link ViewStub}.
  */
-@TestTargetClass(ViewStub.class)
 public class ViewStubTest extends ActivityInstrumentationTestCase<ViewStubStubActivity> {
     private Context mContext;
     private Activity mActivity;
@@ -58,32 +52,6 @@
         mActivity = getActivity();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link ViewStub}",
-            method = "ViewStub",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link ViewStub}",
-            method = "ViewStub",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link ViewStub}",
-            method = "ViewStub",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link ViewStub}",
-            method = "ViewStub",
-            args = {android.content.Context.class, int.class}
-        )
-    })
     public void testConstructor() {
         XmlPullParser parser = mActivity.getResources().getXml(R.layout.viewstub_layout);
         AttributeSet attrs = Xml.asAttributeSet(parser);
@@ -98,12 +66,6 @@
         new ViewStub(mContext, attrs, 30);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ViewStub#draw(Canvas)}",
-        method = "draw",
-        args = {android.graphics.Canvas.class}
-    )
     public void testDraw() {
         ViewStub viewStub = new ViewStub(mContext);
         // if the function draw() does not throw any exception,
@@ -111,12 +73,6 @@
         viewStub.draw(null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ViewStub#setVisibility(int)}",
-        method = "setVisibility",
-        args = {int.class}
-    )
     @UiThreadTest
     public void testSetVisibility() {
         final ViewStub viewStub1 = (ViewStub) mActivity.findViewById(R.id.viewstub);
@@ -150,18 +106,6 @@
         assertEquals(View.INVISIBLE, viewStub2.getVisibility());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLayoutResource",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setLayoutResource",
-            args = {int.class}
-        )
-    })
     public void testAccessLayoutResource() {
         ViewStub viewStub = new ViewStub(mContext);
 
@@ -175,12 +119,6 @@
         assertEquals(-1, viewStub.getLayoutResource());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ViewStub#onMeasure(int, int)}",
-        method = "onMeasure",
-        args = {int.class, int.class}
-    )
     public void testViewStubHasNoDimensions() {
         ViewStub viewStub = new ViewStub(mContext);
 
@@ -194,12 +132,6 @@
         assertEquals(0, viewStub.getMeasuredHeight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ViewStub#setOnInflateListener(OnInflateListener)}",
-        method = "setOnInflateListener",
-        args = {android.view.ViewStub.OnInflateListener.class}
-    )
     @UiThreadTest
     public void testSetOnInflateListener() {
         final ViewStub viewStub = (ViewStub) mActivity.findViewById(R.id.viewstub);
@@ -211,11 +143,6 @@
         assertTrue(listener.hasCalledOnInflate());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setOnInflateListener",
-        args = {android.view.ViewStub.OnInflateListener.class}
-    )
     @UiThreadTest
     public void testSetOnInflateListenerError() {
         final ViewStub viewStub = (ViewStub) mActivity.findViewById(R.id.viewstub);
@@ -228,20 +155,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link ViewStub#getInflatedId()} and {@link ViewStub#setInflatedId(int)}",
-            method = "getInflatedId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link ViewStub#getInflatedId()} and {@link ViewStub#setInflatedId(int)}",
-            method = "setInflatedId",
-            args = {int.class}
-        )
-    })
     public void testAccessInflatedId() {
         ViewStub viewStub = new ViewStub(mContext);
         assertEquals(0, viewStub.getInflatedId());
@@ -253,12 +166,6 @@
         assertEquals(-1, viewStub.getInflatedId());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ViewStub#inflate()}",
-        method = "inflate",
-        args = {}
-    )
     @UiThreadTest
     public void testInflate() {
         final ViewStub viewStub = (ViewStub) mActivity.findViewById(R.id.viewstub);
@@ -280,15 +187,6 @@
         assertTrue(listener.hasCalledOnInflate());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test abnormal condition of {@link ViewStub#inflate()}",
-        method = "inflate",
-        args = {}
-    )
-    @ToBeFixed(bug="", explanation="should add javadoc for ViewStub#inflate(): it will" +
-            " throw IllegalArgumentException when resource is invalid and " +
-            " throw IllegalStateException when parent is null")
     public void testInflateError() {
         final ViewStub viewStub = (ViewStub) mActivity.findViewById(R.id.viewstub);
 
diff --git a/tests/tests/view/src/android/view/cts/ViewTest.java b/tests/tests/view/src/android/view/cts/ViewTest.java
index be60976..e6a802a 100644
--- a/tests/tests/view/src/android/view/cts/ViewTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewTest.java
@@ -29,6 +29,7 @@
 import android.content.Context;
 import android.content.res.Resources;
 import android.content.res.XmlResourceParser;
+import android.cts.util.PollingCheck;
 import android.graphics.Bitmap;
 import android.graphics.Point;
 import android.graphics.Rect;
@@ -69,7 +70,6 @@
 import android.view.accessibility.AccessibilityEvent;
 import android.view.animation.AlphaAnimation;
 import android.view.animation.Animation;
-import android.view.animation.cts.DelayedCheck;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputConnection;
 import android.view.inputmethod.InputMethodManager;
@@ -79,16 +79,10 @@
 import android.widget.LinearLayout;
 import android.widget.ListView;
 import android.widget.cts.StubActivity;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 /**
  * Test {@link View}.
  */
-@TestTargetClass(View.class)
 public class ViewTest extends ActivityInstrumentationTestCase2<ViewTestStubActivity> {
     public ViewTest() {
         super(ViewTestStubActivity.class);
@@ -111,23 +105,6 @@
         mMockParent = new MockViewParent(mActivity);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "View",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "View",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "View",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
     public void testConstructor() {
         new View(mActivity);
 
@@ -154,31 +131,16 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getContext",
-        args = {}
-    )
     public void testGetContext() {
         View view = new View(mActivity);
         assertSame(mActivity, view.getContext());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getResources",
-        args = {}
-    )
     public void testGetResources() {
         View view = new View(mActivity);
         assertSame(mResources, view.getResources());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getAnimation",
-        args = {}
-    )
     public void testGetAnimation() {
         Animation animation = new AlphaAnimation(0.0f, 1.0f);
         View view = new View(mActivity);
@@ -191,11 +153,6 @@
         assertNull(view.getAnimation());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setAnimation",
-        args = {android.view.animation.Animation.class}
-    )
     public void testSetAnimation() {
         Animation animation = new AlphaAnimation(0.0f, 1.0f);
         View view = new View(mActivity);
@@ -211,11 +168,6 @@
         assertNull(view.getAnimation());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clearAnimation",
-        args = {}
-    )
     public void testClearAnimation() {
         Animation animation = new AlphaAnimation(0.0f, 1.0f);
         View view = new View(mActivity);
@@ -230,13 +182,6 @@
         assertNull(view.getAnimation());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "startAnimation",
-        args = {android.view.animation.Animation.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for startAnimation() is incomplete." +
-            "1. not clear what is supposed to happen if animation is null.")
     public void testStartAnimation() {
         Animation animation = new AlphaAnimation(0.0f, 1.0f);
         View view = new View(mActivity);
@@ -253,23 +198,6 @@
         assertEquals(Animation.START_ON_FIRST_FRAME, animation.getStartTime());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onAnimationStart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onAnimationEnd",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSetAlpha",
-            args = {int.class}
-        )
-    })
     public void testOnAnimation() throws Throwable {
         final Animation animation = new AlphaAnimation(0.0f, 1.0f);
         long duration = 2000L;
@@ -287,7 +215,7 @@
         assertTrue(view.hasCalledOnAnimationStart());
 
         // check whether it has ended after duration, and alpha changed during this time.
-        new DelayedCheck(duration + TIMEOUT_DELTA) {
+        new PollingCheck(duration + TIMEOUT_DELTA) {
             @Override
             protected boolean check() {
                 return view.hasCalledOnSetAlpha() && view.hasCalledOnAnimationEnd();
@@ -295,22 +223,12 @@
         }.run();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getParent",
-        args = {}
-    )
     public void testGetParent() {
         MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
         ViewGroup parent = (ViewGroup) mActivity.findViewById(R.id.viewlayout_root);
         assertSame(parent, view.getParent());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "findViewById",
-        args = {int.class}
-    )
     public void testFindViewById() {
         View parent = mActivity.findViewById(R.id.viewlayout_root);
         assertSame(parent, parent.findViewById(R.id.viewlayout_root));
@@ -319,18 +237,6 @@
         assertTrue(view instanceof MockView);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTouchDelegate",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTouchDelegate",
-            args = {android.view.TouchDelegate.class}
-        )
-    })
     public void testAccessTouchDelegate() throws Throwable {
         final MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
         Rect rect = new Rect();
@@ -359,23 +265,6 @@
         assertNull(view.getTouchDelegate());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTag",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTag",
-            args = {java.lang.Object.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "findViewWithTag",
-            args = {java.lang.Object.class}
-        )
-    })
     @UiThreadTest
     public void testAccessTag() {
         ViewGroup viewGroup = (ViewGroup) mActivity.findViewById(R.id.viewlayout_root);
@@ -406,11 +295,6 @@
         assertNull(mockView.getTag());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onSizeChanged",
-        args = {int.class, int.class, int.class, int.class}
-    )
     public void testOnSizeChanged() throws Throwable {
         final ViewGroup viewGroup = (ViewGroup) mActivity.findViewById(R.id.viewlayout_root);
         final MockView mockView = new MockView(mActivity);
@@ -445,13 +329,6 @@
         assertEquals(oldh, view.getOldHOnSizeChanged());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getHitRect",
-        args = {android.graphics.Rect.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for getHitRect() is incomplete." +
-            "1. not clear what is supposed to happen if outRect is null.")
     public void testGetHitRect() {
         MockView view = new MockView(mActivity);
         Rect outRect = new Rect();
@@ -470,11 +347,6 @@
         assertEquals(mockView.getHeight(), outRect.bottom);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "forceLayout",
-        args = {}
-    )
     public void testForceLayout() {
         View view = new View(mActivity);
 
@@ -486,11 +358,6 @@
         assertTrue(view.isLayoutRequested());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isLayoutRequested",
-        args = {}
-    )
     public void testIsLayoutRequested() {
         View view = new View(mActivity);
 
@@ -502,11 +369,6 @@
         assertFalse(view.isLayoutRequested());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "requestLayout",
-        args = {}
-    )
     public void testRequestLayout() {
         MockView view = new MockView(mActivity);
         assertFalse(view.isLayoutRequested());
@@ -522,18 +384,6 @@
         assertTrue(mMockParent.hasRequestLayout());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "layout",
-            args = {int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onLayout",
-            args = {boolean.class, int.class, int.class, int.class, int.class}
-        )
-    })
     public void testLayout() throws Throwable {
         final MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
         assertTrue(view.hasCalledOnLayout());
@@ -549,29 +399,12 @@
         assertTrue(view.hasCalledOnLayout());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getBaseline",
-        args = {}
-    )
     public void testGetBaseline() {
         View view = new View(mActivity);
 
         assertEquals(-1, view.getBaseline());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBackground",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setBackgroundDrawable",
-            args = {android.graphics.drawable.Drawable.class}
-        )
-    })
     public void testAccessBackground() {
         View view = new View(mActivity);
         Drawable d1 = mResources.getDrawable(R.drawable.scenery);
@@ -589,11 +422,6 @@
         assertNull(view.getBackground());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setBackgroundResource",
-        args = {int.class}
-    )
     public void testSetBackgroundResource() {
         View view = new View(mActivity);
 
@@ -606,18 +434,6 @@
         assertNull(view.getBackground());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDrawingCacheBackgroundColor",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDrawingCacheBackgroundColor",
-            args = {int.class}
-        )
-    })
     public void testAccessDrawingCacheBackgroundColor() {
         View view = new View(mActivity);
 
@@ -630,11 +446,6 @@
         assertEquals(-1, view.getDrawingCacheBackgroundColor());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setBackgroundColor",
-        args = {int.class}
-    )
     public void testSetBackgroundColor() {
         View view = new View(mActivity);
         ColorDrawable colorDrawable;
@@ -651,11 +462,6 @@
         assertEquals(0, colorDrawable.getAlpha());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "verifyDrawable",
-        args = {android.graphics.drawable.Drawable.class}
-    )
     public void testVerifyDrawable() {
         MockView view = new MockView(mActivity);
         Drawable d1 = mResources.getDrawable(R.drawable.scenery);
@@ -670,11 +476,6 @@
         assertFalse(view.verifyDrawable(d2));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getDrawingRect",
-        args = {android.graphics.Rect.class}
-    )
     public void testGetDrawingRect() {
         MockView view = new MockView(mActivity);
         Rect outRect = new Rect();
@@ -700,11 +501,6 @@
         assertEquals(mockView.getHeight(), outRect.bottom);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getFocusedRect",
-        args = {android.graphics.Rect.class}
-    )
     public void testGetFocusedRect() {
         MockView view = new MockView(mActivity);
         Rect outRect = new Rect();
@@ -723,11 +519,6 @@
         assertEquals(100, outRect.bottom);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getGlobalVisibleRect",
-        args = {android.graphics.Rect.class, android.graphics.Point.class}
-    )
     public void testGetGlobalVisibleRectPoint() throws Throwable {
         final View view = mActivity.findViewById(R.id.mock_view);
         final ViewGroup viewGroup = (ViewGroup) mActivity.findViewById(R.id.viewlayout_root);
@@ -786,11 +577,6 @@
         assertEquals(ptParent.y, point.y);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getGlobalVisibleRect",
-        args = {android.graphics.Rect.class}
-    )
     public void testGetGlobalVisibleRect() throws Throwable {
         final View view = mActivity.findViewById(R.id.mock_view);
         final ViewGroup viewGroup = (ViewGroup) mActivity.findViewById(R.id.viewlayout_root);
@@ -843,23 +629,6 @@
         assertEquals(rect.top + halfHeight, rect.bottom);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "computeHorizontalScrollOffset",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "computeHorizontalScrollRange",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "computeHorizontalScrollExtent",
-            args = {}
-        )
-    })
     public void testComputeHorizontalScroll() throws Throwable {
         final MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
 
@@ -901,23 +670,6 @@
         assertEquals(view.getWidth(), view.computeHorizontalScrollExtent());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "computeVerticalScrollOffset",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "computeVerticalScrollRange",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "computeVerticalScrollExtent",
-            args = {}
-        )
-    })
     public void testComputeVerticalScroll() throws Throwable {
         final MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
 
@@ -961,28 +713,6 @@
         assertEquals(view.getHeight(), view.computeVerticalScrollExtent());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLeftFadingEdgeStrength",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRightFadingEdgeStrength",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTopFadingEdgeStrength",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBottomFadingEdgeStrength",
-            args = {}
-        )
-    })
     public void testGetFadingEdgeStrength() throws Throwable {
         final MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
 
@@ -1014,11 +744,6 @@
         assertEquals(1f, view.getBottomFadingEdgeStrength());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLeftFadingEdgeStrength",
-        args = {}
-    )
     public void testGetLeftFadingEdgeStrength() {
         MockView view = new MockView(mActivity);
 
@@ -1028,11 +753,6 @@
         assertEquals(1.0f, view.getLeftFadingEdgeStrength());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getRightFadingEdgeStrength",
-        args = {}
-    )
     public void testGetRightFadingEdgeStrength() {
         MockView view = new MockView(mActivity);
 
@@ -1042,11 +762,6 @@
         assertEquals(1.0f, view.getRightFadingEdgeStrength());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getBottomFadingEdgeStrength",
-        args = {}
-    )
     public void testGetBottomFadingEdgeStrength() {
         MockView view = new MockView(mActivity);
 
@@ -1056,11 +771,6 @@
         assertEquals(1.0f, view.getBottomFadingEdgeStrength());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getTopFadingEdgeStrength",
-        args = {}
-    )
     public void testGetTopFadingEdgeStrength() {
         MockView view = new MockView(mActivity);
 
@@ -1070,11 +780,6 @@
         assertEquals(1.0f, view.getTopFadingEdgeStrength());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "resolveSize",
-        args = {int.class, int.class}
-    )
     public void testResolveSize() {
         assertEquals(50, View.resolveSize(50, View.MeasureSpec.UNSPECIFIED));
 
@@ -1085,11 +790,6 @@
         assertEquals(20, View.resolveSize(20, 30 | View.MeasureSpec.AT_MOST));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getDefaultSize",
-        args = {int.class, int.class}
-    )
     public void testGetDefaultSize() {
         assertEquals(50, View.getDefaultSize(50, View.MeasureSpec.UNSPECIFIED));
 
@@ -1100,18 +800,6 @@
         assertEquals(30, View.getDefaultSize(20, 30 | View.MeasureSpec.AT_MOST));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setId",
-            args = {int.class}
-        )
-    })
     public void testAccessId() {
         View view = new View(mActivity);
 
@@ -1124,18 +812,6 @@
         assertEquals(0xFFFFFFFF, view.getId());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setLongClickable",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isLongClickable",
-            args = {}
-        )
-    })
     public void testAccessLongClickable() {
         View view = new View(mActivity);
 
@@ -1148,18 +824,6 @@
         assertFalse(view.isLongClickable());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setClickable",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isClickable",
-            args = {}
-        )
-    })
     public void testAccessClickable() {
         View view = new View(mActivity);
 
@@ -1172,22 +836,12 @@
         assertFalse(view.isClickable());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getContextMenuInfo",
-        args = {}
-    )
     public void testGetContextMenuInfo() {
         MockView view = new MockView(mActivity);
 
         assertNull(view.getContextMenuInfo());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setOnCreateContextMenuListener",
-        args = {android.view.View.OnCreateContextMenuListener.class}
-    )
     public void testSetOnCreateContextMenuListener() {
         View view = new View(mActivity);
         assertFalse(view.isLongClickable());
@@ -1199,23 +853,6 @@
         assertTrue(view.isLongClickable());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "parameter ContextMenu must be a MenuBuilder or its subclass instance, " +
-                    "but there is no document to indicate it. So there is a potential" +
-                    " ClassCastException",
-            method = "createContextMenu",
-            args = {android.view.ContextMenu.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateContextMenu",
-            args = {android.view.ContextMenu.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for createContextMenu() is incomplete." +
-            "1. not clear what is supposed to happen if menu is null.")
     public void testCreateContextMenu() {
         OnCreateContextMenuListenerImpl listener = new OnCreateContextMenuListenerImpl();
         MockView view = new MockView(mActivity);
@@ -1238,13 +875,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addFocusables",
-        args = {java.util.ArrayList.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for addFocusables() is incomplete." +
-            "1. not clear what is supposed to happen if the input ArrayList<View> is null.")
     public void testAddFocusables() {
         View view = new View(mActivity);
         ArrayList<View> viewList = new ArrayList<View>();
@@ -1265,11 +895,6 @@
         view.addFocusables(null, 0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getFocusables",
-        args = {int.class}
-    )
     public void testGetFocusables() {
         View view = new View(mActivity);
         ArrayList<View> viewList;
@@ -1290,11 +915,6 @@
         assertEquals(view, viewList.get(0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getRootView",
-        args = {}
-    )
     public void testGetRootView() {
         MockView view = new MockView(mActivity);
 
@@ -1305,22 +925,12 @@
         assertEquals(mMockParent, view.getRootView());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSolidColor",
-        args = {}
-    )
     public void testGetSolidColor() {
         View view = new View(mActivity);
 
         assertEquals(0, view.getSolidColor());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setMinimumWidth",
-        args = {int.class}
-    )
     public void testSetMinimumWidth() {
         MockView view = new MockView(mActivity);
         assertEquals(0, view.getSuggestedMinimumWidth());
@@ -1332,11 +942,6 @@
         assertEquals(-100, view.getSuggestedMinimumWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSuggestedMinimumWidth",
-        args = {}
-    )
     public void testGetSuggestedMinimumWidth() {
         MockView view = new MockView(mActivity);
         Drawable d = mResources.getDrawable(R.drawable.scenery);
@@ -1357,11 +962,6 @@
         assertEquals(drawableMinimumWidth + 10, view.getSuggestedMinimumWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setMinimumHeight",
-        args = {int.class}
-    )
     public void testSetMinimumHeight() {
         MockView view = new MockView(mActivity);
         assertEquals(0, view.getSuggestedMinimumHeight());
@@ -1373,11 +973,6 @@
         assertEquals(-100, view.getSuggestedMinimumHeight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSuggestedMinimumHeight",
-        args = {}
-    )
     public void testGetSuggestedMinimumHeight() {
         MockView view = new MockView(mActivity);
         Drawable d = mResources.getDrawable(R.drawable.scenery);
@@ -1398,18 +993,6 @@
         assertEquals(drawableMinimumHeight + 10, view.getSuggestedMinimumHeight());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setWillNotCacheDrawing",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "willNotCacheDrawing",
-            args = {}
-        )
-    })
     public void testAccessWillNotCacheDrawing() {
         View view = new View(mActivity);
 
@@ -1419,18 +1002,6 @@
         assertTrue(view.willNotCacheDrawing());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDrawingCacheEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isDrawingCacheEnabled",
-            args = {}
-        )
-    })
     public void testAccessDrawingCacheEnabled() {
         View view = new View(mActivity);
 
@@ -1440,11 +1011,6 @@
         assertTrue(view.isDrawingCacheEnabled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getDrawingCache",
-        args = {}
-    )
     public void testGetDrawingCache() {
         MockView view = new MockView(mActivity);
 
@@ -1468,18 +1034,6 @@
         assertNotSame(bitmap1, bitmap2);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "destroyDrawingCache",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "buildDrawingCache",
-            args = {}
-        )
-    })
     public void testBuildAndDestroyDrawingCache() {
         MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
 
@@ -1495,18 +1049,6 @@
         assertNull(view.getDrawingCache());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setWillNotDraw",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "willNotDraw",
-            args = {}
-        )
-    })
     public void testAccessWillNotDraw() {
         View view = new View(mActivity);
 
@@ -1516,18 +1058,6 @@
         assertTrue(view.willNotDraw());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDrawingCacheQuality",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDrawingCacheQuality",
-            args = {int.class}
-        )
-    })
     public void testAccessDrawingCacheQuality() {
         View view = new View(mActivity);
 
@@ -1547,13 +1077,6 @@
         assertEquals(0x00180000, view.getDrawingCacheQuality());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dispatchSetSelected",
-        args = {boolean.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the java doc said it dispatch setSelected to" +
-            " all of this View's children, but it doesn't.")
     public void testDispatchSetSelected() {
         MockView mockView1 = new MockView(mActivity);
         MockView mockView2 = new MockView(mActivity);
@@ -1569,18 +1092,6 @@
         assertFalse(mockView2.isSelected());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSelected",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isSelected",
-            args = {}
-        )
-    })
     public void testAccessSelected() {
         View view = new View(mActivity);
 
@@ -1590,13 +1101,6 @@
         assertTrue(view.isSelected());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dispatchSetPressed",
-        args = {boolean.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the java doc said it dispatch setPressed to" +
-            " all of this View's children, but it doesn't.")
     public void testDispatchSetPressed() {
         MockView mockView1 = new MockView(mActivity);
         MockView mockView2 = new MockView(mActivity);
@@ -1612,18 +1116,6 @@
         assertFalse(mockView2.isPressed());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPressed",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isPressed",
-            args = {}
-        )
-    })
     public void testAccessPressed() {
         View view = new View(mActivity);
 
@@ -1633,18 +1125,6 @@
         assertTrue(view.isPressed());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSoundEffectsEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isSoundEffectsEnabled",
-            args = {}
-        )
-    })
     public void testAccessSoundEffectsEnabled() {
         View view = new View(mActivity);
 
@@ -1654,18 +1134,6 @@
         assertFalse(view.isSoundEffectsEnabled());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setKeepScreenOn",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getKeepScreenOn",
-            args = {}
-        )
-    })
     public void testAccessKeepScreenOn() {
         View view = new View(mActivity);
 
@@ -1675,18 +1143,6 @@
         assertTrue(view.getKeepScreenOn());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDuplicateParentStateEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isDuplicateParentStateEnabled",
-            args = {}
-        )
-    })
     public void testAccessDuplicateParentStateEnabled() {
         View view = new View(mActivity);
 
@@ -1696,18 +1152,6 @@
         assertTrue(view.isDuplicateParentStateEnabled());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isEnabled",
-            args = {}
-        )
-    })
     public void testAccessEnabled() {
         View view = new View(mActivity);
 
@@ -1717,18 +1161,6 @@
         assertFalse(view.isEnabled());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSaveEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isSaveEnabled",
-            args = {}
-        )
-    })
     public void testAccessSaveEnabled() {
         View view = new View(mActivity);
 
@@ -1738,13 +1170,6 @@
         assertFalse(view.isSaveEnabled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "showContextMenu",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for showContextMenu() is incomplete." +
-            "1. not clear what is supposed to happen if view hasn't a parent.")
     public void testShowContextMenu() {
         MockView view = new MockView(mActivity);
 
@@ -1762,14 +1187,6 @@
         assertTrue(mMockParent.hasShowContextMenuForChild());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "fitSystemWindows",
-        args = {android.graphics.Rect.class}
-    )
-    @ToBeFixed(bug = "", explanation = "can not test the cast when fitSystemWindows return" +
-            " true, because it's a protected method, we have to test it by MockView, but" +
-            " we can not construct a MockView instance which is FITS_SYSTEM_WINDOWS")
     public void testFitSystemWindows() {
         final XmlResourceParser parser = mResources.getLayout(R.layout.view_layout);
         final AttributeSet attrs = Xml.asAttributeSet(parser);
@@ -1784,11 +1201,6 @@
         assertFalse(view.fitSystemWindows(null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "performClick",
-        args = {}
-    )
     public void testPerformClick() {
         View view = new View(mActivity);
         OnClickListenerImpl listener = new OnClickListenerImpl();
@@ -1805,11 +1217,6 @@
         assertFalse(view.performClick());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setOnClickListener",
-        args = {android.view.View.OnClickListener.class}
-    )
     public void testSetOnClickListener() {
         View view = new View(mActivity);
         assertFalse(view.performClick());
@@ -1824,13 +1231,6 @@
         assertTrue(view.isClickable());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "performLongClick",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for performLongClick() is incomplete." +
-            "1. not clear what is supposed to happen if view hasn't a parent.")
     public void testPerformLongClick() {
         MockView view = new MockView(mActivity);
         OnLongClickListenerImpl listener = new OnLongClickListenerImpl();
@@ -1855,11 +1255,6 @@
         assertTrue(listener.hasOnLongClick());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setOnLongClickListener",
-        args = {android.view.View.OnLongClickListener.class}
-    )
     public void testSetOnLongClickListener() {
         MockView view = new MockView(mActivity);
         view.setParent(mMockParent);
@@ -1875,18 +1270,6 @@
         assertTrue(view.isLongClickable());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOnFocusChangeListener",
-            args = {android.view.View.OnFocusChangeListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getOnFocusChangeListener",
-            args = {}
-        )
-    })
     public void testAccessOnFocusChangeListener() {
         View view = new View(mActivity);
         OnFocusChangeListener listener = new OnFocusChangeListenerImpl();
@@ -1897,18 +1280,6 @@
         assertSame(listener, view.getOnFocusChangeListener());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setNextFocusUpId",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getNextFocusUpId",
-            args = {}
-        )
-    })
     public void testAccessNextFocusUpId() {
         View view = new View(mActivity);
 
@@ -1924,18 +1295,6 @@
         assertEquals(Integer.MIN_VALUE, view.getNextFocusUpId());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setNextFocusDownId",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getNextFocusDownId",
-            args = {}
-        )
-    })
     public void testAccessNextFocusDownId() {
         View view = new View(mActivity);
 
@@ -1951,18 +1310,6 @@
         assertEquals(Integer.MIN_VALUE, view.getNextFocusDownId());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setNextFocusLeftId",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getNextFocusLeftId",
-            args = {}
-        )
-    })
     public void testAccessNextFocusLeftId() {
         View view = new View(mActivity);
 
@@ -1978,18 +1325,6 @@
         assertEquals(Integer.MIN_VALUE, view.getNextFocusLeftId());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setNextFocusRightId",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getNextFocusRightId",
-            args = {}
-        )
-    })
     public void testAccessNextFocusRightId() {
         View view = new View(mActivity);
 
@@ -2005,23 +1340,6 @@
         assertEquals(Integer.MIN_VALUE, view.getNextFocusRightId());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setMeasuredDimension",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMeasuredWidth",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMeasuredHeight",
-            args = {}
-        )
-    })
     public void testAccessMeasuredDimension() {
         MockView view = new MockView(mActivity);
         assertEquals(0, view.getMeasuredWidth());
@@ -2032,18 +1350,6 @@
         assertEquals(30, view.getMeasuredHeight());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "measure",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onMeasure",
-            args = {int.class, int.class}
-        )
-    })
     public void testMeasure() throws Throwable {
         final MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
         assertTrue(view.hasCalledOnMeasure());
@@ -2074,20 +1380,6 @@
         assertEquals(100, view.getMeasuredHeight());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setLayoutParams",
-            args = {android.view.ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLayoutParams",
-            args = {}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for setLayoutParams() is incomplete." +
-            "1. not clear what is supposed to happen if params is null.")
     public void testAccessLayoutParams() {
         View view = new View(mActivity);
         ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(10, 20);
@@ -2106,11 +1398,6 @@
         assertTrue(view.isLayoutRequested());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isShown",
-        args = {}
-    )
     public void testIsShown() {
         MockView view = new MockView(mActivity);
 
@@ -2126,11 +1413,6 @@
         assertFalse(view.isShown());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getDrawingTime",
-        args = {}
-    )
     public void testGetDrawingTime() {
         View view = new View(mActivity);
         // mAttachInfo is null
@@ -2141,11 +1423,6 @@
         assertEquals(SystemClock.uptimeMillis(), view.getDrawingTime(), 1000);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "scheduleDrawable",
-        args = {android.graphics.drawable.Drawable.class, java.lang.Runnable.class, long.class}
-    )
     public void testScheduleDrawable() {
         View view = new View(mActivity);
         Drawable drawable = new StateListDrawable();
@@ -2173,18 +1450,6 @@
         view.scheduleDrawable(null, null, -1000);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unscheduleDrawable",
-            args = {android.graphics.drawable.Drawable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unscheduleDrawable",
-            args = {android.graphics.drawable.Drawable.class, java.lang.Runnable.class}
-        )
-    })
     public void testUnscheduleDrawable() {
         View view = new View(mActivity);
         Drawable drawable = new StateListDrawable();
@@ -2214,11 +1479,6 @@
         view.unscheduleDrawable(null, null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getWindowVisibility",
-        args = {}
-    )
     public void testGetWindowVisibility() {
         View view = new View(mActivity);
         // mAttachInfo is null
@@ -2229,11 +1489,6 @@
         assertEquals(View.VISIBLE, view.getWindowVisibility());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getWindowToken",
-        args = {}
-    )
     public void testGetWindowToken() {
         View view = new View(mActivity);
         // mAttachInfo is null
@@ -2244,11 +1499,6 @@
         assertNotNull(view.getWindowToken());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "hasWindowFocus",
-        args = {}
-    )
     public void testHasWindowFocus() {
         View view = new View(mActivity);
         // mAttachInfo is null
@@ -2257,7 +1507,7 @@
         // mAttachInfo is not null
         final View view2 = mActivity.findViewById(R.id.fit_windows);
         // Wait until the window has been focused.
-        new DelayedCheck(TIMEOUT_DELTA) {
+        new PollingCheck(TIMEOUT_DELTA) {
             @Override
             protected boolean check() {
                 return view2.hasWindowFocus();
@@ -2265,24 +1515,12 @@
         }.run();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getHandler",
-        args = {}
-    )
-    @ToBeFixed(bug = "1400249", explanation = "View#getHandler() is protected, so we should" +
-            " test it by MockView, but we cannot access mAttachInfo which is package protected")
     public void testGetHandler() {
         MockView view = new MockView(mActivity);
         // mAttachInfo is null
         assertNull(view.getHandler());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "removeCallbacks",
-        args = {java.lang.Runnable.class}
-    )
     public void testRemoveCallbacks() throws InterruptedException {
         final long delay = 500L;
         View view = mActivity.findViewById(R.id.mock_view);
@@ -2300,13 +1538,6 @@
         assertTrue(runner.hasRun);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "cancelLongPress",
-        args = {}
-    )
-    @ToBeFixed(bug = "1400249", explanation = "it's hard to do unit test for this method, " +
-            "should be tested by functional test")
     public void testCancelLongPress() {
         View view = new View(mActivity);
         // mAttachInfo is null
@@ -2317,13 +1548,6 @@
         view.cancelLongPress();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getViewTreeObserver",
-        args = {}
-    )
-    @ToBeFixed(bug = "1400249", explanation = "we cannot access both mFloatingTreeObserver" +
-            " and mAttachInfo which are package protected")
     public void testGetViewTreeObserver() {
         View view = new View(mActivity);
         // mAttachInfo is null
@@ -2334,33 +1558,12 @@
         assertNotNull(view.getViewTreeObserver());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getWindowAttachCount",
-        args = {}
-    )
-    @ToBeFixed(bug = "1400249", explanation = "View#getHandler() is protected, so we should" +
-            " test it by MockView, but we cannot access method" +
-            " View#dispatchAttachedToWindow(AttachInfo, int) which is package protected" +
-            " to update mWindowAttachCount")
     public void testGetWindowAttachCount() {
         MockView view = new MockView(mActivity);
         // mAttachInfo is null
         assertEquals(0, view.getWindowAttachCount());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onAttachedToWindow",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onDetachedFromWindow",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testOnAttachedToAndDetachedFromWindow() {
         MockView mockView = new MockView(mActivity);
@@ -2380,14 +1583,6 @@
         assertTrue(mockView.hasCalledOnDetachedFromWindow());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLocationInWindow",
-        args = {int[].class}
-    )
-    @ToBeFixed(bug = "1695243", explanation =
-            "the javadoc for getLocationInWindow() is incomplete." +
-            "1. not clear what is supposed to happen if the input int[] is null or short than 2.")
     public void testGetLocationInWindow() {
         int[] location = new int[] { -1, -1 };
 
@@ -2418,14 +1613,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLocationOnScreen",
-        args = {int[].class}
-    )
-    @ToBeFixed(bug = "1695243", explanation =
-            "the javadoc for getLocationOnScreen() is incomplete." +
-            "1. not clear what is supposed to happen if mAttachInfo is null.")
     public void testGetLocationOnScreen() {
         View view = new View(mActivity);
         int[] location = new int[] { -1, -1 };
@@ -2458,13 +1645,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addTouchables",
-        args = {java.util.ArrayList.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for addTouchables() is incomplete." +
-            "1. not clear what is supposed to happen if the input ArrayList<View> is null.")
     public void testAddTouchables() {
         View view = new View(mActivity);
         ArrayList<View> result = new ArrayList<View>();
@@ -2491,11 +1671,6 @@
         assertEquals(0, result.size());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getTouchables",
-        args = {}
-    )
     public void testGetTouchables() {
         View view = new View(mActivity);
         ArrayList<View> result;
@@ -2515,18 +1690,6 @@
         assertEquals(0, result.size());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "inflate",
-            args = {android.content.Context.class, int.class, android.view.ViewGroup.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onFinishInflate",
-            args = {}
-        )
-    })
     public void testInflate() {
         View view = View.inflate(mActivity, R.layout.view_layout, null);
         assertNotNull(view);
@@ -2537,11 +1700,6 @@
         assertTrue(mockView.hasCalledOnFinishInflate());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isInTouchMode",
-        args = {}
-    )
     public void testIsInTouchMode() {
         View view = new View(mActivity);
         // mAttachInfo is null
@@ -2552,21 +1710,11 @@
         assertFalse(view.isInTouchMode());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isInEditMode",
-        args = {}
-    )
     public void testIsInEditMode() {
         View view = new View(mActivity);
         assertFalse(view.isInEditMode());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "postInvalidate",
-        args = {}
-    )
     public void testPostInvalidate1() {
         View view = new View(mActivity);
         // mAttachInfo is null
@@ -2577,11 +1725,6 @@
         view.postInvalidate();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "postInvalidate",
-        args = {int.class, int.class, int.class, int.class}
-    )
     public void testPostInvalidate2() {
         View view = new View(mActivity);
         // mAttachInfo is null
@@ -2593,18 +1736,6 @@
         view.postInvalidate(0, -20, -30, -40);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "postInvalidateDelayed",
-            args = {long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "postInvalidateDelayed",
-            args = {long.class, int.class, int.class, int.class, int.class}
-        )
-    })
     public void testPostInvalidateDelayed() {
         View view = new View(mActivity);
         // mAttachInfo is null
@@ -2618,11 +1749,6 @@
         view.postInvalidateDelayed(-1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "post",
-        args = {java.lang.Runnable.class}
-    )
     public void testPost() {
         View view = new View(mActivity);
         MockRunnable action = new MockRunnable();
@@ -2637,11 +1763,6 @@
         assertTrue(view.post(null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "postDelayed",
-        args = {java.lang.Runnable.class, long.class}
-    )
     public void testPostDelayed() {
         View view = new View(mActivity);
         MockRunnable action = new MockRunnable();
@@ -2656,11 +1777,6 @@
         assertTrue(view.postDelayed(null, 0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        method = "playSoundEffect",
-        args = {int.class}
-    )
     @UiThreadTest
     public void testPlaySoundEffect() {
         MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
@@ -2674,11 +1790,6 @@
         // no way to assert the soundConstant be really played.
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onKeyShortcut",
-        args = {int.class, android.view.KeyEvent.class}
-    )
     public void testOnKeyShortcut() throws Throwable {
         final MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
         runTestOnUiThread(new Runnable() {
@@ -2697,11 +1808,6 @@
         assertTrue(view.hasCalledOnKeyShortcut());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onKeyMultiple",
-        args = {int.class, int.class, android.view.KeyEvent.class}
-    )
     public void testOnKeyMultiple() throws Throwable {
         final MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
         runTestOnUiThread(new Runnable() {
@@ -2715,13 +1821,6 @@
         assertTrue(view.hasCalledOnKeyMultiple());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dispatchKeyShortcutEvent",
-        args = {android.view.KeyEvent.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of " +
-            "View#dispatchKeyShortcutEvent(KeyEvent) when the input KeyEvent is null")
     @UiThreadTest
     public void testDispatchKeyShortcutEvent() {
         MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
@@ -2738,11 +1837,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onTrackballEvent",
-        args = {android.view.MotionEvent.class}
-    )
     public void testOnTrackballEvent() throws Throwable {
         final MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
         runTestOnUiThread(new Runnable() {
@@ -2771,14 +1865,6 @@
         assertTrue(view.hasCalledOnTrackballEvent());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dispatchTrackballEvent",
-        args = {android.view.MotionEvent.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for dispatchTrackballEvent() is " +
-            "incomplete. It passes a trackball motion event down to itself even if it is not " +
-            "the focused view.")
     @UiThreadTest
     public void testDispatchTrackballEvent() {
         ViewGroup viewGroup = (ViewGroup) mActivity.findViewById(R.id.viewlayout_root);
@@ -2810,11 +1896,6 @@
         assertTrue(mockView2.hasCalledOnTrackballEvent());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dispatchUnhandledMove",
-        args = {android.view.View.class, int.class}
-    )
     public void testDispatchUnhandledMove() throws Throwable {
         final MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
         runTestOnUiThread(new Runnable() {
@@ -2831,18 +1912,6 @@
         assertTrue(view.hasCalledDispatchUnhandledMove());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onWindowVisibilityChanged",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchWindowVisibilityChanged",
-            args = {int.class}
-        )
-    })
     public void testWindowVisibilityChanged() throws Throwable {
         final MockView mockView = new MockView(mActivity);
         final ViewGroup viewGroup = (ViewGroup) mActivity.findViewById(R.id.viewlayout_root);
@@ -2885,11 +1954,6 @@
         assertTrue(mockView.hasCalledOnWindowVisibilityChanged());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLocalVisibleRect",
-        args = {android.graphics.Rect.class}
-    )
     public void testGetLocalVisibleRect() throws Throwable {
         final View view = mActivity.findViewById(R.id.mock_view);
         Rect rect = new Rect();
@@ -2944,15 +2008,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "mergeDrawableStates",
-        args = {int[].class, int[].class}
-    )
-    @ToBeFixed(bug = "1695243", explanation =
-            "the javadoc for mergeDrawableStates() is incomplete." +
-            "1. not clear what is supposed to happen if the input int[] is null or" +
-            "   baseState is not long enough to append additionalState.")
     public void testMergeDrawableStates() {
         MockView view = new MockView(mActivity);
 
@@ -2985,48 +2040,10 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "onRestoreInstanceState",
-            args = {android.os.Parcelable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "onSaveInstanceState",
-            args = {}
-        )
-    })
     public void testOnSaveAndRestoreInstanceState() {
         // it is hard to simulate operation to make callback be called.
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchRestoreInstanceState",
-            args = {android.util.SparseArray.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "restoreHierarchyState",
-            args = {android.util.SparseArray.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchSaveInstanceState",
-            args = {android.util.SparseArray.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "saveHierarchyState",
-            args = {android.util.SparseArray.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc of saveHierarchyState() and " +
-            "restoreHierarchyState() are incomplete." +
-            "1, not clear what is supposed to happen if input SparseArray<Parcelable> is null." +
-            "2, no description about IllegalArgumentException which thrown in a certain condition.")
     public void testSaveAndRestoreHierarchyState() {
         int viewId = R.id.mock_view;
         MockView view = (MockView) mActivity.findViewById(viewId);
@@ -3071,18 +2088,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyDown",
-            args = {int.class, android.view.KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyUp",
-            args = {int.class, android.view.KeyEvent.class}
-        )
-    })
     public void testOnKeyDownOrUp() throws Throwable {
         final MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
         runTestOnUiThread(new Runnable() {
@@ -3148,21 +2153,6 @@
         assertTrue(listener.hasOnClick());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchKeyEvent",
-            args = {android.view.KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOnKeyListener",
-            args = {android.view.View.OnKeyListener.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for dispatchKeyEvent() is incomplete." +
-            "1. not clear what is supposed to happen if the KeyEvent is null." +
-            "2. When the view has NOT focus, it dispatchs to itself, which disobey the javadoc.")
     @UiThreadTest
     public void testDispatchKeyEvent() {
         MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
@@ -3225,21 +2215,6 @@
         assertFalse(view.hasCalledOnKeyUp());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchTouchEvent",
-            args = {android.view.MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOnTouchListener",
-            args = {android.view.View.OnTouchListener.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for dispatchTouchEvent() is incomplete" +
-            "1. it passes the touch screen motion event down to itself even if it is not " +
-            "   the target view.")
     @UiThreadTest
     public void testDispatchTouchEvent() {
         ViewGroup viewGroup = (ViewGroup) mActivity.findViewById(R.id.viewlayout_root);
@@ -3282,11 +2257,6 @@
         assertFalse(mockView1.hasCalledOnTouchEvent());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "invalidate",
-        args = {}
-    )
     public void testInvalidate1() throws Throwable {
         final MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
         assertTrue(view.hasCalledOnDraw());
@@ -3311,13 +2281,6 @@
         assertFalse(view.hasCalledOnDraw());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "invalidate",
-        args = {android.graphics.Rect.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for invalidate() is incomplete." +
-            "1. not clear what is supposed to happen if the input Rect is null.")
     public void testInvalidate2() throws Throwable {
         final MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
         assertTrue(view.hasCalledOnDraw());
@@ -3350,11 +2313,6 @@
         assertFalse(view.hasCalledOnDraw());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "invalidate",
-        args = {int.class, int.class, int.class, int.class}
-    )
     public void testInvalidate3() throws Throwable {
         final MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
         assertTrue(view.hasCalledOnDraw());
@@ -3381,14 +2339,6 @@
         assertFalse(view.hasCalledOnDraw());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "invalidateDrawable",
-        args = {android.graphics.drawable.Drawable.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation =
-            "the javadoc for invalidateDrawable() is incomplete." +
-            "1. not clear what is supposed to happen if the input Drawable is null.")
     public void testInvalidateDrawable() throws Throwable {
         final MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
         final Drawable d1 = mResources.getDrawable(R.drawable.scenery);
@@ -3421,11 +2371,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onFocusChanged",
-        args = {boolean.class, int.class, android.graphics.Rect.class}
-    )
     @UiThreadTest
     public void testOnFocusChanged() {
         MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
@@ -3442,28 +2387,6 @@
         assertTrue(view.hasCalledOnFocusChanged());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateDrawableState",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDrawableState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "drawableStateChanged",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "refreshDrawableState",
-            args = {}
-        )
-    })
     public void testDrawableState() {
         MockView view = new MockView(mActivity);
         view.setParent(mMockParent);
@@ -3497,18 +2420,6 @@
         assertTrue(view.hasCalledOnCreateDrawableState());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onWindowFocusChanged",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchWindowFocusChanged",
-            args = {boolean.class}
-        )
-    })
     public void testWindowFocusChanged() {
         MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
         assertTrue(view.hasCalledOnWindowFocusChanged());
@@ -3525,23 +2436,6 @@
         activity.finish();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "draw",
-            args = {android.graphics.Canvas.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onDraw",
-            args = {android.graphics.Canvas.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchDraw",
-            args = {android.graphics.Canvas.class}
-        )
-    })
     public void testDraw() throws Throwable {
         final MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
         runTestOnUiThread(new Runnable() {
@@ -3555,11 +2449,6 @@
         assertTrue(view.hasCalledDispatchDraw());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "requestFocusFromTouch",
-        args = {}
-    )
     public void testRequestFocusFromTouch() {
         View view = new View(mActivity);
         view.setFocusable(true);
@@ -3572,14 +2461,6 @@
         assertTrue(view.isFocused());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "requestRectangleOnScreen",
-        args = {android.graphics.Rect.class, boolean.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation =
-            "the javadoc for requestRectangleOnScreen() is incomplete." +
-            "1. not clear what is supposed to happen if the input Rect is null.")
     public void testRequestRectangleOnScreen1() {
         MockView view = new MockView(mActivity);
         Rect rectangle = new Rect(10, 10, 20, 30);
@@ -3611,14 +2492,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "requestRectangleOnScreen",
-        args = {android.graphics.Rect.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation =
-            "the javadoc for requestRectangleOnScreen() is incomplete." +
-            "1. not clear what is supposed to happen if the input Rect is null.")
     public void testRequestRectangleOnScreen2() {
         MockView view = new MockView(mActivity);
         Rect rectangle = new Rect();
@@ -3665,11 +2538,6 @@
         getInstrumentation().waitForIdleSync();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onTouchEvent",
-        args = {android.view.MotionEvent.class}
-    )
     public void testOnTouchEvent() throws Throwable {
         final MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
 
@@ -3768,11 +2636,6 @@
         assertFalse(listener.hasOnClick());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "bringToFront",
-        args = {}
-    )
     public void testBringToFront() {
         MockView view = new MockView(mActivity);
         view.setParent(mMockParent);
@@ -3782,11 +2645,6 @@
         assertTrue(mMockParent.hasBroughtChildToFront());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getApplicationWindowToken",
-        args = {}
-    )
     public void testGetApplicationWindowToken() {
         View view = new View(mActivity);
         // mAttachInfo is null
@@ -3797,61 +2655,31 @@
         assertNotNull(view.getApplicationWindowToken());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getBottomPaddingOffset",
-        args = {}
-    )
     public void testGetBottomPaddingOffset() {
         MockView view = new MockView(mActivity);
         assertEquals(0, view.getBottomPaddingOffset());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLeftPaddingOffset",
-        args = {}
-    )
     public void testGetLeftPaddingOffset() {
         MockView view = new MockView(mActivity);
         assertEquals(0, view.getLeftPaddingOffset());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getRightPaddingOffset",
-        args = {}
-    )
     public void testGetRightPaddingOffset() {
         MockView view = new MockView(mActivity);
         assertEquals(0, view.getRightPaddingOffset());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getTopPaddingOffset",
-        args = {}
-    )
     public void testGetTopPaddingOffset() {
         MockView view = new MockView(mActivity);
         assertEquals(0, view.getTopPaddingOffset());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isPaddingOffsetRequired",
-        args = {}
-    )
     public void testIsPaddingOffsetRequired() {
         MockView view = new MockView(mActivity);
         assertFalse(view.isPaddingOffsetRequired());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getWindowVisibleDisplayFrame",
-        args = {android.graphics.Rect.class}
-    )
     public void testGetWindowVisibleDisplayFrame() {
         Rect outRect = new Rect();
         View view = new View(mActivity);
@@ -3870,11 +2698,6 @@
         view.getWindowVisibleDisplayFrame(outRect);
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        method = "setScrollContainer",
-        args = {boolean.class}
-    )
     public void testSetScrollContainer() throws Throwable {
         final MockView mockView = (MockView) mActivity.findViewById(R.id.mock_view);
         final MockView scrollView = (MockView) mActivity.findViewById(R.id.scroll_view);
@@ -3909,23 +2732,6 @@
         getInstrumentation().waitForIdleSync();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isFocusableInTouchMode",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFocusableInTouchMode",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isInTouchMode",
-            args = {}
-        )
-    })
     public void testTouchMode() throws Throwable {
         final MockView mockView = (MockView) mActivity.findViewById(R.id.mock_view);
         final View fitWindowsView = mActivity.findViewById(R.id.fit_windows);
@@ -3982,48 +2788,6 @@
         assertFalse(fitWindowsView.isInTouchMode());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setHorizontalScrollBarEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVerticalScrollBarEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isHorizontalScrollBarEnabled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isVerticalScrollBarEnabled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getVerticalScrollbarWidth",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getHorizontalScrollbarHeight",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "setScrollBarStyle",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getScrollBarStyle",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testScrollbarStyle() {
         MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
@@ -4063,43 +2827,6 @@
         // TODO: how to get the position of the Scrollbar to assert it is inside or outside.
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isHorizontalFadingEdgeEnabled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isVerticalFadingEdgeEnabled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getHorizontalFadingEdgeLength",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getVerticalFadingEdgeLength",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setHorizontalFadingEdgeEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVerticalFadingEdgeEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFadingEdgeLength",
-            args = {int.class}
-        )
-    })
     @UiThreadTest
     public void testScrollFading() {
         MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
@@ -4125,33 +2852,6 @@
         assertEquals(fadingLength, view.getVerticalFadingEdgeLength());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "scrollBy",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "scrollTo",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getScrollX",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getScrollY",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onScrollChanged",
-            args = {int.class, int.class, int.class, int.class}
-        )
-    })
     @UiThreadTest
     public void testScrolling() {
         MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
@@ -4190,18 +2890,6 @@
         assertTrue(view.hasCalledOnScrollChanged());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "initializeScrollbars",
-            args = {android.content.res.TypedArray.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "initializeFadingEdge",
-            args = {android.content.res.TypedArray.class}
-        )
-    })
     public void testInitializeScrollbarsAndFadingEdge() {
         MockView view = (MockView) mActivity.findViewById(R.id.scroll_view);
 
@@ -4221,21 +2909,6 @@
         assertEquals(fadingEdgeLength, view.getVerticalFadingEdgeLength());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onStartTemporaryDetach",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onFinishTemporaryDetach",
-            args = {}
-        )
-    })
-    @ToBeFixed(bug = "", explanation = "onStartTemporaryDetach and onFinishTemporaryDetach" +
-            " is not called when ListView is going to temporarily detach a child that currently" +
-            " has focus, with detachViewFromParent.")
     public void testOnStartAndFinishTemporaryDetach() throws Throwable {
         final MockListView listView = new MockListView(mActivity);
         List<String> items = Lists.newArrayList("1", "2", "3");
@@ -4334,18 +3007,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchKeyEventPreIme",
-            args = {KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyPreIme",
-            args = {int.class, KeyEvent.class}
-        )
-    })
     public void testKeyPreIme() throws Throwable {
         final MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
 
@@ -4362,28 +3023,6 @@
         assertTrue(view.hasCalledOnKeyPreIme());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isHapticFeedbackEnabled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setHapticFeedbackEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "performHapticFeedback",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "performHapticFeedback",
-            args = {int.class, int.class}
-        )
-    })
     public void testHapticFeedback() {
         final MockView view = (MockView) mActivity.findViewById(R.id.mock_view);
         final int LONG_PRESS = HapticFeedbackConstants.LONG_PRESS;
@@ -4402,23 +3041,6 @@
         assertTrue(view.performHapticFeedback(LONG_PRESS, FLAG_IGNORE_GLOBAL_SETTING));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateInputConnection",
-            args = {EditorInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "checkInputConnectionProxy",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCheckIsTextEditor",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testInputConnection() {
         final InputMethodManager imm = InputMethodManager.getInstance(getActivity());
@@ -4429,7 +3051,7 @@
         viewGroup.addView(editText);
         editText.requestFocus();
 
-        new DelayedCheck(TIMEOUT_DELTA) {
+        new PollingCheck(TIMEOUT_DELTA) {
             @Override
             protected boolean check() {
                 return editText.isFocused();
@@ -4446,18 +3068,6 @@
         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);
@@ -4700,6 +3310,11 @@
         public void childOverlayStateChanged(View child) {
 
         }
+
+        @Override
+        public void childHasTransientStateChanged(View child, boolean hasTransientState) {
+
+        }
     }
 
     private final class OnCreateContextMenuListenerImpl implements OnCreateContextMenuListener {
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 d06bf31..bd86ed9 100644
--- a/tests/tests/view/src/android/view/cts/View_AnimationTest.java
+++ b/tests/tests/view/src/android/view/cts/View_AnimationTest.java
@@ -17,25 +17,19 @@
 package android.view.cts;
 
 import android.app.Activity;
+import android.cts.util.PollingCheck;
 import android.test.ActivityInstrumentationTestCase2;
 import android.view.View;
 import android.view.animation.Animation;
 import android.view.animation.TranslateAnimation;
 import android.view.animation.cts.AnimationTestUtils;
-import android.view.animation.cts.DelayedCheck;
 
 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;
 
 /**
  * Test {@link View}.
  */
-@TestTargetClass(View.class)
 public class View_AnimationTest extends ActivityInstrumentationTestCase2<ViewTestStubActivity> {
 
     private static final int TIME_OUT = 5000;
@@ -57,13 +51,6 @@
         mAnimation.setDuration(DURATION);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAnimation",
-            args = {Animation.class}
-        )
-    })
     public void testAnimation() throws Throwable {
         final View view = mActivity.findViewById(R.id.mock_view);
         // set null animation
@@ -80,14 +67,6 @@
         AnimationTestUtils.assertRunAnimation(getInstrumentation(), view, mAnimation, TIME_OUT);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startAnimation",
-            args = {Animation.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testStartAnimation() throws Throwable {
         final View view = mActivity.findViewById(R.id.mock_view);
         // start null animation
@@ -107,18 +86,6 @@
         AnimationTestUtils.assertRunAnimation(getInstrumentation(), view, mAnimation, TIME_OUT);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "clearAnimation",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAnimation",
-            args = {}
-        )
-    })
     public void testClearBeforeAnimation() throws Throwable {
         final View view = mActivity.findViewById(R.id.mock_view);
         assertFalse(mAnimation.hasStarted());
@@ -139,13 +106,6 @@
         assertNull(view.getAnimation());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "View.clearAnimation",
-            args = {}
-        )
-    })
     public void testClearDuringAnimation() throws Throwable {
         final View view = mActivity.findViewById(R.id.mock_view);
         runTestOnUiThread(new Runnable() {
@@ -155,7 +115,7 @@
             }
         });
 
-        new DelayedCheck(TIME_OUT) {
+        new PollingCheck(TIME_OUT) {
             @Override
             protected boolean check() {
                 return mAnimation.hasStarted();
diff --git a/tests/tests/view/src/android/view/cts/View_BaseSavedStateTest.java b/tests/tests/view/src/android/view/cts/View_BaseSavedStateTest.java
index f19fdd5..ce64a18 100644
--- a/tests/tests/view/src/android/view/cts/View_BaseSavedStateTest.java
+++ b/tests/tests/view/src/android/view/cts/View_BaseSavedStateTest.java
@@ -16,29 +16,12 @@
 
 package android.view.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.os.Parcel;
 import android.test.InstrumentationTestCase;
 import android.view.View.BaseSavedState;
 
-@TestTargetClass(BaseSavedState.class)
 public class View_BaseSavedStateTest extends InstrumentationTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "BaseSavedState",
-            args = {android.os.Parcel.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "BaseSavedState",
-            args = {android.os.Parcelable.class}
-        )
-    })
     public void testConstructors() {
         BaseSavedState state = new BaseSavedState(Parcel.obtain());
 
diff --git a/tests/tests/view/src/android/view/cts/View_FocusHandlingTest.java b/tests/tests/view/src/android/view/cts/View_FocusHandlingTest.java
index 5f38749..929ac7f 100644
--- a/tests/tests/view/src/android/view/cts/View_FocusHandlingTest.java
+++ b/tests/tests/view/src/android/view/cts/View_FocusHandlingTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.app.Activity;
 import android.graphics.Rect;
@@ -29,115 +25,12 @@
 import android.test.UiThreadTest;
 import android.view.View;
 
-@TestTargetClass(View.class)
 public class View_FocusHandlingTest
         extends ActivityInstrumentationTestCase2<FocusHandlingStubActivity> {
     public View_FocusHandlingTest() {
         super("com.android.cts.stub", FocusHandlingStubActivity.class);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isFocusable",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasFocusable",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setNextFocusRightId",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setNextFocusDownId",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setNextFocusLeftId",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setNextFocusUpId",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getNextFocusRightId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getNextFocusDownId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getNextFocusLeftId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getNextFocusUpId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "focusSearch",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requestFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requestFocus",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requestFocus",
-            args = {int.class, Rect.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requestFocusFromTouch",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isFocused",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "clearFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "findFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVisibility",
-            args = {int.class}
-        )
-    })
     @UiThreadTest
     public void testFocusHandling() {
         Activity activity = getActivity();
diff --git a/tests/tests/view/src/android/view/cts/View_IdsTest.java b/tests/tests/view/src/android/view/cts/View_IdsTest.java
index e7f9e39..ce94771 100644
--- a/tests/tests/view/src/android/view/cts/View_IdsTest.java
+++ b/tests/tests/view/src/android/view/cts/View_IdsTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.app.Activity;
 import android.test.ActivityInstrumentationTestCase2;
@@ -31,24 +27,11 @@
 import android.widget.EditText;
 import android.widget.TextView;
 
-@TestTargetClass(View.class)
 public class View_IdsTest extends ActivityInstrumentationTestCase2<UsingViewsStubActivity> {
     public View_IdsTest() {
         super("com.android.cts.stub", UsingViewsStubActivity.class);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setId",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getId",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testIds() {
         Activity activity = getActivity();
diff --git a/tests/tests/view/src/android/view/cts/View_LayoutPositionTest.java b/tests/tests/view/src/android/view/cts/View_LayoutPositionTest.java
index 0c5fe92..db21be1 100644
--- a/tests/tests/view/src/android/view/cts/View_LayoutPositionTest.java
+++ b/tests/tests/view/src/android/view/cts/View_LayoutPositionTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.app.Activity;
 import android.graphics.Canvas;
@@ -34,7 +30,6 @@
  * For the view test is too big, we divide the test cases into several parts.
  * This part contains size, padding, margin, layout and drawing
  */
-@TestTargetClass(View.class)
 public class View_LayoutPositionTest
         extends ActivityInstrumentationTestCase2<ViewLayoutPositionTestStubActivity> {
 
@@ -50,78 +45,6 @@
         mActivity = getActivity();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBottom",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRight",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLeft",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "offsetTopAndBottom",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "offsetLeftAndRight",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWidth",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getHeight",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBaseLine",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "draw",
-            args = {Canvas.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "layout",
-            args = {int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMeasuredWidth",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMeasuredHeight",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLocationOnScreen",
-            args = {int[].class}
-        )
-    })
     @UiThreadTest
     public void testPositionInParent() {
         View parent = mActivity.findViewById(R.id.testparent);
@@ -178,33 +101,6 @@
         assertEquals(bottom + v_offset, nbottom);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPaddingLeft",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPaddingTop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPaddingRight",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPaddingBottom",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPadding",
-            args = {int.class, int.class, int.class, int.class}
-        )
-    })
     public void testPadding() {
         View view = new View(mActivity);
 
diff --git a/tests/tests/view/src/android/view/cts/View_MeasureSpecTest.java b/tests/tests/view/src/android/view/cts/View_MeasureSpecTest.java
index 28d2e05..ca29992 100644
--- a/tests/tests/view/src/android/view/cts/View_MeasureSpecTest.java
+++ b/tests/tests/view/src/android/view/cts/View_MeasureSpecTest.java
@@ -19,15 +19,10 @@
 import android.test.AndroidTestCase;
 import android.view.View;
 import android.view.View.MeasureSpec;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
 /**
  * Test {@link MeasureSpec}.
  */
-@TestTargetClass(View.MeasureSpec.class)
 public class View_MeasureSpecTest extends AndroidTestCase {
     private static final int MEASURE_SPEC_SIZE = 1;
 
@@ -46,21 +41,9 @@
                 View.MeasureSpec.AT_MOST);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "This is a foo test, just add annotation for constructor, to make nooser pass",
-        method = "View.MeasureSpec",
-        args = {}
-    )
     public void testConstructor() {
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test View.MeasureSpec#getSize(int)",
-        method = "getSize",
-        args = {int.class}
-    )
     public void testGetSize() {
         assertEquals(MEASURE_SPEC_SIZE,
                 View.MeasureSpec.getSize(mUnspecifiedMeasureSpec));
@@ -70,12 +53,6 @@
                 View.MeasureSpec.getSize(mAtMostMeasureSpec));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test View.MeasureSpec#toString(int)",
-        method = "toString",
-        args = {int.class}
-    )
     public void testToString() {
         assertEquals("MeasureSpec: UNSPECIFIED " + MEASURE_SPEC_SIZE,
                 View.MeasureSpec.toString(mUnspecifiedMeasureSpec));
@@ -85,12 +62,6 @@
                 View.MeasureSpec.toString(mAtMostMeasureSpec));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test View.MeasureSpec#getMode(int)",
-        method = "getMode",
-        args = {int.class}
-    )
     public void testGetMode() {
         assertEquals(View.MeasureSpec.UNSPECIFIED,
                 View.MeasureSpec.getMode(mUnspecifiedMeasureSpec));
@@ -100,12 +71,6 @@
                 View.MeasureSpec.getMode(mAtMostMeasureSpec));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test View.MeasureSpec#makeMeasureSpec(int, int)",
-        method = "makeMeasureSpec",
-        args = {int.class, int.class}
-    )
     public void testMakeMeasureSpec() {
         assertEquals(MEASURE_SPEC_SIZE + View.MeasureSpec.UNSPECIFIED,
                 mUnspecifiedMeasureSpec);
diff --git a/tests/tests/view/src/android/view/cts/View_UsingViewsTest.java b/tests/tests/view/src/android/view/cts/View_UsingViewsTest.java
index 3bc500c..adfec69 100644
--- a/tests/tests/view/src/android/view/cts/View_UsingViewsTest.java
+++ b/tests/tests/view/src/android/view/cts/View_UsingViewsTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.app.Activity;
 import android.app.Instrumentation;
@@ -39,7 +35,6 @@
 import android.widget.RelativeLayout;
 import android.widget.TextView;
 
-@TestTargetClass(View.class)
 public class View_UsingViewsTest extends ActivityInstrumentationTestCase2<UsingViewsStubActivity> {
     /**
      * country of Argentina
@@ -98,183 +93,6 @@
         mWarningTextView = (TextView) mActivity.findViewById(R.id.warning);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setClickable",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isClickable",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOnClickListener",
-            args = {OnClickListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "performClick",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDrawingCacheEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isDrawingCacheEnabled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDrawingCacheQuality",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDrawingCacheQuality",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDrawingCacheBackgroundColor",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDrawingCacheBackgroundColor",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDrawingCache",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "buildDrawingCache",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "destroyDrawingCache",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDuplicateParentStateEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isDuplicateParentStateEnabled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "refreshDrawableState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDrawableState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isEnabled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVerticalFadingEdgeEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isVerticalFadingEdgeEnabled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFadingEdgeLength",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setHorizontalFadingEdgeEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isHorizontalFadingEdgeEnabled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFocusable",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isFocusable",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFocusableInTouchMode",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isFocusableInTouchMode",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isHorizontalScrollBarEnabled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isVerticalScrollBarEnabled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setHorizontalScrollBarEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVerticalScrollBarEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setId",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "findViewById",
-            args = {int.class}
-        )
-    })
     @UiThreadTest
     public void testSetProperties() {
         /**
@@ -440,33 +258,6 @@
         assertEquals(R.id.symbolball, mSymbolTextView.getId());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOnFocusChangeListener",
-            args = {OnFocusChangeListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVisibility",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requestFocus",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFocusable",
-            args = {boolean.class}
-        )
-    })
     @UiThreadTest
     public void testSetFocus() throws Throwable {
         boolean focusWasOnEditText = mEditText.hasFocus();
@@ -537,43 +328,6 @@
         assertFalse(warningListener.hasFocus());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setClickable",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isClickable",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setLongClickable",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isLongClickable",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getVisibility",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOnClickListener",
-            args = {OnClickListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOnLongClickListener",
-            args = {OnLongClickListener.class}
-        )
-    })
     public void testSetupListeners() throws Throwable {
         // set ok button OnClick listener
         mButtonOk.setClickable(true);
@@ -657,18 +411,6 @@
         assertEquals(View.VISIBLE, mWarningTextView.getVisibility());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVisibility",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getVisibility",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testSetVisibility() throws Throwable {
         mActivity.setContentView(R.layout.view_visibility_layout);
diff --git a/tests/tests/view/src/android/view/cts/WindowManager_BadTokenExceptionTest.java b/tests/tests/view/src/android/view/cts/WindowManager_BadTokenExceptionTest.java
index 2dcbb16..db5607c 100644
--- a/tests/tests/view/src/android/view/cts/WindowManager_BadTokenExceptionTest.java
+++ b/tests/tests/view/src/android/view/cts/WindowManager_BadTokenExceptionTest.java
@@ -17,28 +17,9 @@
 
 import android.test.AndroidTestCase;
 import android.view.WindowManager.BadTokenException;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
-@TestTargetClass(BadTokenException.class)
 public class WindowManager_BadTokenExceptionTest extends AndroidTestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test BadTokenException constructor",
-            method = "WindowManager.BadTokenException",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test BadTokenException constructor",
-            method = "WindowManager.BadTokenException",
-            args = {String.class}
-        )
-    })
     public void testBadTokenException(){
         BadTokenException badTokenException = new BadTokenException();
         try {
diff --git a/tests/tests/view/src/android/view/cts/WindowManager_LayoutParamsTest.java b/tests/tests/view/src/android/view/cts/WindowManager_LayoutParamsTest.java
index e2775d0..40b4b28 100644
--- a/tests/tests/view/src/android/view/cts/WindowManager_LayoutParamsTest.java
+++ b/tests/tests/view/src/android/view/cts/WindowManager_LayoutParamsTest.java
@@ -16,10 +16,6 @@
 
 package android.view.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.graphics.PixelFormat;
 import android.os.Binder;
@@ -30,7 +26,6 @@
 import android.view.Gravity;
 import android.view.WindowManager;
 
-@TestTargetClass(WindowManager.LayoutParams.class)
 public class WindowManager_LayoutParamsTest extends AndroidTestCase {
     private static final int WINDOW_WIDTH = 320;
     private static final int WINDOW_HEIGHT = 480;
@@ -50,49 +45,6 @@
 
     private WindowManager.LayoutParams mLayoutParams;
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s)",
-            method = "WindowManager.LayoutParams",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "WindowManager.LayoutParams",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "WindowManager.LayoutParams",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "WindowManager.LayoutParams",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "WindowManager.LayoutParams",
-            args = {int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "WindowManager.LayoutParams",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "WindowManager.LayoutParams",
-            args = {Parcel.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "WindowManager.mayUseInputMethod",
-            args = {int.class}
-        )
-    })
     public void testConstructor() {
         new WindowManager.LayoutParams();
 
@@ -135,11 +87,6 @@
                 .mayUseInputMethod(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "copyFrom",
-        args = {WindowManager.LayoutParams.class}
-    )
     public void testCopyFrom() {
         mLayoutParams = new WindowManager.LayoutParams();
         WindowManager.LayoutParams params = new WindowManager.LayoutParams(
@@ -215,29 +162,12 @@
         assertEquals(params.verticalWeight, mLayoutParams.verticalWeight);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
         mLayoutParams = new WindowManager.LayoutParams();
 
         assertEquals(0, mLayoutParams.describeContents());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitle",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTitle",
-            args = {CharSequence.class}
-        )
-    })
     public void testAccessTitle() {
         String title = "";
         mLayoutParams = new WindowManager.LayoutParams();
@@ -254,11 +184,6 @@
         assertEquals(spannedTitle, mLayoutParams.getTitle());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "toString",
-        args = {}
-    )
     public void testToString() {
         mLayoutParams = new WindowManager.LayoutParams();
         assertNotNull(mLayoutParams.toString());
@@ -269,11 +194,6 @@
         assertNotNull(mLayoutParams.toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {Parcel.class, int.class}
-    )
     public void testWriteToParcel() {
         IBinder binder = new Binder();
         mLayoutParams = new WindowManager.LayoutParams(WINDOW_WIDTH, WINDOW_HEIGHT, XPOS, YPOS,
@@ -303,11 +223,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "debug",
-        args = {String.class}
-    )
     public void testDebug() {
     }
 }
diff --git a/tests/tests/view/src/android/view/cts/WindowTest.java b/tests/tests/view/src/android/view/cts/WindowTest.java
index 5727ff0..8f45f5c 100755
--- a/tests/tests/view/src/android/view/cts/WindowTest.java
+++ b/tests/tests/view/src/android/view/cts/WindowTest.java
@@ -18,11 +18,6 @@
 
 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 android.app.Instrumentation;
 import android.content.Context;
@@ -53,7 +48,6 @@
 import android.view.accessibility.AccessibilityEvent;
 import android.widget.TextView;
 
-@TestTargetClass(Window.class)
 public class WindowTest extends ActivityInstrumentationTestCase2<WindowStubActivity> {
     private Window mWindow;
     private Context mContext;
@@ -84,18 +78,6 @@
         super.tearDown();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Window",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getContext",
-            args = {}
-        )
-    })
     public void testConstructor() throws Exception {
         mWindow = new MockWindow(mContext);
         assertSame(mContext, mWindow.getContext());
@@ -109,23 +91,6 @@
      *              _2. test invocation of Window.Callback#onWindowAttributesChanged.
      * 3. clearFlags: clear the flag bits as specified in flags.
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addFlags",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "clearFlags",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFlags",
-            args = {int.class, int.class}
-        )
-    })
    public void testOpFlags() throws Exception {
         mWindow = new MockWindow(mContext);
         final WindowManager.LayoutParams attrs = mWindow.getAttributes();
@@ -157,11 +122,6 @@
         mWindow.clearFlags(WindowManager.LayoutParams.FLAG_DITHER);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "findViewById",
-        args = {int.class}
-    )
     public void testFindViewById() throws Exception {
         TextView v = (TextView) mWindow.findViewById(R.id.listview_window);
         assertNotNull(v);
@@ -179,28 +139,6 @@
      *    there is just one method, onWindowAttributesChanged, used.
      * getCallback: Return the current Callback interface for this window.
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAttributes",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setCallback",
-            args = {android.view.Window.Callback.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCallback",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAttributes",
-            args = {android.view.WindowManager.LayoutParams.class}
-        )
-    })
     public void testAccessAttributes() throws Exception {
         mWindow = new MockWindow(mContext);
 
@@ -235,23 +173,6 @@
      * container is false;
      * Otherwise, it will display itself meanwhile container's mHasChildren is true.
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getContainer",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContainer",
-            args = {android.view.Window.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasChildren",
-            args = {}
-        )
-    })
     public void testAccessContainer() throws Exception {
         mWindow = new MockWindow(mContext);
         assertNull(mWindow.getContainer());
@@ -270,18 +191,6 @@
      * getLayoutInflater: Quick access to the {@link LayoutInflater} instance that this Window
      *    retrieved from its Context.
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addContentView",
-            args = {android.view.View.class, android.view.ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLayoutInflater",
-            args = {}
-        )
-    })
     public void testAddContentView() throws Throwable {
         final ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(VIEWGROUP_LAYOUT_WIDTH,
                 VIEWGROUP_LAYOUT_HEIGHT);
@@ -305,11 +214,6 @@
         mInstrumentation.waitForIdleSync();
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "closeAllPanels",
-        args = {}
-    )
     public void testCloseAllPanels() throws Throwable {
     }
 
@@ -320,11 +224,6 @@
      * 1. Set focus view to null, get current focus, it should be null
      * 2. Set listview_window as focus view, get it and compare.
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getCurrentFocus",
-        args = {}
-    )
     public void testGetCurrentFocus() throws Throwable {
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -351,18 +250,6 @@
      *    ontext is same as Window's context.
      * 2. Return null if decor view is not created, else the same with detDecorView.
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDecorView",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "peekDecorView",
-            args = {}
-        )
-    })
     public void testDecorView() throws Exception {
         mInstrumentation.waitForIdleSync();
         View decor = mWindow.getDecorView();
@@ -391,18 +278,6 @@
      * getVolumeControlStream: Gets the suggested audio stream whose volume should be changed by
      *    the harwdare volume controls.
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getVolumeControlStream",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVolumeControlStream",
-            args = {int.class}
-        )
-    })
     public void testAccessVolumeControlStream() throws Exception {
         // Default value is AudioManager.USE_DEFAULT_STREAM_TYPE, see javadoc of
         // {@link Activity#setVolumeControlStream}.
@@ -416,19 +291,6 @@
      * getWindowManager: Return the window manager allowing this Window to display its own
      *    windows.
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "getWindowManager",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "setWindowManager",
-            args = {android.view.WindowManager.class, android.os.IBinder.class,
-                    java.lang.String.class}
-        )
-    })
     public void testAccessWindowManager() throws Exception {
         mWindow = new MockWindow(getActivity());
         WindowManager expected = (WindowManager) getActivity().getSystemService(
@@ -444,13 +306,6 @@
      * Return the {@link android.R.styleable#Window} attributes from this
      * window's theme. It's invisible.
      */
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        notes = "the windowStyle is obtained from com.android.internal.R.styleable.Window whose"
-              + " details are invisible for user",
-        method = "getWindowStyle",
-        args = {}
-    )
     public void testGetWindowStyle() throws Exception {
         mWindow = new MockWindow(mContext);
         final TypedArray windowStyle = mWindow.getWindowStyle();
@@ -460,23 +315,6 @@
         assertNotNull(windowStyle);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isActive",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "makeActive",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onActive",
-            args = {}
-        )
-    })
     public void testIsActive() throws Exception {
         MockWindow window = new MockWindow(mContext);
         assertFalse(window.isActive());
@@ -490,51 +328,14 @@
      * isFloating: Return whether this window is being displayed with a floating style
      * (based on the {@link android.R.attr#windowIsFloating} attribute in the style/theme).
      */
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        notes = "Now can only get the unfloating status",
-        method = "isFloating",
-        args = {}
-    )
     public void testIsFloating() throws Exception {
         // Default system theme defined by themes.xml, the windowIsFloating is set false.
         assertFalse(mWindow.isFloating());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "performContextMenuIdentifierAction",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "performPanelIdentifierAction",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "performPanelShortcut",
-            args = {int.class, int.class, android.view.KeyEvent.class, int.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc, hard to get known about its"
-        + " functionality")
     public void testPerformMethods() throws Exception {
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-             method = "restoreHierarchyState",
-            args = {android.os.Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "saveHierarchyState",
-            args = {}
-        )
-    })
     public void testKeepHierarchyState() throws Exception {
     }
 
@@ -544,18 +345,6 @@
      *  attribute of PixelFormat to check if the window is opaque). To make the window
      * transparent, you can use an empty drawable(eg. ColorDrawable with the color 0).
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setBackgroundDrawable",
-            args = {android.graphics.drawable.Drawable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setBackgroundDrawableResource",
-            args = {int.class}
-        )
-    })
     public void testSetBackgroundDrawable() throws Throwable {
         // DecorView holds the background
         View decor = mWindow.getDecorView();
@@ -592,20 +381,6 @@
         assertNull(decor.getBackground());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "setChildDrawable",
-            args = {int.class, android.graphics.drawable.Drawable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "setChildInt",
-            args = {int.class, int.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "miss javadoc, hard to get known about its"
-        + " functionality")
     public void testSetChild() throws Exception {
     }
 
@@ -622,23 +397,6 @@
      *   1. can't get the features requested because the getter is protected final.
      *   2. certain window flags are not clear to concrete one.
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "setContentView",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "setContentView",
-            args = {android.view.View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "setContentView",
-            args = {android.view.View.class, android.view.ViewGroup.LayoutParams.class}
-        )
-    })
     public void testSetContentView() throws Throwable {
         final ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(VIEWGROUP_LAYOUT_WIDTH,
                 VIEWGROUP_LAYOUT_HEIGHT);
@@ -687,48 +445,9 @@
      *
      * the set views exist, and no getter way to check.
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "setFeatureDrawable",
-            args = {int.class, android.graphics.drawable.Drawable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "setFeatureDrawableAlpha",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "setFeatureDrawableResource",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "setFeatureDrawableUri",
-            args = {int.class, android.net.Uri.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "setFeatureInt",
-            args = {int.class, int.class}
-        )
-    })
     public void testSetFeature() throws Throwable {
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "setTitle",
-            args = {java.lang.CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "setTitleColor",
-            args = {int.class}
-        )
-    })
     public void testSetTitle() throws Throwable {
         final String title = "Android Window Test";
         runTestOnUiThread(new Runnable() {
@@ -746,25 +465,6 @@
      * further down the view hierarchy. Application developers should not need to implement or
      * call this.
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "superDispatchTouchEvent",
-            args = {android.view.MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "superDispatchTrackballEvent",
-            args = {android.view.MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "superDispatchKeyEvent",
-            args = {android.view.KeyEvent.class}
-        )
-    })
-    @ToBeFixed(bug = "1719667", explanation = "In javadoc, it is not recommended for developer"
-        + " to call these methods, they are used by custom windows.")
     public void testSuperDispatchEvent() throws Exception {
     }
 
@@ -772,14 +472,6 @@
      * takeKeyEvents: Request that key events come to this activity. Use this if your activity
      * has no views with focus, but the activity still wants a chance to process key events.
      */
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        method = "takeKeyEvents",
-        args = {boolean.class}
-    )
-    @ToBeFixed(bug = "1728604", explanation = "Clear all focused view, use takeKeyEvents(false)"
-        + " It's expected that the activity can't process key events, But when we send a key,"
-        + " Acitivity#onKeyDown is still called by system.")
     public void testTakeKeyEvents() throws Throwable {
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -797,27 +489,12 @@
     /**
      * onConfigurationChanged: Should be called when the configuration is changed.
      */
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        notes = "Test onConfigurationChanged, because the Window#onConfigurationChanged is"
-              + " abstract and we can't let system call our own MockWindow#onConfigurationChanged"
-              + " and can't check if the system call this callback method",
-        method = "onConfigurationChanged",
-        args = {android.content.res.Configuration.class}
-    )
     public void testOnConfigurationChanged() throws Exception {
     }
 
     /**
      * requestFeature: Enable extended screen features.
      */
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        notes = "Because getFeatures is final protected, we can't get the request Features and"
-              + " no way to check the request result.",
-        method = "requestFeature",
-        args = {int.class}
-    )
     public void testRequestFeature() throws Exception {
     }
 
@@ -830,18 +507,6 @@
      *                          PixelFormat.UNKNOWN to allow the Window to select
      *                          the format.
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDefaultWindowFormat",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFormat",
-            args = {int.class}
-        )
-    })
     public void testSetDefaultWindowFormat() throws Exception {
         MockWindowCallback callback;
         MockWindow window = new MockWindow(mContext);
@@ -870,12 +535,6 @@
     /**
      * Set the gravity of the window
      */
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        notes = "Lack of getter to obtain the gravity of window manager positioned in window",
-        method = "setGravity",
-        args = {int.class}
-    )
     public void testSetGravity() throws Exception {
         mWindow = new MockWindow(mContext);
         WindowManager.LayoutParams attrs = mWindow.getAttributes();
@@ -895,11 +554,6 @@
      *    1.The default for both of these is MATCH_PARENT;
      *    2.You can change them to WRAP_CONTENT to make a window that is not full-screen.
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setLayout",
-        args = {int.class, int.class}
-    )
     public void testSetLayout() throws Exception {
         mWindow = new MockWindow(mContext);
         WindowManager.LayoutParams attrs = mWindow.getAttributes();
@@ -920,11 +574,6 @@
     /**
      * Set the type of the window, as per the WindowManager.LayoutParams types.
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setType",
-        args = {int.class}
-    )
     public void testSetType() throws Exception {
         mWindow = new MockWindow(mContext);
         WindowManager.LayoutParams attrs = mWindow.getAttributes();
@@ -945,11 +594,6 @@
      *    1.Providing "unspecified" here will NOT override the input mode the window.
      *    2.Providing "unspecified" here will override the input mode the window.
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setSoftInputMode",
-        args = {int.class}
-    )
     public void testSetSoftInputMode() throws Exception {
         mWindow = new MockWindow(mContext);
         assertEquals(WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED,
@@ -969,11 +613,6 @@
      *    it because the getter is in WindowManagerService and is private)
      *    2.Providing 0 here will override the animations the window.
      */
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        method = "setWindowAnimations",
-        args = {int.class}
-    )
     public void testSetWindowAnimations() throws Exception {
         mWindow = new MockWindow(mContext);
 
@@ -986,32 +625,6 @@
         assertTrue(callback.isOnWindowAttributesChangedCalled());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            notes = "Test getFeatures, protected final method, can't call it",
-            method = "getFeatures",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            notes = "Test getLocalFeatures, protected final method, can't call it",
-            method = "getLocalFeatures",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            notes = "Test getForcedWindowFlags, protected final method, can't call it",
-            method = "getForcedWindowFlags",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            notes = "Test hasSoftInputMode, protected final method, can't call it",
-            method = "hasSoftInputMode",
-            args = {}
-        )
-    })
     public void testFinalMethod() throws Exception {
         // No way to test protected final method
     }
diff --git a/tests/tests/view/src/android/view/inputmethod/cts/BaseInputConnectionTest.java b/tests/tests/view/src/android/view/inputmethod/cts/BaseInputConnectionTest.java
index 2cf6b58..ad6f971 100755
--- a/tests/tests/view/src/android/view/inputmethod/cts/BaseInputConnectionTest.java
+++ b/tests/tests/view/src/android/view/inputmethod/cts/BaseInputConnectionTest.java
@@ -18,13 +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 android.app.Instrumentation;
 import android.content.Context;
+import android.cts.util.PollingCheck;
 import android.os.Bundle;
 import android.test.ActivityInstrumentationTestCase2;
 import android.text.Editable;
@@ -35,14 +32,12 @@
 import android.view.KeyEvent;
 import android.view.View;
 import android.view.Window;
-import android.view.animation.cts.DelayedCheck;
 import android.view.inputmethod.BaseInputConnection;
 import android.view.inputmethod.CompletionInfo;
 import android.view.inputmethod.ExtractedTextRequest;
 import android.view.inputmethod.InputMethodManager;
 import android.widget.EditText;
 
-@TestTargetClass(BaseInputConnection.class)
 public class BaseInputConnectionTest extends
         ActivityInstrumentationTestCase2<InputMethodStubActivity> {
 
@@ -66,43 +61,6 @@
         mConnection = new BaseInputConnection(mView, true);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "beginBatchEdit",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "commitCompletion",
-            args = {CompletionInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "endBatchEdit",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getExtractedText",
-            args = {ExtractedTextRequest.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "performContextMenuAction",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "performEditorAction",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "performPrivateCommand",
-            args = {String.class, Bundle.class}
-        )
-    })
     public void testDefaultMethods() {
         // These methods are default to return fixed result.
 
@@ -126,28 +84,6 @@
         assertFalse(mConnection.performPrivateCommand(action, new Bundle()));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "getComposingSpanEnd",
-            args = {Spannable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "getComposingSpanStart",
-            args = {Spannable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "removeComposingSpans",
-            args = {Spannable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "setComposingSpans",
-            args = {Spannable.class}
-        )
-    })
     public void testOpComposingSpans() {
         Spannable text = new SpannableString("Test ComposingSpans");
         BaseInputConnection.setComposingSpans(text);
@@ -178,53 +114,6 @@
      *                          around the current selection position of the editable text.
      * setSelection: changes the selection position in the current editable text.
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "BaseInputConnection",
-            args = {View.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "clearMetaKeyStates",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "commitText",
-            args = {CharSequence.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "deleteSurroundingText",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCursorCapsMode",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getEditable",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSelection",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTextAfterCursor",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTextBeforeCursor",
-            args = {int.class, int.class}
-        )
-    })
     public void testOpTextMethods() throws Throwable {
         // return is an default Editable instance with empty source
         final Editable text = mConnection.getEditable();
@@ -260,7 +149,7 @@
         // dummy mode
         BaseInputConnection dummyConnection = new BaseInputConnection(mView, false);
         dummyConnection.commitText(inputText, inputText.length());
-        new DelayedCheck() {
+        new PollingCheck() {
             @Override
             protected boolean check() {
                 return text2.toString().equals(mView.getText().toString());
@@ -287,18 +176,6 @@
      * setComposingText: The default implementation places the given text into the editable,
      *                  replacing any existing composing text
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishComposingText",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setComposingText",
-            args = {CharSequence.class, int.class}
-        )
-    })
     public void testFinishComposingText() throws Throwable {
         CharSequence str = "TestFinish";
         Editable inputText = Editable.Factory.getInstance().newEditable(str);
@@ -323,7 +200,7 @@
         BaseInputConnection dummyConnection = new BaseInputConnection(mView, false);
         dummyConnection.setComposingText(str, str.length());
         dummyConnection.finishComposingText();
-        new DelayedCheck() {
+        new PollingCheck() {
             @Override
             protected boolean check() {
                 return text.toString().equals(mView.getText().toString());
@@ -335,11 +212,6 @@
      * Provides standard implementation for sending a key event to the window
      * attached to the input connection's view
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "sendKeyEvent",
-        args = {KeyEvent.class}
-    )
     public void testSendKeyEvent() throws Throwable {
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -359,7 +231,7 @@
             mInstrumentation.sendStringSync("q");
             mInstrumentation.waitForIdleSync();
         }
-        new DelayedCheck() {
+        new PollingCheck() {
             @Override
             protected boolean check() {
                 return "q".equals(mView.getText().toString());
@@ -370,11 +242,6 @@
     /**
      * Updates InputMethodManager with the current fullscreen mode.
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "reportFullscreenMode",
-        args = {boolean.class}
-    )
     public void testReportFullscreenMode() {
         InputMethodManager imManager = (InputMethodManager) mInstrumentation.getTargetContext()
                 .getSystemService(Context.INPUT_METHOD_SERVICE);
diff --git a/tests/tests/view/src/android/view/inputmethod/cts/CompletionInfoTest.java b/tests/tests/view/src/android/view/inputmethod/cts/CompletionInfoTest.java
index ba4358f..9606a0e 100644
--- a/tests/tests/view/src/android/view/inputmethod/cts/CompletionInfoTest.java
+++ b/tests/tests/view/src/android/view/inputmethod/cts/CompletionInfoTest.java
@@ -16,69 +16,17 @@
 
 package android.view.inputmethod.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.os.Parcel;
 import android.test.AndroidTestCase;
 import android.view.inputmethod.CompletionInfo;
 
-@TestTargetClass(CompletionInfo.class)
 public class CompletionInfoTest extends AndroidTestCase {
     private static final int ID = 1;
     private static final int POSITION = 1;
     private static final String TEXT = "CompletionInfoText";
     private static final String LABEL = "CompletionInfoLabel";
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "describeContents",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeToParcel",
-            args = {Parcel.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "CompletionInfo",
-            args = {long.class, int.class, CharSequence.class, CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "CompletionInfo",
-            args = {long.class, int.class, CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPosition",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getText",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLabel",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "toString",
-            args = {}
-        )
-    })
     public void testCompletionInfo() {
         new CompletionInfo(ID, POSITION, TEXT);
         CompletionInfo info = new CompletionInfo(ID, POSITION, TEXT, LABEL);
diff --git a/tests/tests/view/src/android/view/inputmethod/cts/EditorInfoTest.java b/tests/tests/view/src/android/view/inputmethod/cts/EditorInfoTest.java
index cd28b3f..5bc4515 100644
--- a/tests/tests/view/src/android/view/inputmethod/cts/EditorInfoTest.java
+++ b/tests/tests/view/src/android/view/inputmethod/cts/EditorInfoTest.java
@@ -16,10 +16,6 @@
 
 package android.view.inputmethod.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.os.Bundle;
 import android.os.Parcel;
@@ -29,26 +25,8 @@
 import android.view.inputmethod.EditorInfo;
 
 
-@TestTargetClass(EditorInfo.class)
 public class EditorInfoTest extends AndroidTestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "describeContents",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeToParcel",
-            args = {Parcel.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dump",
-            args = {Printer.class, String.class}
-        )
-    })
     public void testEditorInfo() {
         EditorInfo info = new EditorInfo();
 
diff --git a/tests/tests/view/src/android/view/inputmethod/cts/ExtractedTextRequestTest.java b/tests/tests/view/src/android/view/inputmethod/cts/ExtractedTextRequestTest.java
index 0f0a987..c3aa588 100644
--- a/tests/tests/view/src/android/view/inputmethod/cts/ExtractedTextRequestTest.java
+++ b/tests/tests/view/src/android/view/inputmethod/cts/ExtractedTextRequestTest.java
@@ -16,30 +16,13 @@
 
 package android.view.inputmethod.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.os.Parcel;
 import android.test.AndroidTestCase;
 import android.view.inputmethod.ExtractedTextRequest;
 
-@TestTargetClass(ExtractedTextRequest.class)
 public class ExtractedTextRequestTest extends AndroidTestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "describeContents",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeToParcel",
-            args = {Parcel.class, int.class}
-        )
-    })
     public void testExtractedTextRequest() {
         ExtractedTextRequest request = new ExtractedTextRequest();
         request.flags = 1;
diff --git a/tests/tests/view/src/android/view/inputmethod/cts/ExtractedTextTest.java b/tests/tests/view/src/android/view/inputmethod/cts/ExtractedTextTest.java
index c115902..3dccee6 100644
--- a/tests/tests/view/src/android/view/inputmethod/cts/ExtractedTextTest.java
+++ b/tests/tests/view/src/android/view/inputmethod/cts/ExtractedTextTest.java
@@ -15,30 +15,13 @@
  */
 package android.view.inputmethod.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.os.Parcel;
 import android.test.AndroidTestCase;
 import android.view.inputmethod.ExtractedText;
 
-@TestTargetClass(ExtractedText.class)
 public class ExtractedTextTest extends AndroidTestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "describeContents",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeToParcel",
-            args = {android.os.Parcel.class, int.class}
-        )
-    })
     public void testWriteToParcel() {
 
         ExtractedText extractedText = new ExtractedText();
diff --git a/tests/tests/view/src/android/view/inputmethod/cts/InputBindingTest.java b/tests/tests/view/src/android/view/inputmethod/cts/InputBindingTest.java
index 8e0102e..0957a94 100644
--- a/tests/tests/view/src/android/view/inputmethod/cts/InputBindingTest.java
+++ b/tests/tests/view/src/android/view/inputmethod/cts/InputBindingTest.java
@@ -16,10 +16,6 @@
 
 package android.view.inputmethod.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.os.Binder;
 import android.os.Parcel;
@@ -28,58 +24,8 @@
 import android.view.inputmethod.BaseInputConnection;
 import android.view.inputmethod.InputBinding;
 
-@TestTargetClass(InputBinding.class)
 public class InputBindingTest extends AndroidTestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "describeContents",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getConnection",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getConnectionToken",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPid",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getUid",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "InputBinding",
-            args = {android.view.inputmethod.InputConnection.class,
-                    android.view.inputmethod.InputBinding.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "InputBinding",
-            args = {android.view.inputmethod.InputConnection.class, android.os.IBinder.class,
-                    int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "toString",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "writeToParcel",
-            args = {android.os.Parcel.class, int.class}
-        )
-    })
     public void testInputBinding() {
         View view = new View(getContext());
         BaseInputConnection bic = new BaseInputConnection(view, false);
diff --git a/tests/tests/view/src/android/view/inputmethod/cts/InputConnectionWrapperTest.java b/tests/tests/view/src/android/view/inputmethod/cts/InputConnectionWrapperTest.java
index 10abe4a..17147cf 100644
--- a/tests/tests/view/src/android/view/inputmethod/cts/InputConnectionWrapperTest.java
+++ b/tests/tests/view/src/android/view/inputmethod/cts/InputConnectionWrapperTest.java
@@ -16,10 +16,6 @@
 
 package android.view.inputmethod.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.os.Bundle;
 import android.test.AndroidTestCase;
@@ -33,121 +29,8 @@
 import android.view.inputmethod.InputConnection;
 import android.view.inputmethod.InputConnectionWrapper;
 
-@TestTargetClass(InputConnectionWrapper.class)
 public class InputConnectionWrapperTest extends AndroidTestCase {
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "InputConnectionWrapper",
-            args = {InputConnection.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTarget",
-            args = {InputConnection.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "beginBatchEdit",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "commitCompletion",
-            args = {CompletionInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "endBatchEdit",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getExtractedText",
-            args = {ExtractedTextRequest.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "performContextMenuAction",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "performEditorAction",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "performPrivateCommand",
-            args = {String.class, Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSelection",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTextAfterCursor",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTextBeforeCursor",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-                level = TestLevel.COMPLETE,
-                method = "getSelectedText",
-                args = {int.class}
-            ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCursorCapsMode",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "clearMetaKeyStates",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "commitText",
-            args = {CharSequence.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "deleteSurroundingText",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "finishComposingText",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setComposingText",
-            args = {CharSequence.class, int.class}
-        ),
-        @TestTargetNew(
-                level = TestLevel.COMPLETE,
-                method = "setComposingRegion",
-                args = {int.class, int.class}
-            ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "sendKeyEvent",
-            args = {KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "reportFullscreenMode",
-            args = {boolean.class}
-        )
-    })
     public void testInputConnectionWrapper() {
         MockInputConnection inputConnection = new MockInputConnection();
         InputConnectionWrapper wrapper = new InputConnectionWrapper(null, true);
@@ -251,7 +134,7 @@
             return false;
         }
 
-        public boolean deleteSurroundingText(int leftLength, int rightLength) {
+        public boolean deleteSurroundingText(int beforeLength, int afterLength) {
             isDeleteSurroundingTextCalled = true;
             return false;
         }
diff --git a/tests/tests/view/src/android/view/inputmethod/cts/InputMethodInfoTest.java b/tests/tests/view/src/android/view/inputmethod/cts/InputMethodInfoTest.java
index 35a5a44..00a8dea 100644
--- a/tests/tests/view/src/android/view/inputmethod/cts/InputMethodInfoTest.java
+++ b/tests/tests/view/src/android/view/inputmethod/cts/InputMethodInfoTest.java
@@ -16,10 +16,6 @@
 
 package android.view.inputmethod.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.ComponentName;
 import android.content.Intent;
@@ -37,7 +33,6 @@
 import java.io.IOException;
 import java.util.List;
 
-@TestTargetClass(InputMethodInfo.class)
 public class InputMethodInfoTest extends AndroidTestCase {
     private InputMethodInfo mInputMethodInfo;
     private String mPackageName;
@@ -55,70 +50,6 @@
         mInputMethodInfo = new InputMethodInfo(mPackageName, mClassName, mLabel, mSettingsActivity);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "describeContents",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getComponent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            notes = "Can't make sure how to make the default id non-0",
-            method = "getIsDefaultResourceId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPackageName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getServiceInfo",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getServiceName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSettingsActivity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "loadIcon",
-            args = {android.content.pm.PackageManager.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "InputMethodInfo",
-            args = {android.content.Context.class, android.content.pm.ResolveInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "InputMethodInfo",
-            args = {java.lang.String.class, java.lang.String.class, java.lang.CharSequence.class,
-                    java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "toString",
-            args = {}
-        )
-    })
     public void testInputMethodInfoProperties() throws XmlPullParserException, IOException {
         assertEquals(0, mInputMethodInfo.describeContents());
         assertNotNull(mInputMethodInfo.toString());
@@ -156,54 +87,29 @@
         assertEquals(mClassName, info.getServiceName());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dump",
-        args = {android.util.Printer.class, java.lang.String.class}
-    )
     public void testDump() {
         MockPrinter printer = new MockPrinter();
         String prefix = "test";
         mInputMethodInfo.dump(printer, prefix);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "loadIcon",
-        args = {android.content.pm.PackageManager.class}
-    )
     public void testLoadIcon() {
         PackageManager pm = mContext.getPackageManager();
         assertNotNull(mInputMethodInfo.loadIcon(pm));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "equals",
-        args = {java.lang.Object.class}
-    )
     public void testEquals() {
         InputMethodInfo inputMethodInfo = new InputMethodInfo(mPackageName, mClassName, mLabel,
                 mSettingsActivity);
         assertTrue(inputMethodInfo.equals(mInputMethodInfo));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "loadLabel",
-        args = {android.content.pm.PackageManager.class}
-    )
     public void testLoadLabel() {
         CharSequence expected = "test";
         PackageManager pm = mContext.getPackageManager();
         assertEquals(expected.toString(), mInputMethodInfo.loadLabel(pm).toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {android.os.Parcel.class, int.class}
-    )
     public void testWriteToParcel() {
         Parcel p = Parcel.obtain();
         mInputMethodInfo.writeToParcel(p, 0);
diff --git a/tests/tests/view/src/android/view/inputmethod/cts/InputMethodManagerTest.java b/tests/tests/view/src/android/view/inputmethod/cts/InputMethodManagerTest.java
index 92ef3fe..3f01dc0 100755
--- a/tests/tests/view/src/android/view/inputmethod/cts/InputMethodManagerTest.java
+++ b/tests/tests/view/src/android/view/inputmethod/cts/InputMethodManagerTest.java
@@ -17,10 +17,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.app.Instrumentation;
 import android.content.Context;
@@ -39,7 +35,6 @@
 
 import java.util.List;
 
-@TestTargetClass(InputMethodManager.class)
 public class InputMethodManagerTest
                   extends ActivityInstrumentationTestCase2<InputMethodStubActivity> {
 
@@ -64,88 +59,6 @@
         super.tearDown();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "hideSoftInputFromInputMethod",
-            args = {IBinder.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "hideSoftInputFromWindow",
-            args = {IBinder.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "hideSoftInputFromWindow",
-            args = {IBinder.class, int.class, ResultReceiver.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "isAcceptingText",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "isActive",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "isActive",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isFullscreenMode",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isWatchingCursor",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "restartInput",
-            args = {View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "getEnabledInputMethodList",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "getInputMethodList",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "setInputMethod",
-            args = {IBinder.class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "showSoftInput",
-            args = {View.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "showSoftInput",
-            args = {View.class, int.class, ResultReceiver.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "showSoftInputFromInputMethod",
-            args = {IBinder.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "toggleSoftInputFromWindow",
-            args = {IBinder.class, int.class, int.class}
-        )
-    })
     @UiThreadTest
     public void testInputMethodManager() {
         Window window = mActivity.getWindow();
diff --git a/tests/tests/webkit/Android.mk b/tests/tests/webkit/Android.mk
index f739b42..1426dbb 100644
--- a/tests/tests/webkit/Android.mk
+++ b/tests/tests/webkit/Android.mk
@@ -32,5 +32,4 @@
 # uncomment when dalvik.annotation.Test* are removed or part of SDK
 #LOCAL_SDK_VERSION := current
 
-include $(BUILD_PACKAGE)
-
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/webkit/src/android/webkit/cts/CacheManagerTest.java b/tests/tests/webkit/src/android/webkit/cts/CacheManagerTest.java
index bebb1fa..e58ef0a 100644
--- a/tests/tests/webkit/src/android/webkit/cts/CacheManagerTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/CacheManagerTest.java
@@ -16,27 +16,20 @@
 
 package android.webkit.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
-
+import android.cts.util.PollingCheck;
 import android.test.ActivityInstrumentationTestCase2;
-import android.view.animation.cts.DelayedCheck;
 import android.webkit.CacheManager;
-import android.webkit.WebView;
 import android.webkit.CacheManager.CacheResult;
 
+
 import java.util.Map;
 
-@TestTargetClass(android.webkit.CacheManager.class)
 public class CacheManagerTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
-    private static final long CACHEMANAGER_INIT_TIMEOUT = 5000l;
-    private static final long NETWORK_OPERATION_DELAY = 10000l;
+    private static final long CACHEMANAGER_INIT_TIMEOUT = 5000L;
+    private static final long NETWORK_OPERATION_TIMEOUT = 10000L;
 
-    private WebView mWebView;
     private CtsTestServer mWebServer;
+    private WebViewOnUiThread mOnUiThread;
 
     public CacheManagerTest() {
         super("com.android.cts.stub", WebViewStubActivity.class);
@@ -45,7 +38,7 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        mWebView = getActivity().getWebView();
+        mOnUiThread = new WebViewOnUiThread(this, getActivity().getWebView());
     }
 
     @Override
@@ -56,57 +49,27 @@
         super.tearDown();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getCacheFileBaseDir",
-        args = {}
-    )
     public void testGetCacheFileBaseDir() {
         assertTrue(CacheManager.getCacheFileBaseDir().exists());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "startCacheTransaction",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "endCacheTransaction",
-            args = {}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc of these two methods doesn't exist.")
     public void testCacheTransaction() {
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCacheFile",
-            args = {String.class, Map.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "saveCacheFile",
-            args = {String.class, CacheResult.class}
-        )
-    })
     public void testCacheFile() throws Exception {
         mWebServer = new CtsTestServer(getActivity());
         final String url = mWebServer.getAssetUrl(TestHtmlConstants.EMBEDDED_IMG_URL);
 
         // Wait for CacheManager#init() finish.
-        new DelayedCheck(CACHEMANAGER_INIT_TIMEOUT) {
+        new PollingCheck(CACHEMANAGER_INIT_TIMEOUT) {
             @Override
             protected boolean check() {
                 return CacheManager.getCacheFileBaseDir() != null;
             }
         }.run();
 
-        mWebView.clearCache(true);
-        new DelayedCheck(NETWORK_OPERATION_DELAY) {
+        mOnUiThread.clearCache(true);
+        new PollingCheck(NETWORK_OPERATION_TIMEOUT) {
             @Override
             protected boolean check() {
                 CacheResult result = CacheManager.getCacheFile(url, null);
@@ -114,8 +77,8 @@
             }
         }.run();
 
-        loadUrl(url);
-        new DelayedCheck(NETWORK_OPERATION_DELAY) {
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        new PollingCheck(NETWORK_OPERATION_TIMEOUT) {
             @Override
             protected boolean check() {
                 CacheResult result = CacheManager.getCacheFile(url, null);
@@ -128,25 +91,8 @@
         // public API to set the output stream.
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        method = "cacheDisabled",
-        args = {}
-    )
     public void testCacheDisabled() {
         // The cache should always be enabled.
         assertFalse(CacheManager.cacheDisabled());
     }
-
-    private void loadUrl(String url){
-        mWebView.loadUrl(url);
-        // check whether loadURL successfully
-        new DelayedCheck(NETWORK_OPERATION_DELAY) {
-            @Override
-            protected boolean check() {
-                return mWebView.getProgress() == 100;
-            }
-        }.run();
-        assertEquals(100, mWebView.getProgress());
-    }
 }
diff --git a/tests/tests/webkit/src/android/webkit/cts/CacheManager_CacheResultTest.java b/tests/tests/webkit/src/android/webkit/cts/CacheManager_CacheResultTest.java
index 48a6a1f..6c3ef93 100755
--- a/tests/tests/webkit/src/android/webkit/cts/CacheManager_CacheResultTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/CacheManager_CacheResultTest.java
@@ -16,31 +16,27 @@
 
 package android.webkit.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
+import android.cts.util.PollingCheck;
+import android.test.ActivityInstrumentationTestCase2;
+import android.webkit.CacheManager;
+import android.webkit.CacheManager.CacheResult;
+import android.webkit.WebView;
+
 
 import org.apache.http.HttpStatus;
 import org.apache.http.impl.cookie.DateUtils;
 
-import android.test.ActivityInstrumentationTestCase2;
-import android.view.animation.cts.DelayedCheck;
-import android.webkit.CacheManager;
-import android.webkit.WebChromeClient;
-import android.webkit.WebView;
-import android.webkit.CacheManager.CacheResult;
-
 import java.io.File;
 import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
 
-@TestTargetClass(android.webkit.CacheManager.CacheResult.class)
 public class CacheManager_CacheResultTest
         extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
-    private static final long NETWORK_OPERATION_DELAY = 10000l;
+    private static final long NETWORK_OPERATION_TIMEOUT = 10000L;
 
-    private WebView mWebView;
     private CtsTestServer mWebServer;
+    private WebViewOnUiThread mOnUiThread;
 
     public CacheManager_CacheResultTest() {
         super("com.android.cts.stub", WebViewStubActivity.class);
@@ -49,8 +45,7 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        mWebView = getActivity().getWebView();
-        mWebView.setWebChromeClient(new WebChromeClient());
+        mOnUiThread = new WebViewOnUiThread(this, getActivity().getWebView());
     }
 
     @Override
@@ -61,75 +56,8 @@
         super.tearDown();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInputStream",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getContentLength",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getETag",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLastModified",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLocalPath",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLocation",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMimeType",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getOutputStream",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getExpires",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getHttpStatusCode",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getEncoding",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEncoding",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setInputStream",
-            args = {InputStream.class}
-        )
-    })
     public void testCacheResult() throws Exception {
-        final long validity = 5 * 50 * 1000; // 5 min
+        final long validity = 5 * 60 * 1000; // 5 min
         final long age = 30 * 60 * 1000; // 30 min
         final long tolerance = 5 * 1000; // 5s
 
@@ -138,8 +66,8 @@
         mWebServer.setDocumentAge(age);
         mWebServer.setDocumentValidity(validity);
 
-        mWebView.clearCache(true);
-        new DelayedCheck(NETWORK_OPERATION_DELAY) {
+        mOnUiThread.clearCache(true);
+        new PollingCheck(NETWORK_OPERATION_TIMEOUT) {
             @Override
             protected boolean check() {
                 CacheResult result =
@@ -148,8 +76,12 @@
             }
         }.run();
         final long time = System.currentTimeMillis();
-        loadUrl(url);
-        CacheResult result = CacheManager.getCacheFile(url, null);
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+
+        Map<String, String> headers = new HashMap<String, String>();
+        CacheResult result = CacheManager.getCacheFile(url, headers);
+        assertTrue(headers.isEmpty());
+
         assertNotNull(result);
         assertNotNull(result.getInputStream());
         assertTrue(result.getContentLength() > 0);
@@ -171,16 +103,4 @@
         result.setInputStream(null);
         assertNull(result.getInputStream());
     }
-
-    private void loadUrl(String url){
-        mWebView.loadUrl(url);
-        // check whether loadURL successfully
-        new DelayedCheck(NETWORK_OPERATION_DELAY) {
-            @Override
-            protected boolean check() {
-                return mWebView.getProgress() == 100;
-            }
-        }.run();
-        assertEquals(100, mWebView.getProgress());
-    }
 }
diff --git a/tests/tests/webkit/src/android/webkit/cts/CookieManagerTest.java b/tests/tests/webkit/src/android/webkit/cts/CookieManagerTest.java
index 712d641..4d460d5 100755
--- a/tests/tests/webkit/src/android/webkit/cts/CookieManagerTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/CookieManagerTest.java
@@ -16,30 +16,23 @@
 
 package android.webkit.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
-
+import android.cts.util.PollingCheck;
 import android.test.ActivityInstrumentationTestCase2;
-import android.view.animation.cts.DelayedCheck;
 import android.webkit.CookieManager;
 import android.webkit.CookieSyncManager;
-import android.webkit.WebChromeClient;
 import android.webkit.WebView;
 
+
 import java.util.Date;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-@TestTargetClass(android.webkit.CookieManager.class)
 public class CookieManagerTest extends
         ActivityInstrumentationTestCase2<CookieSyncManagerStubActivity> {
 
-    private static final int TEST_DELAY = 5000;
+    private static final int TEST_TIMEOUT = 5000;
 
-    private WebView mWebView;
+    private WebViewOnUiThread mOnUiThread;
     private CookieManager mCookieManager;
 
     public CookieManagerTest() {
@@ -49,20 +42,12 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        mWebView = getActivity().getWebView();
-
-        // Set a web chrome client in order to receive progress updates.
-        mWebView.setWebChromeClient(new WebChromeClient());
+        mOnUiThread = new WebViewOnUiThread(this, getActivity().getWebView());
 
         mCookieManager = CookieManager.getInstance();
         assertNotNull(mCookieManager);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getInstance",
-        args = {}
-    )
     public void testGetInstance() {
         CookieManager c1 = CookieManager.getInstance();
         CookieManager c2 = CookieManager.getInstance();
@@ -70,42 +55,9 @@
         assertSame(c1, c2);
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        method = "clone",
-        notes = "clone() is protected and CookieManager cannot be subclassed",
-        args = {}
-    )
     public void testClone() {
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAcceptCookie",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "acceptCookie",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setCookie",
-            args = {String.class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCookie",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeAllCookie",
-            args = {}
-        )
-    })
     public void testAcceptCookie() throws Exception {
         mCookieManager.removeAllCookie();
         mCookieManager.setAcceptCookie(false);
@@ -114,17 +66,17 @@
 
         CtsTestServer server = new CtsTestServer(getActivity(), false);
         String url = server.getCookieUrl("conquest.html");
-        loadUrl(url);
-        assertEquals(null, mWebView.getTitle()); // no cookies passed
-        Thread.sleep(TEST_DELAY);
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        assertEquals(null, mOnUiThread.getTitle()); // no cookies passed
+        Thread.sleep(500);
         assertNull(mCookieManager.getCookie(url));
 
         mCookieManager.setAcceptCookie(true);
         assertTrue(mCookieManager.acceptCookie());
 
         url = server.getCookieUrl("war.html");
-        loadUrl(url);
-        assertEquals(null, mWebView.getTitle()); // no cookies passed
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        assertEquals(null, mOnUiThread.getTitle()); // no cookies passed
         waitForCookie(url);
         String cookie = mCookieManager.getCookie(url);
         assertNotNull(cookie);
@@ -135,8 +87,8 @@
         assertEquals("0", m.group(1));
 
         url = server.getCookieUrl("famine.html");
-        loadUrl(url);
-        assertEquals("count=0", mWebView.getTitle()); // outgoing cookie
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        assertEquals("count=0", mOnUiThread.getTitle()); // outgoing cookie
         waitForCookie(url);
         cookie = mCookieManager.getCookie(url);
         assertNotNull(cookie);
@@ -146,8 +98,8 @@
 
         url = server.getCookieUrl("death.html");
         mCookieManager.setCookie(url, "count=41");
-        loadUrl(url);
-        assertEquals("count=41", mWebView.getTitle()); // outgoing cookie
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        assertEquals("count=41", mOnUiThread.getTitle()); // outgoing cookie
         waitForCookie(url);
         cookie = mCookieManager.getCookie(url);
         assertNotNull(cookie);
@@ -159,19 +111,6 @@
         mCookieManager.removeAllCookie();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasCookies",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeAllCookie",
-            args = {}
-        )
-    })
-    @ToBeFixed(explanation = "CookieManager.hasCookies() should also count cookies in RAM cache")
     public void testCookieManager() {
         // enable cookie
         mCookieManager.setAcceptCookie(true);
@@ -187,7 +126,7 @@
 
         // sync cookie from RAM to FLASH, because hasCookies() only counts FLASH cookies
         CookieSyncManager.getInstance().sync();
-        new DelayedCheck(TEST_DELAY) {
+        new PollingCheck(TEST_TIMEOUT) {
             @Override
             protected boolean check() {
                 return mCookieManager.hasCookies();
@@ -196,7 +135,7 @@
 
         // clean up all cookies
         mCookieManager.removeAllCookie();
-        new DelayedCheck(TEST_DELAY) {
+        new PollingCheck(TEST_TIMEOUT) {
             @Override
             protected boolean check() {
                 return !mCookieManager.hasCookies();
@@ -204,18 +143,6 @@
         }.run();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeSessionCookie",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeExpiredCookie",
-            args = {}
-        )
-    })
     @SuppressWarnings("deprecation")
     public void testRemoveCookies() throws InterruptedException {
         // enable cookie
@@ -247,7 +174,8 @@
         assertTrue(allCookies.contains(cookie3));
 
         mCookieManager.removeSessionCookie();
-        new DelayedCheck(TEST_DELAY) {
+        new PollingCheck(TEST_TIMEOUT) {
+            @Override
             protected boolean check() {
                 String c = mCookieManager.getCookie(url);
                 return !c.contains(cookie1) && c.contains(cookie2) && c.contains(cookie3);
@@ -256,7 +184,8 @@
 
         Thread.sleep(expiration + 1000); // wait for cookie to expire
         mCookieManager.removeExpiredCookie();
-        new DelayedCheck(TEST_DELAY) {
+        new PollingCheck(TEST_TIMEOUT) {
+            @Override
             protected boolean check() {
                 String c = mCookieManager.getCookie(url);
                 return !c.contains(cookie1) && c.contains(cookie2) && !c.contains(cookie3);
@@ -264,24 +193,17 @@
         }.run();
 
         mCookieManager.removeAllCookie();
-        new DelayedCheck(TEST_DELAY) {
+        new PollingCheck(TEST_TIMEOUT) {
+            @Override
             protected boolean check() {
                 return mCookieManager.getCookie(url) == null;
             }
         }.run();
     }
 
-    private void loadUrl(String url) {
-        mWebView.loadUrl(url);
-        new DelayedCheck(TEST_DELAY) {
-            protected boolean check() {
-                return mWebView.getProgress() == 100;
-            }
-        }.run();
-    }
-
     private void waitForCookie(final String url) {
-        new DelayedCheck(TEST_DELAY) {
+        new PollingCheck(TEST_TIMEOUT) {
+            @Override
             protected boolean check() {
                 return mCookieManager.getCookie(url) != null;
             }
diff --git a/tests/tests/webkit/src/android/webkit/cts/CookieSyncManagerTest.java b/tests/tests/webkit/src/android/webkit/cts/CookieSyncManagerTest.java
index 9450c70..67a77e7 100644
--- a/tests/tests/webkit/src/android/webkit/cts/CookieSyncManagerTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/CookieSyncManagerTest.java
@@ -16,42 +16,22 @@
 
 package android.webkit.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.Context;
+import android.cts.util.PollingCheck;
 import android.test.ActivityInstrumentationTestCase2;
-import android.view.animation.cts.DelayedCheck;
 import android.webkit.CookieManager;
 import android.webkit.CookieSyncManager;
 
-@TestTargetClass(android.webkit.CookieSyncManager.class)
 public class CookieSyncManagerTest
         extends ActivityInstrumentationTestCase2<CookieSyncManagerStubActivity> {
 
+    private final static int COOKIE_MANAGER_TIMEOUT = 5000;
+
     public CookieSyncManagerTest() {
         super("com.android.cts.stub", CookieSyncManagerStubActivity.class);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "createInstance",
-            args = {Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInstance",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "sync",
-            args = {}
-        )
-    })
     public void testCookieSyncManager() throws Exception {
         CookieSyncManager csm1 = CookieSyncManager.createInstance(getActivity());
         assertNotNull(csm1);
@@ -65,7 +45,7 @@
 
         // Remove all cookies from the database.
         cookieManager.removeAllCookie();
-        new DelayedCheck(30000) {
+        new PollingCheck(COOKIE_MANAGER_TIMEOUT) {
             @Override
             protected boolean check() {
                 return !cookieManager.hasCookies();
@@ -83,7 +63,7 @@
 
         // Store the cookie to the database.
         csm1.sync();
-        new DelayedCheck(30000) {
+        new PollingCheck(COOKIE_MANAGER_TIMEOUT) {
             @Override
             protected boolean check() {
                 return cookieManager.hasCookies();
@@ -92,7 +72,7 @@
 
         // Remove all cookies from the database.
         cookieManager.removeAllCookie();
-        new DelayedCheck(30000) {
+        new PollingCheck(COOKIE_MANAGER_TIMEOUT) {
             @Override
             protected boolean check() {
                 return !cookieManager.hasCookies();
diff --git a/tests/tests/webkit/src/android/webkit/cts/DateSorterTest.java b/tests/tests/webkit/src/android/webkit/cts/DateSorterTest.java
index 180336f..85a483e 100644
--- a/tests/tests/webkit/src/android/webkit/cts/DateSorterTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/DateSorterTest.java
@@ -16,10 +16,6 @@
 
 package android.webkit.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.Context;
 import android.test.AndroidTestCase;
@@ -27,7 +23,6 @@
 
 import java.util.HashSet;
 
-@TestTargetClass(android.webkit.DateSorter.class)
 public class DateSorterTest extends AndroidTestCase {
     private Context mContext;
 
@@ -38,13 +33,6 @@
         mContext = getContext();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "DateSorter",
-            args = {android.content.Context.class}
-        )
-    })
     public void testConstructor() {
         new DateSorter(mContext);
     }
@@ -54,14 +42,6 @@
         assertTrue(DateSorter.DAY_COUNT >= 3);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            notes = "Resource Strings used for creating the labels are not public",
-            method = "getLabel",
-            args = {int.class}
-        )
-    })
     public void testGetLabel() {
         DateSorter dateSorter = new DateSorter(mContext);
         HashSet<String> set = new HashSet<String>();
@@ -76,13 +56,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIndex",
-            args = {long.class}
-        )
-    })
     public void testGetIndex() {
         DateSorter dateSorter = new DateSorter(mContext);
 
@@ -97,13 +70,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBoundary",
-            args = {int.class}
-        )
-    })
     public void testGetBoundary() {
         DateSorter dateSorter = new DateSorter(mContext);
 
diff --git a/tests/tests/webkit/src/android/webkit/cts/HttpAuthHandlerTest.java b/tests/tests/webkit/src/android/webkit/cts/HttpAuthHandlerTest.java
index 8721326..6682cb1 100644
--- a/tests/tests/webkit/src/android/webkit/cts/HttpAuthHandlerTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/HttpAuthHandlerTest.java
@@ -16,27 +16,20 @@
 
 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.webkit.HttpAuthHandler;
+import android.webkit.WebView;
+import android.webkit.cts.WebViewOnUiThread.WaitForLoadedClient;
+
 
 import org.apache.http.HttpStatus;
 
-import android.test.ActivityInstrumentationTestCase2;
-import android.view.animation.cts.DelayedCheck;
-import android.webkit.HttpAuthHandler;
-import android.webkit.WebChromeClient;
-import android.webkit.WebView;
-import android.webkit.WebViewClient;
-
-@TestTargetClass(android.webkit.HttpAuthHandler.class)
 public class HttpAuthHandlerTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
 
     private static final long TIMEOUT = 10000;
 
-    private WebView mWebView;
     private CtsTestServer mWebServer;
+    private WebViewOnUiThread mOnUiThread;
 
     public HttpAuthHandlerTest() {
         super("com.android.cts.stub", WebViewStubActivity.class);
@@ -45,103 +38,66 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        mWebView = getActivity().getWebView();
-
-        // Set a web chrome client in order to receive progress updates.
-        mWebView.setWebChromeClient(new WebChromeClient());
+        mOnUiThread = new WebViewOnUiThread(this, getActivity().getWebView());
     }
 
     @Override
     protected void tearDown() throws Exception {
-        mWebView.clearHistory();
-        mWebView.clearCache(true);
+        mOnUiThread.clearHistory();
+        mOnUiThread.clearCache(true);
         if (mWebServer != null) {
             mWebServer.shutdown();
         }
         super.tearDown();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "proceed",
-            args = {String.class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            notes = "useHttpAuthUsernamePassword() always returns true",
-            method = "useHttpAuthUsernamePassword",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            notes = "This method is for internal use by the handler",
-            method = "handleMessage",
-            args = {android.os.Message.class}
-        )
-    })
     public void testProceed() throws Exception {
         mWebServer = new CtsTestServer(getActivity());
         String url = mWebServer.getAuthAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
 
         // wrong credentials
         MyWebViewClient client = new MyWebViewClient(true, "FakeUser", "FakePass");
-        mWebView.setWebViewClient(client);
+        mOnUiThread.setWebViewClient(client);
 
-        assertLoadUrlSuccessfully(url);
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
         assertEquals(CtsTestServer.AUTH_REALM, client.realm);
-        assertEquals(CtsTestServer.getReasonString(HttpStatus.SC_UNAUTHORIZED), mWebView.getTitle());
+        assertEquals(CtsTestServer.getReasonString(HttpStatus.SC_UNAUTHORIZED), mOnUiThread.getTitle());
         assertTrue(client.useHttpAuthUsernamePassword);
 
         // missing credentials
         client = new MyWebViewClient(true, null, null);
-        mWebView.setWebViewClient(client);
+        mOnUiThread.setWebViewClient(client);
 
-        assertLoadUrlSuccessfully(url);
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
         assertEquals(CtsTestServer.AUTH_REALM, client.realm);
         assertEquals(
-                CtsTestServer.getReasonString(HttpStatus.SC_UNAUTHORIZED), mWebView.getTitle());
+                CtsTestServer.getReasonString(HttpStatus.SC_UNAUTHORIZED), mOnUiThread.getTitle());
         assertTrue(client.useHttpAuthUsernamePassword);
 
         // correct credentials
         client = new MyWebViewClient(true, CtsTestServer.AUTH_USER, CtsTestServer.AUTH_PASS);
-        mWebView.setWebViewClient(client);
+        mOnUiThread.setWebViewClient(client);
 
-        assertLoadUrlSuccessfully(url);
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
         assertEquals(CtsTestServer.AUTH_REALM, client.realm);
-        assertEquals(TestHtmlConstants.HELLO_WORLD_TITLE, mWebView.getTitle());
+        assertEquals(TestHtmlConstants.HELLO_WORLD_TITLE, mOnUiThread.getTitle());
         assertTrue(client.useHttpAuthUsernamePassword);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "cancel",
-        args = {}
-    )
     public void testCancel() throws Exception {
         mWebServer = new CtsTestServer(getActivity());
 
         String url = mWebServer.getAuthAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
         MyWebViewClient client = new MyWebViewClient(false, null, null);
-        mWebView.setWebViewClient(client);
+        mOnUiThread.setWebViewClient(client);
 
-        assertLoadUrlSuccessfully(url);
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
         assertEquals(CtsTestServer.AUTH_REALM, client.realm);
         assertEquals(
-                CtsTestServer.getReasonString(HttpStatus.SC_UNAUTHORIZED), mWebView.getTitle());
+                CtsTestServer.getReasonString(HttpStatus.SC_UNAUTHORIZED), mOnUiThread.getTitle());
     }
 
-    private void assertLoadUrlSuccessfully(String url) throws InterruptedException {
-        mWebView.loadUrl(url);
-        new DelayedCheck(TIMEOUT) {
-            @Override
-            protected boolean check() {
-                return mWebView.getProgress() == 100;
-            }
-        }.run();
-    }
-
-    private static class MyWebViewClient extends WebViewClient {
+    private class MyWebViewClient extends WaitForLoadedClient {
         String realm;
         boolean useHttpAuthUsernamePassword;
 
@@ -151,11 +107,13 @@
         private int mAuthCount;
 
         MyWebViewClient(boolean proceed, String user, String password) {
+            super(mOnUiThread);
             mProceed = proceed;
             mUser = user;
             mPassword = password;
         }
 
+        @Override
         public void onReceivedHttpAuthRequest(WebView view,
                 HttpAuthHandler handler, String host, String realm) {
             ++mAuthCount;
diff --git a/tests/tests/webkit/src/android/webkit/cts/MimeTypeMapTest.java b/tests/tests/webkit/src/android/webkit/cts/MimeTypeMapTest.java
index a91b4ca..7213184 100644
--- a/tests/tests/webkit/src/android/webkit/cts/MimeTypeMapTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/MimeTypeMapTest.java
@@ -16,16 +16,10 @@
 
 package android.webkit.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.test.AndroidTestCase;
 import android.webkit.MimeTypeMap;
 
-@TestTargetClass(android.webkit.MimeTypeMap.class)
 public class MimeTypeMapTest extends AndroidTestCase {
 
     private MimeTypeMap mMimeTypeMap;
@@ -37,14 +31,6 @@
         mMimeTypeMap = MimeTypeMap.getSingleton();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFileExtensionFromUrl",
-            args = {String.class}
-        )
-    })
-    @ToBeFixed(explanation="Returns part of the domain name if the optional URL path is missing")
     public void testGetFileExtensionFromUrl() {
         assertEquals("html", MimeTypeMap.getFileExtensionFromUrl("http://localhost/index.html"));
         assertEquals("html", MimeTypeMap.getFileExtensionFromUrl("http://host/x.html?x=y"));
@@ -58,13 +44,6 @@
         //assertEquals("", MimeTypeMap.getFileExtensionFromUrl("http://www.example.com"));
 }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasMimeType",
-            args = {String.class}
-        )
-    })
     public void testHasMimeType() {
         assertTrue(mMimeTypeMap.hasMimeType("audio/mpeg"));
         assertTrue(mMimeTypeMap.hasMimeType("text/plain"));
@@ -75,13 +54,6 @@
         assertFalse(mMimeTypeMap.hasMimeType(null));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMimeTypeFromExtension",
-            args = {String.class}
-        )
-    })
     public void testGetMimeTypeFromExtension() {
         assertEquals("audio/mpeg", mMimeTypeMap.getMimeTypeFromExtension("mp3"));
         assertEquals("application/zip", mMimeTypeMap.getMimeTypeFromExtension("zip"));
@@ -92,13 +64,6 @@
         assertNull(mMimeTypeMap.getMimeTypeFromExtension(""));
 }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasExtension",
-            args = {String.class}
-        )
-    })
     public void testHasExtension() {
         assertTrue(mMimeTypeMap.hasExtension("mp3"));
         assertTrue(mMimeTypeMap.hasExtension("zip"));
@@ -109,13 +74,6 @@
         assertFalse(mMimeTypeMap.hasExtension(null));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getExtensionFromMimeType",
-            args = {String.class}
-        )
-    })
     public void testGetExtensionFromMimeType() {
         assertEquals("png", mMimeTypeMap.getExtensionFromMimeType("image/png"));
         assertEquals("zip", mMimeTypeMap.getExtensionFromMimeType("application/zip"));
@@ -126,13 +84,6 @@
         assertNull(mMimeTypeMap.getExtensionFromMimeType(""));
 }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSingleton",
-            args = {}
-        )
-    })
     public void testGetSingleton() {
         MimeTypeMap firstMimeTypeMap = MimeTypeMap.getSingleton();
         MimeTypeMap secondMimeTypeMap = MimeTypeMap.getSingleton();
diff --git a/tests/tests/webkit/src/android/webkit/cts/URLUtilTest.java b/tests/tests/webkit/src/android/webkit/cts/URLUtilTest.java
index e877ab9..fb44334 100644
--- a/tests/tests/webkit/src/android/webkit/cts/URLUtilTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/URLUtilTest.java
@@ -16,16 +16,11 @@
 
 package android.webkit.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.test.AndroidTestCase;
 import android.test.MoreAsserts;
 import android.webkit.URLUtil;
 
-@TestTargetClass(android.webkit.URLUtil.class)
 public class URLUtilTest extends AndroidTestCase {
     private final String VALID_HTTP_URL = "http://www.google.com";
     private final String VALID_HTTPS_URL = "https://www.google.com";
@@ -38,52 +33,24 @@
     private final String VALID_FILE_URL = "file://test";
     private final String VALID_FTP_URL = "ftp://www.domain.com";
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isAssetUrl",
-            args = {String.class}
-        )
-    })
     public void testIsAssetUrl() {
         assertFalse(URLUtil.isAssetUrl(null));
         assertFalse(URLUtil.isAssetUrl(VALID_HTTP_URL));
         assertTrue(URLUtil.isAssetUrl(VALID_ASSET_URL));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isAboutUrl",
-            args = {String.class}
-        )
-    })
     public void testIsAboutUrl() {
         assertFalse(URLUtil.isAboutUrl(null));
         assertFalse(URLUtil.isAboutUrl(VALID_DATA_URL));
         assertTrue(URLUtil.isAboutUrl(VALID_ABOUT_URL));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isContentUrl",
-            args = {String.class}
-        )
-    })
     public void testIsContentUrl() {
         assertFalse(URLUtil.isContentUrl(null));
         assertFalse(URLUtil.isContentUrl(VALID_DATA_URL));
         assertTrue(URLUtil.isContentUrl(VALID_CONTENT_URL));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isCookielessProxyUrl",
-            args = {String.class}
-        )
-    })
     @SuppressWarnings("deprecation")
     public void testIsCookielessProxyUrl() {
         assertFalse(URLUtil.isCookielessProxyUrl(null));
@@ -91,26 +58,12 @@
         assertTrue(URLUtil.isCookielessProxyUrl(VALID_PROXY_URL));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isDataUrl",
-            args = {String.class}
-        )
-    })
     public void testIsDataUrl() {
         assertFalse(URLUtil.isDataUrl(null));
         assertFalse(URLUtil.isDataUrl(VALID_CONTENT_URL));
         assertTrue(URLUtil.isDataUrl(VALID_DATA_URL));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isFileUrl",
-            args = {String.class}
-        )
-    })
     public void testIsFileUrl() {
         assertFalse(URLUtil.isFileUrl(null));
         assertFalse(URLUtil.isFileUrl(VALID_CONTENT_URL));
@@ -119,52 +72,24 @@
         assertTrue(URLUtil.isFileUrl(VALID_FILE_URL));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isHttpsUrl",
-            args = {String.class}
-        )
-    })
     public void testIsHttpsUrl() {
         assertFalse(URLUtil.isHttpsUrl(null));
         assertFalse(URLUtil.isHttpsUrl(VALID_HTTP_URL));
         assertTrue(URLUtil.isHttpsUrl(VALID_HTTPS_URL));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isHttpUrl",
-            args = {String.class}
-        )
-    })
     public void testIsHttpUrl() {
         assertFalse(URLUtil.isHttpUrl(null));
         assertFalse(URLUtil.isHttpUrl(VALID_FTP_URL));
         assertTrue(URLUtil.isHttpUrl(VALID_HTTP_URL));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isJavaScriptUrl",
-            args = {String.class}
-        )
-    })
     public void testIsJavaScriptUrl() {
         assertFalse(URLUtil.isJavaScriptUrl(null));
         assertFalse(URLUtil.isJavaScriptUrl(VALID_FTP_URL));
         assertTrue(URLUtil.isJavaScriptUrl(VALID_JAVASCRIPT_URL));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isNetworkUrl",
-            args = {String.class}
-        )
-    })
     public void testIsNetworkUrl() {
         assertFalse(URLUtil.isNetworkUrl(null));
         assertFalse(URLUtil.isNetworkUrl(""));
@@ -173,13 +98,6 @@
         assertTrue(URLUtil.isNetworkUrl(VALID_HTTPS_URL));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isValidUrl",
-            args = {String.class}
-        )
-    })
     public void testIsValidUrl() {
         assertFalse(URLUtil.isValidUrl(null));
         assertFalse(URLUtil.isValidUrl(""));
@@ -193,13 +111,6 @@
         assertTrue(URLUtil.isValidUrl(VALID_CONTENT_URL));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "composeSearchUrl",
-            args = {String.class, String.class, String.class}
-        )
-    })
     public void testComposeSearchUrl() {
         assertNull(URLUtil.composeSearchUrl("", "template", "no such holder"));
 
@@ -210,13 +121,6 @@
         assertEquals(expected, URLUtil.composeSearchUrl("query", "file://holder/test", "holder"));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "decode",
-            args = {byte[].class}
-        )
-    })
     public void testDecode() {
         byte[] url = new byte[0];
         byte[] result = URLUtil.decode(url);
@@ -238,13 +142,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "guessFileName",
-            args = {String.class, String.class, String.class}
-        )
-    })
     public void testGuessFileName() {
         String url = "ftp://example.url/test";
         assertEquals("test.jpeg", URLUtil.guessFileName(url, null, "image/jpeg"));
@@ -252,13 +149,6 @@
         assertEquals("test.bin", URLUtil.guessFileName(url, null, "application/octet-stream"));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "guessUrl",
-            args = {String.class}
-        )
-    })
     public void testGuessUrl() {
         assertEquals(VALID_FILE_URL, URLUtil.guessUrl(VALID_FILE_URL));
         assertEquals(VALID_ABOUT_URL, URLUtil.guessUrl(VALID_ABOUT_URL));
@@ -275,13 +165,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stripAnchor",
-            args = {String.class}
-        )
-    })
     public void testStripAnchor() {
         assertEquals(VALID_HTTP_URL, URLUtil.stripAnchor(VALID_HTTP_URL));
 
diff --git a/tests/tests/webkit/src/android/webkit/cts/UrlInterceptRegistryTest.java b/tests/tests/webkit/src/android/webkit/cts/UrlInterceptRegistryTest.java
index 452aaf0..005ede3 100644
--- a/tests/tests/webkit/src/android/webkit/cts/UrlInterceptRegistryTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/UrlInterceptRegistryTest.java
@@ -16,10 +16,6 @@
 
 package android.webkit.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.test.AndroidTestCase;
 import android.webkit.PluginData;
@@ -29,23 +25,10 @@
 
 import java.util.Map;
 
-@TestTargetClass(android.webkit.UrlInterceptRegistry.class)
 @SuppressWarnings("deprecation")
 public class UrlInterceptRegistryTest extends AndroidTestCase {
     private int mService;
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "registerHandler",
-            args = {android.webkit.UrlInterceptHandler.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unregisterHandler",
-            args = {android.webkit.UrlInterceptHandler.class}
-        )
-    })
     public void testRegisterHandler() {
         UrlInterceptHandler handler1 = new MockUrlInterceptHandler();
         UrlInterceptHandler handler2 = new MockUrlInterceptHandler();
@@ -61,28 +44,6 @@
         assertFalse(UrlInterceptRegistry.unregisterHandler(handler1));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSurrogate",
-            args = {java.lang.String.class, java.util.Map.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setUrlInterceptDisabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "urlInterceptDisabled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPluginData",
-            args = {java.lang.String.class, java.util.Map.class}
-        )
-    })
     public void testGetSurrogate() {
         mService = 0;
 
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebBackForwardListTest.java b/tests/tests/webkit/src/android/webkit/cts/WebBackForwardListTest.java
index 6cddfb3..5930bae 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebBackForwardListTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebBackForwardListTest.java
@@ -16,53 +16,29 @@
 
 package android.webkit.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-
+import android.cts.util.PollingCheck;
 import android.test.ActivityInstrumentationTestCase2;
-import android.view.animation.cts.DelayedCheck;
 import android.webkit.WebBackForwardList;
 import android.webkit.WebHistoryItem;
-import android.webkit.WebView;
 
-@TestTargetClass(WebBackForwardList.class)
+
 public class WebBackForwardListTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
 
     private static final int TEST_TIMEOUT = 10000;
 
-    private WebView mWebView;
+    private WebViewOnUiThread mOnUiThread;
 
     public WebBackForwardListTest() {
         super("com.android.cts.stub", WebViewStubActivity.class);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrentItem",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrentIndex",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getItemAtIndex",
-            args = {int.class}
-        )
-    })
+    @Override
+    public void setUp() {
+        mOnUiThread = new WebViewOnUiThread(this, getActivity().getWebView());
+    }
+
     public void testGetCurrentItem() throws Exception {
-        mWebView = getActivity().getWebView();
-        WebBackForwardList list = mWebView.copyBackForwardList();
+        WebBackForwardList list = mOnUiThread.copyBackForwardList();
 
         assertNull(list.getCurrentItem());
         assertEquals(0, list.getSize());
@@ -76,26 +52,27 @@
             String url2 = server.getAssetUrl(TestHtmlConstants.HTML_URL2);
             String url3 = server.getAssetUrl(TestHtmlConstants.HTML_URL3);
 
-            mWebView.loadUrl(url1);
-            checkBackForwardList(mWebView, url1);
+            mOnUiThread.loadUrlAndWaitForCompletion(url1);
+            checkBackForwardList(url1);
 
-            mWebView.loadUrl(url2);
-            checkBackForwardList(mWebView, url1, url2);
+            mOnUiThread.loadUrlAndWaitForCompletion(url2);
+            checkBackForwardList(url1, url2);
 
-            mWebView.loadUrl(url3);
-            checkBackForwardList(mWebView, url1, url2, url3);
+            mOnUiThread.loadUrlAndWaitForCompletion(url3);
+            checkBackForwardList(url1, url2, url3);
         } finally {
             server.shutdown();
         }
     }
 
-    private void checkBackForwardList(final WebView view, final String... url) {
-        new DelayedCheck(TEST_TIMEOUT) {
+    private void checkBackForwardList(final String... url) {
+        new PollingCheck(TEST_TIMEOUT) {
+            @Override
             protected boolean check() {
-                if (view.getProgress() < 100) {
+                if (mOnUiThread.getProgress() < 100) {
                     return false;
                 }
-                WebBackForwardList list = view.copyBackForwardList();
+                WebBackForwardList list = mOnUiThread.copyBackForwardList();
                 if (list.getSize() != url.length) {
                     return false;
                 }
@@ -114,12 +91,6 @@
         }.run();
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        notes = "clone() is protected and WebBackForwardList cannot be subclassed here",
-        method = "clone",
-        args = {}
-    )
     public void testClone() {
     }
 
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebChromeClientTest.java b/tests/tests/webkit/src/android/webkit/cts/WebChromeClientTest.java
index cf20217..493ebe4 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebChromeClientTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebChromeClientTest.java
@@ -16,29 +16,24 @@
 
 package android.webkit.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-
+import android.cts.util.PollingCheck;
 import android.graphics.Bitmap;
 import android.os.Message;
 import android.test.ActivityInstrumentationTestCase2;
-import android.view.animation.cts.DelayedCheck;
 import android.webkit.JsPromptResult;
 import android.webkit.JsResult;
-import android.webkit.WebChromeClient;
 import android.webkit.WebIconDatabase;
 import android.webkit.WebSettings;
 import android.webkit.WebView;
+import android.webkit.cts.WebViewOnUiThread.WaitForProgressClient;
 
-@TestTargetClass(android.webkit.WebChromeClient.class)
+
 public class WebChromeClientTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
     private static final long TEST_TIMEOUT = 5000L;
 
-    private WebView mWebView;
     private CtsTestServer mWebServer;
     private WebIconDatabase mIconDb;
+    private WebViewOnUiThread mOnUiThread;
 
     public WebChromeClientTest() {
         super(WebViewStubActivity.class);
@@ -47,14 +42,14 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        mWebView = getActivity().getWebView();
+        mOnUiThread = new WebViewOnUiThread(this, getActivity().getWebView());
         mWebServer = new CtsTestServer(getActivity());
     }
 
     @Override
     protected void tearDown() throws Exception {
-        mWebView.clearHistory();
-        mWebView.clearCache(true);
+        mOnUiThread.clearHistory();
+        mOnUiThread.clearCache(true);
         if (mWebServer != null) {
             mWebServer.shutdown();
         }
@@ -65,21 +60,14 @@
         super.tearDown();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onProgressChanged",
-            args = {WebView.class, int.class}
-        )
-    })
     public void testOnProgressChanged() {
         final MockWebChromeClient webChromeClient = new MockWebChromeClient();
-        mWebView.setWebChromeClient(webChromeClient);
+        mOnUiThread.setWebChromeClient(webChromeClient);
 
         assertFalse(webChromeClient.hadOnProgressChanged());
-        mWebView.loadUrl(TestHtmlConstants.HELLO_WORLD_URL);
+        mOnUiThread.loadUrlAndWaitForCompletion(TestHtmlConstants.HELLO_WORLD_URL);
 
-        new DelayedCheck(TEST_TIMEOUT) {
+        new PollingCheck(TEST_TIMEOUT) {
             @Override
             protected boolean check() {
                 return webChromeClient.hadOnProgressChanged();
@@ -87,22 +75,15 @@
         }.run();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onReceivedTitle",
-            args = {WebView.class, String.class}
-        )
-    })
     public void testOnReceivedTitle() throws Exception {
         final MockWebChromeClient webChromeClient = new MockWebChromeClient();
-        mWebView.setWebChromeClient(webChromeClient);
+        mOnUiThread.setWebChromeClient(webChromeClient);
 
         assertFalse(webChromeClient.hadOnReceivedTitle());
         String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
-        mWebView.loadUrl(url);
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
 
-        new DelayedCheck(TEST_TIMEOUT) {
+        new PollingCheck(TEST_TIMEOUT) {
             @Override
             protected boolean check() {
                 return webChromeClient.hadOnReceivedTitle();
@@ -112,16 +93,9 @@
         assertEquals(TestHtmlConstants.HELLO_WORLD_TITLE, webChromeClient.getPageTitle());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onReceivedIcon",
-            args = {WebView.class, Bitmap.class}
-        )
-    })
     public void testOnReceivedIcon() throws Throwable {
         final MockWebChromeClient webChromeClient = new MockWebChromeClient();
-        mWebView.setWebChromeClient(webChromeClient);
+        mOnUiThread.setWebChromeClient(webChromeClient);
 
         runTestOnUiThread(new Runnable() {
 
@@ -138,9 +112,9 @@
         assertFalse(webChromeClient.hadOnReceivedIcon());
 
         String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
-        mWebView.loadUrl(url);
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
 
-        new DelayedCheck(TEST_TIMEOUT) {
+        new PollingCheck(TEST_TIMEOUT) {
             @Override
             protected boolean check() {
                 return webChromeClient.hadOnReceivedIcon();
@@ -148,28 +122,11 @@
         }.run();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCreateWindow",
-            args = {WebView.class, boolean.class, boolean.class, Message.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRequestFocus",
-            args = {WebView.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onCloseWindow",
-            args = {WebView.class}
-        )
-    })
     public void testWindows() throws Exception {
         final MockWebChromeClient webChromeClient = new MockWebChromeClient();
-        mWebView.setWebChromeClient(webChromeClient);
+        mOnUiThread.setWebChromeClient(webChromeClient);
 
-        final WebSettings settings = mWebView.getSettings();
+        final WebSettings settings = mOnUiThread.getSettings();
         settings.setJavaScriptEnabled(true);
         settings.setJavaScriptCanOpenWindowsAutomatically(true);
         settings.setSupportMultipleWindows(true);
@@ -178,16 +135,17 @@
 
         // load a page that opens a child window, requests focus for the child and sets a timeout
         // after which the child will be closed
-        loadUrl(mWebServer.getAssetUrl(TestHtmlConstants.JS_WINDOW_URL));
+        mOnUiThread.loadUrlAndWaitForCompletion(mWebServer.
+                getAssetUrl(TestHtmlConstants.JS_WINDOW_URL));
 
-        new DelayedCheck(TEST_TIMEOUT) {
+        new PollingCheck(TEST_TIMEOUT) {
             @Override
             protected boolean check() {
                 return webChromeClient.hadOnCreateWindow();
             }
         }.run();
         assertFalse(webChromeClient.hadOnRequestFocus());
-        new DelayedCheck(TEST_TIMEOUT) {
+        new PollingCheck(TEST_TIMEOUT) {
             @Override
             protected boolean check() {
                 return webChromeClient.hadOnCloseWindow();
@@ -195,28 +153,21 @@
         }.run();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onJsBeforeUnload",
-            args = {WebView.class, String.class, String.class, JsResult.class}
-        )
-    })
     public void testOnJsBeforeUnload() throws Exception {
         final MockWebChromeClient webChromeClient = new MockWebChromeClient();
-        mWebView.setWebChromeClient(webChromeClient);
+        mOnUiThread.setWebChromeClient(webChromeClient);
 
-        final WebSettings settings = mWebView.getSettings();
+        final WebSettings settings = mOnUiThread.getSettings();
         settings.setJavaScriptEnabled(true);
         settings.setJavaScriptCanOpenWindowsAutomatically(true);
 
         assertFalse(webChromeClient.hadOnJsBeforeUnload());
 
-        loadUrl(mWebServer.getAssetUrl(TestHtmlConstants.JS_UNLOAD_URL));
+        mOnUiThread.loadUrlAndWaitForCompletion(mWebServer.getAssetUrl(TestHtmlConstants.JS_UNLOAD_URL));
         // unload should trigger when we try to navigate away
-        loadUrl(mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL));
+        mOnUiThread.loadUrlAndWaitForCompletion(mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL));
 
-        new DelayedCheck(TEST_TIMEOUT) {
+        new PollingCheck(TEST_TIMEOUT) {
             @Override
             protected boolean check() {
                 return webChromeClient.hadOnJsBeforeUnload();
@@ -225,27 +176,20 @@
         assertEquals(webChromeClient.getMessage(), "testOnJsBeforeUnload");
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onJsAlert",
-            args = {WebView.class, String.class, String.class, JsResult.class}
-        )
-    })
     public void testOnJsAlert() throws Exception {
         final MockWebChromeClient webChromeClient = new MockWebChromeClient();
-        mWebView.setWebChromeClient(webChromeClient);
+        mOnUiThread.setWebChromeClient(webChromeClient);
 
-        final WebSettings settings = mWebView.getSettings();
+        final WebSettings settings = mOnUiThread.getSettings();
         settings.setJavaScriptEnabled(true);
         settings.setJavaScriptCanOpenWindowsAutomatically(true);
 
         assertFalse(webChromeClient.hadOnJsAlert());
 
         String url = mWebServer.getAssetUrl(TestHtmlConstants.JS_ALERT_URL);
-        mWebView.loadUrl(url);
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
 
-        new DelayedCheck(TEST_TIMEOUT) {
+        new PollingCheck(TEST_TIMEOUT) {
             @Override
             protected boolean check() {
                 return webChromeClient.hadOnJsAlert();
@@ -254,27 +198,20 @@
         assertEquals(webChromeClient.getMessage(), "testOnJsAlert");
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onJsConfirm",
-            args = {WebView.class, String.class, String.class, JsResult.class}
-        )
-    })
     public void testOnJsConfirm() throws Exception {
         final MockWebChromeClient webChromeClient = new MockWebChromeClient();
-        mWebView.setWebChromeClient(webChromeClient);
+        mOnUiThread.setWebChromeClient(webChromeClient);
 
-        final WebSettings settings = mWebView.getSettings();
+        final WebSettings settings = mOnUiThread.getSettings();
         settings.setJavaScriptEnabled(true);
         settings.setJavaScriptCanOpenWindowsAutomatically(true);
 
         assertFalse(webChromeClient.hadOnJsConfirm());
 
         String url = mWebServer.getAssetUrl(TestHtmlConstants.JS_CONFIRM_URL);
-        mWebView.loadUrl(url);
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
 
-        new DelayedCheck(TEST_TIMEOUT) {
+        new PollingCheck(TEST_TIMEOUT) {
             @Override
             protected boolean check() {
                 return webChromeClient.hadOnJsConfirm();
@@ -283,18 +220,11 @@
         assertEquals(webChromeClient.getMessage(), "testOnJsConfirm");
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onJsPrompt",
-            args = {WebView.class, String.class, String.class, String.class, JsPromptResult.class}
-        )
-    })
     public void testOnJsPrompt() throws Exception {
         final MockWebChromeClient webChromeClient = new MockWebChromeClient();
-        mWebView.setWebChromeClient(webChromeClient);
+        mOnUiThread.setWebChromeClient(webChromeClient);
 
-        final WebSettings settings = mWebView.getSettings();
+        final WebSettings settings = mOnUiThread.getSettings();
         settings.setJavaScriptEnabled(true);
         settings.setJavaScriptCanOpenWindowsAutomatically(true);
 
@@ -303,33 +233,25 @@
         final String promptResult = "CTS";
         webChromeClient.setPromptResult(promptResult);
         String url = mWebServer.getAssetUrl(TestHtmlConstants.JS_PROMPT_URL);
-        mWebView.loadUrl(url);
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
 
-        new DelayedCheck(TEST_TIMEOUT) {
+        new PollingCheck(TEST_TIMEOUT) {
             @Override
             protected boolean check() {
                 return webChromeClient.hadOnJsPrompt();
             }
         }.run();
         // the result returned by the client gets set as the page title
-        new DelayedCheck(TEST_TIMEOUT) {
+        new PollingCheck(TEST_TIMEOUT) {
+            @Override
             protected boolean check() {
-                return mWebView.getTitle().equals(promptResult);
+                return mOnUiThread.getTitle().equals(promptResult);
             }
         }.run();
         assertEquals(webChromeClient.getMessage(), "testOnJsPrompt");
     }
 
-    private void loadUrl(String url) {
-        mWebView.loadUrl(url);
-        new DelayedCheck(TEST_TIMEOUT) {
-            protected boolean check() {
-                return mWebView.getProgress() == 100;
-            }
-        }.run();
-    }
-
-    private class MockWebChromeClient extends WebChromeClient {
+    private class MockWebChromeClient extends WaitForProgressClient {
         private boolean mHadOnProgressChanged;
         private boolean mHadOnReceivedTitle;
         private String mPageTitle;
@@ -344,6 +266,10 @@
         private boolean mHadOnRequestFocus;
         private boolean mHadOnReceivedIcon;
 
+        public MockWebChromeClient() {
+            super(mOnUiThread);
+        }
+
         public void setPromptResult(String promptResult) {
             mPromptResult = promptResult;
         }
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebHistoryItemTest.java b/tests/tests/webkit/src/android/webkit/cts/WebHistoryItemTest.java
index 71ba504..9fc308d 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebHistoryItemTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebHistoryItemTest.java
@@ -16,25 +16,16 @@
 
 package android.webkit.cts;
 
-import dalvik.annotation.BrokenTest;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
-
 import android.graphics.Bitmap;
 import android.test.ActivityInstrumentationTestCase2;
-import android.view.animation.cts.DelayedCheck;
 import android.webkit.WebBackForwardList;
-import android.webkit.WebChromeClient;
 import android.webkit.WebHistoryItem;
-import android.webkit.WebView;
-import android.webkit.WebViewClient;
 
-@TestTargetClass(android.webkit.WebHistoryItem.class)
+
 public class WebHistoryItemTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
+    private final static long TEST_TIMEOUT = 10000;
     private CtsTestServer mWebServer;
+    private WebViewOnUiThread mOnUiThread;
 
     public WebHistoryItemTest() {
         super("com.android.cts.stub", WebViewStubActivity.class);
@@ -44,6 +35,7 @@
     protected void setUp() throws Exception {
         super.setUp();
         mWebServer = new CtsTestServer(getActivity());
+        mOnUiThread = new WebViewOnUiThread(this, getActivity().getWebView());
     }
 
     @Override
@@ -52,37 +44,13 @@
         super.tearDown();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "getId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitle",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getUrl",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFavicon",
-            args = {}
-        )
-    })
     public void testWebHistoryItem() {
-        final WebView view = getActivity().getWebView();
-        view.setWebChromeClient(new WebChromeClient());
-        WebBackForwardList list = view.copyBackForwardList();
+        WebBackForwardList list = mOnUiThread.copyBackForwardList();
         assertEquals(0, list.getSize());
 
         String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
-        assertLoadUrlSuccessfully(view, url);
-        list = view.copyBackForwardList();
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        list = mOnUiThread.copyBackForwardList();
         assertEquals(1, list.getSize());
         WebHistoryItem item = list.getCurrentItem();
         assertNotNull(item);
@@ -90,12 +58,12 @@
         assertEquals(url, item.getUrl());
         assertNull(item.getOriginalUrl());
         assertEquals(TestHtmlConstants.HELLO_WORLD_TITLE, item.getTitle());
-        Bitmap icon = view.getFavicon();
+        Bitmap icon = mOnUiThread.getFavicon();
         assertEquals(icon, item.getFavicon());
 
         url = mWebServer.getAssetUrl(TestHtmlConstants.BR_TAG_URL);
-        assertLoadUrlSuccessfully(view, url);
-        list = view.copyBackForwardList();
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        list = mOnUiThread.copyBackForwardList();
         assertEquals(2, list.getSize());
         item = list.getCurrentItem();
         assertNotNull(item);
@@ -103,15 +71,4 @@
         int secondId = item.getId();
         assertTrue(firstId != secondId);
     }
-
-    private void assertLoadUrlSuccessfully(final WebView view, String url) {
-        view.loadUrl(url);
-        // wait for the page load to complete
-        new DelayedCheck(10000) {
-            @Override
-            protected boolean check() {
-                return view.getProgress() == 100;
-            }
-        }.run();
-    }
 }
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java b/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java
index 05e668b..27fa5a0 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java
@@ -15,25 +15,18 @@
  */
 package android.webkit.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
-
+import android.cts.util.PollingCheck;
 import android.os.Build;
 import android.test.ActivityInstrumentationTestCase2;
 import android.util.Log;
-import android.view.animation.cts.DelayedCheck;
 import android.webkit.MimeTypeMap;
 import android.webkit.WebChromeClient;
 import android.webkit.WebSettings;
-import android.webkit.WebView;
-import android.webkit.WebViewClient;
 import android.webkit.WebSettings.LayoutAlgorithm;
 import android.webkit.WebSettings.RenderPriority;
 import android.webkit.WebSettings.TextSize;
 
+
 import java.util.Locale;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -41,14 +34,26 @@
 /**
  * Tests for {@link android.webkit.WebSettings}
  */
-@TestTargetClass(android.webkit.WebSettings.class)
 public class WebSettingsTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
 
+    private static final int WEBVIEW_TIMEOUT = 5000;
     private static final String LOG_TAG = "WebSettingsTest";
 
-    private WebView mWebView;
+    private final String EMPTY_IMAGE_HEIGHT = "0";
+    private final String NETWORK_IMAGE_HEIGHT = "48";  // See getNetworkImageHtml()
+    private final String DATA_URL_IMAGE_HTML = "<html>" +
+            "<head><script>function updateTitle(){" +
+            "document.title=document.getElementById('img').naturalHeight;}</script></head>" +
+            "<body onload='updateTitle()'>" +
+            "<img id='img' onload='updateTitle()' src='data:image/png;base64,iVBORw0KGgoAAA" +
+            "ANSUhEUgAAAAEAAAABCAAAAAA6fptVAAAAAXNSR0IArs4c6QAAAA1JREFUCB0BAgD9/wAAAAIAAc3j" +
+            "0SsAAAAASUVORK5CYII=" +
+            "'></body></html>";
+    private final String DATA_URL_IMAGE_HEIGHT = "1";
+
     private WebSettings mSettings;
     private CtsTestServer mWebServer;
+    private WebViewOnUiThread mOnUiThread;
 
     public WebSettingsTest() {
         super("com.android.cts.stub", WebViewStubActivity.class);
@@ -57,12 +62,8 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        mWebView = getActivity().getWebView();
-
-        // Set a web chrome client in order to receive progress updates.
-        mWebView.setWebChromeClient(new WebChromeClient());
-
-        mSettings = mWebView.getSettings();
+        mOnUiThread = new WebViewOnUiThread(this, getActivity().getWebView());
+        mSettings = mOnUiThread.getSettings();
     }
 
     @Override
@@ -71,15 +72,10 @@
             mWebServer.shutdown();
         }
         // clear the cache to prevent side effects
-        mWebView.clearCache(true);
+        mOnUiThread.clearCache(true);
         super.tearDown();
     }
 
-    @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getUserAgentString",
-            args = {}
-    )
     /**
      * Verifies that the default user agent string follows the format defined in Android
      * compatibility definition:
@@ -99,68 +95,46 @@
         assertTrue(String.format("User agent string did not match expected pattern. \nExpected " +
                         "pattern:\n%s\nActual:\n%s", patternString, actualUserAgentString),
                         patternMatcher.find());
-        assertEquals(Build.VERSION.RELEASE, patternMatcher.group(1));
         Locale currentLocale = Locale.getDefault();
         assertEquals(currentLocale.getLanguage().toLowerCase(), patternMatcher.group(2));
         assertEquals(currentLocale.getCountry().toLowerCase(), patternMatcher.group(3));
-        // Model is only added in release builds
-        if ("REL".equals(Build.VERSION.CODENAME))
+        if ("REL".equals(Build.VERSION.CODENAME)) {
+            // Model is only added in release builds
             assertEquals(Build.MODEL, patternMatcher.group(4));
+            // Release version is valid only in release builds
+            assertEquals(Build.VERSION.RELEASE, patternMatcher.group(1));
+        }
         assertEquals(Build.ID, patternMatcher.group(5));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getUserAgentString",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setUserAgentString",
-            args = {String.class}
-        )
-    })
     public void testAccessUserAgentString() throws Exception {
         startWebServer();
         String url = mWebServer.getUserAgentUrl();
 
         String defaultUserAgent = mSettings.getUserAgentString();
         assertNotNull(defaultUserAgent);
-        loadUrl(url);
-        assertEquals(defaultUserAgent, mWebView.getTitle());
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        assertEquals(defaultUserAgent, mOnUiThread.getTitle());
 
         // attempting to set a null string has no effect
         mSettings.setUserAgentString(null);
         assertEquals(defaultUserAgent, mSettings.getUserAgentString());
-        loadUrl(url);
-        assertEquals(defaultUserAgent, mWebView.getTitle());
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        assertEquals(defaultUserAgent, mOnUiThread.getTitle());
 
         // attempting to set an empty string has no effect
         mSettings.setUserAgentString("");
         assertEquals(defaultUserAgent, mSettings.getUserAgentString());
-        loadUrl(url);
-        assertEquals(defaultUserAgent, mWebView.getTitle());
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        assertEquals(defaultUserAgent, mOnUiThread.getTitle());
 
         String customUserAgent = "Cts/test";
         mSettings.setUserAgentString(customUserAgent);
         assertEquals(customUserAgent, mSettings.getUserAgentString());
-        loadUrl(url);
-        assertEquals(customUserAgent, mWebView.getTitle());
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        assertEquals(customUserAgent, mOnUiThread.getTitle());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getUserAgent",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "setUserAgent",
-            args = {int.class}
-        )
-    })
     @SuppressWarnings("deprecation")
     public void testAccessUserAgent() throws Exception {
         startWebServer();
@@ -168,119 +142,60 @@
 
         mSettings.setUserAgent(1);
         assertEquals(1, mSettings.getUserAgent());
-        loadUrl(url);
-        String userAgent1 = mWebView.getTitle();
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        String userAgent1 = mOnUiThread.getTitle();
         assertNotNull(userAgent1);
 
         mSettings.setUserAgent(3);
         assertEquals(1, mSettings.getUserAgent());
-        loadUrl(url);
-        assertEquals(userAgent1, mWebView.getTitle());
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        assertEquals(userAgent1, mOnUiThread.getTitle());
 
         mSettings.setUserAgent(2);
         assertEquals(2, mSettings.getUserAgent());
-        loadUrl(url);
-        String userAgent2 = mWebView.getTitle();
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        String userAgent2 = mOnUiThread.getTitle();
         assertNotNull(userAgent2);
 
         mSettings.setUserAgent(3);
         assertEquals(2, mSettings.getUserAgent());
-        loadUrl(url);
-        assertEquals(userAgent2, mWebView.getTitle());
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        assertEquals(userAgent2, mOnUiThread.getTitle());
 
         mSettings.setUserAgent(0);
         assertEquals(0, mSettings.getUserAgent());
-        loadUrl(url);
-        String userAgent0 = mWebView.getTitle();
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        String userAgent0 = mOnUiThread.getTitle();
         assertNotNull(userAgent0);
 
         final String customUserAgent = "Cts/Test";
         mSettings.setUserAgentString(customUserAgent);
         assertEquals(-1, mSettings.getUserAgent());
-        loadUrl(url);
-        assertEquals(customUserAgent, mWebView.getTitle());
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        assertEquals(customUserAgent, mOnUiThread.getTitle());
     }
 
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAllowFileAccess",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "setAllowFileAccess",
-            args = {boolean.class}
-        )
-    })
     public void testAccessAllowFileAccess() {
         assertTrue(mSettings.getAllowFileAccess());
 
         String fileUrl = TestHtmlConstants.getFileUrl(TestHtmlConstants.HELLO_WORLD_URL);
-        loadUrl(fileUrl);
-        assertEquals(TestHtmlConstants.HELLO_WORLD_TITLE, mWebView.getTitle());
+        mOnUiThread.loadUrlAndWaitForCompletion(fileUrl);
+        assertEquals(TestHtmlConstants.HELLO_WORLD_TITLE, mOnUiThread.getTitle());
 
         fileUrl = TestHtmlConstants.getFileUrl(TestHtmlConstants.BR_TAG_URL);
         mSettings.setAllowFileAccess(false);
         assertFalse(mSettings.getAllowFileAccess());
-
-        loadUrl(fileUrl);
+        mOnUiThread.loadUrlAndWaitForCompletion(fileUrl);
         // android_asset URLs should still be loaded when even with file access
         // disabled.
-        assertEquals(TestHtmlConstants.BR_TAG_TITLE, mWebView.getTitle());
+        assertEquals(TestHtmlConstants.BR_TAG_TITLE, mOnUiThread.getTitle());
 
         // Files on the file system should not be loaded.
-        loadUrl(TestHtmlConstants.LOCAL_FILESYSTEM_URL);
-        assertEquals(TestHtmlConstants.WEBPAGE_NOT_AVAILABLE_TITLE, mWebView.getTitle());
+        mOnUiThread.loadUrlAndWaitForCompletion(TestHtmlConstants.LOCAL_FILESYSTEM_URL);
+        assertEquals(TestHtmlConstants.WEBPAGE_NOT_AVAILABLE_TITLE, mOnUiThread.getTitle());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBlockNetworkImage",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setBlockNetworkImage",
-            args = {boolean.class}
-        )
-    })
-    public void testAccessBlockNetworkImage() throws Exception {
-        String url = TestHtmlConstants.EMBEDDED_IMG_URL;
-        final String ext = MimeTypeMap.getFileExtensionFromUrl(url);
-
-        mWebView.clearCache(true);
-        assertFalse(mSettings.getBlockNetworkImage());
-        assertTrue(mSettings.getLoadsImagesAutomatically());
-        loadAssetUrl(url);
-        new DelayedCheck() {
-            @Override
-            protected boolean check() {
-                return !mWebServer.getLastRequestUrl().endsWith(ext);
-            }
-        }.run();
-
-        mWebView.clearCache(true);
-        mSettings.setBlockNetworkImage(true);
-        assertTrue(mSettings.getBlockNetworkImage());
-        loadAssetUrl(url);
-        assertTrue(mWebServer.getLastRequestUrl().endsWith(ext));
-    }
-
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCacheMode",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setCacheMode",
-            args = {int.class}
-        )
-    })
     public void testAccessCacheMode() throws Exception {
         assertEquals(WebSettings.LOAD_DEFAULT, mSettings.getCacheMode());
 
@@ -309,20 +224,6 @@
         assertEquals(thirdFetch, mWebServer.getRequestCount());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCursiveFontFamily",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "setCursiveFontFamily",
-            args = {String.class}
-        )
-    })
-    @ToBeFixed( bug = "1665811", explanation = "Can not check whether methods " +
-            "take effect by automatic testing")
     public void testAccessCursiveFontFamily() throws Exception {
         assertNotNull(mSettings.getCursiveFontFamily());
 
@@ -331,20 +232,6 @@
         assertEquals(newCusiveFamily, mSettings.getCursiveFontFamily());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFantasyFontFamily",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "setFantasyFontFamily",
-            args = {String.class}
-        )
-    })
-    @ToBeFixed( bug = "1665811", explanation = "Can not check whether methods " +
-            "take effect by automatic testing")
     public void testAccessFantasyFontFamily() {
         assertNotNull(mSettings.getFantasyFontFamily());
 
@@ -353,20 +240,6 @@
         assertEquals(newFantasyFamily, mSettings.getFantasyFontFamily());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFixedFontFamily",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "setFixedFontFamily",
-            args = {String.class}
-        )
-    })
-    @ToBeFixed( bug = "1665811", explanation = "Can not check whether methods " +
-            "take effect by automatic testing")
     public void testAccessFixedFontFamily() {
         assertNotNull(mSettings.getFixedFontFamily());
 
@@ -375,20 +248,6 @@
         assertEquals(newFixedFamily, mSettings.getFixedFontFamily());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSansSerifFontFamily",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "setSansSerifFontFamily",
-            args = {String.class}
-        )
-    })
-    @ToBeFixed( bug = "1665811", explanation = "Can not check whether methods " +
-            "take effect by automatic testing")
     public void testAccessSansSerifFontFamily() {
         assertNotNull(mSettings.getSansSerifFontFamily());
 
@@ -397,20 +256,6 @@
         assertEquals(newFixedFamily, mSettings.getSansSerifFontFamily());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSerifFontFamily",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "setSerifFontFamily",
-            args = {String.class}
-        )
-    })
-    @ToBeFixed( bug = "1665811", explanation = "Can not check whether methods " +
-            "take effect by automatic testing")
     public void testAccessSerifFontFamily() {
         assertNotNull(mSettings.getSerifFontFamily());
 
@@ -419,20 +264,6 @@
         assertEquals(newSerifFamily, mSettings.getSerifFontFamily());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStandardFontFamily",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "setStandardFontFamily",
-            args = {String.class}
-        )
-    })
-    @ToBeFixed( bug = "1665811", explanation = "Can not check whether methods " +
-            "take effect by automatic testing")
     public void testAccessStandardFontFamily() {
         assertNotNull(mSettings.getStandardFontFamily());
 
@@ -441,20 +272,6 @@
         assertEquals(newStandardFamily, mSettings.getStandardFontFamily());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDefaultFontSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "setDefaultFontSize",
-            args = {int.class}
-        )
-    })
-    @ToBeFixed( bug = "1665811", explanation = "Can not check whether methods " +
-            "take effect by automatic testing")
     public void testAccessDefaultFontSize() {
         int defaultSize = mSettings.getDefaultFontSize();
         assertTrue(defaultSize > 0);
@@ -473,20 +290,6 @@
         assertEquals(10, mSettings.getDefaultFontSize());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDefaultFixedFontSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "setDefaultFixedFontSize",
-            args = {int.class}
-        )
-    })
-    @ToBeFixed( bug = "1665811", explanation = "Can not check whether methods " +
-            "take effect by automatic testing")
     public void testAccessDefaultFixedFontSize() {
         int defaultSize = mSettings.getDefaultFixedFontSize();
         assertTrue(defaultSize > 0);
@@ -505,20 +308,6 @@
         assertEquals(10, mSettings.getDefaultFixedFontSize());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDefaultTextEncodingName",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "setDefaultTextEncodingName",
-            args = {String.class}
-        )
-    })
-    @ToBeFixed( bug = "1665811", explanation = "Can not check whether methods " +
-            "take effect by automatic testing")
     public void testAccessDefaultTextEncodingName() {
         assertNotNull(mSettings.getDefaultTextEncodingName());
 
@@ -527,95 +316,58 @@
         assertEquals(newEncodingName, mSettings.getDefaultTextEncodingName());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getJavaScriptCanOpenWindowsAutomatically",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setJavaScriptCanOpenWindowsAutomatically",
-            args = {boolean.class}
-        )
-    })
     public void testAccessJavaScriptCanOpenWindowsAutomatically() throws Exception {
-        mWebView.setWebViewClient(new WebViewClient());
         mSettings.setJavaScriptEnabled(true);
 
         mSettings.setJavaScriptCanOpenWindowsAutomatically(false);
         assertFalse(mSettings.getJavaScriptCanOpenWindowsAutomatically());
         loadAssetUrl(TestHtmlConstants.POPUP_URL);
-        new DelayedCheck(10000) {
+        new PollingCheck(WEBVIEW_TIMEOUT) {
+            @Override
             protected boolean check() {
-                String title = mWebView.getTitle();
+                String title = mOnUiThread.getTitle();
                 return title != null && title.length() > 0;
             }
         }.run();
-        assertEquals("Popup blocked", mWebView.getTitle());
+        assertEquals("Popup blocked", mOnUiThread.getTitle());
 
         mSettings.setJavaScriptCanOpenWindowsAutomatically(true);
         assertTrue(mSettings.getJavaScriptCanOpenWindowsAutomatically());
         loadAssetUrl(TestHtmlConstants.POPUP_URL);
-        new DelayedCheck(10000) {
+        new PollingCheck(WEBVIEW_TIMEOUT) {
+            @Override
             protected boolean check() {
-                String title = mWebView.getTitle();
+                String title = mOnUiThread.getTitle();
                 return title != null && title.length() > 0;
             }
         }.run();
-        assertEquals("Popup allowed", mWebView.getTitle());
+        assertEquals("Popup allowed", mOnUiThread.getTitle());
 }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getJavaScriptEnabled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setJavaScriptEnabled",
-            args = {boolean.class}
-        )
-    })
     public void testAccessJavaScriptEnabled() throws Exception {
         mSettings.setJavaScriptEnabled(true);
         assertTrue(mSettings.getJavaScriptEnabled());
         loadAssetUrl(TestHtmlConstants.JAVASCRIPT_URL);
-        new DelayedCheck(10000) {
+        new PollingCheck(WEBVIEW_TIMEOUT) {
             @Override
             protected boolean check() {
-                return mWebView.getTitle() != null;
+                return mOnUiThread.getTitle() != null;
             }
         }.run();
-        assertEquals("javascript on", mWebView.getTitle());
+        assertEquals("javascript on", mOnUiThread.getTitle());
 
         mSettings.setJavaScriptEnabled(false);
         assertFalse(mSettings.getJavaScriptEnabled());
         loadAssetUrl(TestHtmlConstants.JAVASCRIPT_URL);
-        new DelayedCheck(10000) {
+        new PollingCheck(WEBVIEW_TIMEOUT) {
             @Override
             protected boolean check() {
-                return mWebView.getTitle() != null;
+                return mOnUiThread.getTitle() != null;
             }
         }.run();
-        assertEquals("javascript off", mWebView.getTitle());
+        assertEquals("javascript off", mOnUiThread.getTitle());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLayoutAlgorithm",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "setLayoutAlgorithm",
-            args = {LayoutAlgorithm.class}
-        )
-    })
-    @ToBeFixed( bug = "1665811", explanation = "Can not check whether methods " +
-            "take effect by automatic testing")
     public void testAccessLayoutAlgorithm() {
         assertEquals(WebSettings.LayoutAlgorithm.NARROW_COLUMNS, mSettings.getLayoutAlgorithm());
 
@@ -626,20 +378,6 @@
         assertEquals(WebSettings.LayoutAlgorithm.SINGLE_COLUMN, mSettings.getLayoutAlgorithm());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLightTouchEnabled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "setLightTouchEnabled",
-            args = {boolean.class}
-        )
-    })
-    @ToBeFixed( bug = "1665811", explanation = "Can not check whether methods " +
-            "take effect by automatic testing")
     public void testAccessLightTouchEnabled() {
         assertFalse(mSettings.getLightTouchEnabled());
 
@@ -647,51 +385,6 @@
         assertTrue(mSettings.getLightTouchEnabled());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLoadsImagesAutomatically",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "setLoadsImagesAutomatically",
-            args = {boolean.class}
-        )
-    })
-    @ToBeFixed( bug = "1665811", explanation = "Can not check whether methods " +
-            "take effect by automatic testing")
-    public void testAccessLoadsImagesAutomatically() throws Exception {
-        mWebView.clearCache(true);
-        assertTrue(mSettings.getLoadsImagesAutomatically());
-        String url = TestHtmlConstants.EMBEDDED_IMG_URL;
-        String ext = MimeTypeMap.getFileExtensionFromUrl(url);
-        loadAssetUrl(url);
-        Thread.sleep(1000);
-        assertFalse(mWebServer.getLastRequestUrl().endsWith(ext));
-
-        mWebView.clearCache(true);
-        mSettings.setLoadsImagesAutomatically(false);
-        assertFalse(mSettings.getLoadsImagesAutomatically());
-        loadAssetUrl(url);
-        Thread.sleep(1000);
-        assertTrue(mWebServer.getLastRequestUrl().endsWith(ext));
-    }
-
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinimumFontSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "setMinimumFontSize",
-            args = {int.class}
-        )
-    })
-    @ToBeFixed( bug = "1665811", explanation = "Can not check whether methods " +
-            "take effect by automatic testing")
     public void testAccessMinimumFontSize() {
         assertEquals(8, mSettings.getMinimumFontSize());
 
@@ -705,20 +398,6 @@
         assertEquals(10, mSettings.getMinimumFontSize());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMinimumLogicalFontSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "setMinimumLogicalFontSize",
-            args = {int.class}
-        )
-    })
-    @ToBeFixed( bug = "1665811", explanation = "Can not check whether methods " +
-            "take effect by automatic testing")
     public void testAccessMinimumLogicalFontSize() {
         assertEquals(8, mSettings.getMinimumLogicalFontSize());
 
@@ -732,19 +411,6 @@
         assertEquals(10, mSettings.getMinimumLogicalFontSize());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getNavDump",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "setNavDump",
-            args = {boolean.class}
-        )
-    })
-    @ToBeFixed(explanation = "NavDump feature is not documented")
     public void testAccessNavDump() {
         assertFalse(mSettings.getNavDump());
 
@@ -752,20 +418,6 @@
         assertTrue(mSettings.getNavDump());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPluginsEnabled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "setPluginsEnabled",
-            args = {boolean.class}
-        )
-    })
-    @ToBeFixed( bug = "1665811", explanation = "Can not check whether methods " +
-            "take effect by automatic testing")
     public void testAccessPluginsEnabled() {
         assertFalse(mSettings.getPluginsEnabled());
 
@@ -773,20 +425,6 @@
         assertTrue(mSettings.getPluginsEnabled());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPluginsPath",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "setPluginsPath",
-            args = {String.class}
-        )
-    })
-    @ToBeFixed( bug = "1665811", explanation = "Can not check whether methods " +
-            "take effect by automatic testing")
     public void testAccessPluginsPath() {
         assertNotNull(mSettings.getPluginsPath());
 
@@ -796,20 +434,6 @@
         assertEquals("", mSettings.getPluginsPath());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSaveFormData",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "setSaveFormData",
-            args = {boolean.class}
-        )
-    })
-    @ToBeFixed( bug = "1665811", explanation = "Can not check whether methods " +
-            "take effect by automatic testing")
     public void testAccessSaveFormData() {
         assertTrue(mSettings.getSaveFormData());
 
@@ -817,20 +441,6 @@
         assertFalse(mSettings.getSaveFormData());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSavePassword",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "setSavePassword",
-            args = {boolean.class}
-        )
-    })
-    @ToBeFixed( bug = "1665811", explanation = "Can not check whether methods " +
-            "take effect by automatic testing")
     public void testAccessSavePassword() {
         assertTrue(mSettings.getSavePassword());
 
@@ -838,20 +448,6 @@
         assertFalse(mSettings.getSavePassword());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTextSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "setTextSize",
-            args = {TextSize.class}
-        )
-    })
-    @ToBeFixed( bug = "1665811", explanation = "Can not check whether methods " +
-            "take effect by automatic testing")
     public void testAccessTextSize() {
         assertEquals(TextSize.NORMAL, mSettings.getTextSize());
 
@@ -868,19 +464,6 @@
         assertEquals(TextSize.SMALLEST, mSettings.getTextSize());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getUseDoubleTree",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "setUseDoubleTree",
-            args = {boolean.class}
-        )
-    })
-    @ToBeFixed( bug = "1665811", explanation = "Can not check whether methods take effect")
     public void testAccessUseDoubleTree() {
         assertFalse(mSettings.getUseDoubleTree());
 
@@ -889,20 +472,6 @@
         assertFalse(mSettings.getUseDoubleTree());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getUseWideViewPort",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "setUseWideViewPort",
-            args = {boolean.class}
-        )
-    })
-    @ToBeFixed( bug = "1665811", explanation = "Can not check whether methods " +
-            "take effect by automatic testing")
     public void testAccessUseWideViewPort() {
         assertFalse(mSettings.getUseWideViewPort());
 
@@ -910,25 +479,12 @@
         assertTrue(mSettings.getUseWideViewPort());
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        method = "setNeedInitialFocus",
-        args = {boolean.class}
-    )
-    @ToBeFixed( bug = "1665811", explanation = "Can not check whether methods " +
-            "take effect by automatic testing")
     public void testSetNeedInitialFocus() {
         mSettings.setNeedInitialFocus(false);
 
         mSettings.setNeedInitialFocus(true);
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        method = "setRenderPriority",
-        args = {RenderPriority.class}
-    )
-    @ToBeFixed( bug = "1665811", explanation = "Can not check whether methods take effect")
     public void testSetRenderPriority() {
         mSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);
 
@@ -937,20 +493,6 @@
         mSettings.setRenderPriority(WebSettings.RenderPriority.NORMAL);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "supportMultipleWindows",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "setSupportMultipleWindows",
-            args = {boolean.class}
-        )
-    })
-    @ToBeFixed( bug = "1665811", explanation = "Can not check whether methods " +
-            "take effect by automatic testing")
     public void testAccessSupportMultipleWindows() {
         assertFalse(mSettings.supportMultipleWindows());
 
@@ -958,79 +500,182 @@
         assertTrue(mSettings.supportMultipleWindows());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "supportZoom",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSupportZoom",
-            args = {boolean.class}
-        )
-    })
-    @ToBeFixed( bug = "1665811", explanation = "Can not check whether methods " +
-            "take effect by automatic testing")
-    public void testAccessSupportZoom() {
+    public void testAccessSupportZoom() throws Throwable {
         assertTrue(mSettings.supportZoom());
 
-        mSettings.setSupportZoom(false);
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mSettings.setSupportZoom(false);
+            }
+        });
         assertFalse(mSettings.supportZoom());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBuiltInZoomControls",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "setBuiltInZoomControls",
-            args = {boolean.class}
-        )
-    })
-    @ToBeFixed( bug = "1665811", explanation = "Can not check whether methods " +
-            "take effect by automatic testing")
-    public void testAccessBuiltInZoomControls() {
+    public void testAccessBuiltInZoomControls() throws Throwable {
         assertFalse(mSettings.getBuiltInZoomControls());
 
-        mSettings.setBuiltInZoomControls(true);
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mSettings.setBuiltInZoomControls(true);
+            }
+        });
         assertTrue(mSettings.getBuiltInZoomControls());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAppCacheEnabled",
-            args = {}
-        )
-    })
-    public void testSetAppCacheEnabled() throws Exception {
-        // Tests that when AppCache is enabled and used, but the database path
-        // is not set or is set to an inaccessible path, the WebView does not crash.
+    public void testAppCacheDisabled() throws Throwable {
+        // Test that when AppCache is disabled, we don't get any AppCache
+        // callbacks.
         startWebServer();
-        String url = mWebServer.getAppCacheUrl();
+        final String url = mWebServer.getAppCacheUrl();
+        mSettings.setJavaScriptEnabled(true);
+
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        new PollingCheck(WEBVIEW_TIMEOUT) {
+            protected boolean check() {
+                return "Loaded".equals(mOnUiThread.getTitle());
+            }
+        }.run();
+        // The page is now loaded. Wait for a further 1s to check no AppCache
+        // callbacks occur.
+        Thread.sleep(1000);
+        assertEquals("Loaded", mOnUiThread.getTitle());
+    }
+
+    public void testAppCacheEnabled() throws Throwable {
+        // Note that the AppCache path can only be set once. This limits the
+        // amount of testing we can do, and means that we must test all aspects
+        // of setting the AppCache path in a single test to guarantee ordering.
+
+        // Test that when AppCache is enabled but no valid path is provided,
+        // we don't get any AppCache callbacks.
+        startWebServer();
+        final String url = mWebServer.getAppCacheUrl();
         mSettings.setAppCacheEnabled(true);
         mSettings.setJavaScriptEnabled(true);
 
-        loadUrl(url);
-        new DelayedCheck(10000) {
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        new PollingCheck(WEBVIEW_TIMEOUT) {
+            @Override
             protected boolean check() {
-                return mWebView.getTitle() != null && mWebView.getTitle().equals("Done");
+                return "Loaded".equals(mOnUiThread.getTitle());
             }
         }.run();
+        // The page is now loaded. Wait for a further 1s to check no AppCache
+        // callbacks occur.
+        Thread.sleep(1000);
+        assertEquals("Loaded", mOnUiThread.getTitle());
 
-        mSettings.setAppCachePath("/data/foo");
-        loadUrl(url);
-        new DelayedCheck(10000) {
+        // Test that when AppCache is enabled and a valid path is provided, we
+        // get an AppCache callback of some kind.
+        mSettings.setAppCachePath(getActivity().getDir("appcache", 0).getPath());
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        new PollingCheck(WEBVIEW_TIMEOUT) {
+            @Override
             protected boolean check() {
-                return mWebView.getTitle() != null && mWebView.getTitle().equals("Done");
+                return mOnUiThread.getTitle() != null
+                        && mOnUiThread.getTitle().endsWith("Callback");
             }
         }.run();
     }
 
+    public void testLoadsImagesAutomatically() throws Throwable {
+        assertTrue(mSettings.getLoadsImagesAutomatically());
+
+        startWebServer();
+        mSettings.setJavaScriptEnabled(true);
+
+        // Check that by default network and data url images are loaded.
+        mOnUiThread.loadDataAndWaitForCompletion(getNetworkImageHtml(), "text/html", null);
+        assertEquals(NETWORK_IMAGE_HEIGHT, mOnUiThread.getTitle());
+        mOnUiThread.loadDataAndWaitForCompletion(DATA_URL_IMAGE_HTML, "text/html", null);
+        assertEquals(DATA_URL_IMAGE_HEIGHT, mOnUiThread.getTitle());
+
+        // Check that with auto-loading turned off no images are loaded.
+        // Also check that images are loaded automatically once we enable the setting,
+        // without reloading the page.
+        mSettings.setLoadsImagesAutomatically(false);
+        mOnUiThread.clearCache(true);
+        mOnUiThread.loadDataAndWaitForCompletion(getNetworkImageHtml(), "text/html", null);
+        assertEquals(EMPTY_IMAGE_HEIGHT, mOnUiThread.getTitle());
+        mSettings.setLoadsImagesAutomatically(true);
+        waitForNonEmptyImage();
+        assertEquals(NETWORK_IMAGE_HEIGHT, mOnUiThread.getTitle());
+
+        mSettings.setLoadsImagesAutomatically(false);
+        mOnUiThread.clearCache(true);
+        mOnUiThread.loadDataAndWaitForCompletion(DATA_URL_IMAGE_HTML, "text/html", null);
+        assertEquals(EMPTY_IMAGE_HEIGHT, mOnUiThread.getTitle());
+        mSettings.setLoadsImagesAutomatically(true);
+        waitForNonEmptyImage();
+        assertEquals(DATA_URL_IMAGE_HEIGHT, mOnUiThread.getTitle());
+    }
+
+    public void testBlockNetworkImage() throws Throwable {
+        assertFalse(mSettings.getBlockNetworkImage());
+
+        startWebServer();
+        mSettings.setJavaScriptEnabled(true);
+
+        // Check that by default network and data url images are loaded.
+        mOnUiThread.loadDataAndWaitForCompletion(getNetworkImageHtml(), "text/html", null);
+        assertEquals(NETWORK_IMAGE_HEIGHT, mOnUiThread.getTitle());
+        mOnUiThread.loadDataAndWaitForCompletion(DATA_URL_IMAGE_HTML, "text/html", null);
+        assertEquals(DATA_URL_IMAGE_HEIGHT, mOnUiThread.getTitle());
+
+        // Check that only network images are blocked, data url images are still loaded.
+        // Also check that network images are loaded automatically once we disable the setting,
+        // without reloading the page.
+        mSettings.setBlockNetworkImage(true);
+        mOnUiThread.clearCache(true);
+        mOnUiThread.loadDataAndWaitForCompletion(getNetworkImageHtml(), "text/html", null);
+        assertEquals(EMPTY_IMAGE_HEIGHT, mOnUiThread.getTitle());
+        mSettings.setBlockNetworkImage(false);
+        waitForNonEmptyImage();
+        assertEquals(NETWORK_IMAGE_HEIGHT, mOnUiThread.getTitle());
+
+        mSettings.setBlockNetworkImage(true);
+        mOnUiThread.clearCache(true);
+        mOnUiThread.loadDataAndWaitForCompletion(DATA_URL_IMAGE_HTML, "text/html", null);
+        assertEquals(DATA_URL_IMAGE_HEIGHT, mOnUiThread.getTitle());
+    }
+
+    public void testBlockNetworkLoads() throws Throwable {
+        assertFalse(mSettings.getBlockNetworkLoads());
+
+        startWebServer();
+        mSettings.setJavaScriptEnabled(true);
+
+        // Check that by default network resources and data url images are loaded.
+        mOnUiThread.loadUrlAndWaitForCompletion(
+            mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL));
+        assertEquals(TestHtmlConstants.HELLO_WORLD_TITLE, mOnUiThread.getTitle());
+        mOnUiThread.loadDataAndWaitForCompletion(getNetworkImageHtml(), "text/html", null);
+        assertEquals(NETWORK_IMAGE_HEIGHT, mOnUiThread.getTitle());
+        mOnUiThread.loadDataAndWaitForCompletion(DATA_URL_IMAGE_HTML, "text/html", null);
+        assertEquals(DATA_URL_IMAGE_HEIGHT, mOnUiThread.getTitle());
+
+        // Check that only network resources are blocked, data url images are still loaded.
+        mSettings.setBlockNetworkLoads(true);
+        mOnUiThread.clearCache(true);
+        mOnUiThread.loadUrlAndWaitForCompletion(
+            mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL));
+        assertEquals(TestHtmlConstants.WEBPAGE_NOT_AVAILABLE_TITLE, mOnUiThread.getTitle());
+        mOnUiThread.loadDataAndWaitForCompletion(getNetworkImageHtml(), "text/html", null);
+        assertEquals(EMPTY_IMAGE_HEIGHT, mOnUiThread.getTitle());
+        mOnUiThread.loadDataAndWaitForCompletion(DATA_URL_IMAGE_HTML, "text/html", null);
+        assertEquals(DATA_URL_IMAGE_HEIGHT, mOnUiThread.getTitle());
+
+        // Check that network resources are loaded once we disable the setting and reload the page.
+        mSettings.setBlockNetworkLoads(false);
+        mOnUiThread.loadUrlAndWaitForCompletion(
+            mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL));
+        assertEquals(TestHtmlConstants.HELLO_WORLD_TITLE, mOnUiThread.getTitle());
+        mOnUiThread.loadDataAndWaitForCompletion(getNetworkImageHtml(), "text/html", null);
+        assertEquals(NETWORK_IMAGE_HEIGHT, mOnUiThread.getTitle());
+    }
+
     /**
      * Starts the internal web server. The server will be shut down automatically
      * during tearDown().
@@ -1054,22 +699,25 @@
             startWebServer();
         }
         String url = mWebServer.getAssetUrl(asset);
-        loadUrl(url);
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
     }
 
-    /**
-     * Fully load the page at the given URL.
-     *
-     * @param url The URL of the page to load.
-     */
-    private void loadUrl(String url) {
-        mWebView.loadUrl(url);
-        new DelayedCheck(10000) {
+    private String getNetworkImageHtml() {
+        return "<html>" +
+                "<head><script>function updateTitle(){" +
+                "document.title=document.getElementById('img').naturalHeight;}</script></head>" +
+                "<body onload='updateTitle()'>" +
+                "<img id='img' onload='updateTitle()' src='" +
+                mWebServer.getAssetUrl(TestHtmlConstants.SMALL_IMG_URL) +
+                "'></body></html>";
+    }
+
+    private void waitForNonEmptyImage() {
+        new PollingCheck(WEBVIEW_TIMEOUT) {
             @Override
             protected boolean check() {
-                return mWebView.getProgress() == 100;
+                return !EMPTY_IMAGE_HEIGHT.equals(mOnUiThread.getTitle());
             }
         }.run();
-        assertEquals(100, mWebView.getProgress());
     }
 }
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
index 2cd2deb..b36e382 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
@@ -16,28 +16,22 @@
 
 package android.webkit.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
-
+import android.cts.util.PollingCheck;
 import android.graphics.Bitmap;
 import android.os.Message;
 import android.test.ActivityInstrumentationTestCase2;
 import android.view.KeyEvent;
-import android.view.animation.cts.DelayedCheck;
 import android.webkit.HttpAuthHandler;
 import android.webkit.WebSettings;
 import android.webkit.WebView;
 import android.webkit.WebViewClient;
-import android.webkit.WebChromeClient;
- 
-@TestTargetClass(android.webkit.WebViewClient.class)
+import android.webkit.cts.WebViewOnUiThread.WaitForLoadedClient;
+
+
 public class WebViewClientTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
     private static final long TEST_TIMEOUT = 5000;
 
-    private WebView mWebView;
+    private WebViewOnUiThread mOnUiThread;
     private CtsTestServer mWebServer;
 
     public WebViewClientTest() {
@@ -47,228 +41,158 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        mWebView = getActivity().getWebView();
-        mWebView.setWebChromeClient(new WebChromeClient());
+        mOnUiThread = new WebViewOnUiThread(this, getActivity().getWebView());
     }
 
     @Override
     protected void tearDown() throws Exception {
-        mWebView.clearHistory();
-        mWebView.clearCache(true);
+        mOnUiThread.clearHistory();
+        mOnUiThread.clearCache(true);
         if (mWebServer != null) {
             mWebServer.shutdown();
         }
         super.tearDown();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "shouldOverrideUrlLoading",
-        args = {WebView.class, String.class}
-    )
     public void testShouldOverrideUrlLoading() {
         final MockWebViewClient webViewClient = new MockWebViewClient();
-        assertFalse(webViewClient.shouldOverrideUrlLoading(mWebView, null));
+        assertFalse(webViewClient.shouldOverrideUrlLoading(mOnUiThread.getWebView(), null));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPageStarted",
-            args = {WebView.class, String.class, Bitmap.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onPageFinished",
-            args = {WebView.class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onLoadResource",
-            args = {WebView.class, String.class}
-        )
-    })
     public void testLoadPage() throws Exception {
         final MockWebViewClient webViewClient = new MockWebViewClient();
-        mWebView.setWebViewClient(webViewClient);
+        mOnUiThread.setWebViewClient(webViewClient);
         mWebServer = new CtsTestServer(getActivity());
         String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
 
         assertFalse(webViewClient.hasOnPageStartedCalled());
         assertFalse(webViewClient.hasOnLoadResourceCalled());
         assertFalse(webViewClient.hasOnPageFinishedCalled());
-        mWebView.loadUrl(url);
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
 
-        new DelayedCheck(TEST_TIMEOUT) {
+        new PollingCheck(TEST_TIMEOUT) {
+            @Override
             protected boolean check() {
                 return webViewClient.hasOnPageStartedCalled();
             }
         }.run();
 
-        new DelayedCheck(TEST_TIMEOUT) {
+        new PollingCheck(TEST_TIMEOUT) {
+            @Override
             protected boolean check() {
                 return webViewClient.hasOnLoadResourceCalled();
             }
         }.run();
 
-        new DelayedCheck(TEST_TIMEOUT) {
+        new PollingCheck(TEST_TIMEOUT) {
+            @Override
             protected boolean check() {
                 return webViewClient.hasOnPageFinishedCalled();
             }
         }.run();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onReceivedError",
-        args = {WebView.class, int.class, String.class, String.class}
-    )
     public void testOnReceivedError() throws Exception {
         final MockWebViewClient webViewClient = new MockWebViewClient();
-        mWebView.setWebViewClient(webViewClient);
+        mOnUiThread.setWebViewClient(webViewClient);
 
         String wrongUri = "invalidscheme://some/resource";
         assertEquals(0, webViewClient.hasOnReceivedErrorCode());
-        assertLoadUrlSuccessfully(mWebView, wrongUri);
+        mOnUiThread.loadUrlAndWaitForCompletion(wrongUri);
         assertEquals(WebViewClient.ERROR_UNSUPPORTED_SCHEME,
                 webViewClient.hasOnReceivedErrorCode());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onFormResubmission",
-        args = {WebView.class, Message.class, Message.class}
-    )
     public void testOnFormResubmission() throws Exception {
         final MockWebViewClient webViewClient = new MockWebViewClient();
-        mWebView.setWebViewClient(webViewClient);
-        final WebSettings settings = mWebView.getSettings();
+        mOnUiThread.setWebViewClient(webViewClient);
+        final WebSettings settings = mOnUiThread.getSettings();
         settings.setJavaScriptEnabled(true);
         mWebServer = new CtsTestServer(getActivity());
 
         assertFalse(webViewClient.hasOnFormResubmissionCalled());
         String url = mWebServer.getAssetUrl(TestHtmlConstants.JS_FORM_URL);
         // this loads a form, which automatically posts itself
-        assertLoadUrlSuccessfully(mWebView, url);
-        Thread.sleep(1000); // allow for javascript to post the form
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        // wait for JavaScript to post the form
+        mOnUiThread.waitForLoadCompletion();
         // the URL should have changed when the form was posted
-        assertFalse(url.equals(mWebView.getUrl()));
+        assertFalse(url.equals(mOnUiThread.getUrl()));
         // reloading the current URL should trigger the callback
-        mWebView.reload();
-        new DelayedCheck(TEST_TIMEOUT) {
+        mOnUiThread.reload();
+        new PollingCheck(TEST_TIMEOUT) {
+            @Override
             protected boolean check() {
                 return webViewClient.hasOnFormResubmissionCalled();
             }
         }.run();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "doUpdateVisitedHistory",
-        args = {WebView.class, String.class, boolean.class}
-    )
     public void testDoUpdateVisitedHistory() throws Exception {
         final MockWebViewClient webViewClient = new MockWebViewClient();
-        mWebView.setWebViewClient(webViewClient);
+        mOnUiThread.setWebViewClient(webViewClient);
         mWebServer = new CtsTestServer(getActivity());
 
         assertFalse(webViewClient.hasDoUpdateVisitedHistoryCalled());
         String url1 = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
         String url2 = mWebServer.getAssetUrl(TestHtmlConstants.BR_TAG_URL);
-        assertLoadUrlSuccessfully(mWebView, url1);
-        assertLoadUrlSuccessfully(mWebView, url2);
-        new DelayedCheck(TEST_TIMEOUT) {
+        mOnUiThread.loadUrlAndWaitForCompletion(url1);
+        mOnUiThread.loadUrlAndWaitForCompletion(url2);
+        new PollingCheck(TEST_TIMEOUT) {
+            @Override
             protected boolean check() {
                 return webViewClient.hasDoUpdateVisitedHistoryCalled();
             }
         }.run();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onReceivedHttpAuthRequest",
-        args = {WebView.class, HttpAuthHandler.class, String.class, String.class}
-    )
     public void testOnReceivedHttpAuthRequest() throws Exception {
         final MockWebViewClient webViewClient = new MockWebViewClient();
-        mWebView.setWebViewClient(webViewClient);
+        mOnUiThread.setWebViewClient(webViewClient);
         mWebServer = new CtsTestServer(getActivity());
 
         assertFalse(webViewClient.hasOnReceivedHttpAuthRequestCalled());
         String url = mWebServer.getAuthAssetUrl(TestHtmlConstants.EMBEDDED_IMG_URL);
-        assertLoadUrlSuccessfully(mWebView, url);
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
         assertTrue(webViewClient.hasOnReceivedHttpAuthRequestCalled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "shouldOverrideKeyEvent",
-        args = {WebView.class, KeyEvent.class}
-    )
     public void testShouldOverrideKeyEvent() {
         final MockWebViewClient webViewClient = new MockWebViewClient();
-        mWebView.setWebViewClient(webViewClient);
+        mOnUiThread.setWebViewClient(webViewClient);
 
-        assertFalse(webViewClient.shouldOverrideKeyEvent(mWebView, null));
+        assertFalse(webViewClient.shouldOverrideKeyEvent(mOnUiThread.getWebView(), null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onUnhandledKeyEvent",
-        args = {WebView.class, KeyEvent.class}
-    )
     public void testOnUnhandledKeyEvent() throws Throwable {
         final MockWebViewClient webViewClient = new MockWebViewClient();
-        mWebView.setWebViewClient(webViewClient);
+        mOnUiThread.setWebViewClient(webViewClient);
 
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.requestFocus();
-            }
-        });
+        mOnUiThread.requestFocus();
         getInstrumentation().waitForIdleSync();
 
         assertFalse(webViewClient.hasOnUnhandledKeyEventCalled());
         sendKeys(KeyEvent.KEYCODE_1);
 
-        new DelayedCheck(TEST_TIMEOUT) {
+        new PollingCheck(TEST_TIMEOUT) {
+            @Override
             protected boolean check() {
                 return webViewClient.hasOnUnhandledKeyEventCalled();
             }
         }.run();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onScaleChanged",
-        args = {WebView.class, float.class, float.class}
-    )
     public void testOnScaleChanged() throws Throwable {
         final MockWebViewClient webViewClient = new MockWebViewClient();
-        mWebView.setWebViewClient(webViewClient);
+        mOnUiThread.setWebViewClient(webViewClient);
 
         assertFalse(webViewClient.hasOnScaleChangedCalled());
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.zoomIn();
-            }
-        });
+        mOnUiThread.zoomIn();
         getInstrumentation().waitForIdleSync();
         assertTrue(webViewClient.hasOnScaleChangedCalled());
     }
 
-    private void assertLoadUrlSuccessfully(final WebView view, String url) {
-        view.loadUrl(url);
-        // wait until load is complete
-        new DelayedCheck(TEST_TIMEOUT) {
-            @Override
-            protected boolean check() {
-                return view.getProgress() == 100;
-            }
-        }.run();
-    }
-
-    private class MockWebViewClient extends WebViewClient {
+    private class MockWebViewClient extends WaitForLoadedClient {
         private boolean mOnPageStartedCalled;
         private boolean mOnPageFinishedCalled;
         private boolean mOnLoadResourceCalled;
@@ -279,6 +203,10 @@
         private boolean mOnUnhandledKeyEventCalled;
         private boolean mOnScaleChangedCalled;
 
+        public MockWebViewClient() {
+            super(mOnUiThread);
+        }
+
         public boolean hasOnPageStartedCalled() {
             return mOnPageStartedCalled;
         }
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
index db0f685..791c92a 100755
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
@@ -16,22 +16,16 @@
 
 package android.webkit.cts;
 
-import dalvik.annotation.BrokenTest;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
-
 import android.content.Context;
 import android.content.res.AssetManager;
+import android.cts.util.PollingCheck;
 import android.graphics.Bitmap;
+import android.graphics.Bitmap.Config;
 import android.graphics.BitmapFactory;
 import android.graphics.Canvas;
 import android.graphics.Color;
 import android.graphics.Picture;
 import android.graphics.Rect;
-import android.graphics.Bitmap.Config;
 import android.net.Uri;
 import android.net.http.SslCertificate;
 import android.net.http.SslError;
@@ -44,11 +38,9 @@
 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;
@@ -58,41 +50,48 @@
 import android.webkit.WebChromeClient;
 import android.webkit.WebSettings;
 import android.webkit.WebView;
-import android.webkit.WebViewClient;
-import android.webkit.WebViewDatabase;
 import android.webkit.WebView.HitTestResult;
 import android.webkit.WebView.PictureListener;
-import android.widget.AutoCompleteTextView;
+import android.webkit.WebViewClient;
+import android.webkit.WebViewDatabase;
+import android.webkit.cts.WebViewOnUiThread.WaitForLoadedClient;
+import android.webkit.cts.WebViewOnUiThread.WaitForProgressClient;
 import android.widget.LinearLayout;
 
+
+import junit.framework.Assert;
+
 import java.io.File;
 import java.io.FileInputStream;
 import java.util.Date;
 
-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;
+    /**
+     * This is the minimum number of milliseconds to wait for scrolling to
+     * start. If no scrolling has started before this timeout then it is
+     * assumed that no scrolling will happen.
+     */
+    private static final long MIN_SCROLL_WAIT_MS = 1000;
+    /**
+     * Once scrolling has started, this is the interval that scrolling
+     * is checked to see if there is a change. If no scrolling change
+     * has happened in the given time then it is assumed that scrolling
+     * has stopped.
+     */
+    private static final long SCROLL_WAIT_INTERVAL_MS = 200;
 
     private WebView mWebView;
     private CtsTestServer mWebServer;
-    private boolean mIsUiThreadDone;
+    private WebViewOnUiThread mOnUiThread;
 
     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();
@@ -100,20 +99,13 @@
         if (f.exists()) {
             f.delete();
         }
+        mOnUiThread = new WebViewOnUiThread(this, mWebView);
     }
 
     @Override
     protected void tearDown() throws Exception {
-        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");
-        }
+        mOnUiThread.clearHistory();
+        mOnUiThread.clearCache(true);
         if (mWebServer != null) {
             mWebServer.shutdown();
         }
@@ -125,23 +117,6 @@
         mWebServer = new CtsTestServer(getActivity(), secure);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "WebView",
-            args = {Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "WebView",
-            args = {Context.class, AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "WebView",
-            args = {Context.class, AttributeSet.class, int.class}
-        )
-    })
     @UiThreadTest
     public void testConstructor() {
         new WebView(getActivity());
@@ -149,11 +124,6 @@
         new WebView(getActivity(), null, 0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "findAddress",
-        args = {String.class}
-    )
     @UiThreadTest
     public void testFindAddress() {
         /*
@@ -161,14 +131,16 @@
          * http://en.wikipedia.org/wiki/Postal_address#United_States
          * http://www.usps.com/
          */
+        // full address, invalid zip code
+        assertNull(WebView.findAddress("455 LARKSPUR DRIVE CALIFORNIA SPRINGS CALIFORNIA 92926"));
         // full address
-        assertEquals("455 LARKSPUR DRIVE CALIFORNIA SPRINGS CALIFORNIA 92926",
-                WebView.findAddress("455 LARKSPUR DRIVE CALIFORNIA SPRINGS CALIFORNIA 92926"));
+        assertEquals("455 LARKSPUR DRIVE CALIFORNIA SPRINGS CALIFORNIA 92826",
+                WebView.findAddress("455 LARKSPUR DRIVE CALIFORNIA SPRINGS CALIFORNIA 92826"));
         // full address ( with abbreviated street type and state)
-        assertEquals("455 LARKSPUR DR CALIFORNIA SPRINGS CA 92926",
-                WebView.findAddress("455 LARKSPUR DR CALIFORNIA SPRINGS CA 92926"));
+        assertEquals("455 LARKSPUR DR CALIFORNIA SPRINGS CA 92826",
+                WebView.findAddress("455 LARKSPUR DR CALIFORNIA SPRINGS CA 92826"));
         // misspell the state ( CALIFORNIA -> CALIFONIA )
-        assertNull(WebView.findAddress("455 LARKSPUR DRIVE CALIFORNIA SPRINGS CALIFONIA 92926"));
+        assertNull(WebView.findAddress("455 LARKSPUR DRIVE CALIFORNIA SPRINGS CALIFONIA 92826"));
         // without optional zip code
         assertEquals("455 LARKSPUR DR CALIFORNIA SPRINGS CA",
                 WebView.findAddress("455 LARKSPUR DR CALIFORNIA SPRINGS CA"));
@@ -178,18 +150,6 @@
         assertNull(WebView.findAddress("455 LARKSPUR DR"));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "getZoomControls",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSettings",
-            args = {}
-        )
-    })
     @SuppressWarnings("deprecation")
     @UiThreadTest
     public void testGetZoomControls() {
@@ -204,44 +164,16 @@
          assertNull(mWebView.getZoomControls());
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        method = "invokeZoomPicker",
-        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(url);
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
         mWebView.invokeZoomPicker();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "zoomIn",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "zoomOut",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getScale",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSettings",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testZoom() {
         WebSettings settings = mWebView.getSettings();
@@ -304,23 +236,6 @@
         assertEquals(currScale, previousScale);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setScrollBarStyle",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "overlayHorizontalScrollbar",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "overlayVerticalScrollbar",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testSetScrollBarStyle() {
         mWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_INSET);
@@ -340,28 +255,6 @@
         assertTrue(mWebView.overlayVerticalScrollbar());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setHorizontalScrollbarOverlay",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVerticalScrollbarOverlay",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "overlayHorizontalScrollbar",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "overlayVerticalScrollbar",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testScrollBarOverlay() throws Throwable {
         mWebView.setHorizontalScrollbarOverlay(true);
@@ -375,28 +268,6 @@
         assertTrue(mWebView.overlayVerticalScrollbar());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "loadUrl",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getUrl",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getOriginalUrl",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getProgress",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testLoadUrl() throws Exception {
         assertNull(mWebView.getUrl());
@@ -405,64 +276,34 @@
 
         startWebServer(false);
         String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
-        mWebView.loadUrl(url);
-        waitForLoadComplete();
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
         assertEquals(100, mWebView.getProgress());
         assertEquals(url, mWebView.getUrl());
         assertEquals(url, mWebView.getOriginalUrl());
         assertEquals(TestHtmlConstants.HELLO_WORLD_TITLE, mWebView.getTitle());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getUrl",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getOriginalUrl",
-            args = {}
-        )
-    })
+    @UiThreadTest
     public void testGetOriginalUrl() throws Throwable {
         startWebServer(false);
         final String finalUrl = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
         final String redirectUrl =
                 mWebServer.getRedirectingAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
 
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                assertNull(mWebView.getUrl());
-                assertNull(mWebView.getOriginalUrl());
+        assertNull(mWebView.getUrl());
+        assertNull(mWebView.getOriginalUrl());
 
-                // By default, WebView sends an intent to ask the system to
-                // handle loading a new URL. We set a WebViewClient as
-                // WebViewClient.shouldOverrideUrlLoading() returns false, so
-                // the WebView will load the new URL.
-                mWebView.setWebViewClient(new WebViewClient());
-                mWebView.setWebChromeClient(new LoadCompleteWebChromeClient());
-                mWebView.loadUrl(redirectUrl);
-            }
-        });
+        // By default, WebView sends an intent to ask the system to
+        // handle loading a new URL. We set a WebViewClient as
+        // WebViewClient.shouldOverrideUrlLoading() returns false, so
+        // the WebView will load the new URL.
+        mOnUiThread.setWebViewClient(new WaitForLoadedClient(mOnUiThread));
+        mOnUiThread.loadUrlAndWaitForCompletion(redirectUrl);
 
-        // We need to yield the UI thread to allow the callback to
-        // WebViewClient.shouldOverrideUrlLoading() to be made.
-        waitForUiThreadDone();
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                assertEquals(finalUrl, mWebView.getUrl());
-                assertEquals(redirectUrl, mWebView.getOriginalUrl());
-            }
-        });
+        assertEquals(finalUrl, mWebView.getUrl());
+        assertEquals(redirectUrl, mWebView.getOriginalUrl());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "stopLoading",
-        args = {}
-    )
     @UiThreadTest
     public void testStopLoading() throws Exception {
         assertNull(mWebView.getUrl());
@@ -472,7 +313,7 @@
         String url = mWebServer.getDelayedAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
         mWebView.loadUrl(url);
         mWebView.stopLoading();
-        new DelayedCheck() {
+        new PollingCheck() {
             @Override
             protected boolean check() {
                 return 100 == mWebView.getProgress();
@@ -481,38 +322,6 @@
         assertNull(mWebView.getUrl());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "canGoBack",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "canGoForward",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "canGoBackOrForward",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "goBack",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "goForward",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "goBackOrForward",
-            args = {int.class}
-        )
-    })
     @UiThreadTest
     public void testGoBackAndForward() throws Exception {
         assertGoBackOrForwardBySteps(false, -1);
@@ -523,47 +332,42 @@
         String url2 = mWebServer.getAssetUrl(TestHtmlConstants.HTML_URL2);
         String url3 = mWebServer.getAssetUrl(TestHtmlConstants.HTML_URL3);
 
-        assertLoadUrlSuccessfully(url1);
-        delayedCheckWebBackForwardList(url1, 0, 1);
+        mOnUiThread.loadUrlAndWaitForCompletion(url1);
+        pollingCheckWebBackForwardList(url1, 0, 1);
         assertGoBackOrForwardBySteps(false, -1);
         assertGoBackOrForwardBySteps(false, 1);
 
-        assertLoadUrlSuccessfully(url2);
-        delayedCheckWebBackForwardList(url2, 1, 2);
+        mOnUiThread.loadUrlAndWaitForCompletion(url2);
+        pollingCheckWebBackForwardList(url2, 1, 2);
         assertGoBackOrForwardBySteps(true, -1);
         assertGoBackOrForwardBySteps(false, 1);
 
-        assertLoadUrlSuccessfully(url3);
-        delayedCheckWebBackForwardList(url3, 2, 3);
+        mOnUiThread.loadUrlAndWaitForCompletion(url3);
+        pollingCheckWebBackForwardList(url3, 2, 3);
         assertGoBackOrForwardBySteps(true, -2);
         assertGoBackOrForwardBySteps(false, 1);
 
         mWebView.goBack();
-        delayedCheckWebBackForwardList(url2, 1, 3);
+        pollingCheckWebBackForwardList(url2, 1, 3);
         assertGoBackOrForwardBySteps(true, -1);
         assertGoBackOrForwardBySteps(true, 1);
 
         mWebView.goForward();
-        delayedCheckWebBackForwardList(url3, 2, 3);
+        pollingCheckWebBackForwardList(url3, 2, 3);
         assertGoBackOrForwardBySteps(true, -2);
         assertGoBackOrForwardBySteps(false, 1);
 
         mWebView.goBackOrForward(-2);
-        delayedCheckWebBackForwardList(url1, 0, 3);
+        pollingCheckWebBackForwardList(url1, 0, 3);
         assertGoBackOrForwardBySteps(false, -1);
         assertGoBackOrForwardBySteps(true, 2);
 
         mWebView.goBackOrForward(2);
-        delayedCheckWebBackForwardList(url3, 2, 3);
+        pollingCheckWebBackForwardList(url3, 2, 3);
         assertGoBackOrForwardBySteps(true, -2);
         assertGoBackOrForwardBySteps(false, 1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addJavascriptInterface",
-        args = {Object.class, String.class}
-    )
     @UiThreadTest
     public void testAddJavascriptInterface() throws Exception {
         WebSettings settings = mWebView.getSettings();
@@ -605,15 +409,10 @@
 
         startWebServer(false);
         String url = mWebServer.getAssetUrl(TestHtmlConstants.ADD_JAVA_SCRIPT_INTERFACE_URL);
-        assertLoadUrlSuccessfully(url);
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
         assertEquals("Original title", obj.waitForResult());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addJavascriptInterface",
-        args = {Object.class, String.class}
-    )
     @UiThreadTest
     public void testAddJavascriptInterfaceNullObject() throws Exception {
         WebSettings settings = mWebView.getSettings();
@@ -622,77 +421,30 @@
                 "<body onload=\"document.title = typeof window.injectedObject;\"></body></html>";
 
         // Test that the property is initially undefined.
-        mWebView.loadData(setTitleToPropertyTypeHtml, "text/html", null);
-        waitForLoadComplete();
+        mOnUiThread.loadDataAndWaitForCompletion(setTitleToPropertyTypeHtml,
+                "text/html", null);
         assertEquals("undefined", mWebView.getTitle());
 
         // Test that adding a null object has no effect.
         mWebView.addJavascriptInterface(null, "injectedObject");
-        mWebView.loadData(setTitleToPropertyTypeHtml, "text/html", null);
-        waitForLoadComplete();
+        mOnUiThread.loadDataAndWaitForCompletion(setTitleToPropertyTypeHtml,
+                "text/html", null);
         assertEquals("undefined", mWebView.getTitle());
 
         // Test that adding an object gives an object type.
         final Object obj = new Object();
         mWebView.addJavascriptInterface(obj, "injectedObject");
-        mWebView.loadData(setTitleToPropertyTypeHtml, "text/html", null);
-        waitForLoadComplete();
+        mOnUiThread.loadDataAndWaitForCompletion(setTitleToPropertyTypeHtml,
+                "text/html", null);
         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", null);
-        waitForLoadComplete();
+        mOnUiThread.loadDataAndWaitForCompletion(setTitleToPropertyTypeHtml,
+                "text/html", null);
         assertEquals("object", mWebView.getTitle());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addJavascriptInterface",
-            args = {Object.class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeJavascriptInterface",
-            args = {String.class}
-        )
-    })
-    @UiThreadTest
-    public void testAddJavascriptInterfaceOddName() throws Exception {
-        WebSettings settings = mWebView.getSettings();
-        settings.setJavaScriptEnabled(true);
-        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'.
-        // See b/3279426
-        //String oddNames[] = {" x y ", "`!\"$%^&*()-=_+[]{};#:@~\\|,./<>?\n\r ", " ", "\n", ""};
-        String oddNames[] = {" x y ", "`!\"$%^&*()-=_+[]{};:@~|,./<>? ", " ", ""};
-        for (String name : oddNames) {
-            String setTitleToPropertyTypeHtml = "<html><head>" +
-                    "<script>function updateTitle() { document.title = typeof window['" +
-                    name +
-                    "']; }</script>" +
-                    "</head><body onload=\"updateTitle();\"></body></html>";
-
-            mWebView.addJavascriptInterface(obj, name);
-            mWebView.loadData(Uri.encode(setTitleToPropertyTypeHtml), "text/html", null);
-            waitForLoadComplete();
-            assertEquals("object", mWebView.getTitle());
-
-            mWebView.removeJavascriptInterface(name);
-            mWebView.loadData(Uri.encode(setTitleToPropertyTypeHtml), "text/html", null);
-            waitForLoadComplete();
-            assertEquals("undefined", mWebView.getTitle());
-        }
-    }
-
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "removeJavascriptInterface",
-        args = {String.class}
-    )
     @UiThreadTest
     public void testRemoveJavascriptInterface() throws Exception {
         WebSettings settings = mWebView.getSettings();
@@ -702,22 +454,17 @@
 
         // Test that adding an object gives an object type.
         mWebView.addJavascriptInterface(new Object(), "injectedObject");
-        mWebView.loadData(setTitleToPropertyTypeHtml, "text/html", null);
-        waitForLoadComplete();
+        mOnUiThread.loadDataAndWaitForCompletion(setTitleToPropertyTypeHtml,
+                "text/html", null);
         assertEquals("object", mWebView.getTitle());
 
         // Test that reloading the page after removing the object leaves the property undefined.
         mWebView.removeJavascriptInterface("injectedObject");
-        mWebView.loadData(setTitleToPropertyTypeHtml, "text/html", null);
-        waitForLoadComplete();
+        mOnUiThread.loadDataAndWaitForCompletion(setTitleToPropertyTypeHtml,
+                "text/html", null);
         assertEquals("undefined", mWebView.getTitle());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "removeJavascriptInterface",
-        args = {String.class}
-    )
     public void testUseRemovedJavascriptInterface() throws Throwable {
         class RemovedObject {
             @Override
@@ -725,12 +472,8 @@
                 return "removedObject";
             }
             public void remove() throws Throwable {
-                runTestOnUiThread(new Runnable() {
-                    public void run() {
-                        mWebView.removeJavascriptInterface("removedObject");
-                        System.gc();
-                    }
-                });
+                mOnUiThread.removeJavascriptInterface("removedObject");
+                System.gc();
             }
         }
         class ResultObject {
@@ -755,51 +498,26 @@
 
         // 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", null);
-            }
-        });
+        mOnUiThread.getSettings().setJavaScriptEnabled(true);
+        mOnUiThread.addJavascriptInterface(new RemovedObject(), "removedObject");
+        mOnUiThread.addJavascriptInterface(resultObject, "resultObject");
+        mOnUiThread.loadDataAndWaitForCompletion("<html><head></head>" +
+                "<body onload=\"window.removedObject.remove();" +
+                "resultObject.setResult(removedObject.toString());\"></body></html>",
+                "text/html", null);
         assertEquals("removedObject", resultObject.getResult());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setBackgroundColor",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "capturePicture",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "reload",
-            args = {}
-        )
-    })
     public void testCapturePicture() throws Exception, Throwable {
         startWebServer(false);
         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();
-            }
-        });
+        // showing the blank page will make the picture filled with background color
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
         getInstrumentation().waitForIdleSync();
 
         class PictureRunnable implements Runnable {
             private Picture mPicture;
+            @Override
             public void run() {
                 mPicture = mWebView.capturePicture();
                 Bitmap b = Bitmap.createBitmap(mPicture.getWidth(), mPicture.getHeight(),
@@ -809,8 +527,7 @@
                 assertBitmapFillWithColor(b, Color.WHITE);
 
                 mWebView.setBackgroundColor(Color.CYAN);
-                mWebView.reload();
-                waitForLoadComplete();
+                mOnUiThread.reloadAndWaitForCompletion();
             }
             public Picture getPicture() {
                 return mPicture;
@@ -827,6 +544,7 @@
         assertBitmapFillWithColor(b, Color.WHITE);
 
         runTestOnUiThread(new Runnable() {
+            @Override
             public void run() {
                 // update the content
                 Picture p = mWebView.capturePicture();
@@ -837,18 +555,17 @@
         });
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setPictureListener",
-        args = {PictureListener.class}
-    )
     public void testSetPictureListener() throws Exception, Throwable {
         final class MyPictureListener implements PictureListener {
             public int callCount;
             public WebView webView;
             public Picture picture;
 
+            @Override
             public void onNewPicture(WebView view, Picture picture) {
+                // Need to inform the listener tracking new picture
+                // for the "page loaded" knowledge since it has been replaced.
+                mOnUiThread.onNewPicture();
                 this.callCount += 1;
                 this.webView = view;
                 this.picture = picture;
@@ -858,13 +575,10 @@
         final MyPictureListener listener = new MyPictureListener();
         startWebServer(false);
         final String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.setPictureListener(listener);
-                assertLoadUrlSuccessfully(url);
-            }
-        });
-        new DelayedCheck(TEST_TIMEOUT) {
+        mOnUiThread.setPictureListener(listener);
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        new PollingCheck(TEST_TIMEOUT) {
+            @Override
             protected boolean check() {
                 return listener.callCount > 0;
             }
@@ -874,45 +588,20 @@
 
         final int oldCallCount = listener.callCount;
         final String newUrl = mWebServer.getAssetUrl(TestHtmlConstants.SMALL_IMG_URL);
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                assertLoadUrlSuccessfully(newUrl);
-            }
-        });
-        new DelayedCheck(TEST_TIMEOUT) {
+        mOnUiThread.loadUrlAndWaitForCompletion(newUrl);
+        new PollingCheck(TEST_TIMEOUT) {
+            @Override
             protected boolean check() {
                 return listener.callCount > oldCallCount;
             }
         }.run();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "savePicture",
-            args = {Bundle.class, File.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            notes = "Cannot test whether picture has been restored correctly.",
-            method = "restorePicture",
-            args = {Bundle.class, File.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "reload",
-            args = {}
-        )
-    })
     public void testSaveAndRestorePicture() throws Throwable {
         mWebView.setBackgroundColor(Color.CYAN);
         startWebServer(false);
         final String url = mWebServer.getAssetUrl(TestHtmlConstants.BLANK_PAGE_URL);
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                assertLoadUrlSuccessfully(url);
-            }
-        });
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
         getInstrumentation().waitForIdleSync();
 
         final Bundle bundle = new Bundle();
@@ -924,14 +613,10 @@
         try {
             assertTrue(bundle.isEmpty());
             assertEquals(0, f.length());
-            runTestOnUiThread(new Runnable() {
-                public void run() {
-                    assertTrue(mWebView.savePicture(bundle, f));
-                }
-            });
+            assertTrue(mOnUiThread.savePicture(bundle, f));
 
             // File saving is done in a separate thread.
-            new DelayedCheck() {
+            new PollingCheck() {
                 @Override
                 protected boolean check() {
                     return f.length() > 0;
@@ -945,16 +630,12 @@
             p.draw(new Canvas(b));
             assertBitmapFillWithColor(b, Color.CYAN);
 
-            runTestOnUiThread(new Runnable() {
-                public void run() {
-                    mWebView.setBackgroundColor(Color.WHITE);
-                    mWebView.reload();
-                    waitForLoadComplete();
-                }
-            });
+            mOnUiThread.setBackgroundColor(Color.WHITE);
+            mOnUiThread.reloadAndWaitForCompletion();
             getInstrumentation().waitForIdleSync();
 
             runTestOnUiThread(new Runnable() {
+                @Override
                 public void run() {
                     Bitmap b = Bitmap.createBitmap(mWebView.getWidth(), mWebView.getHeight(),
                             Config.ARGB_8888);
@@ -976,18 +657,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setHttpAuthUsernamePassword",
-            args = {String.class, String.class, String.class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getHttpAuthUsernamePassword",
-            args = {String.class, String.class}
-        )
-    })
     @UiThreadTest
     public void testAccessHttpAuthUsernamePassword() {
         try {
@@ -1050,11 +719,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "savePassword",
-        args = {String.class, String.class, String.class}
-    )
     @UiThreadTest
     public void testSavePassword() {
         WebViewDatabase db = WebViewDatabase.getInstance(getActivity());
@@ -1072,44 +736,24 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "loadData",
-            args = {String.class, String.class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitle",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "capturePicture",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "capturePicture",
-            args = {}
-        )
-    })
     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", null);
-                waitForLoadComplete();
-                assertEquals("Hello,World!", mWebView.getTitle());
-            }
-        });
+        final String HTML_CONTENT =
+                "<html><head><title>Hello,World!</title></head><body></body>" +
+                "</html>";
+        assertNull(mOnUiThread.getTitle());
+        mOnUiThread.loadDataAndWaitForCompletion(HTML_CONTENT,
+                "text/html", null);
+        assertEquals("Hello,World!", mOnUiThread.getTitle());
 
         // Test that JavaScript can't access cross-origin content.
-        class ConsoleMessageWebChromeClient extends WebChromeClient {
+        class ConsoleMessageWebChromeClient extends WaitForProgressClient {
             private boolean mIsMessageLevelAvailable;
             private ConsoleMessage.MessageLevel mMessageLevel;
+
+            public ConsoleMessageWebChromeClient() {
+                super(mOnUiThread);
+            }
+
             @Override
             public synchronized boolean onConsoleMessage(ConsoleMessage message) {
                 mMessageLevel = message.messageLevel();
@@ -1131,10 +775,12 @@
         final ConsoleMessageWebChromeClient webChromeClient = new ConsoleMessageWebChromeClient();
         final String crossOriginUrl = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
         runTestOnUiThread(new Runnable() {
+            @Override
             public void run() {
                 mWebView.getSettings().setJavaScriptEnabled(true);
-                mWebView.setWebChromeClient(webChromeClient);
-                mWebView.loadData("<html><head></head><body onload=\"" +
+                mOnUiThread.setWebChromeClient(webChromeClient);
+                mOnUiThread.loadDataAndWaitForCompletion(
+                        "<html><head></head><body onload=\"" +
                         "document.title = " +
                         "document.getElementById('frame').contentWindow.location.href;" +
                         "\"><iframe id=\"frame\" src=\"" + crossOriginUrl + "\"></body></html>",
@@ -1144,23 +790,6 @@
         assertEquals(ConsoleMessage.MessageLevel.ERROR, webChromeClient.getMessageLevel());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "loadDataWithBaseURL",
-            args = {String.class, String.class, String.class, String.class, String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTitle",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getUrl",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testLoadDataWithBaseUrl() throws Exception {
         assertNull(mWebView.getTitle());
@@ -1171,172 +800,106 @@
         startWebServer(false);
         String baseUrl = mWebServer.getAssetUrl("foo.html");
         String historyUrl = "random";
-        mWebView.loadDataWithBaseURL(baseUrl,
+        mOnUiThread.loadDataWithBaseURLAndWaitForCompletion(baseUrl,
                 "<html><body><img src=\"" + imgUrl + "\"/></body></html>",
                 "text/html", "UTF-8", historyUrl);
-        waitForLoadComplete();
         assertTrue(mWebServer.getLastRequestUrl().endsWith(imgUrl));
         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,
+        mOnUiThread.loadDataWithBaseURLAndWaitForCompletion(baseUrl,
                 "<html><body><img src=\"" + imgUrl + "\"/></body></html>",
                 "text/html", "UTF-8", null);
-        waitForLoadComplete();
         assertTrue(mWebServer.getLastRequestUrl().endsWith(imgUrl));
         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=\"" +
+        mOnUiThread.loadDataWithBaseURLAndWaitForCompletion(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();
+        mOnUiThread.loadDataWithBaseURLAndWaitForCompletion("data:foo",
+                "<html><body>bar</body></html>", "text/html", "UTF-8",
+                historyUrl);
         assertTrue(mWebView.getUrl().indexOf("data:text/html,") == 0);
         assertTrue(mWebView.getUrl().indexOf("bar") > 0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        method = "findAll",
-        args = {String.class},
-        notes = "Cannot check highlighting"
-    )
     @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", null);
-        waitForLoadComplete();
+        mOnUiThread.loadDataAndWaitForCompletion("<html><body>" + p
+                + "</body></html>", "text/html", null);
 
         assertEquals(2, mWebView.findAll("find"));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "findNext",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "findAll",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "clearMatches",
-            args = {}
-        )
-    })
     public void testFindNext() throws Throwable {
-        final ScrollRunnable runnable = new ScrollRunnable();
+        // Reset the scaling so that finding the next "all" text will require scrolling.
+        mOnUiThread.setInitialScale(100);
 
-        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;
-            }
-        }
+        DisplayMetrics metrics = mOnUiThread.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 FindNextRunnable implements Runnable {
-            private boolean mForward;
-            FindNextRunnable(boolean forward) {
-                mForward = forward;
-            }
-            public void run() {
-                mWebView.findNext(mForward);
-            }
-        }
+        mOnUiThread.loadDataAndWaitForCompletion("<html><body>" + p + p + "</body></html>", "text/html", null);
 
-        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", null);
-                waitForLoadComplete();
-
-                // highlight all the strings found
-                mWebView.findAll("all");
-            }
-        });
+        // highlight all the strings found
+        mOnUiThread.findAll("all");
         getInstrumentation().waitForIdleSync();
 
-        runTestOnUiThread(runnable);
-        int previousScrollY = runnable.getScrollY();
+        int previousScrollY = mOnUiThread.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();
+        mOnUiThread.findNext(true);
+        waitForScrollingComplete(previousScrollY);
+        assertTrue(mOnUiThread.getScrollY() > previousScrollY);
+        previousScrollY = mOnUiThread.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();
+        mOnUiThread.findNext(true);
+        waitForScrollingComplete(previousScrollY);
+        assertTrue(mOnUiThread.getScrollY() < previousScrollY);
+        previousScrollY = mOnUiThread.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();
+        mOnUiThread.findNext(false);
+        waitForScrollingComplete(previousScrollY);
+        assertTrue(mOnUiThread.getScrollY() > previousScrollY);
+        previousScrollY = mOnUiThread.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();
+        mOnUiThread.findNext(false);
+        waitForScrollingComplete(previousScrollY);
+        assertTrue(mOnUiThread.getScrollY() < previousScrollY);
+        previousScrollY = mOnUiThread.getScrollY();
 
         // clear the result
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.clearMatches();
-            }
-        });
+        mOnUiThread.clearMatches();
         getInstrumentation().waitForIdleSync();
 
         // can not scroll any more
-        runTestOnUiThread(new FindNextRunnable(false));
-        new StopScrollingDelayedCheck().run();
-        assertTrue(runnable.getScrollY() == previousScrollY);
+        mOnUiThread.findNext(false);
+        waitForScrollingComplete(previousScrollY);
+        assertTrue(mOnUiThread.getScrollY() == previousScrollY);
 
-        runTestOnUiThread(new FindNextRunnable(true));
-        new StopScrollingDelayedCheck().run();
-        assertTrue(runnable.getScrollY() == previousScrollY);
+        mOnUiThread.findNext(true);
+        waitForScrollingComplete(previousScrollY);
+        assertTrue(mOnUiThread.getScrollY() == previousScrollY);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "documentHasImages",
-        args = {android.os.Message.class}
-    )
     public void testDocumentHasImages() throws Exception, Throwable {
         final class DocumentHasImageCheckHandler extends Handler {
             private boolean mReceived;
@@ -1367,17 +930,17 @@
             new DocumentHasImageCheckHandler(mWebView.getHandler().getLooper());
 
         runTestOnUiThread(new Runnable() {
+            @Override
             public void run() {
-                mWebView.loadData("<html><body><img src=\"" + imgUrl + "\"/></body></html>",
-                        "text/html", null);
-                waitForLoadComplete();
+                mOnUiThread.loadDataAndWaitForCompletion("<html><body><img src=\""
+                        + imgUrl + "\"/></body></html>", "text/html", null);
                 Message response = new Message();
                 response.setTarget(handler);
                 assertFalse(handler.hasCalledHandleMessage());
                 mWebView.documentHasImages(response);
             }
         });
-        new DelayedCheck() {
+        new PollingCheck() {
             @Override
             protected boolean check() {
                 return handler.hasCalledHandleMessage();
@@ -1386,168 +949,68 @@
         assertEquals(1, handler.getMsgArg1());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "pageDown",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "pageUp",
-            args = {boolean.class}
-        )
-    })
     public void testPageScroll() throws Throwable {
-        final class PageUpRunnable implements Runnable {
-            private boolean mResult;
-            public void run() {
-                mResult = mWebView.pageUp(false);
-            }
-            public boolean getResult() {
-                return mResult;
-            }
-        }
-
-        final class PageDownRunnable implements Runnable {
-            private boolean mResult;
-            public void run() {
-                mResult = mWebView.pageDown(false);
-            }
-            public boolean getResult() {
-                return mResult;
-            }
-        }
-
-        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", null);
-                waitForLoadComplete();
-            }
-        });
+        DisplayMetrics metrics = mOnUiThread.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>";
+        mOnUiThread.loadDataAndWaitForCompletion("<html><body>" + p
+                + p + "</body></html>", "text/html", null);
         getInstrumentation().waitForIdleSync();
 
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                assertTrue(mWebView.pageDown(false));
-            }
-        });
+        assertTrue(mOnUiThread.pageDown(false));
 
-        PageDownRunnable pageDownRunnable = new PageDownRunnable();
         do {
             getInstrumentation().waitForIdleSync();
-            runTestOnUiThread(pageDownRunnable);
-        } while (pageDownRunnable.getResult());
+        } while (mOnUiThread.pageDown(false));
 
-        ScrollRunnable scrollRunnable = new ScrollRunnable();
         getInstrumentation().waitForIdleSync();
-        runTestOnUiThread(scrollRunnable);
-        int bottomScrollY = scrollRunnable.getScrollY();
+        int bottomScrollY = mOnUiThread.getScrollY();
 
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                assertTrue(mWebView.pageUp(false));
-            }
-        });
+        assertTrue(mOnUiThread.pageUp(false));
 
-        PageUpRunnable pageUpRunnable = new PageUpRunnable();
         do {
             getInstrumentation().waitForIdleSync();
-            runTestOnUiThread(pageUpRunnable);
-        } while (pageUpRunnable.getResult());
+        } while (mOnUiThread.pageUp(false));
 
         getInstrumentation().waitForIdleSync();
-        runTestOnUiThread(scrollRunnable);
-        int topScrollY = scrollRunnable.getScrollY();
+        int topScrollY = mOnUiThread.getScrollY();
 
         // jump to the bottom
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                assertTrue(mWebView.pageDown(true));
-            }
-        });
+        assertTrue(mOnUiThread.pageDown(true));
         getInstrumentation().waitForIdleSync();
-        runTestOnUiThread(scrollRunnable);
-        assertEquals(bottomScrollY, scrollRunnable.getScrollY());
+        assertEquals(bottomScrollY, mOnUiThread.getScrollY());
 
         // jump to the top
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                assertTrue(mWebView.pageUp(true));
-            }
-        });
+        assertTrue(mOnUiThread.pageUp(true));
         getInstrumentation().waitForIdleSync();
-        runTestOnUiThread(scrollRunnable);
-        assertEquals(topScrollY, scrollRunnable.getScrollY());
+        assertEquals(topScrollY, mOnUiThread.getScrollY());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getContentHeight",
-        args = {}
-    )
     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;
-            }
-        }
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.loadData("<html><body></body></html>", "text/html", null);
-                waitForLoadComplete();
-            }
-        });
+        mOnUiThread.loadDataAndWaitForCompletion(
+                "<html><body></body></html>", "text/html", null);
         getInstrumentation().waitForIdleSync();
 
         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", null);
-                waitForLoadComplete();
-            }
-        });
+        assertEquals(mOnUiThread.getHeight(), mOnUiThread.getContentHeight() * mOnUiThread.getScale(), 2f);
+        mOnUiThread.loadDataAndWaitForCompletion("<html><body>" + p
+                + "</body></html>", "text/html", null);
         getInstrumentation().waitForIdleSync();
 
-        HeightRunnable runnable = new HeightRunnable();
-        runTestOnUiThread(runnable);
-        assertTrue(runnable.getContentHeight() > pageHeight);
-        int extraSpace = runnable.getContentHeight() - pageHeight;
+        assertTrue(mOnUiThread.getContentHeight() > pageHeight);
+        int extraSpace = mOnUiThread.getContentHeight() - pageHeight;
 
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.loadData("<html><body>" + p + p + "</body></html>", "text/html", null);
-                waitForLoadComplete();
-            }
-        });
+        mOnUiThread.loadDataAndWaitForCompletion("<html><body>" + p
+                + p + "</body></html>", "text/html", null);
         getInstrumentation().waitForIdleSync();
-        runTestOnUiThread(runnable);
-        assertEquals(pageHeight + pageHeight + extraSpace, runnable.getContentHeight());
+        assertEquals(pageHeight + pageHeight + extraSpace,
+                mOnUiThread.getContentHeight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        method = "clearCache",
-        args = {boolean.class}
-    )
     @UiThreadTest
     public void testClearCache() throws Exception {
         final File cacheFileBaseDir = CacheManager.getCacheFileBaseDir();
@@ -1556,9 +1019,8 @@
 
         startWebServer(false);
         final String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
-        mWebView.loadUrl(url);
-        waitForLoadComplete();
-        new DelayedCheck(TEST_TIMEOUT) {
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        new PollingCheck(TEST_TIMEOUT) {
             @Override
             protected boolean check() {
                 CacheResult result = CacheManager.getCacheFile(url, null);
@@ -1575,7 +1037,7 @@
 
         mWebView.clearCache(true);
         // check the files are deleted
-        new DelayedCheck(TEST_TIMEOUT) {
+        new PollingCheck(TEST_TIMEOUT) {
             @Override
             protected boolean check() {
                 return cacheFileBaseDir.list().length == 0;
@@ -1583,38 +1045,12 @@
         }.run();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "enablePlatformNotifications",
-            args = {},
-            notes = "Cannot simulate data state or proxy changes"
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "disablePlatformNotifications",
-            args = {},
-            notes = "Cannot simulate data state or proxy changes"
-        )
-    })
     @UiThreadTest
     public void testPlatformNotifications() {
         WebView.enablePlatformNotifications();
         WebView.disablePlatformNotifications();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "getPluginList",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "refreshPlugins",
-            args = {boolean.class}
-        )
-    })
     @UiThreadTest
     public void testAccessPluginList() {
         assertNotNull(WebView.getPluginList());
@@ -1623,11 +1059,6 @@
         mWebView.refreshPlugins(false);
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        method = "destroy",
-        args = {}
-    )
     @UiThreadTest
     public void testDestroy() {
         // Create a new WebView, since we cannot call destroy() on a view in the hierarchy
@@ -1635,71 +1066,43 @@
         localWebView.destroy();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "flingScroll",
-        args = {int.class, int.class}
-    )
     public void testFlingScroll() throws Throwable {
-        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", null);
-                waitForLoadComplete();
-            }
-        });
+        DisplayMetrics metrics = mOnUiThread.getDisplayMetrics();
+        int dimension = 2 * Math.max(metrics.widthPixels, metrics.heightPixels);
+        String p = "<p style=\"height:" + dimension + "px;" +
+                "width:" + dimension + "px\">Test fling scroll.</p>";
+        mOnUiThread.loadDataAndWaitForCompletion("<html><body>" + p
+                + "</body></html>", "text/html", null);
         getInstrumentation().waitForIdleSync();
 
-        ScrollRunnable runnable = new ScrollRunnable();
-        runTestOnUiThread(runnable);
-        int previousScrollX = runnable.getScrollX();
-        int previousScrollY = runnable.getScrollY();
+        int previousScrollX = mOnUiThread.getScrollX();
+        int previousScrollY = mOnUiThread.getScrollY();
 
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.flingScroll(100, 100);
-            }
-        });
+        mOnUiThread.flingScroll(100, 100);
 
         int timeSlice = 500;
         Thread.sleep(timeSlice);
-        runTestOnUiThread(runnable);
-        assertTrue(runnable.getScrollX() > previousScrollX);
-        assertTrue(runnable.getScrollY() > previousScrollY);
+        assertTrue(mOnUiThread.getScrollX() > previousScrollX);
+        assertTrue(mOnUiThread.getScrollY() > previousScrollY);
 
-        previousScrollY = runnable.getScrollY();
-        previousScrollX = runnable.getScrollX();
+        previousScrollY = mOnUiThread.getScrollY();
+        previousScrollX = mOnUiThread.getScrollX();
         Thread.sleep(timeSlice);
-        runTestOnUiThread(runnable);
-        assertTrue(runnable.getScrollX() >= previousScrollX);
-        assertTrue(runnable.getScrollY() >= previousScrollY);
+        assertTrue(mOnUiThread.getScrollX() >= previousScrollX);
+        assertTrue(mOnUiThread.getScrollY() >= previousScrollY);
 
-        previousScrollY = runnable.getScrollY();
-        previousScrollX = runnable.getScrollX();
+        previousScrollY = mOnUiThread.getScrollY();
+        previousScrollX = mOnUiThread.getScrollX();
         Thread.sleep(timeSlice);
-        runTestOnUiThread(runnable);
-        assertTrue(runnable.getScrollX() >= previousScrollX);
-        assertTrue(runnable.getScrollY() >= previousScrollY);
+        assertTrue(mOnUiThread.getScrollX() >= previousScrollX);
+        assertTrue(mOnUiThread.getScrollY() >= previousScrollY);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "requestFocusNodeHref",
-        args = {android.os.Message.class}
-    )
     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>";
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.loadData("<html><body>" + links + "</body></html>", "text/html", null);
-                waitForLoadComplete();
-            }
-        });
+        mOnUiThread.loadDataAndWaitForCompletion("<html><body>" + links + "</body></html>", "text/html", null);
         getInstrumentation().waitForIdleSync();
 
         final HrefCheckHandler handler = new HrefCheckHandler(mWebView.getHandler().getLooper());
@@ -1709,12 +1112,8 @@
         // focus on first link
         handler.reset();
         getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_DOWN);
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.requestFocusNodeHref(hrefMsg);
-            }
-        });
-        new DelayedCheck() {
+        mOnUiThread.requestFocusNodeHref(hrefMsg);
+        new PollingCheck() {
             @Override
             protected boolean check() {
                 return handler.hasCalledHandleMessage();
@@ -1727,12 +1126,8 @@
         final Message hrefMsg2 = new Message();
         hrefMsg2.setTarget(handler);
         getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_DOWN);
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.requestFocusNodeHref(hrefMsg2);
-            }
-        });
-        new DelayedCheck() {
+        mOnUiThread.requestFocusNodeHref(hrefMsg2);
+        new PollingCheck() {
             @Override
             protected boolean check() {
                 return handler.hasCalledHandleMessage();
@@ -1740,30 +1135,10 @@
         }.run();
         assertEquals(TestHtmlConstants.HTML_URL2, handler.getResultUrl());
 
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.requestFocusNodeHref(null);
-            }
-        });
+        mOnUiThread.requestFocusNodeHref(null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "requestImageRef",
-        args = {android.os.Message.class}
-    )
     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();
@@ -1771,13 +1146,9 @@
 
         startWebServer(false);
         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", null);
-                waitForLoadComplete();
-            }
-        });
+        mOnUiThread.loadDataAndWaitForCompletion(
+                "<html><title>Title</title><body><img src=\"" + imgUrl
+                + "\"/></body></html>", "text/html", null);
         getInstrumentation().waitForIdleSync();
 
         final HrefCheckHandler handler = new HrefCheckHandler(mWebView.getHandler().getLooper());
@@ -1786,21 +1157,16 @@
 
         // touch the image
         handler.reset();
-        GetLocationRunnable runnable = new GetLocationRunnable();
-        runTestOnUiThread(runnable);
-        int[] location = runnable.getLocation();
+        int[] location = mOnUiThread.getLocationOnScreen();
 
         long time = SystemClock.uptimeMillis();
         getInstrumentation().sendPointerSync(
                 MotionEvent.obtain(time, time, MotionEvent.ACTION_DOWN,
                         location[0] + imgWidth / 2,
                         location[1] + imgHeight / 2, 0));
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.requestImageRef(msg);
-            }
-        });
-        new DelayedCheck() {
+        getInstrumentation().waitForIdleSync();
+        mOnUiThread.requestImageRef(msg);
+        new PollingCheck() {
             @Override
             protected boolean check() {
                 return handler.hasCalledHandleMessage();
@@ -1809,32 +1175,12 @@
         assertEquals(imgUrl, handler.mResultUrl);
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        method = "debugDump",
-        args = {}
-    )
     @UiThreadTest
     public void testDebugDump() {
         mWebView.debugDump();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getHitTestResult",
-        args = {}
-    )
     public void testGetHitTestResult() throws Throwable {
-        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>";
         final String blankAnchor = "<p><a href=\"\">blank anchor</a></p>";
@@ -1847,140 +1193,98 @@
         String location = "shanghai";
         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();
-            }
-        });
+        mOnUiThread.loadDataWithBaseURLAndWaitForCompletion("fake://home",
+                "<html><body>" + anchor + blankAnchor + form + tel + mailto +
+                geo + "</body></html>", "text/html", "UTF-8", null);
         getInstrumentation().waitForIdleSync();
-        HitTestResultRunnable runnable = new HitTestResultRunnable();
 
         // anchor
         moveFocusDown();
-        runTestOnUiThread(runnable);
-        assertEquals(HitTestResult.SRC_ANCHOR_TYPE, runnable.getHitTestResult().getType());
-        assertEquals(TestHtmlConstants.EXT_WEB_URL1, runnable.getHitTestResult().getExtra());
+        HitTestResult hitTestResult = mOnUiThread.getHitTestResult();
+        assertEquals(HitTestResult.SRC_ANCHOR_TYPE, hitTestResult.getType());
+        assertEquals(TestHtmlConstants.EXT_WEB_URL1, hitTestResult.getExtra());
 
         // blank anchor
         moveFocusDown();
-        runTestOnUiThread(runnable);
-        assertEquals(HitTestResult.SRC_ANCHOR_TYPE, runnable.getHitTestResult().getType());
-        assertEquals("fake://home", runnable.getHitTestResult().getExtra());
+        hitTestResult = mOnUiThread.getHitTestResult();
+        assertEquals(HitTestResult.SRC_ANCHOR_TYPE, hitTestResult.getType());
+        assertEquals("fake://home", hitTestResult.getExtra());
 
         // text field
         moveFocusDown();
-        runTestOnUiThread(runnable);
-        assertEquals(HitTestResult.EDIT_TEXT_TYPE, runnable.getHitTestResult().getType());
-        assertNull(runnable.getHitTestResult().getExtra());
+        hitTestResult = mOnUiThread.getHitTestResult();
+        assertEquals(HitTestResult.EDIT_TEXT_TYPE, hitTestResult.getType());
+        assertNull(hitTestResult.getExtra());
 
         // submit button
         moveFocusDown();
-        runTestOnUiThread(runnable);
-        assertEquals(HitTestResult.UNKNOWN_TYPE, runnable.getHitTestResult().getType());
-        assertNull(runnable.getHitTestResult().getExtra());
+        hitTestResult = mOnUiThread.getHitTestResult();
+        assertEquals(HitTestResult.UNKNOWN_TYPE, hitTestResult.getType());
+        assertNull(hitTestResult.getExtra());
 
         // phone number
         moveFocusDown();
-        runTestOnUiThread(runnable);
-        assertEquals(HitTestResult.PHONE_TYPE, runnable.getHitTestResult().getType());
-        assertEquals(phoneNo, runnable.getHitTestResult().getExtra());
+        hitTestResult = mOnUiThread.getHitTestResult();
+        assertEquals(HitTestResult.PHONE_TYPE, hitTestResult.getType());
+        assertEquals(phoneNo, hitTestResult.getExtra());
 
         // email
         moveFocusDown();
-        runTestOnUiThread(runnable);
-        assertEquals(HitTestResult.EMAIL_TYPE, runnable.getHitTestResult().getType());
-        assertEquals(email, runnable.getHitTestResult().getExtra());
+        hitTestResult = mOnUiThread.getHitTestResult();
+        assertEquals(HitTestResult.EMAIL_TYPE, hitTestResult.getType());
+        assertEquals(email, hitTestResult.getExtra());
 
         // geo address
         moveFocusDown();
-        runTestOnUiThread(runnable);
-        assertEquals(HitTestResult.GEO_TYPE, runnable.getHitTestResult().getType());
-        assertEquals(location, runnable.getHitTestResult().getExtra());
+        hitTestResult = mOnUiThread.getHitTestResult();
+        assertEquals(HitTestResult.GEO_TYPE, hitTestResult.getType());
+        assertEquals(location, hitTestResult.getExtra());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setInitialScale",
-        args = {int.class}
-    )
     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;
 
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.loadData("<html><body>" + p + "</body></html>", "text/html", null);
-                waitForLoadComplete();
-            }
-        });
+        mOnUiThread.loadDataAndWaitForCompletion("<html><body>" + p
+                + "</body></html>", "text/html", null);
         getInstrumentation().waitForIdleSync();
 
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                assertEquals(defaultScale, mWebView.getScale(), .01f);
+        assertEquals(defaultScale, mOnUiThread.getScale(), .01f);
 
-                mWebView.setInitialScale(0);
-                // modify content to fool WebKit into re-loading
-                mWebView.loadData("<html><body>" + p + "2" + "</body></html>", "text/html", null);
-                waitForLoadComplete();
-            }
-        });
+        mOnUiThread.setInitialScale(0);
+        // modify content to fool WebKit into re-loading
+        mOnUiThread.loadDataAndWaitForCompletion("<html><body>" + p
+                + "2" + "</body></html>", "text/html", null);
         getInstrumentation().waitForIdleSync();
 
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                assertEquals(defaultScale, mWebView.getScale(), .01f);
+        assertEquals(defaultScale, mOnUiThread.getScale(), .01f);
 
-                mWebView.setInitialScale(50);
-                mWebView.loadData("<html><body>" + p + "3" + "</body></html>", "text/html", null);
-                waitForLoadComplete();
-            }
-        });
+        mOnUiThread.setInitialScale(50);
+        mOnUiThread.loadDataAndWaitForCompletion("<html><body>" + p
+                + "3" + "</body></html>", "text/html", null);
         getInstrumentation().waitForIdleSync();
 
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                assertEquals(0.5f, mWebView.getScale(), .02f);
+        assertEquals(0.5f, mOnUiThread.getScale(), .02f);
 
-                mWebView.setInitialScale(0);
-                mWebView.loadData("<html><body>" + p + "4" + "</body></html>", "text/html", null);
-                waitForLoadComplete();
-            }
-        });
+        mOnUiThread.setInitialScale(0);
+        mOnUiThread.loadDataAndWaitForCompletion("<html><body>" + p
+                + "4" + "</body></html>", "text/html", null);
         getInstrumentation().waitForIdleSync();
 
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                assertEquals(defaultScale, mWebView.getScale(), .01f);
-            }
-        });
+        assertEquals(defaultScale, mOnUiThread.getScale(), .01f);
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        notes = "No API to trigger receiving an icon. Favicon not loaded automatically.",
-        method = "getFavicon",
-        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(url);
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
         mWebView.getFavicon();
         // ToBeFixed: Favicon is not loaded automatically.
         // assertNotNull(mWebView.getFavicon());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clearHistory",
-        args = {}
-    )
     @UiThreadTest
     public void testClearHistory() throws Exception {
         startWebServer(false);
@@ -1988,39 +1292,21 @@
         String url2 = mWebServer.getAssetUrl(TestHtmlConstants.HTML_URL2);
         String url3 = mWebServer.getAssetUrl(TestHtmlConstants.HTML_URL3);
 
-        assertLoadUrlSuccessfully(url1);
-        delayedCheckWebBackForwardList(url1, 0, 1);
+        mOnUiThread.loadUrlAndWaitForCompletion(url1);
+        pollingCheckWebBackForwardList(url1, 0, 1);
 
-        assertLoadUrlSuccessfully(url2);
-        delayedCheckWebBackForwardList(url2, 1, 2);
+        mOnUiThread.loadUrlAndWaitForCompletion(url2);
+        pollingCheckWebBackForwardList(url2, 1, 2);
 
-        assertLoadUrlSuccessfully(url3);
-        delayedCheckWebBackForwardList(url3, 2, 3);
+        mOnUiThread.loadUrlAndWaitForCompletion(url3);
+        pollingCheckWebBackForwardList(url3, 2, 3);
 
         mWebView.clearHistory();
 
         // only current URL is left after clearing
-        delayedCheckWebBackForwardList(url3, 0, 1);
+        pollingCheckWebBackForwardList(url3, 0, 1);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "saveState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "restoreState",
-            args = {Bundle.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "copyBackForwardList",
-            args = {}
-        )
-    })
-    @ToBeFixed(explanation="Web history items do not get inflated after restore.")
     @UiThreadTest
     public void testSaveAndRestoreState() throws Throwable {
         // nothing to save
@@ -2032,12 +1318,12 @@
         String url3 = mWebServer.getAssetUrl(TestHtmlConstants.HTML_URL3);
 
         // make a history list
-        assertLoadUrlSuccessfully(url1);
-        delayedCheckWebBackForwardList(url1, 0, 1);
-        assertLoadUrlSuccessfully(url2);
-        delayedCheckWebBackForwardList(url2, 1, 2);
-        assertLoadUrlSuccessfully(url3);
-        delayedCheckWebBackForwardList(url3, 2, 3);
+        mOnUiThread.loadUrlAndWaitForCompletion(url1);
+        pollingCheckWebBackForwardList(url1, 0, 1);
+        mOnUiThread.loadUrlAndWaitForCompletion(url2);
+        pollingCheckWebBackForwardList(url2, 1, 2);
+        mOnUiThread.loadUrlAndWaitForCompletion(url3);
+        pollingCheckWebBackForwardList(url3, 2, 3);
 
         // save the list
         Bundle bundle = new Bundle();
@@ -2063,7 +1349,7 @@
         assertEquals(2, saveList.getCurrentIndex());
         /* ToBeFixed: The WebHistoryItems do not get inflated. Uncomment remaining tests when fixed.
         // wait for the list items to get inflated
-        new DelayedCheck(TEST_TIMEOUT) {
+        new PollingCheck(TEST_TIMEOUT) {
             @Override
             protected boolean check() {
                 return restoreList.getItemAtIndex(0).getUrl() != null &&
@@ -2085,14 +1371,12 @@
         */
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setWebViewClient",
-        args = {WebViewClient.class}
-    )
     public void testSetWebViewClient() throws Throwable {
-        final class MockWebViewClient extends WebViewClient {
+        final class MockWebViewClient extends WaitForLoadedClient {
             private boolean mOnScaleChangedCalled = false;
+            public MockWebViewClient() {
+                super(mOnUiThread);
+            }
             @Override
             public void onScaleChanged(WebView view, float oldScale, float newScale) {
                 super.onScaleChanged(view, oldScale, newScale);
@@ -2104,35 +1388,15 @@
         }
 
         final MockWebViewClient webViewClient = new MockWebViewClient();
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.setWebViewClient(webViewClient);
-            }
-        });
+        mOnUiThread.setWebViewClient(webViewClient);
         getInstrumentation().waitForIdleSync();
         assertFalse(webViewClient.onScaleChangedCalled());
 
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.zoomIn();
-            }
-        });
+        mOnUiThread.zoomIn();
         getInstrumentation().waitForIdleSync();
         assertTrue(webViewClient.onScaleChangedCalled());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setCertificate",
-            args = {SslCertificate.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCertificate",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testSetAndGetCertificate() {
         assertNull(mWebView.getCertificate());
@@ -2141,58 +1405,23 @@
         assertEquals(certificate, mWebView.getCertificate());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setCertificate",
-            args = {SslCertificate.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCertificate",
-            args = {}
-        )
-    })
+    @UiThreadTest
     public void testInsecureSiteClearsCertificate() throws Throwable {
         final SslCertificate certificate =
                 new SslCertificate("foo", "bar", new Date(42), new Date(43));
         startWebServer(false);
         final String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.setWebChromeClient(new LoadCompleteWebChromeClient());
-                mWebView.setCertificate(certificate);
-                mWebView.loadUrl(url);
-            }
-        });
-        waitForUiThreadDone();
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                new DelayedCheck(TEST_TIMEOUT) {
-                    @Override
-                    protected boolean check() {
-                        return mWebView.getCertificate() == null;
-                    }
-                }.run();
-            }
-        });
+        mWebView.setCertificate(certificate);
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        assertNull(mWebView.getCertificate());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setCertificate",
-            args = {SslCertificate.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCertificate",
-            args = {}
-        )
-    })
+    @UiThreadTest
     public void testSecureSiteSetsCertificate() throws Throwable {
-        final class MockWebViewClient extends WebViewClient {
+        final class MockWebViewClient extends WaitForLoadedClient {
+            public MockWebViewClient() {
+                super(mOnUiThread);
+            }
             @Override
             public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                 handler.proceed();
@@ -2201,51 +1430,28 @@
 
         startWebServer(true);
         final String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.setWebViewClient(new MockWebViewClient());
-                mWebView.setWebChromeClient(new LoadCompleteWebChromeClient());
-                mWebView.setCertificate(null);
-                mWebView.loadUrl(url);
-            }
-        });
-        waitForUiThreadDone();
-
-        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());
-            }
-        });
+        mOnUiThread.setWebViewClient(new MockWebViewClient());
+        mWebView.setCertificate(null);
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        SslCertificate cert = mWebView.getCertificate();
+        assertNotNull(cert);
+        assertEquals("Android", cert.getIssuedTo().getUName());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clearSslPreferences",
-        args = {}
-    )
     @UiThreadTest
     public void testClearSslPreferences() {
         // FIXME: Implement this. See http://b/5378046.
         mWebView.clearSslPreferences();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "WebViewClient.onReceivedSslError",
-        args = {}
-    )
     public void testOnReceivedSslError() throws Throwable {
-        final class MockWebViewClient extends WebViewClient {
+        final class MockWebViewClient extends WaitForLoadedClient {
             private String mErrorUrl;
             private WebView mWebView;
+
+            public MockWebViewClient() {
+                super(mOnUiThread);
+            }
             @Override
             public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                 mWebView = view;
@@ -2263,27 +1469,19 @@
         startWebServer(true);
         final String errorUrl = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
         final MockWebViewClient webViewClient = new MockWebViewClient();
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.setWebViewClient(webViewClient);
-                mWebView.setWebChromeClient(new LoadCompleteWebChromeClient());
-                mWebView.clearSslPreferences();
-                mWebView.loadUrl(errorUrl);
-            }
-        });
-        waitForUiThreadDone();
+        mOnUiThread.setWebViewClient(webViewClient);
+        mOnUiThread.clearSslPreferences();
+        mOnUiThread.loadUrlAndWaitForCompletion(errorUrl);
 
         assertEquals(mWebView, webViewClient.webView());
         assertEquals(errorUrl, webViewClient.errorUrl());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "WebViewClient.onReceivedSslError",
-        args = {}
-    )
     public void testOnReceivedSslErrorProceed() throws Throwable {
-        final class MockWebViewClient extends WebViewClient {
+        final class MockWebViewClient extends WaitForLoadedClient {
+            public MockWebViewClient() {
+                super(mOnUiThread);
+            }
             @Override
             public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                 handler.proceed();
@@ -2292,28 +1490,16 @@
 
         startWebServer(true);
         final String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.setWebViewClient(new MockWebViewClient());
-                mWebView.setWebChromeClient(new LoadCompleteWebChromeClient());
-                mWebView.loadUrl(url);
-            }
-        });
-        waitForUiThreadDone();
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                assertEquals(TestHtmlConstants.HELLO_WORLD_TITLE, mWebView.getTitle());
-            }
-        });
+        mOnUiThread.setWebViewClient(new MockWebViewClient());
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        assertEquals(TestHtmlConstants.HELLO_WORLD_TITLE, mOnUiThread.getTitle());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "WebViewClient.onReceivedSslError",
-        args = {}
-    )
     public void testOnReceivedSslErrorCancel() throws Throwable {
-        final class MockWebViewClient extends WebViewClient {
+        final class MockWebViewClient extends WaitForLoadedClient {
+            public MockWebViewClient() {
+                super(mOnUiThread);
+            }
             @Override
             public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                 handler.cancel();
@@ -2322,82 +1508,41 @@
 
         startWebServer(true);
         final String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.setWebViewClient(new MockWebViewClient());
-                mWebView.setWebChromeClient(new LoadCompleteWebChromeClient());
-                mWebView.clearSslPreferences();
-                mWebView.loadUrl(url);
-            }
-        });
-        waitForUiThreadDone();
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                assertFalse(TestHtmlConstants.HELLO_WORLD_TITLE.equals(mWebView.getTitle()));
-            }
-        });
+        mOnUiThread.setWebViewClient(new MockWebViewClient());
+        mOnUiThread.clearSslPreferences();
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        assertFalse(TestHtmlConstants.HELLO_WORLD_TITLE.equals(mOnUiThread.getTitle()));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "WebViewClient.onReceivedSslError",
-        args = {}
-    )
     public void testSslErrorProceedResponseReusedForSameHost() throws Throwable {
         // Load the first page. We expect a call to
         // WebViewClient.onReceivedSslError().
         final SslErrorWebViewClient webViewClient = new SslErrorWebViewClient();
         startWebServer(true);
         final String firstUrl = mWebServer.getAssetUrl(TestHtmlConstants.HTML_URL1);
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.setWebViewClient(webViewClient);
-                mWebView.setWebChromeClient(new LoadCompleteWebChromeClient());
-                mWebView.clearSslPreferences();
-                mWebView.loadUrl(firstUrl);
-            }
-        });
-        waitForUiThreadDone();
+        mOnUiThread.setWebViewClient(webViewClient);
+        mOnUiThread.clearSslPreferences();
+        mOnUiThread.loadUrlAndWaitForCompletion(firstUrl);
         assertTrue(webViewClient.wasOnReceivedSslErrorCalled());
 
         // Load the second page. We don't expect a call to
         // WebViewClient.onReceivedSslError(), but the page should load.
         webViewClient.resetWasOnReceivedSslErrorCalled();
         final String sameHostUrl = mWebServer.getAssetUrl(TestHtmlConstants.HTML_URL2);
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.loadUrl(sameHostUrl);
-            }
-        });
-        waitForUiThreadDone();
+        mOnUiThread.loadUrlAndWaitForCompletion(sameHostUrl);
         assertFalse(webViewClient.wasOnReceivedSslErrorCalled());
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                assertEquals("Second page", mWebView.getTitle());
-            }
-        });
+        assertEquals("Second page", mOnUiThread.getTitle());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "WebViewClient.onReceivedSslError",
-        args = {}
-    )
     public void testSslErrorProceedResponseNotReusedForDifferentHost() throws Throwable {
         // Load the first page. We expect a call to
         // WebViewClient.onReceivedSslError().
         final SslErrorWebViewClient webViewClient = new SslErrorWebViewClient();
         startWebServer(true);
         final String firstUrl = mWebServer.getAssetUrl(TestHtmlConstants.HTML_URL1);
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.setWebViewClient(webViewClient);
-                mWebView.setWebChromeClient(new LoadCompleteWebChromeClient());
-                mWebView.clearSslPreferences();
-                mWebView.loadUrl(firstUrl);
-            }
-        });
-        waitForUiThreadDone();
+        mOnUiThread.setWebViewClient(webViewClient);
+        mOnUiThread.clearSslPreferences();
+        mOnUiThread.loadUrlAndWaitForCompletion(firstUrl);
         assertTrue(webViewClient.wasOnReceivedSslErrorCalled());
 
         // Load the second page. We expect another call to
@@ -2407,66 +1552,31 @@
         // alias, but will be considered unique by the WebView.
         final String differentHostUrl = mWebServer.getAssetUrl(TestHtmlConstants.HTML_URL2).replace(
                 "localhost", "127.0.0.1");
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.loadUrl(differentHostUrl);
-            }
-        });
-        waitForUiThreadDone();
+        mOnUiThread.loadUrlAndWaitForCompletion(differentHostUrl);
         assertTrue(webViewClient.wasOnReceivedSslErrorCalled());
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                assertEquals("Second page", mWebView.getTitle());
-            }
-        });
+        assertEquals("Second page", mOnUiThread.getTitle());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "requestChildRectangleOnScreen",
-        args = {View.class, Rect.class, boolean.class}
-    )
     public void testRequestChildRectangleOnScreen() throws Throwable {
-        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", null);
-                waitForLoadComplete();
-            }
-        });
+        DisplayMetrics metrics = mOnUiThread.getDisplayMetrics();
+        int dimension = 2 * Math.max(metrics.widthPixels, metrics.heightPixels);
+        String p = "<p style=\"height:" + dimension + "px;width:" + dimension + "px\">&nbsp;</p>";
+        mOnUiThread.loadDataAndWaitForCompletion("<html><body>" + p
+                + "</body></html>", "text/html", null);
         getInstrumentation().waitForIdleSync();
 
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                int origX = mWebView.getScrollX();
-                int origY = mWebView.getScrollY();
+        int origX = mOnUiThread.getScrollX();
+        int origY = mOnUiThread.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));
-                assertTrue(mWebView.getScrollX() > origX);
-                assertTrue(mWebView.getScrollY() > origY);
-            }
-        });
+        metrics = mOnUiThread.getDisplayMetrics();
+        dimension = 2 * Math.max(metrics.widthPixels, metrics.heightPixels);
+        int half = dimension / 2;
+        Rect rect = new Rect(half, half, half + 1, half + 1);
+        assertTrue(mOnUiThread.requestChildRectangleOnScreen(mWebView, rect, true));
+        assertTrue(mOnUiThread.getScrollX() > origX);
+        assertTrue(mOnUiThread.getScrollY() > origY);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDownloadListener",
-            args = {DownloadListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "requestFocus",
-            args = {int.class, Rect.class}
-        )
-    })
-    @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;
@@ -2475,6 +1585,7 @@
             public String contentDisposition;
             public boolean called;
 
+            @Override
             public void onDownloadStart(String url, String userAgent, String contentDisposition,
                     String mimetype, long contentLength) {
                 this.called = true;
@@ -2492,29 +1603,21 @@
         startWebServer(false);
         final String url = mWebServer.getBinaryUrl(mimeType, length);
 
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                // By default, WebView sends an intent to ask the system to
-                // handle loading a new URL. We set WebViewClient as
-                // WebViewClient.shouldOverrideUrlLoading() returns false, so
-                // the WebView will load the new URL.
-                mWebView.setWebViewClient(new WebViewClient());
-                mWebView.setDownloadListener(listener);
-                mWebView.loadData("<html><body><a href=\"" + url + "\">link</a></body></html>",
-                        "text/html", null);
-                waitForLoadComplete();
-            }
-        });
+        // By default, WebView sends an intent to ask the system to
+        // handle loading a new URL. We set WebViewClient as
+        // WebViewClient.shouldOverrideUrlLoading() returns false, so
+        // the WebView will load the new URL.
+        mOnUiThread.setDownloadListener(listener);
+        mOnUiThread.loadDataAndWaitForCompletion(
+                "<html><body><a href=\"" + url
+                + "\">link</a></body></html>",
+                "text/html", null);
         // Wait for layout to complete before setting focus.
         getInstrumentation().waitForIdleSync();
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                assertTrue(mWebView.requestFocus(View.FOCUS_DOWN, null));
-            }
-        });
+        assertTrue(mOnUiThread.requestFocus(View.FOCUS_DOWN, null));
         getInstrumentation().waitForIdleSync();
         getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_CENTER);
-        new DelayedCheck(TEST_TIMEOUT) {
+        new PollingCheck(TEST_TIMEOUT) {
             @Override
             protected boolean check() {
                 return listener.called;
@@ -2527,12 +1630,6 @@
         // assertEquals(length, listener.contentLength);
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        method = "setLayoutParams",
-        args = {android.view.ViewGroup.LayoutParams.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for setLayoutParams() is incomplete.")
     @UiThreadTest
     public void testSetLayoutParams() {
         LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(600, 800);
@@ -2540,50 +1637,37 @@
         assertSame(params, mWebView.getLayoutParams());
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        notes = "No documentation",
-        method = "setMapTrackballToArrowKeys",
-        args = {boolean.class}
-    )
     @UiThreadTest
     public void testSetMapTrackballToArrowKeys() {
         mWebView.setMapTrackballToArrowKeys(true);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        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(url);
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
         assertEquals("ONLINE", mWebView.getTitle());
 
         mWebView.setNetworkAvailable(false);
-        mWebView.reload();
-        waitForLoadComplete();
+        mOnUiThread.reloadAndWaitForCompletion();
         assertEquals("OFFLINE", mWebView.getTitle());
 
         mWebView.setNetworkAvailable(true);
-        mWebView.reload();
-        waitForLoadComplete();
+        mOnUiThread.reloadAndWaitForCompletion();
         assertEquals("ONLINE", mWebView.getTitle());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setWebChromeClient",
-        args = {WebChromeClient.class}
-    )
     public void testSetWebChromeClient() throws Throwable {
-        final class MockWebChromeClient extends WebChromeClient {
+        final class MockWebChromeClient extends WaitForProgressClient {
             private boolean mOnProgressChanged = false;
+
+            public MockWebChromeClient() {
+                super(mOnUiThread);
+            }
+
             @Override
             public void onProgressChanged(WebView view, int newProgress) {
                 super.onProgressChanged(view, newProgress);
@@ -2596,24 +1680,16 @@
 
         final MockWebChromeClient webChromeClient = new MockWebChromeClient();
 
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.setWebChromeClient(webChromeClient);
-            }
-        });
+        mOnUiThread.setWebChromeClient(webChromeClient);
         getInstrumentation().waitForIdleSync();
         assertFalse(webChromeClient.onProgressChangedCalled());
 
         startWebServer(false);
         final String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.loadUrl(url);
-            }
-        });
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
         getInstrumentation().waitForIdleSync();
 
-        new DelayedCheck(TEST_TIMEOUT) {
+        new PollingCheck(TEST_TIMEOUT) {
             @Override
             protected boolean check() {
                 return webChromeClient.onProgressChangedCalled();
@@ -2621,18 +1697,6 @@
         }.run();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "pauseTimers",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "resumeTimers",
-            args = {}
-        )
-    })
     public void testPauseResumeTimers() throws Throwable {
         class Monitor {
             private boolean mIsUpdated;
@@ -2658,134 +1722,33 @@
             }
         };
         final Monitor monitor = new Monitor();
-        final String updateMonitorHtml = "<html><head></head>" +
+        final String updateMonitorHtml = "<html>" +
                 "<body onload=\"monitor.update();\"></body></html>";
 
         // Test that JavaScript is executed even with timers paused.
         runTestOnUiThread(new Runnable() {
+            @Override
             public void run() {
                 mWebView.getSettings().setJavaScriptEnabled(true);
                 mWebView.addJavascriptInterface(monitor, "monitor");
                 mWebView.pauseTimers();
-                mWebView.loadData(updateMonitorHtml, "text/html", null);
+                mOnUiThread.loadDataAndWaitForCompletion(updateMonitorHtml,
+                        "text/html", null);
             }
         });
         assertTrue(monitor.waitForUpdate());
 
         // Start a timer and test that it does not fire.
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.loadUrl("javascript:setTimeout(function(){monitor.update();},100)");
-            }
-        });
+        mOnUiThread.loadDataAndWaitForCompletion(
+                "<html><body onload='setTimeout(function(){monitor.update();},100)'>" +
+                "</body></html>", "text/html", null);
         assertFalse(monitor.waitForUpdate());
 
         // Resume timers and test that the timer fires.
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mWebView.resumeTimers();
-            }
-        });
+        mOnUiThread.resumeTimers();
         assertTrue(monitor.waitForUpdate());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "dispatchKeyEvent",
-            args = {KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onAttachedToWindow",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onDetachedFromWindow",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onChildViewAdded",
-            args = {View.class, View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onChildViewRemoved",
-            args = {View.class, View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onDraw",
-            args = {Canvas.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onFocusChanged",
-            args = {boolean.class, int.class, Rect.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onGlobalFocusChanged",
-            args = {View.class, View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onKeyDown",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onKeyUp",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onMeasure",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onScrollChanged",
-            args = {int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onSizeChanged",
-            args = {int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onTouchEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onTrackballEvent",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onWindowFocusChanged",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "computeScroll",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "computeHorizontalScrollRange",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "computeVerticalScrollRange",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testInternals() {
         // Do not test these APIs. They are implementation details.
@@ -2827,25 +1790,9 @@
         Thread.sleep(500);
     }
 
-    private final class ScrollRunnable implements Runnable {
-        private int mScrollX;
-        private int mScrollY;
-        @Override
-        public void run() {
-            mScrollX = mWebView.getScrollX();
-            mScrollY = mWebView.getScrollY();
-        }
-        public int getScrollX() {
-            return mScrollX;
-        }
-        public int getScrollY() {
-            return mScrollY;
-        }
-    }
-
-    private void delayedCheckWebBackForwardList(final String currUrl, final int currIndex,
+    private void pollingCheckWebBackForwardList(final String currUrl, final int currIndex,
             final int size) {
-        new DelayedCheck() {
+        new PollingCheck() {
             @Override
             protected boolean check() {
                 WebBackForwardList list = mWebView.copyBackForwardList();
@@ -2935,56 +1882,38 @@
         return true;
     }
 
-    private void assertLoadUrlSuccessfully(String url) {
-        mWebView.loadUrl(url);
-        waitForLoadComplete();
-    }
-
-    private void waitForLoadComplete() {
-        new DelayedCheck(TEST_TIMEOUT) {
-            @Override
-            protected boolean check() {
-                return mWebView.getProgress() == 100;
-            }
-        }.run();
-        try {
-            Thread.sleep(TIME_FOR_LAYOUT);
-        } catch (InterruptedException e) {
-            Log.w(LOGTAG, "waitForLoadComplete() interrupted while sleeping for layout delay.");
-        }
-    }
-
-    private synchronized void notifyUiThreadDone() {
-        mIsUiThreadDone = true;
-        notify();
-    }
-
-    private synchronized void waitForUiThreadDone() throws InterruptedException {
-        while (!mIsUiThreadDone) {
-            try {
-                wait(TEST_TIMEOUT);
-            } catch (InterruptedException e) {
-                continue;
-            }
-            if (!mIsUiThreadDone) {
-                Assert.fail("Unexpected timeout");
-            }
-        }
-    }
-
-    final class LoadCompleteWebChromeClient extends WebChromeClient {
-        @Override
-        public void onProgressChanged(WebView webView, int progress) {
-            super.onProgressChanged(webView, progress);
-            if (progress == 100) {
-                notifyUiThreadDone();
-            }
+    /**
+     * Waits at least MIN_SCROLL_WAIT_MS for scrolling to start. Once started,
+     * scrolling is checked every SCROLL_WAIT_INTERVAL_MS for changes. Once
+     * changes have stopped, the function exits. If no scrolling has happened
+     * then the function exits after MIN_SCROLL_WAIT milliseconds.
+     * @param previousScrollY The Y scroll position prior to waiting.
+     */
+    private void waitForScrollingComplete(int previousScrollY)
+            throws InterruptedException {
+        int scrollY = previousScrollY;
+        // wait at least MIN_SCROLL_WAIT for something to happen.
+        long noChangeMinWait = SystemClock.uptimeMillis() + MIN_SCROLL_WAIT_MS;
+        boolean scrollChanging = false;
+        boolean scrollChanged = false;
+        boolean minWaitExpired = false;
+        while (scrollChanging || (!scrollChanged && !minWaitExpired)) {
+            Thread.sleep(SCROLL_WAIT_INTERVAL_MS);
+            int oldScrollY = scrollY;
+            scrollY = mOnUiThread.getScrollY();
+            scrollChanging = (scrollY != oldScrollY);
+            scrollChanged = (scrollY != previousScrollY);
+            minWaitExpired = (SystemClock.uptimeMillis() > noChangeMinWait);
         }
     }
 
     // Note that this class is not thread-safe.
-    final class SslErrorWebViewClient extends WebViewClient {
+    final class SslErrorWebViewClient extends WaitForLoadedClient {
         private boolean mWasOnReceivedSslErrorCalled;
+
+        public SslErrorWebViewClient() {
+            super(mOnUiThread);
+        }
         @Override
         public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
             mWasOnReceivedSslErrorCalled = true;
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebView_WebViewTransportTest.java b/tests/tests/webkit/src/android/webkit/cts/WebView_WebViewTransportTest.java
index c4f3a6c..eaa5e69 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebView_WebViewTransportTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebView_WebViewTransportTest.java
@@ -16,29 +16,14 @@
 
 package android.webkit.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-
 import android.test.AndroidTestCase;
+import android.test.UiThreadTest;
 import android.webkit.WebView;
 import android.webkit.WebView.WebViewTransport;
 
-@TestTargetClass(WebViewTransport.class)
+
 public class WebView_WebViewTransportTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setWebView",
-            args = {WebView.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWebView",
-            args = {}
-        )
-    })
+    @UiThreadTest
     public void testAccessWebView() {
         WebView webView = new WebView(mContext);
         WebViewTransport transport = webView.new WebViewTransport();
diff --git a/tests/tests/widget/Android.mk b/tests/tests/widget/Android.mk
index a35120e..628935c 100644
--- a/tests/tests/widget/Android.mk
+++ b/tests/tests/widget/Android.mk
@@ -31,5 +31,4 @@
 
 LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
 
-include $(BUILD_PACKAGE)
-
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/widget/src/android/widget/cts/AbsListViewTest.java b/tests/tests/widget/src/android/widget/cts/AbsListViewTest.java
index 0995f28..3368b67 100644
--- a/tests/tests/widget/src/android/widget/cts/AbsListViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AbsListViewTest.java
@@ -18,11 +18,6 @@
 
 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;
@@ -56,7 +51,6 @@
 import java.util.ArrayList;
 import java.util.List;
 
-@TestTargetClass(AbsListView.class)
 public class AbsListViewTest extends ActivityInstrumentationTestCase2<ListViewStubActivity> {
     private final String[] mCountryList = new String[] {
         "Argentina", "Australia", "China", "France", "Germany", "Italy", "Japan", "United States"
@@ -74,10 +68,6 @@
         super("com.android.cts.stub", ListViewStubActivity.class);
     }
 
-    @ToBeFixed(bug="1448885", explanation="AbsListView is an abstract class and its abstract " +
-            "methods: fillGap(boolean), findMotionRow(int) and setSelectionInt(int) are " +
-            "package private, we can not extends it directly to test. So, we use its subclass " +
-            "ListView to test")
 
     @Override
     protected void setUp() throws Exception {
@@ -96,42 +86,12 @@
         mListView = (ListView)mActivity.findViewById(R.id.listview_default);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "AbsListView",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "AbsListView",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "AbsListView",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testConstructor() {
         /**
          * We can not test the constructors.
          */
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFastScrollEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isFastScrollEnabled",
-            args = {}
-        )
-    })
     public void testAccessFastScrollEnabled() {
         mListView.setFastScrollEnabled(false);
         assertFalse(mListView.isFastScrollEnabled());
@@ -140,18 +100,6 @@
         assertTrue(mListView.isFastScrollEnabled());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSmoothScrollbarEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isSmoothScrollbarEnabled",
-            args = {}
-        )
-    })
     public void testAccessSmoothScrollbarEnabled() {
         mListView.setSmoothScrollbarEnabled(false);
         assertFalse(mListView.isSmoothScrollbarEnabled());
@@ -160,18 +108,6 @@
         assertTrue(mListView.isSmoothScrollbarEnabled());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setScrollingCacheEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isScrollingCacheEnabled",
-            args = {}
-        )
-    })
     public void testAccessScrollingCacheEnabled() {
         mListView.setScrollingCacheEnabled(false);
         assertFalse(mListView.isScrollingCacheEnabled());
@@ -199,11 +135,6 @@
         });
         mInstrumentation.waitForIdleSync();
     }
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setOnScrollListener",
-        args = {android.widget.AbsListView.OnScrollListener.class}
-    )
     public void testSetOnScrollListener() throws Throwable {
         MockOnScrollListener onScrollListener = new MockOnScrollListener();
 
@@ -249,11 +180,6 @@
         assertTrue(onScrollListener.isOnScrollStateChangedCalled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getFocusedRect",
-        args = {android.graphics.Rect.class}
-    )
     public void testGetFocusedRect() throws Throwable {
         setAdapter();
         setListSelection(0);
@@ -279,18 +205,6 @@
         assertEquals(r1.right, r2.right);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setStackFromBottom",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isStackFromBottom",
-            args = {}
-        )
-    })
     public void testAccessStackFromBottom() throws Throwable {
         setAdapter();
 
@@ -314,11 +228,6 @@
         assertEquals(mCountryList.length-1, mListView.getSelectedItemPosition());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getSelectedView",
-        args = {android.graphics.Rect.class}
-    )
     public void testAccessSelectedItem() throws Throwable {
         assertNull(mListView.getSelectedView());
 
@@ -335,28 +244,6 @@
         assertEquals(mCountryList[2], tv.getText().toString());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPaddingTop",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPaddingLeft",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPaddingBottom",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPaddingRight",
-            args = {}
-        )
-    })
     public void testAccessListPadding() throws Throwable {
         setAdapter();
 
@@ -379,33 +266,6 @@
         assertEquals(r.bottom, mListView.getListPaddingBottom());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSelector",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSelector",
-            args = {android.graphics.drawable.Drawable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSelector",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDrawSelectorOnTop",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "verifyDrawable",
-            args = {android.graphics.drawable.Drawable.class}
-        )
-    })
     public void testAccessSelector() throws Throwable {
         setAdapter();
 
@@ -442,19 +302,6 @@
         assertEquals(v.getBottom(), r.bottom);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setScrollIndicators",
-            args = {android.view.View.class, android.view.View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requestLayout",
-            args = {}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testSetScrollIndicators() throws Throwable {
         TextView tv1 = (TextView) mActivity.findViewById(R.id.headerview1);
         TextView tv2 = (TextView) mActivity.findViewById(R.id.footerview1);
@@ -471,11 +318,6 @@
         mInstrumentation.waitForIdleSync();
     }
 
-    @TestTargetNew(
-        level = TestLevel.TODO,
-        method = "showContextMenuForChild",
-        args = {android.view.View.class}
-    )
     public void testShowContextMenuForChild() throws Throwable {
         setAdapter();
         setListSelection(1);
@@ -486,18 +328,6 @@
         // TODO: how to show the contextMenu success
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "pointToPosition",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "pointToRowId",
-            args = {int.class, int.class}
-        )
-    })
     public void testPointToPosition() throws Throwable {
         assertEquals(AbsListView.INVALID_POSITION, mListView.pointToPosition(-1, -1));
         assertEquals(AbsListView.INVALID_ROW_ID, mListView.pointToRowId(-1, -1));
@@ -518,18 +348,6 @@
         assertTrue(position2 > position1);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "draw",
-            args = {android.graphics.Canvas.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "dispatchDraw",
-            args = {android.graphics.Canvas.class}
-        )
-    })
     public void testDraw() {
         Canvas canvas = new Canvas();
         mListView.draw(canvas);
@@ -540,18 +358,6 @@
         // TODO: how to check
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRecyclerListener",
-            args = {android.widget.AbsListView.RecyclerListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "reclaimViews",
-            args = {java.util.List.class}
-        )
-    })
     public void testSetRecyclerListener() throws Throwable {
         setAdapter();
 
@@ -568,23 +374,6 @@
         assertSame(recyclerListener.getView(), views.get(views.size() - 1));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setCacheColorHint",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCacheColorHint",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSolidColor",
-            args = {}
-        )
-    })
     public void testAccessCacheColorHint() {
         mListView.setCacheColorHint(Color.RED);
         assertEquals(Color.RED, mListView.getCacheColorHint());
@@ -599,18 +388,6 @@
         assertEquals(Color.GRAY, mListView.getSolidColor());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTranscriptMode",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTranscriptMode",
-            args = {}
-        )
-    })
     public void testAccessTranscriptMode() {
         mListView.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
         assertEquals(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL, mListView.getTranscriptMode());
@@ -622,11 +399,6 @@
         assertEquals(AbsListView.TRANSCRIPT_MODE_NORMAL, mListView.getTranscriptMode());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "checkLayoutParams",
-        args = {android.view.ViewGroup.LayoutParams.class}
-    )
     public void testCheckLayoutParams() {
         MyListView listView = new MyListView(mActivity);
 
@@ -637,23 +409,6 @@
         assertFalse(listView.checkLayoutParams(param2));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "computeVerticalScrollRange",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "computeVerticalScrollOffset",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "computeVerticalScrollExtent",
-            args = {}
-        )
-    })
     public void testComputeVerticalScrollValues() {
         MyListView listView = new MyListView(mActivity);
         assertEquals(0, listView.computeVerticalScrollRange());
@@ -671,18 +426,6 @@
         assertEquals(0, listView.computeVerticalScrollExtent());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "generateLayoutParams",
-            args = {android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "generateLayoutParams",
-            args = {android.view.ViewGroup.LayoutParams.class}
-        )
-    })
     public void testGenerateLayoutParams() throws XmlPullParserException, IOException {
         ViewGroup.LayoutParams res = mListView.generateLayoutParams(mAttributeSet);
         assertNotNull(res);
@@ -699,18 +442,6 @@
         assertEquals(ViewGroup.LayoutParams.WRAP_CONTENT, res.height);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "beforeTextChanged",
-            args = {java.lang.CharSequence.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "afterTextChanged",
-            args = {android.text.Editable.class}
-        )
-    })
     public void testBeforeAndAfterTextChanged() {
         // The java doc says these two methods do nothing
         CharSequence str = "test";
@@ -738,11 +469,6 @@
         assertTrue(listView.isAfterTextChangedCalled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addTouchables",
-        args = {java.util.ArrayList.class}
-    )
     public void testAddTouchables() throws Throwable {
         ArrayList<View> views = new ArrayList<View>();
         assertEquals(0, views.size());
@@ -753,13 +479,6 @@
         assertEquals(mListView.getChildCount(), views.size());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "invalidateViews",
-        args = {}
-    )
-    @ToBeFixed(bug = "1400249", explanation = "it's hard to do unit test, should be tested by" +
-            " functional test.")
     public void testInvalidateViews() throws Throwable {
         TextView tv1 = (TextView) mActivity.findViewById(R.id.headerview1);
         TextView tv2 = (TextView) mActivity.findViewById(R.id.footerview1);
@@ -776,11 +495,6 @@
         mInstrumentation.waitForIdleSync();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getContextMenuInfo",
-        args = {}
-    )
     public void testGetContextMenuInfo() throws Throwable {
         final MyListView listView = new MyListView(mActivity, mAttributeSet);
 
@@ -815,18 +529,6 @@
         assertNotNull(cmi);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTopFadingEdgeStrength",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "getBottomFadingEdgeStrength",
-            args = {}
-        )
-    })
     public void testGetTopBottomFadingEdgeStrength() {
         MyListView listView = new MyListView(mActivity);
 
@@ -834,50 +536,12 @@
         assertEquals(0.0f, listView.getBottomFadingEdgeStrength(), DELTA);
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        method = "handleDataChanged",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testHandleDataChanged() {
         MyListView listView = new MyListView(mActivity, mAttributeSet, 0);
         listView.handleDataChanged();
         // TODO: how to check?
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasTextFilter",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTextFilterEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isTextFilterEnabled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFilterText",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "clearTextFilter",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isInFilterMode",
-            args = {}
-        )
-    })
     public void testSetFilterText() {
         MyListView listView = new MyListView(mActivity, mAttributeSet, 0);
         String filterText = "xyz";
@@ -911,12 +575,6 @@
         assertFalse(listView.isInFilterMode());
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        method = "layoutChildren",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testLayoutChildren() {
         /**
          * the subclass ListView and GridView override this method, so we can not test
@@ -924,108 +582,6 @@
          */
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "drawableStateChanged",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onCreateInputConnection",
-            args = {android.view.inputmethod.EditorInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onFilterComplete",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onGlobalLayout",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onInterceptTouchEvent",
-            args = {android.view.MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onKeyUp",
-            args = {int.class, android.view.KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onRestoreInstanceState",
-            args = {android.os.Parcelable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onSaveInstanceState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onTextChanged",
-            args = {java.lang.CharSequence.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onTouchEvent",
-            args = {android.view.MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onTouchModeChanged",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onWindowFocusChanged",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onAttachedToWindow",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onCreateDrawableState",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onDetachedFromWindow",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onFocusChanged",
-            args = {boolean.class, int.class, android.graphics.Rect.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onLayout",
-            args = {boolean.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onMeasure",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onSizeChanged",
-            args = {int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "dispatchSetPressed",
-            args = {boolean.class}
-        )
-    })
     public void testFoo() {
         /**
          * Do not test these APIs. They are callbacks which:
diff --git a/tests/tests/widget/src/android/widget/cts/AbsListView_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/AbsListView_LayoutParamsTest.java
index 7403614..655b5ee 100644
--- a/tests/tests/widget/src/android/widget/cts/AbsListView_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AbsListView_LayoutParamsTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import org.xmlpull.v1.XmlPullParser;
 
@@ -31,7 +27,6 @@
 import android.widget.AbsListView;
 import android.widget.AbsListView.LayoutParams;
 
-@TestTargetClass(LayoutParams.class)
 public class AbsListView_LayoutParamsTest extends AndroidTestCase {
     private AttributeSet mAttributeSet;
 
@@ -44,28 +39,6 @@
         mAttributeSet = Xml.asAttributeSet(parser);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AbsListView.LayoutParams",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AbsListView.LayoutParams",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AbsListView.LayoutParams",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AbsListView.LayoutParams",
-            args = {android.view.ViewGroup.LayoutParams.class}
-        )
-    })
     public void testConstructors() {
         int TEST_WIDTH = 25;
         int TEST_HEIGHT = 25;
diff --git a/tests/tests/widget/src/android/widget/cts/AbsSeekBarTest.java b/tests/tests/widget/src/android/widget/cts/AbsSeekBarTest.java
index 6a30e06..76d3883 100644
--- a/tests/tests/widget/src/android/widget/cts/AbsSeekBarTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AbsSeekBarTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.app.Activity;
 import android.content.Context;
@@ -39,7 +35,6 @@
 /**
  * Test {@link AbsSeekBar}.
  */
-@TestTargetClass(AbsSeekBar.class)
 public class AbsSeekBarTest extends ActivityInstrumentationTestCase2<ProgressBarStubActivity> {
     public AbsSeekBarTest() {
         super("com.android.cts.stub", ProgressBarStubActivity.class);
@@ -55,23 +50,6 @@
         mResources = mActivity.getResources();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AbsSeekBar",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AbsSeekBar",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AbsSeekBar",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
     public void testConstructor() {
         new MyAbsSeekBar(mActivity);
 
@@ -80,18 +58,6 @@
         new MyAbsSeekBar(mActivity, null, com.android.internal.R.attr.progressBarStyle);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setThumbOffset",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getThumbOffset",
-            args = {}
-        )
-    })
     public void testAccessThumbOffset() {
         AbsSeekBar myAbsSeekBar = new MyAbsSeekBar(mActivity);
         final int positive = 5;
@@ -108,11 +74,6 @@
         assertEquals(negative, myAbsSeekBar.getThumbOffset());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setThumb",
-        args = {android.graphics.drawable.Drawable.class}
-    )
     public void testSetThumb() {
         MyAbsSeekBar myAbsSeekBar = new MyAbsSeekBar(mActivity);
         Drawable drawable1 = mResources.getDrawable(R.drawable.scenery);
@@ -130,11 +91,6 @@
         assertTrue(myAbsSeekBar.verifyDrawable(drawable2));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawableStateChanged",
-        args = {}
-    )
     public void testDrawableStateChanged() {
         MyAbsSeekBar myAbsSeekBar = new MyAbsSeekBar(mActivity);
         MockDrawable drawable = new MockDrawable();
@@ -149,18 +105,6 @@
         assertEquals(0xFF, drawable.getAlpha());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setThumb",
-            args = {android.graphics.drawable.Drawable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "verifyDrawable",
-            args = {android.graphics.drawable.Drawable.class}
-        )
-    })
     public void testVerifyDrawable() {
         MyAbsSeekBar myAbsSeekBar = new MyAbsSeekBar(mActivity);
         Drawable drawable1 = mResources.getDrawable(R.drawable.scenery);
@@ -198,18 +142,6 @@
         assertFalse(myAbsSeekBar.verifyDrawable(null));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getKeyProgressIncrement",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setKeyProgressIncrement",
-            args = {int.class}
-        )
-    })
     public void testAccessKeyProgressIncrement() throws Throwable {
         // AbsSeekBar is an abstract class, use its subclass: SeekBar to do this test.
         runTestOnUiThread(new Runnable() {
@@ -241,11 +173,6 @@
         assertEquals(oldProgress - keyProgressIncrement, seekBar.getProgress());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setMax",
-        args = {int.class}
-    )
     public void testSetMax() {
         MyAbsSeekBar myAbsSeekBar = new MyAbsSeekBar(mActivity, null, R.style.TestProgressBar);
 
@@ -274,33 +201,6 @@
         assertEquals(keyProgressIncrement + 1, myAbsSeekBar.getKeyProgressIncrement());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onSizeChanged",
-            args = {int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onDraw",
-            args = {Canvas.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onKeyDown",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onMeasure",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onTouchEvent",
-            args = {MotionEvent.class}
-        )
-    })
     public void testFoo() {
         // Do not test these APIs. They are callbacks which:
         // 1. The callback machanism has been tested in super class
diff --git a/tests/tests/widget/src/android/widget/cts/AbsSpinnerTest.java b/tests/tests/widget/src/android/widget/cts/AbsSpinnerTest.java
index aa65111..fc37a64 100644
--- a/tests/tests/widget/src/android/widget/cts/AbsSpinnerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AbsSpinnerTest.java
@@ -18,11 +18,6 @@
 
 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;
 
@@ -44,7 +39,6 @@
 import android.widget.Spinner;
 import android.widget.SpinnerAdapter;
 
-@TestTargetClass(AbsSpinner.class)
 public class AbsSpinnerTest extends ActivityInstrumentationTestCase2<RelativeLayoutStubActivity> {
     private Context mContext;
 
@@ -58,30 +52,7 @@
         mContext = getInstrumentation().getTargetContext();
     }
 
-    @ToBeFixed(bug="1448885", explanation="AbsSpinner is an abstract class and its abstract " +
-            "method layout(int, boolean) is package private, we can not extends it directly " +
-            "to test. So, we use its subclass Spinner and Gallery to test")
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "AbsSpinner",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "AbsSpinner",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "AbsSpinner",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
     public void testConstructor() {
         new Spinner(mContext);
 
@@ -99,16 +70,6 @@
         new Gallery(mContext, attrs, 0);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setSelection",
-            args = {int.class, boolean.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for setSelection() is incomplete." +
-            "1. no description about the @param and @return.")
     @UiThreadTest
     /**
      * Check points:
@@ -132,16 +93,6 @@
         // It is not meaningful to check it.
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setSelection",
-            args = {int.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for setSelection() is incomplete." +
-            "1. no description about the @param and @return.")
     @UiThreadTest
     /**
      * Check points:
@@ -162,22 +113,6 @@
         assertEquals(absSpinner.getCount() - 1, absSpinner.getSelectedItemPosition());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "setAdapter",
-            args = {android.widget.SpinnerAdapter.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "getAdapter",
-            args = {}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for setAdapter() is incomplete." +
-            "1. no description about the situation that adapter is null.")
     @UiThreadTest
     /**
      * Check points:
@@ -204,12 +139,6 @@
         // There is neither limit in code nor description about it in javadoc.
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "",
-        method = "requestLayout",
-        args = {}
-    )
     public void testRequestLayout() {
         AbsSpinner absSpinner = new Spinner(mContext);
         absSpinner.layout(0, 0, 200, 300);
@@ -219,12 +148,6 @@
         assertTrue(absSpinner.isLayoutRequested());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "",
-        method = "getCount",
-        args = {}
-    )
     @UiThreadTest
     /**
      * Check points:
@@ -248,12 +171,6 @@
         assertEquals(anotherStringArray.length, absSpinner.getCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "",
-        method = "pointToPosition",
-        args = {int.class, int.class}
-    )
     /**
      * Check points:
      * 1. Should return the position of the item which contains the specified point.
@@ -288,12 +205,6 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "",
-        method = "getSelectedView",
-        args = {}
-    )
     /**
      * Check points:
      * 1. Should return the view corresponding to the currently selected item.
@@ -313,20 +224,6 @@
 
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onSaveInstanceState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "onRestoreInstanceState",
-            args = {android.os.Parcelable.class}
-        )
-    })
     @UiThreadTest
     /**
      * Check points:
@@ -355,17 +252,6 @@
         assertEquals(adapter.getItemId(0), absSpinner.getSelectedItemId());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "",
-        method = "generateDefaultLayoutParams",
-        args = {}
-    )
-    @ToBeFixed(bug = "1448885", explanation = "AbsSpinner#generateDefaultLayoutParams() is" +
-            " protected method, we have to test it in MockSpinner which extends from" +
-            " AbsSpinner. class MockSpinner must implement the inherited abstract method" +
-            " AbsSpinner.layout(int, boolean), but cannot override it since it is not" +
-            " visible from MockSpinner. So we cannot test this method.")
     public void testGenerateDefaultLayoutParams() {
 //        final MockSpinner absSpinner = new MockSpinner(mContext);
 //        LayoutParams layoutParams = (LayoutParams) absSpinner.generateDefaultLayoutParams();
@@ -373,12 +259,6 @@
 //        assertEquals(LayoutParams.WRAP_CONTENT, layoutParams.height);
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        notes = "Test onMeasure(int, int) function.",
-        method = "onMeasure",
-        args = {int.class, int.class}
-    )
     public void testOnMeasure() {
         // onMeasure() is implementation details, do NOT test
     }
diff --git a/tests/tests/widget/src/android/widget/cts/AbsoluteLayoutTest.java b/tests/tests/widget/src/android/widget/cts/AbsoluteLayoutTest.java
index e5569c4..0fde985 100644
--- a/tests/tests/widget/src/android/widget/cts/AbsoluteLayoutTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AbsoluteLayoutTest.java
@@ -18,11 +18,6 @@
 
 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;
@@ -39,7 +34,6 @@
 import java.io.IOException;
 
 @SuppressWarnings("deprecation")
-@TestTargetClass(AbsoluteLayout.class)
 public class AbsoluteLayoutTest extends ActivityInstrumentationTestCase2<StubActivity> {
     private static final int DEFAULT_X      = 5;
     private static final int DEFAULT_Y      = 10;
@@ -69,24 +63,6 @@
         return Xml.asAttributeSet(parser);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AbsoluteLayout",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AbsoluteLayout",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AbsoluteLayout",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testConstructor() throws XmlPullParserException, IOException {
         AttributeSet attrs = getAttributeSet();
 
@@ -97,29 +73,14 @@
         new AbsoluteLayout(mActivity, attrs, -1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onMeasure",
-        args = {int.class, int.class}
-    )
     public void testOnMeasure() {
         // onMeasure() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onLayout",
-        args = {boolean.class, int.class, int.class, int.class, int.class}
-    )
     public void testOnLayout() {
         // onMeasure() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "checkLayoutParams",
-        args = {android.view.ViewGroup.LayoutParams.class}
-    )
     public void testCheckLayoutParams() {
         assertTrue(mMyAbsoluteLayout.checkLayoutParams(mAbsoluteLayoutParams));
 
@@ -128,11 +89,6 @@
         assertFalse(mMyAbsoluteLayout.checkLayoutParams(null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "generateLayoutParams",
-        args = {android.util.AttributeSet.class}
-    )
     public void testGenerateLayoutParams1() throws Throwable {
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -157,14 +113,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "generateLayoutParams",
-        args = {android.view.ViewGroup.LayoutParams.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of " +
-            "AbsoluteLayout#generateLayoutParams(ViewGroup.LayoutParams) when the input " +
-            "ViewGroup.LayoutParams is null")
     public void testGenerateLayoutParams2() {
         LayoutParams params =
             (LayoutParams) mMyAbsoluteLayout.generateLayoutParams(mAbsoluteLayoutParams);
@@ -182,11 +130,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "generateDefaultLayoutParams",
-        args = {}
-    )
     public void testGenerateDefaultLayoutParams() {
         LayoutParams params = (LayoutParams) mMyAbsoluteLayout.generateDefaultLayoutParams();
 
diff --git a/tests/tests/widget/src/android/widget/cts/AbsoluteLayout_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/AbsoluteLayout_LayoutParamsTest.java
index ef9bf1f..63be7d4 100644
--- a/tests/tests/widget/src/android/widget/cts/AbsoluteLayout_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AbsoluteLayout_LayoutParamsTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
@@ -35,7 +31,6 @@
 import java.io.IOException;
 
 @SuppressWarnings("deprecation")
-@TestTargetClass(LayoutParams.class)
 public class AbsoluteLayout_LayoutParamsTest extends AndroidTestCase {
 
     private AttributeSet getAttributeSet() throws XmlPullParserException, IOException {
@@ -44,23 +39,6 @@
         return Xml.asAttributeSet(parser);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AbsoluteLayout.LayoutParams",
-            args = {int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AbsoluteLayout.LayoutParams",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AbsoluteLayout.LayoutParams",
-            args = {android.view.ViewGroup.LayoutParams.class}
-        )
-    })
     public void testConstructor() throws XmlPullParserException, IOException {
         LayoutParams layoutParams;
 
@@ -79,11 +57,6 @@
         new AbsoluteLayout.LayoutParams(mContext, getAttributeSet());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "debug",
-        args = {java.lang.String.class}
-    )
     public void testDebug() {
         LayoutParams layoutParams = new AbsoluteLayout.LayoutParams(1, 2, 3, 4);
         assertNotNull(layoutParams.debug("test: "));
diff --git a/tests/tests/widget/src/android/widget/cts/AdapterViewTest.java b/tests/tests/widget/src/android/widget/cts/AdapterViewTest.java
index 12815b2..b91ca73 100755
--- a/tests/tests/widget/src/android/widget/cts/AdapterViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AdapterViewTest.java
@@ -40,13 +40,7 @@
 
 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;
 
-@TestTargetClass(AdapterView.class)
 public class AdapterViewTest extends ActivityInstrumentationTestCase2<AdapterViewStubActivity> {
 
     private final static int INVALID_ID = -1;
@@ -70,23 +64,6 @@
         mAdapterView = new ListView(mActivity);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AdapterView",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AdapterView",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AdapterView",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
     public void testConstructor() {
         XmlPullParser parser = mActivity.getResources().getXml(R.layout.adapterview_layout);
         AttributeSet attrs = Xml.asAttributeSet(parser);
@@ -110,48 +87,6 @@
     /**
      * test not supported methods, all should throw UnsupportedOperationException
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addView",
-            args = {android.view.View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addView",
-            args = {android.view.View.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addView",
-            args = {android.view.View.class, int.class, android.view.ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addView",
-            args = {android.view.View.class, android.view.ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeView",
-            args = {android.view.View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeAllViews",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeViewAt",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOnClickListener",
-            args = {android.view.View.OnClickListener.class}
-        )
-    })
     public void testUnsupportedMethods() {
         ListView subView = new ListView(mActivity);
 
@@ -216,11 +151,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getCount",
-        args = {}
-    )
     public void testGetCount() {
         // Before setAdapter, the count should be zero.
         assertEquals(0, mAdapterView.getCount());
@@ -231,23 +161,6 @@
         assertEquals(FRUIT.length, mAdapterView.getCount());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getEmptyView",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEmptyView",
-            args = {android.view.View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAdapter",
-            args = {java.lang.Object.class}
-        )
-    })
     public void testAccessEmptyView() {
         ImageView emptyView = new ImageView(mActivity);
 
@@ -289,18 +202,6 @@
         assertEquals(View.VISIBLE, emptyView.getVisibility());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFirstVisiblePosition",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLastVisiblePosition",
-            args = {}
-        )
-    })
     public void testAccessVisiblePosition() {
 
         assertEquals(0, mAdapterView.getFirstVisiblePosition());
@@ -316,19 +217,6 @@
         assertEquals(FRUIT.length - 1, mAdapterView.getLastVisiblePosition());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getItemAtPosition",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getItemIdAtPosition",
-            args = {int.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testItemOrItemIdAtPosition() {
         // no adapter set
         assertNull(mAdapterView.getItemAtPosition(0));
@@ -356,33 +244,6 @@
         assertEquals(FRUIT.length, mAdapterView.getItemIdAtPosition(FRUIT.length));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getOnItemClickListener",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOnItemClickListener",
-            args = {android.widget.AdapterView.OnItemClickListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getOnItemLongClickListener",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOnItemLongClickListener",
-            args = {android.widget.AdapterView.OnItemLongClickListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "performItemClick",
-            args = {android.view.View.class, int.class, long.class}
-        )
-    })
     public void testAccessOnItemClickAndLongClickListener() {
         MockOnItemClickListener clickListener = new MockOnItemClickListener();
         MockOnItemLongClickListener longClickListener = new MockOnItemLongClickListener();
@@ -403,18 +264,6 @@
         assertTrue(longClickListener.isClicked());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.TODO,
-            method = "getOnItemSelectedListener",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.TODO,
-            method = "setOnItemSelectedListener",
-            args = {android.widget.AdapterView.OnItemSelectedListener.class}
-        )
-    })
     public void testAccessOnItemSelectedListener() {
         // FIXME: we can not select the item in touch mode, how can we change the mode to test
         setArrayAdapter(mAdapterView);
@@ -447,13 +296,6 @@
      * it's hard to scroll the list in unit test, so we just test without scrolling
      * this means the position of item is same as position of the children in parent layout
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getPositionForView",
-        args = {android.view.View.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add NullPointerException @throws"
-        + " clause into javadoc.")
     public void testGetPositionForView() {
         setArrayAdapter(mAdapterView);
         mAdapterView.layout(0, 0, LAYOUT_WIDTH, LAYOUT_HEIGHT);
@@ -479,18 +321,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFocusable",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFocusableInTouchMode",
-            args = {boolean.class}
-        )
-    })
     public void testChangeFocusable() {
         assertFalse(mAdapterView.isFocusable());
         assertFalse(mAdapterView.isFocusableInTouchMode());
@@ -516,11 +346,6 @@
     /*
      * skip this test, no need to test
      */
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onLayout",
-        args = {boolean.class, int.class, int.class, int.class, int.class}
-    )
     public void testOnLayout() {
         // onLayout() is implementation details, do NOT test
     }
@@ -529,28 +354,6 @@
      * set and get the selected id, position and item.
      * values will not change if invalid id given.
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSelected",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSelectedItemId",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSelectedItemPosition",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSelectedItem",
-            args = {}
-        )
-    })
     public void testGetSelected() {
         assertEquals(AdapterView.INVALID_ROW_ID, mAdapterView.getSelectedItemId());
         assertEquals(AdapterView.INVALID_POSITION, mAdapterView.getSelectedItemPosition());
@@ -585,11 +388,6 @@
     /*
      * not update this test until the ViewGroup's test finish.
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dispatchSaveInstanceState",
-        args = {android.util.SparseArray.class}
-    )
     public void testDispatchSaveInstanceState() {
         MockAdapterView adapterView = new MockAdapterView(mActivity);
         adapterView.setSaveEnabled(true);
@@ -602,11 +400,6 @@
     /*
      * not update this test until the ViewGroup's test finish.
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dispatchRestoreInstanceState",
-        args = {android.util.SparseArray.class}
-    )
     public void testDispatchRestoreInstanceState() {
         MockAdapterView adapterView = new MockAdapterView(mActivity);
         adapterView.setSaveEnabled(true);
@@ -620,11 +413,6 @@
      * if no child added, it always return false
      * this method is protected, so we involve the mock
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "canAnimate",
-        args = {}
-    )
     public void testCanAnimate() {
         MockAdapterView adapterView = new MockAdapterView(mActivity);
         LayoutAnimationController lAC = new LayoutAnimationController(new AnimationSet(true));
diff --git a/tests/tests/widget/src/android/widget/cts/AdapterView_AdapterContextMenuInfoTest.java b/tests/tests/widget/src/android/widget/cts/AdapterView_AdapterContextMenuInfoTest.java
index 03e17bc..fde6095 100644
--- a/tests/tests/widget/src/android/widget/cts/AdapterView_AdapterContextMenuInfoTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AdapterView_AdapterContextMenuInfoTest.java
@@ -16,22 +16,13 @@
 
 package android.widget.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.test.AndroidTestCase;
 import android.view.View;
 import android.widget.AdapterView;
 import android.widget.AdapterView.AdapterContextMenuInfo;
 
-@TestTargetClass(AdapterContextMenuInfo.class)
 public class AdapterView_AdapterContextMenuInfoTest extends AndroidTestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "AdapterView.AdapterContextMenuInfo",
-        args = {android.view.View.class, int.class, long.class}
-    )
     public void testConstructor() {
         AdapterView.AdapterContextMenuInfo menuInfo;
         View testView = new View(getContext());
diff --git a/tests/tests/widget/src/android/widget/cts/AlphabetIndexerTest.java b/tests/tests/widget/src/android/widget/cts/AlphabetIndexerTest.java
index 291f886..dd9393c 100644
--- a/tests/tests/widget/src/android/widget/cts/AlphabetIndexerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AlphabetIndexerTest.java
@@ -16,17 +16,12 @@
 
 package android.widget.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.database.Cursor;
 import android.database.MatrixCursor;
 import android.test.AndroidTestCase;
 import android.widget.AlphabetIndexer;
 
-@TestTargetClass(AlphabetIndexer.class)
 public class AlphabetIndexerTest extends AndroidTestCase {
     private static final String[] COUNTRIES_LIST = new String[]
         {"Argentina", "Australia", "China", "France", "Germany", "Italy", "Japan", "United States"};
@@ -43,33 +38,6 @@
     private static final int INDEX_OF_MESSI = 5;
     private static final int INDEX_OF_STEVEN = 7;
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AlphabetIndexer",
-            args = {android.database.Cursor.class, int.class, java.lang.CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPositionForSection",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSectionForPosition",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSections",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setCursor",
-            args = {android.database.Cursor.class}
-        )
-    })
     public void testAlphabetIndexer() {
         Cursor c1 = createCursor("Country", COUNTRIES_LIST);
 
@@ -132,11 +100,6 @@
         assertEquals(NAMES_LIST.length, indexer.getPositionForSection(index));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "compare",
-        args = {java.lang.String.class, java.lang.String.class}
-    )
     public void testCompare() {
         Cursor cursor = createCursor("Country", COUNTRIES_LIST);
 
diff --git a/tests/tests/widget/src/android/widget/cts/AnalogClockTest.java b/tests/tests/widget/src/android/widget/cts/AnalogClockTest.java
index 5e0ed71..f3b02b0 100644
--- a/tests/tests/widget/src/android/widget/cts/AnalogClockTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AnalogClockTest.java
@@ -18,11 +18,6 @@
 
 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;
 
@@ -32,7 +27,6 @@
 import android.util.Xml;
 import android.widget.AnalogClock;
 
-@TestTargetClass(AnalogClock.class)
 public class AnalogClockTest extends ActivityInstrumentationTestCase2<FrameLayoutStubActivity> {
     private AttributeSet mAttrSet;
     private Activity mActivity;
@@ -50,27 +44,6 @@
         mActivity = getActivity();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors of AnalogClock.",
-            method = "AnalogClock",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors of AnalogClock.",
-            method = "AnalogClock",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors of AnalogClock.",
-            method = "AnalogClock",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testConstructor() {
         new AnalogClock(mActivity);
         new AnalogClock(mActivity, mAttrSet);
@@ -98,52 +71,22 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        notes = "Test onMeasure() function.",
-        method = "onMeasure",
-        args = {int.class, int.class}
-    )
     public void testOnMeasure() {
         // onMeasure() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        notes = "Test onSizeChanged(int, int, int, int) function.",
-        method = "onSizeChanged",
-        args = {int.class, int.class, int.class, int.class}
-    )
     public void testOnSizeChanged() {
         // Do not test onSizeChanged(), implementation details
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        notes = "Test onDraw(Canvas) function.",
-        method = "onDraw",
-        args = {android.graphics.Canvas.class}
-    )
     public void testOnDraw() {
         // Do not test, it's controlled by View. Implementation details
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        notes = "Test onDetachedFromWindow() function.",
-        method = "onDetachedFromWindow",
-        args = {}
-    )
     public void testOnDetachedFromWindow() {
         // Do not test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        notes = "Test onAttachedToWindow() function.",
-        method = "onAttachedToWindow",
-        args = {}
-    )
     public void testOnAttachedToWindow() {
         // Do not test
     }
diff --git a/tests/tests/widget/src/android/widget/cts/ArrayAdapterTest.java b/tests/tests/widget/src/android/widget/cts/ArrayAdapterTest.java
index 4541e9d..101b271 100644
--- a/tests/tests/widget/src/android/widget/cts/ArrayAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ArrayAdapterTest.java
@@ -28,13 +28,7 @@
 
 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;
 
-@TestTargetClass(ArrayAdapter.class)
 public class ArrayAdapterTest extends AndroidTestCase {
 
     private static final int INVALD_ID = -1;
@@ -49,40 +43,6 @@
           mArrayAdapter = new ArrayAdapter<String>(mContext, R.layout.simple_dropdown_item_1line);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ArrayAdapter",
-            args = {android.content.Context.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ArrayAdapter",
-            args = {android.content.Context.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ArrayAdapter",
-            args = {android.content.Context.class, int.class, int.class, java.util.List.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ArrayAdapter",
-            args = {android.content.Context.class, int.class, java.util.List.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ArrayAdapter",
-            args = {android.content.Context.class, int.class, int.class, java.lang.Object[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ArrayAdapter",
-            args = {android.content.Context.class, int.class, java.lang.Object[].class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "should add NullPointerException @throws"
-        + " clause into javadoc.")
     public void testConstructor() {
 
         new ArrayAdapter<String>(mContext, R.layout.simple_dropdown_item_1line);
@@ -114,29 +74,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setNotifyOnChange",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "notifyDataSetChanged",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "add",
-            args = {java.lang.Object.class}
-        ),
-        @TestTargetNew(
-                level = TestLevel.COMPLETE,
-                method = "clear",
-                args = {}
-        )
-
-    })
     public void testDataChangeEvent() {
         final MockDataSetObserver mockDataSetObserver = new MockDataSetObserver();
         mArrayAdapter.registerDataSetObserver(mockDataSetObserver);
@@ -180,30 +117,6 @@
         assertEquals(3, mockDataSetObserver.getCalledOnChangedCount());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-                level = TestLevel.COMPLETE,
-                method = "getContext",
-                args = {}
-            ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getView",
-            args = {int.class, android.view.View.class, android.view.ViewGroup.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDropDownView",
-            args = {int.class, android.view.View.class, android.view.ViewGroup.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "should add NullPointerException @throws"
-        + " clause into javadoc.")
     public void testAccessView() {
         final TextView textView = new TextView(mContext);
         textView.setText(STR3);
@@ -254,12 +167,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getFilter",
-        args = {}
-    )
-    @ToBeFixed(bug = "", explanation = "Can not check the filter's filting result.")
     public void testGetFilter() {
         Filter filter = mArrayAdapter.getFilter();
 
@@ -272,11 +179,6 @@
      * we set a xml that not contain a textview, so exception should throw to lete us know
      * sucessfully change the dropdown xml, but should not affect the normal view by getview
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setDropDownViewResource",
-        args = {int.class}
-    )
     public void testSetDropDownViewResouce() {
         mArrayAdapter.add(STR1);
 
@@ -300,13 +202,6 @@
      * insert the item to the specific position, notify data changed
      * check -1, normal, > count
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "insert",
-            args = {java.lang.Object.class, int.class}
-        )
-    })
     public void testInsert() {
         mArrayAdapter.setNotifyOnChange(true);
         final MockDataSetObserver mockDataSetObserver = new MockDataSetObserver();
@@ -347,11 +242,6 @@
      * return the given position obj
      * test range: -1, normal, > count
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getItem",
-        args = {int.class}
-    )
     public void testGetItem() {
         mArrayAdapter.add(STR1);
         mArrayAdapter.add(STR2);
@@ -380,11 +270,6 @@
     /**
      * just return the given position
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getItemId",
-        args = {int.class}
-    )
     public void testGetItemId() {
         mArrayAdapter.add(STR1);
         mArrayAdapter.add(STR2);
@@ -403,11 +288,6 @@
     /*
      * return the obj position that in the array, if there are same objs, return the first one
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getPosition",
-        args = {java.lang.Object.class}
-    )
     public void testGetPosition() {
         mArrayAdapter.add(STR1);
         mArrayAdapter.add(STR2);
@@ -428,11 +308,6 @@
      * Removes the specified object from the array. notify data changed
      * remove first one if duplicated string in the array
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "remove",
-        args = {java.lang.Object.class}
-    )
     public void testRemove() {
         final MockDataSetObserver mockDataSetObserver = new MockDataSetObserver();
         mArrayAdapter.registerDataSetObserver(mockDataSetObserver);
@@ -476,13 +351,6 @@
      * Creates a new ArrayAdapter from external resources. The content of the array is
      * obtained through {@link android.content.res.Resources#getTextArray(int)}.
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "createFromResource",
-        args = {android.content.Context.class, int.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add NullPointerException @throws"
-        + " clause into javadoc.")
     public void testCreateFromResource() {
         ArrayAdapter.createFromResource(mContext, R.array.string, R.layout.simple_spinner_item);
 
@@ -504,11 +372,6 @@
        ArrayAdapter.createFromResource(mContext, R.array.string, INVALD_ID);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "createFromResource",
-        args = {android.content.Context.class, int.class, int.class}
-    )
     public void testSort() {
         final MockDataSetObserver mockDataSetObserver = new MockDataSetObserver();
         mArrayAdapter.registerDataSetObserver(mockDataSetObserver);
@@ -530,13 +393,6 @@
      * insert multiple items via add, notify data changed
      * check count and content
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "add",
-            args = {Object.class}
-        )
-    })
     public void testAdd() {
         mArrayAdapter.setNotifyOnChange(true);
         final MockDataSetObserver mockDataSetObserver = new MockDataSetObserver();
@@ -556,13 +412,6 @@
      * insert multiple items via addAll, notify data changed
      * check count and content
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addAll",
-            args = {java.util.Collection.class}
-        )
-    })
     public void testAddAllCollection() {
         mArrayAdapter.setNotifyOnChange(true);
         final MockDataSetObserver mockDataSetObserver = new MockDataSetObserver();
@@ -590,13 +439,6 @@
      * insert multiple items via addAll, notify data changed
      * check count and content
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addAll",
-            args = {Object[].class}
-        )
-    })
     public void testAddAllParams() {
         mArrayAdapter.setNotifyOnChange(true);
         final MockDataSetObserver mockDataSetObserver = new MockDataSetObserver();
diff --git a/tests/tests/widget/src/android/widget/cts/AutoCompleteTextViewTest.java b/tests/tests/widget/src/android/widget/cts/AutoCompleteTextViewTest.java
index 76bf39b..27becec 100755
--- a/tests/tests/widget/src/android/widget/cts/AutoCompleteTextViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AutoCompleteTextViewTest.java
@@ -18,11 +18,6 @@
 
 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;
@@ -48,7 +43,6 @@
 
 import java.io.IOException;
 
-@TestTargetClass(AutoCompleteTextView.class)
 public class AutoCompleteTextViewTest extends
         ActivityInstrumentationTestCase2<AutoCompleteStubActivity> {
 
@@ -103,24 +97,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AutoCompleteTextView",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AutoCompleteTextView",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "AutoCompleteTextView",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testConstructor() {
         XmlPullParser parser;
 
@@ -153,11 +129,6 @@
         new AutoCompleteTextView(mActivity, null, -1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "enoughToFilter",
-        args = {}
-    )
     public void testEnoughToFilter() throws Throwable {
         mAutoCompleteTextView.setThreshold(3);
         assertEquals(3, mAutoCompleteTextView.getThreshold());
@@ -181,23 +152,6 @@
         assertFalse(mAutoCompleteTextView.enoughToFilter());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAdapter",
-            args = {android.widget.ListAdapter.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAdapter",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFilter",
-            args = {}
-        )
-    })
     public void testAccessAdapter() {
         MockAutoCompleteTextView autoCompleteTextView = new MockAutoCompleteTextView(mActivity);
 
@@ -221,23 +175,6 @@
         assertNull(autoCompleteTextView.getFilter());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOnItemClickListener",
-            args = {android.widget.AdapterView.OnItemClickListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getItemClickListener",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getOnItemClickListener",
-            args = {}
-        )
-    })
     @SuppressWarnings("deprecation")
     public void testAccessItemClickListener() {
         final MockOnItemClickListener testOnItemClickListener = new MockOnItemClickListener();
@@ -258,23 +195,6 @@
         assertNull(mAutoCompleteTextView.getOnItemClickListener());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOnItemSelectedListener",
-            args = {android.widget.AdapterView.OnItemSelectedListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getItemSelectedListener",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getOnItemSelectedListener",
-            args = {}
-        )
-    })
     @SuppressWarnings("deprecation")
     public void testAccessItemSelectedListener() {
         MockOnItemSelectedListener testOnItemSelectedListener = new MockOnItemSelectedListener();
@@ -295,11 +215,6 @@
         assertNull(mAutoCompleteTextView.getOnItemSelectedListener());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "convertSelectionToString",
-        args = {java.lang.Object.class}
-    )
     public void testConvertSelectionToString() {
         MockAutoCompleteTextView autoCompleteTextView = new MockAutoCompleteTextView(mActivity);
 
@@ -312,11 +227,6 @@
         assertEquals(STRING_TEST, autoCompleteTextView.convertSelectionToString(STRING_TEST));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onTextChanged",
-        args = {java.lang.CharSequence.class, int.class, int.class, int.class}
-    )
     public void testOnTextChanged() {
         MockAutoCompleteTextView autoCompleteTextView = new MockAutoCompleteTextView(mActivity);
 
@@ -345,28 +255,6 @@
         assertEquals(STRING_CHECK.length(), autoCompleteTextView.getAfter());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onFocusChanged",
-            args = {boolean.class, int.class, android.graphics.Rect.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dismissDropDown",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "showDropDown",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isPopupShowing",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testPopupWindow() throws XmlPullParserException, IOException {
         assertFalse(mAutoCompleteTextView.isPopupShowing());
@@ -392,11 +280,6 @@
         assertEquals(STRING_VALIDATED, mAutoCompleteTextView.getText().toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "replaceText",
-        args = {java.lang.CharSequence.class}
-    )
     public void testReplaceText() {
         MockAutoCompleteTextView autoCompleteTextView = new MockAutoCompleteTextView(mActivity);
 
@@ -413,11 +296,6 @@
         assertTrue(autoCompleteTextView.isOnTextChanged());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setFrame",
-        args = {int.class, int.class, int.class, int.class}
-    )
     public void testSetFrame() {
         MockAutoCompleteTextView autoCompleteTextView = new MockAutoCompleteTextView(mActivity);
 
@@ -442,18 +320,6 @@
         assertEquals(5, autoCompleteTextView.getBottom());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getThreshold",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setThreshold",
-            args = {int.class}
-        )
-    })
     public void testGetThreshold() {
         final AutoCompleteTextView autoCompleteTextView = (AutoCompleteTextView) mActivity
                 .findViewById(R.id.autocompletetv_edit);
@@ -472,18 +338,6 @@
         assertEquals(1, autoCompleteTextView.getThreshold());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getValidator",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setValidator",
-            args = {android.widget.AutoCompleteTextView.Validator.class}
-        )
-    })
     public void testAccessValidater() {
         final MockValidator validator = new MockValidator();
 
@@ -496,11 +350,6 @@
         assertNull(mAutoCompleteTextView.getValidator());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onFilterComplete",
-        args = {int.class}
-    )
     public void testOnFilterComplete() throws Throwable {
         // Set Threshold to 4 characters
         mAutoCompleteTextView.setThreshold(4);
@@ -556,19 +405,6 @@
         assertTrue(mAutoCompleteTextView.isPopupShowing());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyDown",
-            args = {int.class, android.view.KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "performFiltering",
-            args = {java.lang.CharSequence.class, int.class}
-        )
-    })
-    @ToBeFixed(bug = "", explanation = "mAutoCompleteTextView.isPopupShowing() should be false")
     public void testPerformFiltering() throws Throwable {
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -632,23 +468,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "performCompletion",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyUp",
-            args = {int.class, android.view.KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isPerformingCompletion",
-            args = {}
-        )
-    })
     public void testPerformCompletion() throws Throwable {
         final MockOnItemClickListener listener = new MockOnItemClickListener();
         assertFalse(mAutoCompleteTextView.isPerformingCompletion());
@@ -715,11 +534,6 @@
         assertFalse(mAutoCompleteTextView.isPerformingCompletion());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "performValidation",
-        args = {}
-    )
     @UiThreadTest
     public void testPerformValidation() {
         final CharSequence text = "this";
@@ -733,71 +547,26 @@
         mAutoCompleteTextView.setValidator(null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setCompletionHint",
-        args = {java.lang.CharSequence.class}
-    )
-    @ToBeFixed( bug = "1400249", explanation = "only setter no getter")
     public void testSetCompletionHint() {
         mAutoCompleteTextView.setCompletionHint("TEST HINT");
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onAttachedToWindow",
-        args = {}
-    )
     public void testOnAttachedToWindow() {
         // implement details, do not test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onCommitCompletion",
-        args = {android.view.inputmethod.CompletionInfo.class}
-    )
     public void testOnCommitCompletion() {
         // implement details, do not test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onDetachedFromWindow",
-        args = {}
-    )
     public void testOnDetachedFromWindow() {
         // implement details, do not test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onKeyPreIme",
-        args = {int.class, android.view.KeyEvent.class}
-    )
     public void testOnKeyPreIme() {
         // implement details, do not test
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setListSelection",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getListSelection",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "clearListSelection",
-            args = {}
-        )
-    })
-    @ToBeFixed(bug = "", explanation = "When clearListSelection, getListSelection should " +
-            "return ListView.INVALID_POSITION, but not.")
     public void testAccessListSelection() throws Throwable {
         final MockOnItemClickListener listener = new MockOnItemClickListener();
 
@@ -826,18 +595,6 @@
         mInstrumentation.waitForIdleSync();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDropDownAnchor",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDropDownAnchor",
-            args = {}
-        )
-    })
     public void testAccessDropDownAnchor() {
         mAutoCompleteTextView.setDropDownAnchor(View.NO_ID);
         assertEquals(View.NO_ID, mAutoCompleteTextView.getDropDownAnchor());
@@ -846,18 +603,6 @@
         assertEquals(0x5555, mAutoCompleteTextView.getDropDownAnchor());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDropDownWidth",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDropDownWidth",
-            args = {}
-        )
-    })
     public void testAccessDropDownWidth() {
         mAutoCompleteTextView.setDropDownWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
         assertEquals(ViewGroup.LayoutParams.WRAP_CONTENT, mAutoCompleteTextView.getDropDownWidth());
diff --git a/tests/tests/widget/src/android/widget/cts/BaseAdapterTest.java b/tests/tests/widget/src/android/widget/cts/BaseAdapterTest.java
index fe7f98b..0369259 100644
--- a/tests/tests/widget/src/android/widget/cts/BaseAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/BaseAdapterTest.java
@@ -16,10 +16,6 @@
 
 package android.widget.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.database.DataSetObserver;
 import android.test.AndroidTestCase;
@@ -30,36 +26,12 @@
 /**
  * Test {@link BaseAdapter}.
  */
-@TestTargetClass(BaseAdapter.class)
 public class BaseAdapterTest extends AndroidTestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "this function always returns false.",
-        method = "hasStableIds",
-        args = {}
-    )
     public void testHasStableIds() {
         BaseAdapter baseAdapter = new MockBaseAdapter();
         assertFalse(baseAdapter.hasStableIds());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "registerDataSetObserver",
-            args = {android.database.DataSetObserver.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unregisterDataSetObserver",
-            args = {android.database.DataSetObserver.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "notifyDataSetChanged",
-            args = {}
-        )
-    })
     public void testDataSetObserver() {
         BaseAdapter baseAdapter = new MockBaseAdapter();
         MockDataSetObserver dataSetObserver = new MockDataSetObserver();
@@ -79,11 +51,6 @@
         assertFalse(dataSetObserver.hasCalledOnChanged());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "notifyDataSetInvalidated",
-        args = {}
-    )
     public void testNotifyDataSetInvalidated() {
         BaseAdapter baseAdapter = new MockBaseAdapter();
         MockDataSetObserver dataSetObserver = new MockDataSetObserver();
@@ -97,65 +64,31 @@
         assertTrue(dataSetObserver.hasCalledOnInvalidated());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "this function always returns true.",
-        method = "areAllItemsEnabled",
-        args = {}
-    )
     public void testAreAllItemsEnabled() {
         BaseAdapter baseAdapter = new MockBaseAdapter();
         assertTrue(baseAdapter.areAllItemsEnabled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "this function always returns true.",
-        method = "isEnabled",
-        args = {int.class}
-    )
     public void testIsEnabled() {
         BaseAdapter baseAdapter = new MockBaseAdapter();
         assertTrue(baseAdapter.isEnabled(0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getDropDownView",
-        args = {int.class, android.view.View.class, android.view.ViewGroup.class}
-    )
     public void testGetDropDownView() {
         BaseAdapter baseAdapter = new MockBaseAdapter();
         assertNull(baseAdapter.getDropDownView(0, null, null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "this function always returns 0.",
-        method = "getItemViewType",
-        args = {int.class}
-    )
     public void testGetItemViewType() {
         BaseAdapter baseAdapter = new MockBaseAdapter();
         assertEquals(0, baseAdapter.getItemViewType(0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "this function always returns 1.",
-        method = "getViewTypeCount",
-        args = {}
-    )
     public void testGetViewTypeCount() {
         BaseAdapter baseAdapter = new MockBaseAdapter();
         assertEquals(1, baseAdapter.getViewTypeCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isEmpty",
-        args = {}
-    )
     public void testIsEmpty() {
         MockBaseAdapter baseAdapter = new MockBaseAdapter();
 
diff --git a/tests/tests/widget/src/android/widget/cts/BaseExpandableListAdapterTest.java b/tests/tests/widget/src/android/widget/cts/BaseExpandableListAdapterTest.java
index d8528bb..1737cfd 100644
--- a/tests/tests/widget/src/android/widget/cts/BaseExpandableListAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/BaseExpandableListAdapterTest.java
@@ -21,45 +21,16 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.BaseExpandableListAdapter;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
 /**
  * Test {@link BaseExpandableListAdapter}.
  */
-@TestTargetClass(BaseExpandableListAdapter.class)
 public class BaseExpandableListAdapterTest extends InstrumentationTestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test areAllItemsEnabled(), this function always returns true.",
-        method = "areAllItemsEnabled",
-        args = {}
-    )
     public void testAreAllItemsEnabled() {
         MockBaseExpandableListAdapter adapter = new MockBaseExpandableListAdapter();
         assertTrue(adapter.areAllItemsEnabled());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getCombinedChildId(long, long) function.",
-            method = "getCombinedChildId",
-            args = {long.class, long.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test getCombinedChildId(long, long) function.",
-            method = "getCombinedGroupId",
-            args = {long.class}
-        )
-    })
-    @ToBeFixed(bug = "1502158", explanation = "getCombinedChildId() always returns a group id, " +
-            "it never returns a child id; because bit 0 always be 1; getCombinedGroupId() " +
-            "always returns a child id, it never returns a group id; because bit 0 always be 0")
     public void testGetCombinedId() {
         MockBaseExpandableListAdapter adapter = new MockBaseExpandableListAdapter();
 
@@ -74,12 +45,6 @@
         assertTrue(childID != groupID);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test isEmpty() function.",
-        method = "isEmpty",
-        args = {}
-    )
     public void testIsEmpty() {
         MockBaseExpandableListAdapter adapter = new MockBaseExpandableListAdapter();
         assertTrue(adapter.isEmpty());
@@ -87,12 +52,6 @@
         assertFalse(adapter.isEmpty());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test notifyDataSetChanged() function.",
-        method = "notifyDataSetChanged",
-        args = {}
-    )
     public void testNotifyDataSetChanged() {
         MockBaseExpandableListAdapter adapter = new MockBaseExpandableListAdapter();
         MockDataSetObserver dataSetObserver = new MockDataSetObserver();
@@ -103,12 +62,6 @@
         assertTrue(dataSetObserver.hasCalledOnChanged());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test notifyDataSetInvalidated() function.",
-        method = "notifyDataSetInvalidated",
-        args = {}
-    )
     public void testNotifyDataSetInvalidated() {
         MockBaseExpandableListAdapter adapter = new MockBaseExpandableListAdapter();
         MockDataSetObserver dataSetObserver = new MockDataSetObserver();
@@ -119,42 +72,18 @@
         assertTrue(dataSetObserver.hasCalledOnInvalidated());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test onGroupCollapsed(int), this function is non-operation.",
-        method = "onGroupCollapsed",
-        args = {int.class}
-    )
     public void testOnGroupCollapsed() {
         MockBaseExpandableListAdapter adapter = new MockBaseExpandableListAdapter();
         // this function is non-operation.
         adapter.onGroupCollapsed(0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test onGroupExpanded(int), this function is non-operation.",
-        method = "onGroupExpanded",
-        args = {int.class}
-    )
     public void testOnGroupExpanded() {
         MockBaseExpandableListAdapter adapter = new MockBaseExpandableListAdapter();
         // this function is non-operation.
         adapter.onGroupExpanded(0);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "registerDataSetObserver",
-            args = {android.database.DataSetObserver.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unregisterDataSetObserver",
-            args = {android.database.DataSetObserver.class}
-        )
-    })
     public void testDataSetObserver() {
         MockBaseExpandableListAdapter adapter = new MockBaseExpandableListAdapter();
         MockDataSetObserver dataSetObserver = new MockDataSetObserver();
diff --git a/tests/tests/widget/src/android/widget/cts/ButtonTest.java b/tests/tests/widget/src/android/widget/cts/ButtonTest.java
index b3dcabc..98b3318 100644
--- a/tests/tests/widget/src/android/widget/cts/ButtonTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ButtonTest.java
@@ -26,36 +26,8 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
-@TestTargetClass(Button.class)
 public class ButtonTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link Button}",
-            method = "Button",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link Button}",
-            method = "Button",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link Button}",
-            method = "Button",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
-    @ToBeFixed(bug="1417734", explanation="should add @throws clause into javadoc of " +
-            "Button's constructors when the input AttributeSet or Context is null")
     public void testConstructor() {
         XmlPullParser parser = mContext.getResources().getXml(R.layout.togglebutton_layout);
         AttributeSet attrs = Xml.asAttributeSet(parser);
diff --git a/tests/tests/widget/src/android/widget/cts/CheckBoxTest.java b/tests/tests/widget/src/android/widget/cts/CheckBoxTest.java
index 2149d28..55960f9 100644
--- a/tests/tests/widget/src/android/widget/cts/CheckBoxTest.java
+++ b/tests/tests/widget/src/android/widget/cts/CheckBoxTest.java
@@ -18,11 +18,6 @@
 
 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;
 
@@ -31,27 +26,7 @@
 import android.util.Xml;
 import android.widget.CheckBox;
 
-@TestTargetClass(CheckBox.class)
 public class CheckBoxTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "CheckBox",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "CheckBox",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "CheckBox",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
-    @ToBeFixed(bug="1695243", explanation="should add @throws clause into javadoc of " +
-            "CheckBox's constructors when the input AttributeSet or Context is null")
     public void testConstructor() {
         XmlPullParser parser = mContext.getResources().getXml(R.layout.checkbox_layout);
         AttributeSet mAttrSet = Xml.asAttributeSet(parser);
diff --git a/tests/tests/widget/src/android/widget/cts/CheckedTextViewTest.java b/tests/tests/widget/src/android/widget/cts/CheckedTextViewTest.java
index 6e35567..6aa44c1 100644
--- a/tests/tests/widget/src/android/widget/cts/CheckedTextViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/CheckedTextViewTest.java
@@ -18,11 +18,6 @@
 
 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 android.app.Activity;
 import android.app.Instrumentation;
@@ -42,7 +37,6 @@
 
 import java.util.Arrays;
 
-@TestTargetClass(CheckedTextView.class)
 public class CheckedTextViewTest extends
         ActivityInstrumentationTestCase2<CheckedTextViewStubActivity> {
     private Resources mResources;
@@ -61,26 +55,6 @@
         mResources = mActivity.getResources();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "CheckedTextView",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "CheckedTextView",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "CheckedTextView",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, "
-            + "should add @throws clause into javadoc of "
-            + "CheckedTextView's constructors when the input Context is null")
     public void testConstructor() {
         new MockCheckedTextView(mActivity, null, 0);
         new MockCheckedTextView(mActivity, null);
@@ -108,18 +82,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isChecked",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setChecked",
-            args = {boolean.class}
-        )
-    })
     public void testChecked() {
         final ListView lv = (ListView) mActivity.findViewById(R.id.checkedtextview_listview);
 
@@ -164,11 +126,6 @@
         assertFalse(view2.isChecked());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "toggle",
-        args = {}
-    )
     public void testToggle() {
         CheckedTextView checkedTextView = new MockCheckedTextView(mActivity);
         assertFalse(checkedTextView.isChecked());
@@ -184,11 +141,6 @@
         assertFalse(checkedTextView.isChecked());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawableStateChanged",
-        args = {}
-    )
     public void testDrawableStateChanged() {
         MockCheckedTextView checkedTextView = new MockCheckedTextView(mActivity);
 
@@ -198,11 +150,6 @@
         assertTrue(checkedTextView.hasDrawableStateChanged());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setPadding",
-        args = {int.class, int.class, int.class, int.class}
-    )
     public void testSetPadding() {
         final CheckedTextView lv
                 = (CheckedTextView) mActivity.findViewById(R.id.checkedtextview_test);
@@ -240,11 +187,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setCheckMarkDrawable",
-        args = {android.graphics.drawable.Drawable.class}
-    )
     public void testSetCheckMarkDrawableByDrawable() {
         CheckedTextView checkedTextView;
         int basePaddingRight = 10;
@@ -285,11 +227,6 @@
         assertTrue(checkedTextView.isLayoutRequested());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setCheckMarkDrawable",
-        args = {int.class}
-    )
     public void testSetCheckMarkDrawableById() {
         CheckedTextView checkedTextView;
         int basePaddingRight = 10;
@@ -329,20 +266,10 @@
         assertFalse(checkedTextView.isLayoutRequested());
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onDraw",
-        args = {android.graphics.Canvas.class}
-    )
     public void testOnDraw() {
         // Do not test. Implementation details.
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onCreateDrawableState",
-        args = {int.class}
-    )
     public void testOnCreateDrawableState() {
         // Do not test. Implementation details.
     }
diff --git a/tests/tests/widget/src/android/widget/cts/ChronometerTest.java b/tests/tests/widget/src/android/widget/cts/ChronometerTest.java
index 5f16592..7fbb58a 100644
--- a/tests/tests/widget/src/android/widget/cts/ChronometerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ChronometerTest.java
@@ -16,10 +16,6 @@
 
 package android.widget.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.UiThreadTest;
@@ -29,7 +25,6 @@
 /**
  * Test {@link Chronometer}.
  */
-@TestTargetClass(Chronometer.class)
 public class ChronometerTest extends ActivityInstrumentationTestCase2<ChronometerStubActivity> {
     private ChronometerStubActivity mActivity;
     public ChronometerTest() {
@@ -42,23 +37,6 @@
         mActivity = getActivity();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Chronometer",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Chronometer",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Chronometer",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
     public void testConstructor() {
         new Chronometer(mActivity);
 
@@ -67,18 +45,6 @@
         new Chronometer(mActivity, null, 0);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBase",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setBase",
-            args = {long.class}
-        )
-    })
     @UiThreadTest
     public void testAccessBase() {
         Chronometer chronometer = mActivity.getChronometer();
@@ -108,18 +74,6 @@
         assertNotSame(oldText, chronometer.getText());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFormat",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFormat",
-            args = {java.lang.String.class}
-        )
-    })
     @UiThreadTest
     public void testAccessFormat() {
         Chronometer chronometer = mActivity.getChronometer();
@@ -134,36 +88,12 @@
         assertTrue(text.endsWith("trail"));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onWindowVisibilityChanged",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onDetachedFromWindow",
-            args = {}
-        )
-    })
     public void testFoo() {
         // Do not test these APIs. They are callbacks which:
         // 1. The callback machanism has been tested in super class
         // 2. The functionality is implmentation details, no need to test
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "start",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stop",
-            args = {}
-        )
-    })
     public void testStartAndStop() throws Throwable {
         final Chronometer chronometer = mActivity.getChronometer();
 
@@ -200,18 +130,6 @@
         assertTrue(expected.equals(chronometer.getText()));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getOnChronometerTickListener",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOnChronometerTickListener",
-            args = {OnChronometerTickListener.class}
-        )
-    })
     public void testAccessOnChronometerTickListener() throws Throwable {
         final Chronometer chronometer = mActivity.getChronometer();
         final MockOnChronometerTickListener listener = new MockOnChronometerTickListener();
diff --git a/tests/tests/widget/src/android/widget/cts/CompoundButtonTest.java b/tests/tests/widget/src/android/widget/cts/CompoundButtonTest.java
index cf15efd..731d1ce 100644
--- a/tests/tests/widget/src/android/widget/cts/CompoundButtonTest.java
+++ b/tests/tests/widget/src/android/widget/cts/CompoundButtonTest.java
@@ -18,11 +18,6 @@
 
 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;
 
@@ -45,7 +40,6 @@
 /**
  * Test {@link CompoundButton}.
  */
-@TestTargetClass(CompoundButton.class)
 public class CompoundButtonTest extends AndroidTestCase {
     private Resources mResources;
 
@@ -55,28 +49,6 @@
         mResources = mContext.getResources();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link CompoundButton}",
-            method = "CompoundButton",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link CompoundButton}",
-            method = "CompoundButton",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link CompoundButton}",
-            method = "CompoundButton",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
-    @ToBeFixed(bug="1417734", explanation="should add @throws clause into javadoc of " +
-            "CompoundButton's constructors when the input AttributeSet or Context is null")
     public void testConstructor() {
         XmlPullParser parser = mContext.getResources().getXml(R.layout.togglebutton_layout);
         AttributeSet mAttrSet = Xml.asAttributeSet(parser);
@@ -107,18 +79,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setChecked",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isChecked",
-            args = {}
-        )
-    })
     public void testAccessChecked() {
         CompoundButton compoundButton = new MockCompoundButton(mContext);
         MockOnCheckedChangeListener listener = new MockOnCheckedChangeListener();
@@ -144,12 +104,6 @@
         assertFalse(listener.getInputChecked());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CompoundButton#setOnCheckedChangeListener(OnCheckedChangeListener)}",
-        method = "setOnCheckedChangeListener",
-        args = {android.widget.CompoundButton.OnCheckedChangeListener.class}
-    )
     public void testSetOnCheckedChangeListener() {
         CompoundButton compoundButton = new MockCompoundButton(mContext);
         MockOnCheckedChangeListener listener = new MockOnCheckedChangeListener();
@@ -167,12 +121,6 @@
         assertFalse(listener.hasCalledCheckedChange());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CompoundButton#toggle()}",
-        method = "toggle",
-        args = {}
-    )
     public void testToggle() {
         CompoundButton compoundButton = new MockCompoundButton(mContext);
         assertFalse(compoundButton.isChecked());
@@ -188,12 +136,6 @@
         assertFalse(compoundButton.isChecked());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CompoundButton#performClick()}",
-        method = "performClick",
-        args = {}
-    )
     public void testPerformClick() {
         CompoundButton compoundButton = new MockCompoundButton(mContext);
         assertFalse(compoundButton.isChecked());
@@ -217,12 +159,6 @@
         assertFalse(compoundButton.isChecked());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CompoundButton#drawableStateChanged()}",
-        method = "drawableStateChanged",
-        args = {}
-    )
     public void testDrawableStateChanged() {
         MockCompoundButton compoundButton = new MockCompoundButton(mContext);
         assertFalse(compoundButton.isChecked());
@@ -240,12 +176,6 @@
         assertSame(compoundButton.getDrawableState(), drawable.getState());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CompoundButton#setButtonDrawable(Drawable)}",
-        method = "setButtonDrawable",
-        args = {android.graphics.drawable.Drawable.class}
-    )
     public void testSetButtonDrawableByDrawable() {
         CompoundButton compoundButton;
 
@@ -275,14 +205,6 @@
         assertFalse(firstDrawable.isVisible());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CompoundButton#setButtonDrawable(int)}",
-        method = "setButtonDrawable",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1386429", explanation = "we can not check the drawable which is set" +
-            " by id. we need getter method to complete this test case.")
     public void testSetButtonDrawableById() {
         CompoundButton compoundButton;
         // resId is 0
@@ -300,12 +222,6 @@
         compoundButton.setButtonDrawable(R.drawable.pass);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CompoundButton#onCreateDrawableState(int)}",
-        method = "onCreateDrawableState",
-        args = {int.class}
-    )
     public void testOnCreateDrawableState() {
         MockCompoundButton compoundButton;
 
@@ -327,12 +243,6 @@
         assertEquals(0, state[state.length - 1]);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CompoundButton#onDraw(Canvas)}",
-        method = "onDraw",
-        args = {android.graphics.Canvas.class}
-    )
     public void testOnDraw() {
         int viewHeight;
         int drawableWidth;
@@ -381,18 +291,6 @@
         assertEquals( (viewHeight - drawableHeight) / 2 + drawableHeight, bounds.bottom);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSaveInstanceState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestoreInstanceState",
-            args = {android.os.Parcelable.class}
-        )
-    })
     public void testAccessInstanceState() {
         CompoundButton compoundButton = new MockCompoundButton(mContext);
         Parcelable state;
@@ -411,11 +309,6 @@
         assertTrue(compoundButton.isLayoutRequested());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "verifyDrawable",
-        args = {android.graphics.drawable.Drawable.class}
-    )
     public void testVerifyDrawable() {
         MockCompoundButton compoundButton = new MockCompoundButton(mContext);
         Drawable drawable = mContext.getResources().getDrawable(R.drawable.scenery);
diff --git a/tests/tests/widget/src/android/widget/cts/CursorAdapterTest.java b/tests/tests/widget/src/android/widget/cts/CursorAdapterTest.java
index 9627b6f..963c392 100644
--- a/tests/tests/widget/src/android/widget/cts/CursorAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/CursorAdapterTest.java
@@ -19,6 +19,7 @@
 import java.io.File;
 
 import android.content.Context;
+import android.cts.util.PollingCheck;
 import android.database.ContentObserver;
 import android.database.Cursor;
 import android.database.DataSetObserver;
@@ -29,7 +30,6 @@
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.view.animation.cts.DelayedCheck;
 import android.widget.CursorAdapter;
 import android.widget.Filter;
 import android.widget.FilterQueryProvider;
@@ -37,15 +37,10 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
 /**
  * Test {@link CursorAdapter}.
  */
-@TestTargetClass(CursorAdapter.class)
 public class CursorAdapterTest extends AndroidTestCase {
     private static final long TEST_TIME_OUT = 5000;
     private static final int NUMBER_INDEX = 1;
@@ -95,20 +90,6 @@
         super.tearDown();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link CursorAdapter}",
-            method = "CursorAdapter",
-            args = {android.content.Context.class, android.database.Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link CursorAdapter}",
-            method = "CursorAdapter",
-            args = {android.content.Context.class, android.database.Cursor.class, boolean.class}
-        )
-    })
     public void testConstructor() {
         new MockCursorAdapter(mContext, mCursor);
 
@@ -119,12 +100,6 @@
         new MockCursorAdapter(null, null, false);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorAdapter#init(Context, Cursor, boolean)}",
-        method = "init",
-        args = {android.content.Context.class, android.database.Cursor.class, boolean.class}
-    )
     public void testInit() {
         MockCursorAdapter cursorAdapter = new MockCursorAdapter(null, null, false);
         cursorAdapter.init(null, null, false);
@@ -169,12 +144,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorAdapter#getCount()}",
-        method = "getCount",
-        args = {}
-    )
     public void testGetCount() {
         CursorAdapter cursorAdapter = new MockCursorAdapter(mContext, null);
         assertEquals(0, cursorAdapter.getCount());
@@ -183,20 +152,6 @@
         assertEquals(mCursor.getCount(), cursorAdapter.getCount());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link CursorAdapter#changeCursor(Cursor)}",
-            method = "changeCursor",
-            args = {android.database.Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link CursorAdapter#changeCursor(Cursor)}",
-            method = "getCursor",
-            args = {}
-        )
-    })
     public void testAccessCursor() {
         CursorAdapter cursorAdapter = new MockCursorAdapter(mContext, null);
         assertNull(cursorAdapter.getCursor());
@@ -208,12 +163,6 @@
         assertNull(cursorAdapter.getCursor());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorAdapter#convertToString(Cursor)}",
-        method = "convertToString",
-        args = {android.database.Cursor.class}
-    )
     public void testConvertToString() {
         CursorAdapter cursorAdapter = new MockCursorAdapter(mContext, null);
         assertEquals("", cursorAdapter.convertToString(null));
@@ -221,12 +170,6 @@
         assertEquals(mCursor.toString(), cursorAdapter.convertToString(mCursor));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorAdapter#hasStableIds()}, this method always return true",
-        method = "hasStableIds",
-        args = {}
-    )
     public void testHasStableIds() {
         CursorAdapter cursorAdapter = new MockCursorAdapter(mContext, mCursor);
         assertTrue(cursorAdapter.hasStableIds());
@@ -235,12 +178,6 @@
         assertTrue(cursorAdapter.hasStableIds());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorAdapter#getView(int, View, ViewGroup)}",
-        method = "getView",
-        args = {int.class, android.view.View.class, android.view.ViewGroup.class}
-    )
     public void testGetView() {
         TextView textView = new TextView(mContext);
         textView.setText("getView test");
@@ -272,13 +209,6 @@
         assertEquals(SECOND_NUMBER, retView.getText().toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorAdapter#newDropDownView(Context, Cursor, ViewGroup)}",
-        method = "newDropDownView",
-        args = {android.content.Context.class, android.database.Cursor.class,
-                android.view.ViewGroup.class}
-    )
     public void testNewDropDownView() {
         CursorAdapter cursorAdapter = new MockCursorAdapter(mContext, mCursor);
         // null cursor
@@ -288,12 +218,6 @@
         assertEquals(FIRST_NUMBER, textView.getText().toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorAdapter#getDropDownView(int, View, ViewGroup)}",
-        method = "getDropDownView",
-        args = {int.class, android.view.View.class, android.view.ViewGroup.class}
-    )
     public void testGetDropDownView() {
         MockCursorAdapter cursorAdapter = new MockCursorAdapter(mContext, null);
         // null cursor
@@ -315,24 +239,12 @@
         assertEquals(SECOND_NUMBER, retView.getText().toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorAdapter#getFilter()}",
-        method = "getFilter",
-        args = {}
-    )
     public void testGetFilter() {
         CursorAdapter cursorAdapter = new MockCursorAdapter(mContext, mCursor);
         Filter filter = cursorAdapter.getFilter();
         assertNotNull(filter);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorAdapter#getItem(int)}",
-        method = "getItem",
-        args = {int.class}
-    )
     public void testGetItem() {
         CursorAdapter cursorAdapter = new MockCursorAdapter(mContext, null);
         // cursor is null
@@ -350,12 +262,6 @@
         assertEquals(SECOND_NUMBER, c.getString(NUMBER_INDEX));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorAdapter#getItemId(int)}",
-        method = "getItemId",
-        args = {int.class}
-    )
     public void testGetItemId() {
         CursorAdapter cursorAdapter = new MockCursorAdapter(mContext, null);
         // cursor is null
@@ -370,18 +276,6 @@
         assertEquals(0, cursorAdapter.getItemId(2));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFilterQueryProvider",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFilterQueryProvider",
-            args = {android.widget.FilterQueryProvider.class}
-        )
-    })
     public void testAccessFilterQueryProvider() {
         CursorAdapter cursorAdapter = new MockCursorAdapter(mContext, mCursor);
         FilterQueryProvider filterProvider = new MockFilterQueryProvider();
@@ -393,12 +287,6 @@
         assertSame(filterProvider, cursorAdapter.getFilterQueryProvider());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorAdapter#runQueryOnBackgroundThread(CharSequence)}",
-        method = "runQueryOnBackgroundThread",
-        args = {java.lang.CharSequence.class}
-    )
     public void testRunQueryOnBackgroundThread() {
         CursorAdapter cursorAdapter = new MockCursorAdapter(mContext, mCursor);
         final String constraint = "constraint";
@@ -412,11 +300,6 @@
         assertNull(cursorAdapter.runQueryOnBackgroundThread(constraint));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onContentChanged",
-        args = {}
-    )
     public void testOnContentChanged() throws Throwable {
         TestThread testThread = new TestThread(new Runnable() {
             public void run() {
@@ -428,7 +311,7 @@
         assertFalse(mMockCursorAdapter.hasContentChanged());
         // insert a new row
         mDatabase.execSQL("INSERT INTO test (number) VALUES ('" + FIRST_NUMBER + "');");
-        new DelayedCheck(TEST_TIME_OUT) {
+        new PollingCheck(TEST_TIME_OUT) {
             @Override
             protected boolean check() {
                 return mMockCursorAdapter.hasContentChanged();
diff --git a/tests/tests/widget/src/android/widget/cts/CursorTreeAdapterTest.java b/tests/tests/widget/src/android/widget/cts/CursorTreeAdapterTest.java
index e448a97..1d26777 100644
--- a/tests/tests/widget/src/android/widget/cts/CursorTreeAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/CursorTreeAdapterTest.java
@@ -33,16 +33,10 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
 /**
  * Test {@link CursorTreeAdapter}.
  */
-@TestTargetClass(CursorTreeAdapter.class)
 public class CursorTreeAdapterTest extends AndroidTestCase {
     private static final int NAME_INDEX = 1;
     private static final int VALUE_INDEX = 1;
@@ -142,20 +136,6 @@
         super.tearDown();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link CursorTreeAdapter}",
-            method = "CursorTreeAdapter",
-            args = {android.database.Cursor.class, android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link CursorTreeAdapter}",
-            method = "CursorTreeAdapter",
-            args = {android.database.Cursor.class, android.content.Context.class, boolean.class}
-        )
-    })
     public void testConstructor() {
         new MockCursorTreeAdapter(mGroupCursor, mContext);
 
@@ -166,12 +146,6 @@
         new MockCursorTreeAdapter(null, null, false);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorTreeAdapter#getCursor()}",
-        method = "getCursor",
-        args = {}
-    )
     public void testGetCursor() {
         CursorTreeAdapter adapter = new MockCursorTreeAdapter(mGroupCursor, mContext);
         assertSame(mGroupCursor, adapter.getCursor());
@@ -183,12 +157,6 @@
         assertSame(mGroupCursor, adapter.getCursor());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorTreeAdapter#setGroupCursor(Cursor)}",
-        method = "setGroupCursor",
-        args = {android.database.Cursor.class}
-    )
     public void testSetGroupCursor() {
         CursorTreeAdapter adapter = new MockCursorTreeAdapter(mGroupCursor, mContext);
         assertSame(mGroupCursor, adapter.getCursor());
@@ -200,12 +168,6 @@
         assertSame(mGroupCursor, adapter.getCursor());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorTreeAdapter#setChildrenCursor(int, Cursor)}",
-        method = "setChildrenCursor",
-        args = {int.class, android.database.Cursor.class}
-    )
     public void testSetChildrenCursor() {
         MockCursorTreeAdapter adapter = new MockCursorTreeAdapter(mGroupCursor, mContext);
         assertTrue(mGroupCursor.moveToFirst());
@@ -215,12 +177,6 @@
         assertSame(mChildCursor2, adapter.getChild(0, 0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorTreeAdapter#changeCursor(Cursor)}",
-        method = "changeCursor",
-        args = {android.database.Cursor.class}
-    )
     public void testChangeCursor() {
         CursorTreeAdapter adapter = new MockCursorTreeAdapter(null, mContext);
         assertNull(adapter.getCursor());
@@ -232,12 +188,6 @@
         assertNull(adapter.getCursor());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorTreeAdapter#notifyDataSetChanged(boolean)}",
-        method = "notifyDataSetChanged",
-        args = {boolean.class}
-    )
     public void testNotifyDataSetChangedBoolean() {
         MockCursorTreeAdapter adapter = new MockCursorTreeAdapter(mGroupCursor, mContext);
         MockDataSetObserver observer = new MockDataSetObserver();
@@ -276,12 +226,6 @@
         assertFalse(adapter.hasAddedChild2IntoCache());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorTreeAdapter#notifyDataSetChanged()}",
-        method = "notifyDataSetChanged",
-        args = {}
-    )
     public void testNotifyDataSetChanged() {
         MockCursorTreeAdapter adapter = new MockCursorTreeAdapter(mGroupCursor, mContext);
         MockDataSetObserver observer = new MockDataSetObserver();
@@ -307,12 +251,6 @@
         assertTrue(adapter.hasAddedChild2IntoCache());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorTreeAdapter#notifyDataSetInvalidated()}",
-        method = "notifyDataSetInvalidated",
-        args = {}
-    )
     public void testNotifyDataSetInvalidated() {
         MockCursorTreeAdapter adapter = new MockCursorTreeAdapter(mGroupCursor, mContext);
         MockDataSetObserver observer = new MockDataSetObserver();
@@ -338,15 +276,6 @@
         assertTrue(adapter.hasAddedChild2IntoCache());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorTreeAdapter#onGroupCollapsed(int)}",
-        method = "onGroupCollapsed",
-        args = {int.class}
-    )
-    @ToBeFixed(bug="1371108", explanation="CursorTreeAdapter#onGroupCollapsed(int)" +
-            " should check whether the return value from" +
-            " CursorTreeAdapter#getChildrenCursorHelper(int, boolean) is null")
     public void testOnGroupCollapsed() {
         MockCursorTreeAdapter adapter = new MockCursorTreeAdapter(mGroupCursor, mContext);
 
@@ -384,12 +313,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorTreeAdapter#hasStableIds()}, this method always return true",
-        method = "hasStableIds",
-        args = {}
-    )
     public void testHasStableIds() {
         CursorTreeAdapter adapter = new MockCursorTreeAdapter(mGroupCursor, mContext);
         assertTrue(adapter.hasStableIds());
@@ -398,12 +321,6 @@
         assertTrue(adapter.hasStableIds());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorTreeAdapter#isChildSelectable(int, int)}",
-        method = "isChildSelectable",
-        args = {int.class, int.class}
-    )
     public void testIsChildSelectable() {
         CursorTreeAdapter adapter = new MockCursorTreeAdapter(mGroupCursor, mContext);
         assertTrue(adapter.isChildSelectable(0, 0));
@@ -413,12 +330,6 @@
         assertTrue(adapter.isChildSelectable(0, 0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorTreeAdapter#convertToString(Cursor)}",
-        method = "convertToString",
-        args = {android.database.Cursor.class}
-    )
     public void testConvertToString() {
         CursorTreeAdapter adapter = new MockCursorTreeAdapter(mGroupCursor, mContext);
         assertEquals("", adapter.convertToString(null));
@@ -426,12 +337,6 @@
         assertEquals(mGroupCursor.toString(), adapter.convertToString(mGroupCursor));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorTreeAdapter#getFilter()}",
-        method = "getFilter",
-        args = {}
-    )
     public void testGetFilter() {
         MockCursorTreeAdapter adapter = new MockCursorTreeAdapter(mGroupCursor, mContext);
         Filter filter = adapter.getFilter();
@@ -443,18 +348,6 @@
         assertTrue(adapter.hasCalledConvertToString());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFilterQueryProvider",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFilterQueryProvider",
-            args = {android.widget.FilterQueryProvider.class}
-        )
-    })
     public void testAccessQueryProvider() {
         CursorTreeAdapter adapter = new MockCursorTreeAdapter(mGroupCursor, mContext);
         FilterQueryProvider filterProvider = new MockFilterQueryProvider();
@@ -466,12 +359,6 @@
         assertSame(filterProvider, adapter.getFilterQueryProvider());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorTreeAdapter#runQueryOnBackgroundThread(CharSequence)}",
-        method = "runQueryOnBackgroundThread",
-        args = {java.lang.CharSequence.class}
-    )
     public void testRunQueryOnBackgroundThread() {
         CursorTreeAdapter adapter = new MockCursorTreeAdapter(mGroupCursor, mContext);
         final String constraint = "constraint";
@@ -485,12 +372,6 @@
         assertNull(adapter.runQueryOnBackgroundThread(constraint));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorTreeAdapter#getGroup(int)}",
-        method = "getGroup",
-        args = {int.class}
-    )
     public void testGetGroup() {
         CursorTreeAdapter adapter = new MockCursorTreeAdapter(null, mContext);
 
@@ -510,12 +391,6 @@
         assertNull(adapter.getGroup(2));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorTreeAdapter#getGroupCount()}",
-        method = "getGroupCount",
-        args = {}
-    )
     public void testGetGroupCount() {
         CursorTreeAdapter adapter = new MockCursorTreeAdapter(mGroupCursor, mContext);
         assertEquals(mGroupCursor.getCount(), adapter.getGroupCount());
@@ -524,12 +399,6 @@
         assertEquals(0, adapter.getGroupCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorTreeAdapter#getGroupId(int)}",
-        method = "getGroupId",
-        args = {int.class}
-    )
     public void testGetGroupId() {
         CursorTreeAdapter adapter = new MockCursorTreeAdapter(null, mContext);
 
@@ -545,12 +414,6 @@
         assertEquals(0, adapter.getGroupId(2));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorAdapter#getGroupView(int, boolean, View, ViewGroup)}",
-        method = "getGroupView",
-        args = {int.class, boolean.class, android.view.View.class, android.view.ViewGroup.class}
-    )
     public void testGetGroupView() {
         final String expectedStr = "getGroupView test";
         TextView retView;
@@ -586,15 +449,6 @@
         assertEquals(GROUP_ONE, retView.getText().toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorTreeAdapter#getChild(int, int)}",
-        method = "getChild",
-        args = {int.class, int.class}
-    )
-    @ToBeFixed(bug="1371108", explanation="CursorTreeAdapter#onGroupCollapsed(int)" +
-            " should check whether the return value from" +
-            " CursorTreeAdapter#getChildrenCursorHelper(int, boolean) is null")
     public void testGetChild() {
         CursorTreeAdapter adapter = new MockCursorTreeAdapter(mGroupCursor, mContext);
         assertEquals(2, adapter.getGroupCount());
@@ -622,15 +476,6 @@
         assertEquals(CHILD_VALUE_THREE, retCursor.getString(VALUE_INDEX));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorTreeAdapter#getChildId(int, int)}",
-        method = "getChildId",
-        args = {int.class, int.class}
-    )
-    @ToBeFixed(bug="1371108", explanation="CursorTreeAdapter#onGroupCollapsed(int)" +
-            " should check whether the return value from" +
-            " CursorTreeAdapter#getChildrenCursorHelper(int, boolean) is null")
     public void testGetChildId() {
         CursorTreeAdapter adapter = new MockCursorTreeAdapter(null, mContext);
 
@@ -659,12 +504,6 @@
         assertEquals(0, adapter.getChildId(0, 2));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorTreeAdapter#getChildrenCount(int)}",
-        method = "getChildrenCount",
-        args = {int.class}
-    )
     public void testGetChildrenCount() {
         CursorTreeAdapter adapter = new MockCursorTreeAdapter(null, mContext);
 
@@ -680,16 +519,6 @@
         assertEquals(0, adapter.getChildrenCount(2));
     }
 
-    @ToBeFixed(bug="1371108", explanation="CursorTreeAdapter#onGroupCollapsed(int)" +
-            " should check whether the return value from" +
-            " CursorTreeAdapter#getChildrenCursorHelper(int, boolean) is null")
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link CursorAdapter#getChildView(int, int, boolean, View, ViewGroup)}",
-        method = "getChildView",
-        args = {int.class, int.class, boolean.class, android.view.View.class,
-                android.view.ViewGroup.class}
-    )
     public void testGetChildView() {
         final String expectedStr = "getChildView test";
         TextView retView;
diff --git a/tests/tests/widget/src/android/widget/cts/DatePickerTest.java b/tests/tests/widget/src/android/widget/cts/DatePickerTest.java
index ca4ee25..ad9da7c 100644
--- a/tests/tests/widget/src/android/widget/cts/DatePickerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/DatePickerTest.java
@@ -19,11 +19,6 @@
 import com.android.cts.stub.R;
 import com.android.internal.util.XmlUtils;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.content.Context;
 import android.content.res.XmlResourceParser;
@@ -38,30 +33,7 @@
 /**
  * Test {@link DatePicker}.
  */
-@TestTargetClass(DatePicker.class)
 public class DatePickerTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors of DatePicker.",
-            method = "DatePicker",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors of DatePicker.",
-            method = "DatePicker",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors of DatePicker.",
-            method = "DatePicker",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
-    @ToBeFixed(bug = "1417734", explanation = "should add NullPointerException @throws clause into"
-         + "javadoc.")
     public void testConstructor() {
         new DatePicker(mContext);
 
@@ -81,12 +53,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link DatePicker#setEnabled(boolean)}.",
-        method = "setEnabled",
-        args = {boolean.class}
-    )
     public void testSetEnabled() {
         MockDatePicker datePicker = createDatePicker();
 
@@ -99,13 +65,6 @@
         assertTrue(datePicker.isEnabled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link DatePicker#init()}.",
-        method = "init",
-        args = {int.class, int.class, int.class,
-                android.widget.DatePicker.OnDateChangedListener.class}
-    )
     public void testInit() {
         MockOnDateChangedListener onDateChangedListener = new MockOnDateChangedListener();
         DatePicker datePicker = createDatePicker();
@@ -119,28 +78,6 @@
         assertEquals(15, datePicker.getDayOfMonth());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "updateDate",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getYear",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMonth",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDayOfMonth",
-            args = {}
-        )
-    })
     public void testAccessDate() {
         DatePicker datePicker = createDatePicker();
 
@@ -159,12 +96,6 @@
         assertEquals(19, datePicker.getDayOfMonth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link DatePicker#updateDate(int, int, int)}.",
-        method = "updateDate",
-        args = {int.class, int.class, int.class}
-    )
     public void testUpdateDate() {
         DatePicker datePicker = createDatePicker();
 
@@ -178,23 +109,6 @@
         assertEquals(19, datePicker.getDayOfMonth());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSaveInstanceState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "dispatchRestoreInstanceState",
-            args = {android.util.SparseArray.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestoreInstanceState",
-            args = {android.os.Parcelable.class}
-        )
-    })
     public void testOnSaveInstanceState() {
         MockDatePicker datePicker = createDatePicker();
 
diff --git a/tests/tests/widget/src/android/widget/cts/DialerFilterTest.java b/tests/tests/widget/src/android/widget/cts/DialerFilterTest.java
index ec2a250..6886ac0 100755
--- a/tests/tests/widget/src/android/widget/cts/DialerFilterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/DialerFilterTest.java
@@ -18,11 +18,6 @@
 
 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;
 
@@ -43,7 +38,6 @@
 import android.widget.EditText;
 import android.widget.RelativeLayout;
 
-@TestTargetClass(DialerFilter.class)
 public class DialerFilterTest extends ActivityInstrumentationTestCase2<DialerFilterStubActivity> {
     private Activity mActivity;
     private Instrumentation mInstrumentation;
@@ -63,19 +57,6 @@
         mDialerFilter = (DialerFilter) mActivity.findViewById(R.id.dialer_filter);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "DialerFilter",
-            args = {Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "DialerFilter",
-            args = {Context.class, AttributeSet.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testConstructor() {
         final XmlPullParser parser = mActivity.getResources().getXml(R.layout.dialerfilter_layout);
         final AttributeSet attrs = Xml.asAttributeSet(parser);
@@ -84,29 +65,11 @@
         new DialerFilter(mActivity, attrs);
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        method = "isQwertyKeyboard",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testIsQwertyKeyboard() {
         // Simply call the method. Return value may depend on the default keyboard.
         mDialerFilter.isQwertyKeyboard();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "onKeyUp",
-            args = {int.class, KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.SUFFICIENT,
-            method = "onKeyDown",
-            args = {int.class, KeyEvent.class}
-        )
-    })
     public void testOnKeyUpDown() {
         // The exact behavior depends on the implementation of DialerKeyListener and
         // TextKeyListener, but even that may be changed. Simply assert basic scenarios.
@@ -178,20 +141,7 @@
         assertEquals("123", mDialerFilter.getDigits().toString());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setMode",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMode",
-            args = {}
-        )
-    })
     @UiThreadTest
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testAccessMode() {
         mDialerFilter.setMode(DialerFilter.DIGITS_AND_LETTERS_NO_LETTERS);
         assertEquals(DialerFilter.DIGITS_AND_LETTERS_NO_LETTERS, mDialerFilter.getMode());
@@ -203,13 +153,7 @@
         assertEquals(-1, mDialerFilter.getMode());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLetters",
-        args = {}
-    )
     @UiThreadTest
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testGetLetters() {
         assertEquals("", mDialerFilter.getLetters().toString());
 
@@ -218,13 +162,7 @@
         assertEquals("ANDROID", mDialerFilter.getLetters().toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getDigits",
-        args = {}
-    )
     @UiThreadTest
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testGetDigits() {
         assertEquals("", mDialerFilter.getDigits().toString());
 
@@ -233,13 +171,7 @@
         assertEquals("12345", mDialerFilter.getDigits().toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getFilterText",
-        args = {}
-    )
     @UiThreadTest
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testGetFilterText() {
         assertEquals("", mDialerFilter.getFilterText().toString());
 
@@ -254,40 +186,7 @@
         assertEquals("CTS12345", mDialerFilter.getFilterText().toString());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "append",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setMode",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLetters",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDigits",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFilterText",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "clearText",
-            args = {}
-        )
-    })
     @UiThreadTest
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testAppend() {
         mDialerFilter.setMode(DialerFilter.LETTERS_ONLY);
         mDialerFilter.append("ANDROID");
@@ -337,11 +236,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clearText",
-        args = {}
-    )
     @UiThreadTest
     public void testClearText() {
         assertEquals("", mDialerFilter.getLetters().toString());
@@ -358,13 +252,7 @@
         assertEquals(DialerFilter.DIGITS_AND_LETTERS, mDialerFilter.getMode());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setLettersWatcher",
-        args = {TextWatcher.class}
-    )
     @UiThreadTest
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testSetLettersWatcher() {
         MockTextWatcher tw = new MockTextWatcher("A");
 
@@ -396,13 +284,7 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setDigitsWatcher",
-        args = {TextWatcher.class}
-    )
     @UiThreadTest
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testSetDigitsWatcher() {
         final MockTextWatcher tw = new MockTextWatcher("9");
 
@@ -419,13 +301,7 @@
         assertEquals("12345", tw.getText());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setFilterWatcher",
-        args = {TextWatcher.class}
-    )
     @UiThreadTest
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testSetFilterWatcher() {
         final MockTextWatcher tw = new MockTextWatcher("A");
 
@@ -448,13 +324,7 @@
         assertEquals("12345", tw.getText());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "removeFilterWatcher",
-        args = {TextWatcher.class}
-    )
     @UiThreadTest
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testRemoveFilterWatcher() {
         final MockTextWatcher tw = new MockTextWatcher("A");
 
@@ -479,29 +349,14 @@
         assertEquals(-1, span.getSpanEnd(tw));
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onFinishInflate",
-        args = {}
-    )
     public void testOnFinishInflate() {
         // onFinishInflate() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onFocusChanged",
-        args = {boolean.class, int.class, android.graphics.Rect.class}
-    )
     public void testOnFocusChanged() {
         // onFocusChanged() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onModeChange",
-        args = {int.class, int.class}
-    )
     @UiThreadTest
     public void testOnModechange() {
         final MockDialerFilter dialerFilter = createMyDialerFilter();
diff --git a/tests/tests/widget/src/android/widget/cts/DigitalClockTest.java b/tests/tests/widget/src/android/widget/cts/DigitalClockTest.java
index cf23382..4184cdd 100644
--- a/tests/tests/widget/src/android/widget/cts/DigitalClockTest.java
+++ b/tests/tests/widget/src/android/widget/cts/DigitalClockTest.java
@@ -33,15 +33,10 @@
 import com.android.cts.stub.R;
 import com.android.internal.util.XmlUtils;
 
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
 /**
  * Test {@link DigitalClock}.
  */
-@TestTargetClass(DigitalClock.class)
 public class DigitalClockTest extends ActivityInstrumentationTestCase<DigitalClockStubActivity> {
     private Activity mActivity;
     private Context mContext;
@@ -57,20 +52,6 @@
         mContext = getInstrumentation().getContext();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "DigitalClock",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "",
-            method = "DigitalClock",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        )
-    })
     public void testConstructor() {
         // new the DigitalClock instance
         new DigitalClock(mContext);
@@ -91,12 +72,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link DigitalClock#onDetachedFromWindow()}.",
-        method = "onDetachedFromWindow",
-        args = {}
-    )
     @UiThreadTest
     public void testOnDetachedFromWindow() {
         final MockDigitalClock digitalClock = createDigitalClock();
@@ -111,12 +86,6 @@
         linearLayout.removeView(digitalClock);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link DigitalClock#onAttachedToWindow()}.",
-        method = "onAttachedToWindow",
-        args = {}
-    )
     @UiThreadTest
     public void testOnAttachedToWindow() {
         final MockDigitalClock digitalClock = createDigitalClock();
diff --git a/tests/tests/widget/src/android/widget/cts/EditTextTest.java b/tests/tests/widget/src/android/widget/cts/EditTextTest.java
index 1e4ba71..ee10900 100644
--- a/tests/tests/widget/src/android/widget/cts/EditTextTest.java
+++ b/tests/tests/widget/src/android/widget/cts/EditTextTest.java
@@ -30,13 +30,7 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
-@TestTargetClass(EditText.class)
 public class EditTextTest extends AndroidTestCase {
     private Context mContext;
     private AttributeSet mAttributeSet;
@@ -50,30 +44,6 @@
         mAttributeSet = Xml.asAttributeSet(parser);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link EditText}",
-            method = "EditText",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link EditText}",
-            method = "EditText",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link EditText}",
-            method = "EditText",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
-    @ToBeFixed(bug="1417734", explanation="EditText#EditText(Context), " +
-            "EditText#EditText(Context, AttributeSet) and " +
-            "EditText#EditText(Context, AttributeSet, int)" +
-            " should check whether the input Context is null")
     public void testConstructor() {
         new EditText(mContext);
 
@@ -104,18 +74,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getText",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setText",
-            args = {java.lang.CharSequence.class, android.widget.TextView.BufferType.class}
-        )
-    })
     public void testAccessText() {
         EditText editText = new EditText(mContext, mAttributeSet);
 
@@ -129,12 +87,6 @@
         assertEquals("", editText.getText().toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link EditText#setSelection(int)}",
-        method = "setSelection",
-        args = {int.class}
-    )
     public void testSetSelectionIndex() {
         EditText editText = new EditText(mContext, mAttributeSet);
 
@@ -165,12 +117,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link EditText#setSelection(int, int)}",
-        method = "setSelection",
-        args = {int.class, int.class}
-    )
     public void testSetSelectionStartstop() {
         EditText editText = new EditText(mContext, mAttributeSet);
 
@@ -209,12 +155,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link EditText#selectAll()}",
-        method = "selectAll",
-        args = {}
-    )
     public void testSelectAll() {
         EditText editText = new EditText(mContext, mAttributeSet);
 
@@ -235,12 +175,6 @@
         assertEquals(0, editText.getSelectionEnd());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link EditText#extendSelection(int)}",
-        method = "extendSelection",
-        args = {int.class}
-    )
     public void testExtendSelection() {
         EditText editText = new EditText(mContext, mAttributeSet);
 
@@ -272,24 +206,12 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link EditText#getDefaultEditable()}, this function always returns true",
-        method = "getDefaultEditable",
-        args = {}
-    )
     public void testGetDefaultEditable() {
         MockEditText mockEditText = new MockEditText(mContext, mAttributeSet);
 
         assertTrue(mockEditText.getDefaultEditable());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "{@link EditText#getDefaultMovementMethod()}",
-        method = "getDefaultMovementMethod",
-        args = {}
-    )
     public void testGetDefaultMovementMethod() {
         MockEditText mockEditText = new MockEditText(mContext, mAttributeSet);
         MovementMethod method1 = mockEditText.getDefaultMovementMethod();
@@ -301,14 +223,6 @@
         assertSame(method1, method2);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test {@link EditText#setEllipsize(TextUtils.TruncateAt)}",
-        method = "setEllipsize",
-        args = {android.text.TextUtils.TruncateAt.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of " +
-            "EditText#setEllipsize(TextUtils.TruncateAt)")
     public void testSetEllipsize() {
         EditText editText = new EditText(mContext);
         assertNull(editText.getEllipsize());
diff --git a/tests/tests/widget/src/android/widget/cts/ExpandableListViewBasicTest.java b/tests/tests/widget/src/android/widget/cts/ExpandableListViewBasicTest.java
index fc39364..d50897f 100644
--- a/tests/tests/widget/src/android/widget/cts/ExpandableListViewBasicTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ExpandableListViewBasicTest.java
@@ -16,10 +16,6 @@
 
 package android.widget.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.suitebuilder.annotation.MediumTest;
@@ -33,7 +29,6 @@
 
 import java.util.List;
 
-@TestTargetClass(ExpandableListView.class)
 public class ExpandableListViewBasicTest extends
         ActivityInstrumentationTestCase2<ExpandableListSimple> {
     private ExpandableListScenario mActivity;
@@ -75,23 +70,11 @@
         return groupPos;
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ExpandableListView#expandGroup(int)}",
-        method = "expandGroup",
-        args = {int.class}
-    )
     @MediumTest
     public void testExpandGroup() {
         expandGroup(-1, true);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ExpandableListView#collapseGroup(int)}",
-        method = "collapseGroup",
-        args = {int.class}
-    )
     @MediumTest
     public void testCollapseGroup() {
         final int groupPos = expandGroup(-1, true);
@@ -101,20 +84,6 @@
         assertFalse("Group did not collapse", mExpandableListView.isGroupExpanded(groupPos));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link ExpandableListView#expandGroup(int)}",
-            method = "expandGroup",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link ExpandableListView#expandGroup(int)}",
-            method = "isGroupExpanded",
-            args = {int.class}
-        )
-    })
     @MediumTest
     public void testExpandedGroupMovement() {
         // Expand the first group
diff --git a/tests/tests/widget/src/android/widget/cts/ExpandableListViewTest.java b/tests/tests/widget/src/android/widget/cts/ExpandableListViewTest.java
index 5ab7f4d..6a68ed9 100644
--- a/tests/tests/widget/src/android/widget/cts/ExpandableListViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ExpandableListViewTest.java
@@ -18,11 +18,6 @@
 
 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;
 
@@ -45,32 +40,7 @@
 import android.widget.ExpandableListView.OnChildClickListener;
 import android.widget.ExpandableListView.OnGroupClickListener;
 
-@TestTargetClass(ExpandableListView.class)
 public class ExpandableListViewTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link ExpandableListView}",
-            method = "ExpandableListView",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link ExpandableListView}",
-            method = "ExpandableListView",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link ExpandableListView}",
-            method = "ExpandableListView",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
-    @ToBeFixed(bug = "1417734", explanation = "ExpandableListView#ExpandableListView(Context), " +
-            "ExpandableListView#ExpandableListView(Context, AttributeSet) and " +
-            "ExpandableListView#ExpandableListView(Context, AttributeSet, int)" +
-            " should check whether the input Context is null")
     public void testConstructor() {
         new ExpandableListView(mContext);
 
@@ -103,24 +73,12 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ExpandableListView#setChildDivider(Drawable)}",
-        method = "setChildDivider",
-        args = {android.graphics.drawable.Drawable.class}
-    )
-    @ToBeFixed(bug = "1386429", explanation = "No getter and can't check indirectly")
     public void testSetChildDivider() {
         ExpandableListView expandableListView = new ExpandableListView(mContext);
         Drawable drawable = mContext.getResources().getDrawable(R.drawable.scenery);
         expandableListView.setChildDivider(drawable);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setAdapter",
-        args = {android.widget.ListAdapter.class}
-    )
     public void testSetAdapter() {
         ExpandableListView expandableListView = new ExpandableListView(mContext);
         try {
@@ -130,12 +88,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ExpandableListView#getAdapter()}",
-        method = "getAdapter",
-        args = {}
-    )
     public void testGetAdapter() {
         ExpandableListView expandableListView = new ExpandableListView(mContext);
         assertNull(expandableListView.getAdapter());
@@ -145,18 +97,6 @@
         assertNotNull(expandableListView.getAdapter());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAdapter",
-            args = {android.widget.ExpandableListAdapter.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getExpandableListAdapter",
-            args = {}
-        )
-    })
     public void testAccessExpandableListAdapter() {
         ExpandableListView expandableListView = new ExpandableListView(mContext);
         ExpandableListAdapter expandableAdapter = new MockExpandableListAdapter();
@@ -166,12 +106,6 @@
         assertSame(expandableAdapter, expandableListView.getExpandableListAdapter());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ExpandableListView#performItemClick(View, int, long)}",
-        method = "performItemClick",
-        args = {android.view.View.class, int.class, long.class}
-    )
     public void testPerformItemClick() {
         ExpandableListView expandableListView = new ExpandableListView(mContext);
 
@@ -182,13 +116,6 @@
         assertTrue(expandableListView.performItemClick(null, 100, 99));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ExpandableListView#setOnItemClickListener(OnItemClickListener)}",
-        method = "setOnItemClickListener",
-        args = {android.widget.AdapterView.OnItemClickListener.class}
-    )
-    @ToBeFixed(bug = "1486189", explanation = "It is a redundant override method")
     public void testSetOnItemClickListener() {
         ExpandableListView expandableListView = new ExpandableListView(mContext);
         MockOnItemClickListener listener = new MockOnItemClickListener();
@@ -198,19 +125,6 @@
         assertSame(listener, expandableListView.getOnItemClickListener());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "expandGroup",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOnGroupExpandListener",
-            args = {android.widget.ExpandableListView.OnGroupExpandListener.class}
-        )
-    })
-    @ToBeFixed(bug = "1371108", explanation = "unexpected NullPointerException")
     public void testExpandGroup() {
         ExpandableListView expandableListView = new ExpandableListView(mContext);
         ExpandableListAdapter expandableAdapter = new MockExpandableListAdapter();
@@ -241,19 +155,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "collapseGroup",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOnGroupCollapseListener",
-            args = {android.widget.ExpandableListView.OnGroupCollapseListener.class}
-        )
-    })
-    @ToBeFixed(bug = "1371108", explanation = "unexpected NullPointerException")
     public void testCollapseGroup() {
         ExpandableListView expandableListView = new ExpandableListView(mContext);
         ExpandableListAdapter expandableAdapter = new MockExpandableListAdapter();
@@ -284,12 +185,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ExpandableListView#setOnGroupClickListener(OnGroupClickListener)}",
-        method = "setOnGroupClickListener",
-        args = {android.widget.ExpandableListView.OnGroupClickListener.class}
-    )
     public void testSetOnGroupClickListener() {
         ExpandableListView expandableListView = new ExpandableListView(mContext);
         expandableListView.setAdapter(new MockExpandableListAdapter());
@@ -301,12 +196,6 @@
         assertTrue(listener.hasCalledOnGroupClick());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ExpandableListView#setOnChildClickListener(OnChildClickListener)}",
-        method = "setOnChildClickListener",
-        args = {android.widget.ExpandableListView.OnChildClickListener.class}
-    )
     public void testSetOnChildClickListener() {
         ExpandableListView expandableListView = new ExpandableListView(mContext);
         expandableListView.setAdapter(new MockExpandableListAdapter());
@@ -321,12 +210,6 @@
         assertTrue(listener.hasCalledOnChildClick());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ExpandableListView#getExpandableListPosition(int)}",
-        method = "getExpandableListPosition",
-        args = {int.class}
-    )
     public void testGetExpandableListPosition() {
         ExpandableListView expandableListView = new ExpandableListView(mContext);
         expandableListView.setAdapter(new MockExpandableListAdapter());
@@ -347,13 +230,6 @@
                 expandableListView.getExpandableListPosition(2));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ExpandableListView#getFlatListPosition(long)}",
-        method = "getFlatListPosition",
-        args = {long.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "NullPointerException is not expected.")
     public void testGetFlatListPosition() {
         ExpandableListView expandableListView = new ExpandableListView(mContext);
         expandableListView.setAdapter(new MockExpandableListAdapter());
@@ -368,12 +244,6 @@
         assertEquals(1, expandableListView.getFlatListPosition(0x8000000100000000L));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ExpandableListView#getSelectedPosition()}",
-        method = "getSelectedPosition",
-        args = {}
-    )
     public void testGetSelectedPosition() {
         ExpandableListView expandableListView = new ExpandableListView(mContext);
 
@@ -389,12 +259,6 @@
         assertEquals(0, expandableListView.getSelectedPosition());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ExpandableListView#getSelectedId()}",
-        method = "getSelectedId",
-        args = {}
-    )
     public void testGetSelectedId() {
         ExpandableListView expandableListView = new ExpandableListView(mContext);
 
@@ -408,12 +272,6 @@
         assertEquals(0, expandableListView.getSelectedId());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ExpandableListView#setSelectedGroup(int)}",
-        method = "setSelectedGroup",
-        args = {int.class}
-    )
     public void testSetSelectedGroup() {
         ExpandableListView expandableListView = new ExpandableListView(mContext);
         expandableListView.setAdapter(new MockExpandableListAdapter());
@@ -425,12 +283,6 @@
         assertEquals(0, expandableListView.getSelectedPosition());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ExpandableListView#setSelectedChild(int, int, boolean)}",
-        method = "setSelectedChild",
-        args = {int.class, int.class, boolean.class}
-    )
     public void testSetSelectedChild() {
         ExpandableListView expandableListView = new ExpandableListView(mContext);
         expandableListView.setAdapter(new MockExpandableListAdapter());
@@ -439,12 +291,6 @@
         assertTrue(expandableListView.setSelectedChild(0, 1, true));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ExpandableListView#isGroupExpanded(int)}",
-        method = "isGroupExpanded",
-        args = {int.class}
-    )
     public void testIsGroupExpanded() {
         ExpandableListView expandableListView = new ExpandableListView(mContext);
         expandableListView.setAdapter(new MockExpandableListAdapter());
@@ -454,12 +300,6 @@
         assertTrue(expandableListView.isGroupExpanded(1));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ExpandableListView#getPackedPositionType(long)}",
-        method = "getPackedPositionType",
-        args = {long.class}
-    )
     public void testGetPackedPositionType() {
         assertEquals(ExpandableListView.PACKED_POSITION_TYPE_NULL,
                 ExpandableListView.getPackedPositionType(
@@ -474,12 +314,6 @@
                 ExpandableListView.getPackedPositionType(0x8000000000000000L));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ExpandableListView#getPackedPositionGroup(long)}",
-        method = "getPackedPositionGroup",
-        args = {long.class}
-    )
     public void testGetPackedPositionGroup() {
         assertEquals(-1, ExpandableListView.getPackedPositionGroup(
                 ExpandableListView.PACKED_POSITION_VALUE_NULL));
@@ -493,12 +327,6 @@
         assertEquals(0x7FFFFFFF, ExpandableListView.getPackedPositionGroup(0x7FFFFFFF00000000L));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ExpandableListView#getPackedPositionChild(long)}",
-        method = "getPackedPositionChild",
-        args = {long.class}
-    )
     public void testGetPackedPositionChild() {
         assertEquals(-1, ExpandableListView.getPackedPositionChild(
                 ExpandableListView.PACKED_POSITION_VALUE_NULL));
@@ -512,12 +340,6 @@
         assertEquals(0xffffffff, ExpandableListView.getPackedPositionChild(0x80000000ffffffffL));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ExpandableListView#getPackedPositionForChild(int, int)}",
-        method = "getPackedPositionForChild",
-        args = {int.class, int.class}
-    )
     public void testGetPackedPositionForChild() {
         assertEquals(0x8000000000000000L,
                 ExpandableListView.getPackedPositionForChild(0, 0));
@@ -526,12 +348,6 @@
                 ExpandableListView.getPackedPositionForChild(Integer.MAX_VALUE, 0xffffffff));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ExpandableListView#getPackedPositionForGroup(int)}",
-        method = "getPackedPositionForGroup",
-        args = {int.class}
-    )
     public void testGetPackedPositionForGroup() {
         assertEquals(0, ExpandableListView.getPackedPositionForGroup(0));
 
@@ -539,68 +355,27 @@
                 ExpandableListView.getPackedPositionForGroup(Integer.MAX_VALUE));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ExpandableListView#setChildIndicator(Drawable)}",
-        method = "setChildIndicator",
-        args = {android.graphics.drawable.Drawable.class}
-    )
-    @ToBeFixed(bug = "1386429", explanation = "No getter and can't check indirectly")
     public void testSetChildIndicator() {
         ExpandableListView expandableListView = new ExpandableListView(mContext);
         expandableListView.setChildIndicator(null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ExpandableListView#setChildIndicatorBounds(int, int)}",
-        method = "setChildIndicatorBounds",
-        args = {int.class, int.class}
-    )
-    @ToBeFixed(bug = "1386429", explanation = "No getter and can't check indirectly")
     public void testSetChildIndicatorBounds() {
         ExpandableListView expandableListView = new ExpandableListView(mContext);
         expandableListView.setChildIndicatorBounds(10, 10);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ExpandableListView#setGroupIndicator(Drawable)}",
-        method = "setGroupIndicator",
-        args = {android.graphics.drawable.Drawable.class}
-    )
-    @ToBeFixed(bug = "1386429", explanation = "No getter and can't check indirectly")
     public void testSetGroupIndicator() {
         ExpandableListView expandableListView = new ExpandableListView(mContext);
         Drawable drawable = new BitmapDrawable();
         expandableListView.setGroupIndicator(drawable);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ExpandableListView#setIndicatorBounds(int, int)}",
-        method = "setIndicatorBounds",
-        args = {int.class, int.class}
-    )
-    @ToBeFixed(bug = "1386429", explanation = "No getter and can't check indirectly")
     public void testSetIndicatorBounds() {
         ExpandableListView expandableListView = new ExpandableListView(mContext);
         expandableListView.setIndicatorBounds(10,10);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSaveInstanceState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestoreInstanceState",
-            args = {android.os.Parcelable.class}
-        )
-    })
-    @ToBeFixed(bug = "", explanation = "can't use SaveState which is package protected")
     public void testOnSaveInstanceState() {
         ExpandableListView src = new ExpandableListView(mContext);
         Parcelable p1 = src.onSaveInstanceState();
@@ -613,12 +388,6 @@
         assertNotNull(p2);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ExpandableListView#dispatchDraw(Canvas)}",
-        method = "dispatchDraw",
-        args = {android.graphics.Canvas.class}
-    )
     public void testDispatchDraw() {
         MockExpandableListView expandableListView = new MockExpandableListView(mContext);
         expandableListView.dispatchDraw(null);
diff --git a/tests/tests/widget/src/android/widget/cts/ExpandableListViewWithHeadersTest.java b/tests/tests/widget/src/android/widget/cts/ExpandableListViewWithHeadersTest.java
index fe65f98..950355c 100644
--- a/tests/tests/widget/src/android/widget/cts/ExpandableListViewWithHeadersTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ExpandableListViewWithHeadersTest.java
@@ -16,9 +16,6 @@
 
 package android.widget.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.suitebuilder.annotation.LargeTest;
@@ -27,7 +24,6 @@
 import android.widget.ExpandableListView;
 import android.widget.cts.util.ListUtil;
 
-@TestTargetClass(ExpandableListView.class)
 public class ExpandableListViewWithHeadersTest extends
         ActivityInstrumentationTestCase2<ExpandableListWithHeaders> {
     private ExpandableListView mExpandableListView;
@@ -50,12 +46,6 @@
         assertNotNull(mExpandableListView);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ExpandableListView#expandGroup(int)}",
-        method = "expandGroup",
-        args = {int.class}
-    )
     @MediumTest
     public void testExpandOnFirstPosition() {
         // Should be a header, and hence the first group should NOT have expanded
@@ -65,12 +55,6 @@
         assertFalse(mExpandableListView.isGroupExpanded(0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ExpandableListView#expandGroup(int)}",
-        method = "expandGroup",
-        args = {int.class}
-    )
     @LargeTest
     public void testExpandOnFirstGroup() {
         mListUtil.arrowScrollToSelectedPosition(getActivity().getNumOfHeadersAndFooters());
diff --git a/tests/tests/widget/src/android/widget/cts/ExpandableListView_ExpandableListContextMenuInfoTest.java b/tests/tests/widget/src/android/widget/cts/ExpandableListView_ExpandableListContextMenuInfoTest.java
index 6d8413b..bf5a23f 100644
--- a/tests/tests/widget/src/android/widget/cts/ExpandableListView_ExpandableListContextMenuInfoTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ExpandableListView_ExpandableListContextMenuInfoTest.java
@@ -22,22 +22,11 @@
 import android.widget.ExpandableListView;
 import android.widget.ListView;
 import android.widget.ExpandableListView.ExpandableListContextMenuInfo;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
 /**
  * Test {@link ExpandableListContextMenuInfo}.
  */
-@TestTargetClass(ExpandableListContextMenuInfo.class)
 public class ExpandableListView_ExpandableListContextMenuInfoTest extends AndroidTestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor(s) of {@link ExpandableListContextMenuInfo}",
-        method = "ExpandableListView.ExpandableListContextMenuInfo",
-        args = {android.view.View.class, long.class, long.class}
-    )
     public void testConstructor() {
         ListView listview = new ListView(getContext());
         ExpandableListContextMenuInfo expandableListContextMenuInfo =
diff --git a/tests/tests/widget/src/android/widget/cts/FilterTest.java b/tests/tests/widget/src/android/widget/cts/FilterTest.java
index 862cb03..2e50bbe 100644
--- a/tests/tests/widget/src/android/widget/cts/FilterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/FilterTest.java
@@ -16,16 +16,12 @@
 
 package android.widget.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
+import android.cts.util.PollingCheck;
 import android.test.ActivityInstrumentationTestCase2;
-import android.view.animation.cts.DelayedCheck;
 import android.widget.Filter;
 import android.widget.Filter.FilterListener;
 
-@TestTargetClass(Filter.class)
 public class FilterTest extends ActivityInstrumentationTestCase2<StubActivity> {
     private static final long TIME_OUT = 10000;
     private static final String TEST_CONSTRAINT = "filter test";
@@ -35,20 +31,10 @@
         super("com.android.cts.stub", StubActivity.class);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "Filter",
-        args = {}
-    )
     public void testConstructor() {
         new MockFilter();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "convertResultToString",
-        args = {java.lang.Object.class}
-    )
     public void testConvertResultToString() {
         final MockFilter filter = new MockFilter();
         assertEquals("", filter.convertResultToString(null));
@@ -57,11 +43,6 @@
         assertEquals(testStr, filter.convertResultToString(testStr));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "filter",
-        args = {java.lang.CharSequence.class}
-    )
     public void testFilter1() {
         getActivity().runOnUiThread(new Runnable() {
             public void run() {
@@ -70,7 +51,7 @@
             }
         });
 
-        new DelayedCheck(TIME_OUT) {
+        new PollingCheck(TIME_OUT) {
             @Override
             protected boolean check() {
                 return mMockFilter.hadPerformedFiltering();
@@ -78,7 +59,7 @@
         }.run();
         assertEquals(TEST_CONSTRAINT, mMockFilter.getPerformFilteringConstraint());
 
-        new DelayedCheck(TIME_OUT) {
+        new PollingCheck(TIME_OUT) {
             @Override
             protected boolean check() {
                 return mMockFilter.hadPublishedResults();
@@ -88,11 +69,6 @@
         assertSame(mMockFilter.getExpectResults(), mMockFilter.getResults());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "filter",
-        args = {java.lang.CharSequence.class, android.widget.Filter.FilterListener.class}
-    )
     public void testFilter2() {
         final MockFilterListener mockFilterListener = new MockFilterListener();
         getActivity().runOnUiThread(new Runnable() {
@@ -102,7 +78,7 @@
             }
         });
 
-        new DelayedCheck(TIME_OUT) {
+        new PollingCheck(TIME_OUT) {
             @Override
             protected boolean check() {
                 return mMockFilter.hadPerformedFiltering();
@@ -110,7 +86,7 @@
         }.run();
         assertEquals(TEST_CONSTRAINT, mMockFilter.getPerformFilteringConstraint());
 
-        new DelayedCheck(TIME_OUT) {
+        new PollingCheck(TIME_OUT) {
             @Override
             protected boolean check() {
                 return mMockFilter.hadPublishedResults();
@@ -119,7 +95,7 @@
         assertEquals(TEST_CONSTRAINT, mMockFilter.getPublishResultsConstraint());
         assertSame(mMockFilter.getExpectResults(), mMockFilter.getResults());
 
-        new DelayedCheck(TIME_OUT) {
+        new PollingCheck(TIME_OUT) {
             @Override
             protected boolean check() {
                 return mockFilterListener.hasCalledOnFilterComplete();
diff --git a/tests/tests/widget/src/android/widget/cts/FrameLayoutTest.java b/tests/tests/widget/src/android/widget/cts/FrameLayoutTest.java
index 172d8a9..b8c3992 100755
--- a/tests/tests/widget/src/android/widget/cts/FrameLayoutTest.java
+++ b/tests/tests/widget/src/android/widget/cts/FrameLayoutTest.java
@@ -18,11 +18,6 @@
 
 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;
@@ -48,7 +43,6 @@
 
 import java.io.IOException;
 
-@TestTargetClass(FrameLayout.class)
 public class FrameLayoutTest extends ActivityInstrumentationTestCase2<FrameLayoutStubActivity> {
     private Activity mActivity;
     private Instrumentation mInstrumentation;
@@ -70,24 +64,6 @@
         assertNotNull(mFrameLayout);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "FrameLayout",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "FrameLayout",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "FrameLayout",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testConstructor() throws XmlPullParserException, IOException {
         AttributeSet attrs = getAttributeSet();
 
@@ -96,28 +72,6 @@
         new FrameLayout(mActivity, attrs, 0);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setForegroundGravity",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setForeground",
-            args = {android.graphics.drawable.Drawable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getForeground",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "draw",
-            args = {android.graphics.Canvas.class}
-        )
-    })
     public void testSetForegroundGravity() {
         final BitmapDrawable foreground
                 = (BitmapDrawable) mActivity.getResources().getDrawable(R.drawable.size_48x48);
@@ -165,11 +119,6 @@
         assertCenterAligned(mFrameLayout, newForeground);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "gatherTransparentRegion",
-        args = {android.graphics.Region.class}
-    )
     public void testGatherTransparentRegion() {
         final LinearLayout container
                 = (LinearLayout) mActivity.findViewById(R.id.framelayout_container);
@@ -194,18 +143,6 @@
         assertTrue(mFrameLayout.gatherTransparentRegion(region));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setMeasureAllChildren",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getConsiderGoneChildrenWhenMeasuring",
-            args = {}
-        )
-    })
     public void testAccessMeasureAllChildren() {
         final FrameLayout frameLayout
                 = (FrameLayout) mActivity.findViewById(R.id.framelayout_measureall);
@@ -253,11 +190,6 @@
         WidgetTestUtils.assertScaledPixels(expected, actual, getActivity());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "generateLayoutParams",
-        args = {android.view.ViewGroup.LayoutParams.class}
-    )
     public void testGenerateLayoutParams1() {
         MyFrameLayout myFrameLayout = new MyFrameLayout(mActivity);
         ViewGroup.LayoutParams p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
@@ -270,11 +202,6 @@
         assertEquals(ViewGroup.LayoutParams.WRAP_CONTENT, params.height);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "generateLayoutParams",
-        args = {android.util.AttributeSet.class}
-    )
     public void testGenerateLayoutParams2() throws XmlPullParserException, IOException {
         AttributeSet attrs = getAttributeSet();
 
@@ -285,12 +212,6 @@
         assertEquals(Gravity.BOTTOM, params.gravity);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "checkLayoutParams",
-        args = {android.view.ViewGroup.LayoutParams.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testCheckLayoutParams() {
         MyFrameLayout myFrameLayout = new MyFrameLayout(mActivity);
         assertFalse(myFrameLayout.checkLayoutParams(null));
@@ -304,20 +225,10 @@
         assertTrue(myFrameLayout.checkLayoutParams(params2));
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "drawableStateChanged",
-        args = {}
-    )
     public void testDrawableStateChanged() {
         // drawableStateChanged() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "generateDefaultLayoutParams",
-        args = {}
-    )
     public void testGenerateDefaultLayoutParams() {
         MyFrameLayout frameLayout = new MyFrameLayout(mActivity);
         FrameLayout.LayoutParams params = frameLayout.generateDefaultLayoutParams();
@@ -327,38 +238,18 @@
         assertEquals(LayoutParams.MATCH_PARENT, params.height);
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onLayout",
-        args = {boolean.class, int.class, int.class, int.class, int.class}
-    )
     public void testOnLayout() {
         // onLayout() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onMeasure",
-        args = {int.class, int.class}
-    )
     public void testOnMeasure() {
         // onMeasure() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onSizeChanged",
-        args = {int.class, int.class, int.class, int.class}
-    )
     public void testOnSizeChanged() {
         // onSizeChanged() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "verifyDrawable",
-        args = {android.graphics.drawable.Drawable.class}
-    )
     public void testVerifyDrawable() {
         MyFrameLayout myFrameLayout = new MyFrameLayout(mActivity);
 
diff --git a/tests/tests/widget/src/android/widget/cts/FrameLayout_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/FrameLayout_LayoutParamsTest.java
index c40c984..89529a2 100644
--- a/tests/tests/widget/src/android/widget/cts/FrameLayout_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/FrameLayout_LayoutParamsTest.java
@@ -18,11 +18,6 @@
 
 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;
@@ -37,7 +32,6 @@
 
 import java.io.IOException;
 
-@TestTargetClass(FrameLayout.LayoutParams.class)
 public class FrameLayout_LayoutParamsTest extends AndroidTestCase {
 
     private AttributeSet getAttributeSet() throws XmlPullParserException, IOException {
@@ -46,34 +40,6 @@
         return Xml.asAttributeSet(parser);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "FrameLayout.LayoutParams",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "FrameLayout.LayoutParams",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "FrameLayout.LayoutParams",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "FrameLayout.LayoutParams",
-            args = {android.view.ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "FrameLayout.LayoutParams",
-            args = {android.view.ViewGroup.MarginLayoutParams.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testConstructor() throws XmlPullParserException, IOException {
         AttributeSet attrs = getAttributeSet();
 
diff --git a/tests/tests/widget/src/android/widget/cts/GalleryTest.java b/tests/tests/widget/src/android/widget/cts/GalleryTest.java
index aea178a..0aacda4 100644
--- a/tests/tests/widget/src/android/widget/cts/GalleryTest.java
+++ b/tests/tests/widget/src/android/widget/cts/GalleryTest.java
@@ -19,11 +19,6 @@
 import com.android.cts.stub.R;
 import com.android.internal.view.menu.ContextMenuBuilder;
 
-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;
@@ -58,7 +53,6 @@
 /**
  * Test {@link Gallery}.
  */
-@TestTargetClass(Gallery.class)
 public class GalleryTest extends ActivityInstrumentationTestCase2<GalleryStubActivity>  {
     private Gallery mGallery;
     private Activity mActivity;
@@ -79,24 +73,6 @@
         mGallery = (Gallery) mActivity.findViewById(R.id.gallery_test);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Gallery",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Gallery",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Gallery",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testConstructor() {
         new Gallery(mContext);
 
@@ -131,21 +107,9 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        method = "setAnimationDuration",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1386429", explanation = "No getter and can't check indirectly. "
-            + "It is hard to get transition animation to check if the duration is right.")
     public void testSetAnimationDuration() {
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setSpacing",
-        args = {int.class}
-    )
     public void testSetSpacing() throws Throwable {
         setSpacingAndCheck(0);
 
@@ -168,18 +132,6 @@
         assertEquals(v0.getRight() + spacing, v1.getLeft());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setUnselectedAlpha",
-            args = {float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getChildStaticTransformation",
-            args = {android.view.View.class, android.view.animation.Transformation.class}
-        )
-    })
     public void testSetUnselectedAlpha() {
         final MyGallery gallery = (MyGallery) mActivity.findViewById(R.id.gallery_test);
 
@@ -202,18 +154,6 @@
         assertEquals(alpha, t.getAlpha(), DELTA);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "generateLayoutParams",
-            args = {android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "generateLayoutParams",
-            args = {android.view.ViewGroup.LayoutParams.class}
-        )
-    })
     public void testGenerateLayoutParams() throws XmlPullParserException, IOException {
         final int width = 320;
         final int height = 240;
@@ -233,77 +173,20 @@
         assertEquals(LayoutParams.MATCH_PARENT, layoutParams.height);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onSingleTapUp",
-            args = {MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onScroll",
-            args = {MotionEvent.class, MotionEvent.class, float.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onLongPress",
-            args = {android.view.MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onShowPress",
-            args = {android.view.MotionEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onKeyDown",
-            args = {int.class, android.view.KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onKeyUp",
-            args = {int.class, android.view.KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onFocusChanged",
-            args = {boolean.class, int.class, android.graphics.Rect.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onLayout",
-            args = {boolean.class, int.class, int.class, int.class, int.class}
-        )
-    })
     public void testFoo() {
         // Do not test these APIs. They are callbacks which:
         // 1. The callback machanism has been tested in super class
         // 2. The functionality is implmentation details, no need to test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        method = "showContextMenuForChild",
-        args = {android.view.View.class}
-    )
     public void testShowContextMenuForChild() {
         // how to check whether the context menu for child is showing.
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        method = "showContextMenu",
-        args = {}
-    )
     public void testShowContextMenu() {
         // how to check whether the context menu is showing.
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dispatchKeyEvent",
-        args = {android.view.KeyEvent.class}
-    )
     public void testDispatchKeyEvent() {
         mGallery = new Gallery(mContext);
         final KeyEvent validKeyEvent = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_ENTER);
@@ -314,11 +197,6 @@
         assertFalse(mGallery.dispatchKeyEvent(invalidKeyEvent));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setGravity",
-        args = {int.class}
-    )
     public void testSetGravity() throws Throwable {
         setGalleryGravity(Gravity.CENTER_HORIZONTAL);
         View v0 = mGallery.getChildAt(0);
@@ -344,12 +222,6 @@
         mInstrumentation.waitForIdleSync();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "checkLayoutParams",
-        args = {android.view.ViewGroup.LayoutParams.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testCheckLayoutParams() {
         MyGallery gallery = new MyGallery(mContext);
         ViewGroup.LayoutParams p1 = new ViewGroup.LayoutParams(320, 480);
@@ -359,11 +231,6 @@
         assertTrue(gallery.checkLayoutParams(p2));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "computeHorizontalScrollExtent",
-        args = {}
-    )
     public void testComputeHorizontalScrollExtent() {
         MyGallery gallery = new MyGallery(mContext);
 
@@ -371,11 +238,6 @@
         assertEquals(1, gallery.computeHorizontalScrollExtent());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "computeHorizontalScrollOffset",
-        args = {}
-    )
     public void testComputeHorizontalScrollOffset() {
         MyGallery gallery = new MyGallery(mContext);
         assertEquals(AdapterView.INVALID_POSITION, gallery.computeHorizontalScrollOffset());
@@ -385,11 +247,6 @@
         assertEquals(gallery.getSelectedItemPosition(), gallery.computeHorizontalScrollOffset());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "computeHorizontalScrollRange",
-        args = {}
-    )
     public void testComputeHorizontalScrollRange() {
         MyGallery gallery = new MyGallery(mContext);
         ImageAdapter adapter = new ImageAdapter(mActivity);
@@ -399,14 +256,6 @@
         assertEquals(adapter.getCount(), gallery.computeHorizontalScrollRange());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dispatchSetPressed",
-        args = {boolean.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are not right, "
-            + "dispatchSetPressed did not dispatch setPressed to "
-            + "all of this View's children, but only the selected view")
     @UiThreadTest
     public void testDispatchSetPressed() {
         final MyGallery gallery = (MyGallery) getActivity().findViewById(R.id.gallery_test);
@@ -421,11 +270,6 @@
         assertFalse(gallery.getChildAt(1).isPressed());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "generateDefaultLayoutParams",
-        args = {}
-    )
     public void testGenerateDefaultLayoutParams() {
         MyGallery gallery = new MyGallery(mContext);
         ViewGroup.LayoutParams p = gallery.generateDefaultLayoutParams();
@@ -435,12 +279,6 @@
         assertEquals(ViewGroup.LayoutParams.WRAP_CONTENT, p.height);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getChildDrawingOrder",
-        args = {int.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testGetChildDrawingOrder() {
         final MyGallery gallery = (MyGallery) getActivity().findViewById(R.id.gallery_test);
 
@@ -458,11 +296,6 @@
         assertEquals(index + 1, gallery.getChildDrawingOrder(childCount, index));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getContextMenuInfo",
-        args = {}
-    )
     public void testGetContextMenuInfo() {
         MockOnCreateContextMenuListener listener = new MockOnCreateContextMenuListener();
         MyGallery gallery = new MyGallery(mContext);
diff --git a/tests/tests/widget/src/android/widget/cts/Gallery_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/Gallery_LayoutParamsTest.java
index 7907353..af031e4 100644
--- a/tests/tests/widget/src/android/widget/cts/Gallery_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/Gallery_LayoutParamsTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import org.xmlpull.v1.XmlPullParserException;
 
@@ -34,28 +30,7 @@
 /**
  * Test {@link LayoutParams}.
  */
-@TestTargetClass(LayoutParams.class)
 public class Gallery_LayoutParamsTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link LayoutParams}",
-            method = "LayoutParams",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link LayoutParams}",
-            method = "LayoutParams",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link LayoutParams}",
-            method = "LayoutParams",
-            args = {android.view.ViewGroup.LayoutParams.class}
-        )
-    })
     public void testConstructor() throws XmlPullParserException, IOException {
         XmlResourceParser p = mContext.getResources().getLayout(R.layout.gallery_test);
         WidgetTestUtils.beginDocument(p, "LinearLayout");
diff --git a/tests/tests/widget/src/android/widget/cts/GridViewTest.java b/tests/tests/widget/src/android/widget/cts/GridViewTest.java
index 50a7bae..2467861 100755
--- a/tests/tests/widget/src/android/widget/cts/GridViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/GridViewTest.java
@@ -18,11 +18,6 @@
 
 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;
 
@@ -55,7 +50,6 @@
 /**
  * Test {@link GridView}.
  */
-@TestTargetClass(GridView.class)
 public class GridViewTest extends ActivityInstrumentationTestCase<GridViewStubActivity> {
     private GridView mGridView;
     private Activity mActivity;
@@ -77,30 +71,6 @@
         mInstrumentation = getInstrumentation();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link GridView}",
-            method = "GridView",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link GridView}",
-            method = "GridView",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link GridView}",
-            method = "GridView",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
-    @ToBeFixed(bug = "1417734", explanation = "GridView#GridView(Context), " +
-            "GridView#GridView(Context, AttributeSet) and " +
-            "GridView#GridView(Context, AttributeSet, int)" +
-            " should check whether the input Context is null")
     public void testConstructor() {
         new GridView(mActivity);
 
@@ -132,18 +102,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAdapter",
-            args = {android.widget.ListAdapter.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAdapter",
-            args = {}
-        )
-    })
     public void testAccessAdapter() {
         mGridView = new GridView(mActivity);
         // set Adapter
@@ -155,12 +113,6 @@
         assertNull(mGridView.getAdapter());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link GridView#setSelection(int)}",
-        method = "setSelection",
-        args = {int.class}
-    )
     public void testSetSelection() {
         mGridView = new GridView(mActivity);
         mGridView.setSelection(0);
@@ -173,27 +125,6 @@
         assertEquals(mGridView.getCount(), mGridView.getSelectedItemPosition());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link GridView#onKeyDown(int, KeyEvent)}",
-            method = "onKeyDown",
-            args = {int.class, android.view.KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link GridView#onKeyDown(int, KeyEvent)}",
-            method = "onKeyUp",
-            args = {int.class, android.view.KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link GridView#onKeyDown(int, KeyEvent)}",
-            method = "onKeyMultiple",
-            args = {int.class, int.class, android.view.KeyEvent.class}
-        )
-    })
-    @ToBeFixed(bug = "", explanation = "Fix click callback tests")
     public void testPressKey() {
         final int NUM_COLUMNS = 3;
         mGridView = findGridViewById(R.id.gridview);
@@ -242,12 +173,6 @@
         assertTrue(listener.hasOnItemClickCalled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link GridView#setGravity(int)}",
-        method = "setGravity",
-        args = {int.class}
-    )
     public void testSetGravity() {
         mGridView = findGridViewById(R.id.gridview);
 
@@ -301,12 +226,6 @@
         ViewAsserts.assertRightAligned(mGridView, child, mGridView.getListPaddingRight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link GridView#setHorizontalSpacing(int)}",
-        method = "setHorizontalSpacing",
-        args = {int.class}
-    )
     public void testSetHorizontalSpacing() {
         mGridView = findGridViewById(R.id.gridview);
         mGridView.setStretchMode(GridView.NO_STRETCH);
@@ -340,12 +259,6 @@
         assertEquals(5, child1.getLeft() - child0.getRight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link GridView#setVerticalSpacing(int)}",
-        method = "setVerticalSpacing",
-        args = {int.class}
-    )
     public void testSetVerticalSpacing() {
         mGridView = findGridViewById(R.id.gridview);
 
@@ -374,18 +287,6 @@
         assertEquals(5, child1.getTop() - child0.getBottom());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setStretchMode",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStretchMode",
-            args = {}
-        )
-    })
     public void testAccessStretchMode() {
         mGridView = findGridViewById(R.id.gridview);
         View child;
@@ -484,12 +385,6 @@
                 < childRight[STRETCH_SPACING_UNIFORM][INDEX_1]);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link GridView#setNumColumns(int)}",
-        method = "setNumColumns",
-        args = {int.class}
-    )
     public void testSetNumColumns() {
         mGridView = findGridViewById(R.id.gridview);
 
@@ -533,11 +428,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link GridView#getNumColumns()}",
-        method = "getNumColumns"
-    )
     public void testGetNumColumns() {
         mGridView = new GridView(mActivity);
 
@@ -575,12 +465,6 @@
         assertEquals(mGridView.getNumColumns(), 1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "attachLayoutAnimationParameters",
-        args = {android.view.View.class, android.view.ViewGroup.LayoutParams.class, int.class,
-                int.class}
-    )
     public void testAttachLayoutAnimationParameters() {
         MockGridView mockGridView = new MockGridView(mActivity);
         ViewGroup.LayoutParams p = new ViewGroup.LayoutParams(320, 480);
@@ -590,24 +474,11 @@
         assertEquals(2, animationParams.count);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link GridView#layoutChildren()}",
-        method = "layoutChildren",
-        args = {}
-    )
-    @ToBeFixed(bug = "1400249", explanation = "It will be tested by functional test.")
     public void testLayoutChildren() {
         MockGridView mockGridView = new MockGridView(mActivity);
         mockGridView.layoutChildren();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link GridView#onFocusChanged(boolean, int, Rect)}",
-        method = "onFocusChanged",
-        args = {boolean.class, int.class, android.graphics.Rect.class}
-    )
     @UiThreadTest
     public void testOnFocusChanged() {
         final MockGridView mockGridView = new MockGridView(mActivity);
@@ -626,22 +497,10 @@
         assertTrue(mockGridView.hasCalledOnFocusChanged());
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        notes = "Test {@link GridView#onMeasure(int, int)}",
-        method = "onMeasure",
-        args = {int.class, int.class}
-    )
     public void testOnMeasure() {
         // Do not test it. It's implementation detail.
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link GridView#setColumnWidth(int)}",
-        method = "setColumnWidth",
-        args = {int.class}
-    )
     public void testSetColumnWidth() {
         mGridView = findGridViewById(R.id.gridview);
 
diff --git a/tests/tests/widget/src/android/widget/cts/HeaderViewListAdapterTest.java b/tests/tests/widget/src/android/widget/cts/HeaderViewListAdapterTest.java
index 9a7672e..e583dce 100644
--- a/tests/tests/widget/src/android/widget/cts/HeaderViewListAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/HeaderViewListAdapterTest.java
@@ -16,10 +16,6 @@
 
 package android.widget.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
 import android.database.DataSetObserver;
 import android.test.AndroidTestCase;
@@ -37,7 +33,6 @@
 /**
  * Test {@link HeaderViewListAdapter}.
  */
-@TestTargetClass(HeaderViewListAdapter.class)
 public class HeaderViewListAdapterTest extends AndroidTestCase {
 
     @Override
@@ -45,12 +40,6 @@
         super.setUp();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor(s) of {@link HeaderViewListAdapter}",
-        method = "HeaderViewListAdapter",
-        args = {ArrayList.class, ArrayList.class, ListAdapter.class}
-    )
     public void testConstructor() {
         ArrayList<ListView.FixedViewInfo> header = new ArrayList<ListView.FixedViewInfo>();
         ArrayList<ListView.FixedViewInfo> footer = new ArrayList<ListView.FixedViewInfo>(5);
@@ -59,12 +48,6 @@
         new HeaderViewListAdapter(header, footer, new HeaderViewEmptyAdapter());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link HeaderViewListAdapter#getHeadersCount()}",
-        method = "getHeadersCount",
-        args = {}
-    )
     public void testGetHeadersCount() {
         HeaderViewListAdapter headerViewListAdapter = new HeaderViewListAdapter(null, null, null);
         assertEquals(0, headerViewListAdapter.getHeadersCount());
@@ -76,12 +59,6 @@
         assertEquals(1, headerViewListAdapter.getHeadersCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link HeaderViewListAdapter#getFootersCount()}",
-        method = "getFootersCount",
-        args = {}
-    )
     public void testGetFootersCount() {
         HeaderViewListAdapter headerViewListAdapter = new HeaderViewListAdapter(null, null, null);
         assertEquals(0, headerViewListAdapter.getFootersCount());
@@ -93,12 +70,6 @@
         assertEquals(1, headerViewListAdapter.getFootersCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link HeaderViewListAdapter#isEmpty()}",
-        method = "isEmpty",
-        args = {}
-    )
     public void testIsEmpty() {
         HeaderViewListAdapter headerViewListAdapter = new HeaderViewListAdapter(null, null, null);
         assertTrue(headerViewListAdapter.isEmpty());
@@ -112,13 +83,6 @@
         assertFalse(headerViewListAdapter.isEmpty());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link HeaderViewListAdapter#removeHeader(View)}",
-        method = "removeHeader",
-        args = {android.view.View.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete.")
     public void testRemoveHeader() {
         ListView lv = new ListView(getContext());
         ArrayList<ListView.FixedViewInfo> header = new ArrayList<ListView.FixedViewInfo>(4);
@@ -145,13 +109,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link HeaderViewListAdapter#removeFooter(View)}",
-        method = "removeFooter",
-        args = {android.view.View.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete.")
     public void testRemoveFooter() {
         ListView lv = new ListView(getContext());
         ArrayList<ListView.FixedViewInfo> footer = new ArrayList<ListView.FixedViewInfo>(4);
@@ -178,12 +135,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link HeaderViewListAdapter#getCount()}",
-        method = "getCount",
-        args = {}
-    )
     public void testGetCount() {
         HeaderViewListAdapter headerViewListAdapter = new HeaderViewListAdapter(null, null, null);
         assertEquals(0, headerViewListAdapter.getCount());
@@ -219,12 +170,6 @@
         assertEquals(5, headerViewListAdapter.getCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link HeaderViewListAdapter#areAllItemsEnabled()}",
-        method = "areAllItemsEnabled",
-        args = {}
-    )
     public void testAreAllItemsEnabled() {
         HeaderViewListAdapter headerViewListAdapter = new HeaderViewListAdapter(null, null, null);
         assertTrue(headerViewListAdapter.areAllItemsEnabled());
@@ -238,12 +183,6 @@
         assertFalse(headerViewListAdapter.areAllItemsEnabled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link HeaderViewListAdapter#isEnabled(int)}",
-        method = "isEnabled",
-        args = {int.class}
-    )
     public void testIsEnabled() {
         HeaderViewFullAdapter fullAdapter = new HeaderViewFullAdapter();
         HeaderViewListAdapter headerViewListAdapter =
@@ -272,12 +211,6 @@
         assertFalse(headerViewListAdapter.isEnabled(2));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link HeaderViewListAdapter#getItem(int)}",
-        method = "getItem",
-        args = {int.class}
-    )
     public void testGetItem() {
         ListView lv = new ListView(getContext());
         ArrayList<ListView.FixedViewInfo> header = new ArrayList<ListView.FixedViewInfo>(4);
@@ -309,12 +242,6 @@
         assertSame(data4, headerViewListAdapter.getItem(4));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link HeaderViewListAdapter#getItemId(int)}",
-        method = "getItemId",
-        args = {int.class}
-    )
     public void testGetItemId() {
         ListView lv = new ListView(getContext());
         ArrayList<ListView.FixedViewInfo> header = new ArrayList<ListView.FixedViewInfo>(4);
@@ -334,12 +261,6 @@
         assertEquals(fullAdapter.getItemId(0), headerViewListAdapter.getItemId(2));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "",
-        method = "hasStableIds",
-        args = {}
-    )
     public void testHasStableIds() {
         HeaderViewListAdapter headerViewListAdapter = new HeaderViewListAdapter(null, null, null);
         assertFalse(headerViewListAdapter.hasStableIds());
@@ -349,14 +270,6 @@
         assertTrue(headerViewListAdapter.hasStableIds());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link HeaderViewListAdapter#getView(int, View, ViewGroup)}",
-        method = "getView",
-        args = {int.class, android.view.View.class, android.view.ViewGroup.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, " +
-            "should add @throw into javadoc.")
     public void testGetView() {
         ListView lv = new ListView(getContext());
         ArrayList<ListView.FixedViewInfo> header = new ArrayList<ListView.FixedViewInfo>(4);
@@ -387,12 +300,6 @@
         assertSame(expected, headerViewListAdapter.getView(2, null, null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link HeaderViewListAdapter#getItemViewType(int)}",
-        method = "getItemViewType",
-        args = {int.class}
-    )
     public void testGetItemViewType() {
         HeaderViewListAdapter headerViewListAdapter = new HeaderViewListAdapter(null, null, null);
         assertEquals(AdapterView.ITEM_VIEW_TYPE_HEADER_OR_FOOTER,
@@ -407,12 +314,6 @@
                 headerViewListAdapter.getItemViewType(2));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link HeaderViewListAdapter#getViewTypeCount()}",
-        method = "getViewTypeCount",
-        args = {}
-    )
     public void testGetViewTypeCount() {
         HeaderViewListAdapter headerViewListAdapter = new HeaderViewListAdapter(null, null, null);
         assertEquals(1, headerViewListAdapter.getViewTypeCount());
@@ -422,12 +323,6 @@
         assertEquals(fullAdapter.getViewTypeCount(), headerViewListAdapter.getViewTypeCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link HeaderViewListAdapter#registerDataSetObserver(DataSetObserver)}",
-        method = "registerDataSetObserver",
-        args = {android.database.DataSetObserver.class}
-    )
     public void testRegisterDataSetObserver() {
         HeaderViewFullAdapter fullAdapter = new HeaderViewFullAdapter();
         HeaderViewListAdapter headerViewListAdapter =
@@ -437,12 +332,6 @@
         assertSame(observer, fullAdapter.getDataSetObserver());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link HeaderViewListAdapter#unregisterDataSetObserver(DataSetObserver)}",
-        method = "unregisterDataSetObserver",
-        args = {android.database.DataSetObserver.class}
-    )
     public void testUnregisterDataSetObserver() {
         HeaderViewFullAdapter fullAdapter = new HeaderViewFullAdapter();
         HeaderViewListAdapter headerViewListAdapter =
@@ -456,12 +345,6 @@
         assertNull(fullAdapter.getDataSetObserver());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link HeaderViewListAdapter#getFilter()}",
-        method = "getFilter",
-        args = {}
-    )
     public void testGetFilter() {
         HeaderViewListAdapter headerViewListAdapter = new HeaderViewListAdapter(null, null, null);
         assertNull(headerViewListAdapter.getFilter());
@@ -475,12 +358,6 @@
         assertSame(emptyAdapter.getFilter(), headerViewListAdapter.getFilter());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link HeaderViewListAdapter#getWrappedAdapter()}",
-        method = "getWrappedAdapter",
-        args = {}
-    )
     public void testGetWrappedAdapter() {
         HeaderViewListAdapter headerViewListAdapter = new HeaderViewListAdapter(null, null, null);
         assertNull(headerViewListAdapter.getWrappedAdapter());
diff --git a/tests/tests/widget/src/android/widget/cts/HorizontalScrollViewTest.java b/tests/tests/widget/src/android/widget/cts/HorizontalScrollViewTest.java
index 31b0b7b..5d75006 100644
--- a/tests/tests/widget/src/android/widget/cts/HorizontalScrollViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/HorizontalScrollViewTest.java
@@ -18,16 +18,12 @@
 
 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 android.app.Activity;
 import android.content.Context;
+import android.cts.util.PollingCheck;
 import android.graphics.Rect;
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.UiThreadTest;
@@ -39,14 +35,12 @@
 import android.view.ViewGroup;
 import android.view.View.MeasureSpec;
 import android.view.ViewGroup.LayoutParams;
-import android.view.animation.cts.DelayedCheck;
 import android.widget.HorizontalScrollView;
 import android.widget.TextView;
 
 /**
  * Test {@link HorizontalScrollView}.
  */
-@TestTargetClass(HorizontalScrollView.class)
 public class HorizontalScrollViewTest
         extends ActivityInstrumentationTestCase2<HorizontalScrollViewStubActivity> {
     private static final int ITEM_WIDTH  = 250;
@@ -69,23 +63,6 @@
         mScrollView = (MyHorizontalScrollView) mActivity.findViewById(R.id.horizontal_scroll_view);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "HorizontalScrollView",
-            args = {Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "HorizontalScrollView",
-            args = {Context.class, AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "HorizontalScrollView",
-            args = {Context.class, AttributeSet.class, int.class}
-        )
-    })
     public void testConstructor() {
         XmlPullParser parser = mActivity.getResources().getLayout(R.layout.horizontal_scrollview);
         AttributeSet attrs = Xml.asAttributeSet(parser);
@@ -96,11 +73,6 @@
         new HorizontalScrollView(mActivity, attrs, 0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getMaxScrollAmount",
-        args = {}
-    )
     public void testGetMaxScrollAmount() {
         HorizontalScrollView scrollView = new HorizontalScrollView(mActivity);
         scrollView.layout(0, 0, 100, 200);
@@ -110,14 +82,6 @@
         assertEquals((150 - 0) / 2, scrollView.getMaxScrollAmount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addView",
-        args = {View.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete."
-            + " @throws clause should be added into javadoc of "
-            + "HorizontalScrollView#addView(View) when there is already one child in the view.")
     public void testAddView() {
         HorizontalScrollView scrollView = new HorizontalScrollView(mActivity);
         TextView child0 = new TextView(mActivity);
@@ -135,15 +99,6 @@
         assertEquals(1, scrollView.getChildCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addView",
-        args = {View.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete."
-            + " @throws clause should be added into javadoc of "
-            + "HorizontalScrollView#addView(View, int) when there "
-            + "is already one child in the view.")
     public void testAddViewWithIndex() {
         HorizontalScrollView scrollView = new HorizontalScrollView(mActivity);
         TextView child0 = new TextView(mActivity);
@@ -185,15 +140,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addView",
-        args = {View.class, LayoutParams.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete."
-            + " @throws clause should be added into javadoc of "
-            + "HorizontalScrollView#addView(View, LayoutParams) when there is already"
-            + " one child in the view or the layoutparams is null")
     public void testAddViewWithLayoutParams() {
         HorizontalScrollView scrollView = new HorizontalScrollView(mActivity);
         TextView child0 = new TextView(mActivity);
@@ -223,15 +169,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addView",
-        args = {View.class, int.class, LayoutParams.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete."
-            + " @throws clause should be added into javadoc of "
-            + "HorizontalScrollView#addView(View, int, LayoutParams) when there is already"
-            + " one child in the view or the layoutparams is null")
     public void testAddViewWithIndexAndLayoutParams() {
         HorizontalScrollView scrollView = new HorizontalScrollView(mActivity);
         TextView child0 = new TextView(mActivity);
@@ -287,18 +224,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isFillViewport",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFillViewport",
-            args = {boolean.class}
-        )
-    })
     public void testAccessFillViewport() {
         HorizontalScrollView scrollView = new HorizontalScrollView(mActivity);
         assertFalse(scrollView.isFillViewport());
@@ -321,18 +246,6 @@
         assertTrue(scrollView.isLayoutRequested());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isSmoothScrollingEnabled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSmoothScrollingEnabled",
-            args = {boolean.class}
-        )
-    })
     public void testAccessSmoothScrollingEnabled() throws Throwable {
         assertTrue(mScrollView.isSmoothScrollingEnabled());
 
@@ -363,7 +276,7 @@
                 mScrollView.fullScroll(View.FOCUS_RIGHT);
             }
         });
-        delayedCheckSmoothScrolling(0, SCROLL_RIGHT, 0, 0);
+        pollingCheckSmoothScrolling(0, SCROLL_RIGHT, 0, 0);
         assertEquals(SCROLL_RIGHT, mScrollView.getScrollX());
 
         runTestOnUiThread(new Runnable() {
@@ -371,15 +284,10 @@
                 mScrollView.fullScroll(View.FOCUS_LEFT);
             }
         });
-        delayedCheckSmoothScrolling(SCROLL_RIGHT, 0, 0, 0);
+        pollingCheckSmoothScrolling(SCROLL_RIGHT, 0, 0, 0);
         assertEquals(0, mScrollView.getScrollX());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "measureChild",
-        args = {View.class, int.class, int.class}
-    )
     public void testMeasureChild() {
         MyHorizontalScrollView scrollView = new MyHorizontalScrollView(mActivity);
 
@@ -401,11 +309,6 @@
         assertEquals(30, child.getMeasuredWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "measureChildWithMargins",
-        args = {View.class, int.class, int.class, int.class, int.class}
-    )
     public void testMeasureChildWithMargins() {
         MyHorizontalScrollView scrollView = new MyHorizontalScrollView(mActivity);
 
@@ -428,11 +331,6 @@
         assertEquals(30, child.getMeasuredWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "pageScroll",
-        args = {int.class}
-    )
     @UiThreadTest
     public void testPageScroll() {
         mScrollView.setSmoothScrollingEnabled(false);
@@ -453,11 +351,6 @@
         assertEquals(0, mScrollView.getScrollX());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "fullScroll",
-        args = {int.class}
-    )
     @UiThreadTest
     public void testFullScroll() {
         mScrollView.setSmoothScrollingEnabled(false);
@@ -476,11 +369,6 @@
         assertEquals(0, mScrollView.getScrollX());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "arrowScroll",
-        args = {int.class}
-    )
     @UiThreadTest
     public void testArrowScroll() {
         mScrollView.setSmoothScrollingEnabled(false);
@@ -507,11 +395,6 @@
         assertEquals(0, mScrollView.getScrollX());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "smoothScrollBy",
-        args = {int.class, int.class}
-    )
     public void testSmoothScrollBy() throws Throwable {
         assertEquals(0, mScrollView.getScrollX());
         assertEquals(0, mScrollView.getScrollY());
@@ -521,7 +404,7 @@
                 mScrollView.smoothScrollBy(SCROLL_RIGHT, 0);
             }
         });
-        delayedCheckSmoothScrolling(0, SCROLL_RIGHT, 0, 0);
+        pollingCheckSmoothScrolling(0, SCROLL_RIGHT, 0, 0);
         assertEquals(SCROLL_RIGHT, mScrollView.getScrollX());
         assertEquals(0, mScrollView.getScrollY());
 
@@ -530,16 +413,11 @@
                 mScrollView.smoothScrollBy(-SCROLL_RIGHT, 0);
             }
         });
-        delayedCheckSmoothScrolling(SCROLL_RIGHT, 0, 0, 0);
+        pollingCheckSmoothScrolling(SCROLL_RIGHT, 0, 0, 0);
         assertEquals(0, mScrollView.getScrollX());
         assertEquals(0, mScrollView.getScrollY());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "smoothScrollTo",
-        args = {int.class, int.class}
-    )
     public void testSmoothScrollTo() throws Throwable {
         assertEquals(0, mScrollView.getScrollX());
         assertEquals(0, mScrollView.getScrollY());
@@ -549,7 +427,7 @@
                 mScrollView.smoothScrollTo(SCROLL_RIGHT, 0);
             }
         });
-        delayedCheckSmoothScrolling(0, SCROLL_RIGHT, 0, 0);
+        pollingCheckSmoothScrolling(0, SCROLL_RIGHT, 0, 0);
         assertEquals(SCROLL_RIGHT, mScrollView.getScrollX());
         assertEquals(0, mScrollView.getScrollY());
 
@@ -558,16 +436,11 @@
                 mScrollView.smoothScrollTo(0, 0);
             }
         });
-        delayedCheckSmoothScrolling(SCROLL_RIGHT, 0, 0, 0);
+        pollingCheckSmoothScrolling(SCROLL_RIGHT, 0, 0, 0);
         assertEquals(0, mScrollView.getScrollX());
         assertEquals(0, mScrollView.getScrollY());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "computeScrollDeltaToGetChildRectOnScreen",
-        args = {android.graphics.Rect.class}
-    )
     public void testComputeScrollDeltaToGetChildRectOnScreen() {
         mScrollView.setSmoothScrollingEnabled(false);
         int edge = mScrollView.getHorizontalFadingEdgeLength();
@@ -584,11 +457,6 @@
         assertEquals(edge, mScrollView.computeScrollDeltaToGetChildRectOnScreen(rect));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "computeHorizontalScrollRange",
-        args = {}
-    )
     public void testComputeHorizontalScrollRange() {
         assertTrue(mScrollView.getChildCount() > 0);
         assertEquals(ITEM_WIDTH * ITEM_COUNT, mScrollView.computeHorizontalScrollRange());
@@ -598,11 +466,6 @@
         assertEquals(0, myScrollView.computeVerticalScrollRange());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "requestChildFocus",
-        args = {View.class, View.class}
-    )
     @UiThreadTest
     public void testRequestChildFocus() {
         mScrollView.setSmoothScrollingEnabled(false);
@@ -622,11 +485,6 @@
         assertTrue(mScrollView.getScrollX() < scrollX);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "requestChildRectangleOnScreen",
-        args = {View.class, Rect.class, boolean.class}
-    )
     @UiThreadTest
     public void testRequestChildRectangleOnScreen() {
         mScrollView.setSmoothScrollingEnabled(false);
@@ -645,12 +503,6 @@
         assertEquals(0, mScrollView.getScrollY());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "The method is simply called to make sure no exception is thrown.",
-        method = "requestLayout",
-        args = {}
-    )
     @UiThreadTest
     public void testRequestLayout() {
         mScrollView.requestLayout();
@@ -658,13 +510,6 @@
         assertTrue(mScrollView.isLayoutRequested());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "fling",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "As javadoc says, scrolls towards the left "
-            + "when velocityX is positive. But it scrolls to right actually.")
     public void testFling() throws Throwable {
         mScrollView.setSmoothScrollingEnabled(true);
         assertEquals(0, mScrollView.getScrollX());
@@ -677,7 +522,7 @@
                 mScrollView.fling(velocityX);
             }
         });
-        delayedCheckFling(0, true);
+        pollingCheckFling(0, true);
 
         final int currentX = mScrollView.getScrollX();
         // fling towards left
@@ -686,15 +531,9 @@
                 mScrollView.fling(-velocityX);
             }
         });
-        delayedCheckFling(currentX, false);
+        pollingCheckFling(currentX, false);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "scrollTo",
-        args = {int.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "scrollTo can not affect y.")
     @UiThreadTest
     public void testScrollTo() {
         mScrollView.setSmoothScrollingEnabled(false);
@@ -717,18 +556,6 @@
         assertEquals(0, mScrollView.getScrollX());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLeftFadingEdgeStrength",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRightFadingEdgeStrength",
-            args = {}
-        )
-    })
     public void testGetHorizontalFadingEdgeStrengths() {
         assertTrue(mScrollView.getChildCount() > 0);
         assertTrue(mScrollView.getLeftFadingEdgeStrength() <= 1.0f);
@@ -744,83 +571,38 @@
         assertTrue(mScrollView.getRightFadingEdgeStrength() >= 0.0f);
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onLayout",
-        args = {boolean.class, int.class, int.class, int.class, int.class}
-    )
     public void testOnLayout() {
         // onLayout() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onMeasure",
-        args = {int.class, int.class}
-    )
     public void testOnMeasure() {
         // onMeasure() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "executeKeyEvent",
-        args = {KeyEvent.class}
-    )
     public void testExecuteKeyEvent() {
         // executeKeyEvent() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onRequestFocusInDescendants",
-        args = {int.class, Rect.class}
-    )
     public void testOnRequestFocusInDescendants() {
         // onRequestFocusInDescendants() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onSizeChanged",
-        args = {int.class, int.class, int.class, int.class}
-    )
     public void testOnSizeChanged() {
         // onSizeChanged() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "dispatchKeyEvent",
-        args = {KeyEvent.class}
-    )
     public void testDispatchKeyEvent() {
         // dispatchKeyEvent() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onInterceptTouchEvent",
-        args = {MotionEvent.class}
-    )
     public void testOnInterceptTouchEvent() {
         // onInterceptTouchEvent() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onTouchEvent",
-        args = {MotionEvent.class}
-    )
     public void testOnTouchEvent() {
         // onTouchEvent() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "computeScroll",
-        args = {}
-    )
     public void testComputeScroll() {
         // computeScroll() is implementation details, do NOT test
     }
@@ -832,7 +614,7 @@
         return current <= from && current >= to;
     }
 
-    private void delayedCheckSmoothScrolling(final int fromX, final int toX,
+    private void pollingCheckSmoothScrolling(final int fromX, final int toX,
             final int fromY, final int toY) {
 
         if (fromX == toX && fromY == toY) {
@@ -840,7 +622,7 @@
         }
 
         if (fromY != toY) {
-            new DelayedCheck() {
+            new PollingCheck() {
                 @Override
                 protected boolean check() {
                     return isInRange(mScrollView.getScrollY(), fromY, toY);
@@ -849,7 +631,7 @@
         }
 
         if (fromX != toX) {
-            new DelayedCheck() {
+            new PollingCheck() {
                 @Override
                 protected boolean check() {
                     return isInRange(mScrollView.getScrollX(), fromX, toX);
@@ -857,7 +639,7 @@
             }.run();
         }
 
-        new DelayedCheck() {
+        new PollingCheck() {
             @Override
             protected boolean check() {
                 return toX == mScrollView.getScrollX() && toY == mScrollView.getScrollY();
@@ -865,8 +647,8 @@
         }.run();
     }
 
-    private void delayedCheckFling(final int startPosition, final boolean movingRight) {
-        new DelayedCheck() {
+    private void pollingCheckFling(final int startPosition, final boolean movingRight) {
+        new PollingCheck() {
             @Override
             protected boolean check() {
                 if (movingRight) {
@@ -876,7 +658,7 @@
             }
         }.run();
 
-        new DelayedCheck() {
+        new PollingCheck() {
             private int mPreviousScrollX = mScrollView.getScrollX();
 
             @Override
diff --git a/tests/tests/widget/src/android/widget/cts/ImageButtonTest.java b/tests/tests/widget/src/android/widget/cts/ImageButtonTest.java
index ecbfbe0..a71ec9d 100644
--- a/tests/tests/widget/src/android/widget/cts/ImageButtonTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ImageButtonTest.java
@@ -18,11 +18,6 @@
 
 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;
 
@@ -31,30 +26,7 @@
 import android.util.Xml;
 import android.widget.ImageButton;
 
-@TestTargetClass(ImageButton.class)
 public class ImageButtonTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "ImageButton",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "ImageButton",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "ImageButton",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "javadoc does not declare the corner case " +
-            "behavior when context is null")
     public void testConstructor() {
         XmlPullParser parser = getContext().getResources().getXml(R.layout.imagebutton_test);
         AttributeSet attrs = Xml.asAttributeSet(parser);
@@ -85,14 +57,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            notes = "Test {@link ImageButton#onSetAlpha(int)}.",
-            method = "onSetAlpha",
-            args = {int.class}
-        )
-    })
     public void testOnSetAlpha() {
         // Do not test, it's controlled by View. Implementation details.
     }
diff --git a/tests/tests/widget/src/android/widget/cts/ImageSwitcherTest.java b/tests/tests/widget/src/android/widget/cts/ImageSwitcherTest.java
index a7667ba..49bf3c6 100644
--- a/tests/tests/widget/src/android/widget/cts/ImageSwitcherTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ImageSwitcherTest.java
@@ -18,11 +18,6 @@
 
 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;
 
@@ -45,24 +40,7 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 
-@TestTargetClass(ImageSwitcher.class)
 public class ImageSwitcherTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "ImageSwitcher",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "ImageSwitcher",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        )
-    })
-    @ToBeFixed(bug="1417734", explanation="ImageSwitcher#ImageSwitcher(Context, AttributeSet)" +
-            " should check whether the input Context is null")
     public void testConstructor() {
         new ImageSwitcher(getContext());
 
@@ -74,12 +52,6 @@
         new ImageSwitcher(getContext(), attrs);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test setImageResource(int)",
-        method = "setImageResource",
-        args = {int.class}
-    )
     public void testSetImageResource() {
         // new the ImageSwitcher instance
         ImageSwitcher imageSwitcher = new ImageSwitcher(getContext());
@@ -110,12 +82,6 @@
         assertNull(((ImageView) imageSwitcher.getCurrentView()).getDrawable());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test setImageURI(Uri)",
-        method = "setImageURI",
-        args = {android.net.Uri.class}
-    )
     public void testSetImageURI() {
         // new the ImageSwitcher instance
         ImageSwitcher imageSwitcher = new ImageSwitcher(getContext());
@@ -159,12 +125,6 @@
         imageSwitcher.setImageURI(null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test setImageDrawable(Drawable)",
-        method = "setImageDrawable",
-        args = {android.graphics.drawable.Drawable.class}
-    )
     public void testSetImageDrawable() {
         ImageSwitcher imageSwitcher = new ImageSwitcher(getContext());
         ImageView iv = new ImageView(getContext());
diff --git a/tests/tests/widget/src/android/widget/cts/ImageViewTest.java b/tests/tests/widget/src/android/widget/cts/ImageViewTest.java
index 0777259..15a4fe7 100644
--- a/tests/tests/widget/src/android/widget/cts/ImageViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ImageViewTest.java
@@ -46,16 +46,10 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
 /**
  * Test {@link ImageView}.
  */
-@TestTargetClass(ImageView.class)
 public class ImageViewTest extends ActivityInstrumentationTestCase<ImageViewStubActivity> {
     private ImageView mImageView;
     private Activity mActivity;
@@ -109,29 +103,6 @@
         mActivity = getActivity();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link ImageView}",
-            method = "ImageView",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link ImageView}",
-            method = "ImageView",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link ImageView}",
-            method = "ImageView",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
-    @ToBeFixed(bug = "1417734", explanation = "ImageView#ImageView(Context, AttributeSet) and " +
-            "ImageView#ImageView(Context, AttributeSet, int)" +
-            " should check whether the input Context is null")
     public void testConstructor() {
         new ImageView(mActivity);
 
@@ -157,24 +128,11 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ImageView#invalidateDrawable(Drawable)}",
-        method = "invalidateDrawable",
-        args = {android.graphics.drawable.Drawable.class}
-    )
-    @ToBeFixed(bug="1400249", explanation="It will be tested by functional test.")
     public void testInvalidateDrawable() {
         ImageView imageView = new ImageView(mActivity);
         imageView.invalidateDrawable(null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ImageView#setAdjustViewBounds(boolean)}",
-        method = "setAdjustViewBounds",
-        args = {boolean.class}
-    )
     public void testSetAdjustViewBounds() {
         ImageView imageView = new ImageView(mActivity);
         imageView.setScaleType(ScaleType.FIT_XY);
@@ -186,38 +144,18 @@
         assertEquals(ScaleType.FIT_CENTER, imageView.getScaleType());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ImageView#setMaxWidth(int)}",
-        method = "setMaxWidth",
-        args = {int.class}
-    )
-    @ToBeFixed(bug="1400249", explanation="It will be tested by functional test.")
     public void testSetMaxWidth() {
         ImageView imageView = new ImageView(mActivity);
         imageView.setMaxWidth(120);
         imageView.setMaxWidth(-1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ImageView#setMaxHeight(int)}",
-        method = "setMaxHeight",
-        args = {int.class}
-    )
-    @ToBeFixed(bug="1400249", explanation="It will be tested by functional test.")
     public void testSetMaxHeight() {
         ImageView imageView = new ImageView(mActivity);
         imageView.setMaxHeight(120);
         imageView.setMaxHeight(-1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ImageView#getDrawable()}",
-        method = "getDrawable",
-        args = {}
-    )
     public void testGetDrawable() {
         final ImageView imageView = new ImageView(mActivity);
         final PaintDrawable drawable1 = new PaintDrawable();
@@ -230,12 +168,6 @@
         assertNotSame(drawable2, imageView.getDrawable());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ImageView#setImageResource(int)}",
-        method = "setImageResource",
-        args = {int.class}
-    )
     @UiThreadTest
     public void testSetImageResource() {
         mImageView = findImageViewById(R.id.imageview);
@@ -252,12 +184,6 @@
         WidgetTestUtils.assertEquals(testimageBitmap.getBitmap(), imageViewBitmap.getBitmap());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ImageView#setImageURI(Uri)}",
-        method = "setImageURI",
-        args = {android.net.Uri.class}
-    )
     @UiThreadTest
     public void testSetImageURI() {
         mImageView = findImageViewById(R.id.imageview);
@@ -285,12 +211,6 @@
         WidgetTestUtils.assertEquals(testimageBitmap, imageViewBitmap.getBitmap());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ImageView#setImageDrawable(Drawable)}",
-        method = "setImageDrawable",
-        args = {android.graphics.drawable.Drawable.class}
-    )
     @UiThreadTest
     public void testSetImageDrawable() {
         mImageView = findImageViewById(R.id.imageview);
@@ -308,12 +228,6 @@
         WidgetTestUtils.assertEquals(testimageBitmap.getBitmap(), imageViewBitmap.getBitmap());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ImageView#setImageBitmap(Bitmap)}",
-        method = "setImageBitmap",
-        args = {android.graphics.Bitmap.class}
-    )
     @UiThreadTest
     public void testSetImageBitmap() {
         mImageView = findImageViewById(R.id.imageview);
@@ -332,12 +246,6 @@
         WidgetTestUtils.assertEquals(bitmap, imageViewBitmap.getBitmap());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ImageView#setImageState(int[], boolean)}",
-        method = "setImageState",
-        args = {int[].class, boolean.class}
-    )
     public void testSetImageState() {
         mImageView = new ImageView(mActivity);
         int[] state = new int[8];
@@ -345,12 +253,6 @@
         assertSame(state, mImageView.onCreateDrawableState(0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ImageView#setSelected(boolean)}",
-        method = "setSelected",
-        args = {boolean.class}
-    )
     public void testSetSelected() {
         mImageView = new ImageView(mActivity);
         assertFalse(mImageView.isSelected());
@@ -362,12 +264,6 @@
         assertFalse(mImageView.isSelected());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ImageView#setImageLevel(int)}",
-        method = "setImageLevel",
-        args = {int.class}
-    )
     public void testSetImageLevel() {
         PaintDrawable drawable = new PaintDrawable();
         drawable.setLevel(0);
@@ -378,18 +274,6 @@
         assertEquals(1, drawable.getLevel());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setScaleType",
-            args = {android.widget.ImageView.ScaleType.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getScaleType",
-            args = {}
-        )
-    })
     public void testAccessScaleType() {
         final ImageView imageView = new ImageView(mActivity);
 
@@ -419,18 +303,6 @@
         assertEquals(ImageView.ScaleType.CENTER_INSIDE, imageView.getScaleType());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setImageMatrix",
-            args = {android.graphics.Matrix.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getImageMatrix",
-            args = {}
-        )
-    })
     public void testAccessImageMatrix() {
         final ImageView imageView = new ImageView(mActivity);
 
@@ -442,23 +314,11 @@
         assertEquals(matrix, imageView.getImageMatrix());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ImageView#getBaseline()}",
-        method = "getBaseline",
-        args = {}
-    )
     public void testGetBaseline() {
         final ImageView imageView = new ImageView(mActivity);
         assertEquals(-1, imageView.getBaseline());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ImageView#setColorFilter(int, Mode)}",
-        method = "setColorFilter",
-        args = {int.class, android.graphics.PorterDuff.Mode.class}
-    )
     public void testSetColorFilter1() {
         MockDrawable drawable = new MockDrawable();
 
@@ -471,12 +331,6 @@
         assertNotNull(drawable.getColorFilter());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ImageView#clearColorFilter()}",
-        method = "clearColorFilter",
-        args = {}
-    )
     public void testClearColorFilter() {
         MockDrawable drawable = new MockDrawable();
         ColorFilter cf = new ColorFilter();
@@ -489,12 +343,6 @@
         assertNull(drawable.getColorFilter());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ImageView#setColorFilter(ColorFilter)}",
-        method = "setColorFilter",
-        args = {android.graphics.ColorFilter.class}
-    )
     public void testSetColorFilter2() {
         MockDrawable drawable = new MockDrawable();
 
@@ -508,12 +356,6 @@
         assertSame(cf, drawable.getColorFilter());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ImageView#setAlpha(int)}",
-        method = "setAlpha",
-        args = {int.class}
-    )
     public void testSetAlpha() {
         MockDrawable drawable = new MockDrawable();
 
@@ -526,12 +368,6 @@
         assertEquals(255, drawable.getAlpha());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ImageView#drawableStateChanged()}",
-        method = "drawableStateChanged",
-        args = {}
-    )
     public void testDrawableStateChanged() {
         MockImageView mockImageView = new MockImageView(mActivity);
         MockDrawable drawable = new MockDrawable();
@@ -542,13 +378,6 @@
         assertSame(mockImageView.getDrawableState(), drawable.getState());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ImageView#onCreateDrawableState(int)}",
-        method = "onCreateDrawableState",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "IndexOutOfBoundsException is not expected.")
     public void testOnCreateDrawableState() {
         MockImageView mockImageView = new MockImageView(mActivity);
 
@@ -566,12 +395,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ImageView#onDraw(Canvas)}",
-        method = "onDraw",
-        args = {android.graphics.Canvas.class}
-    )
     public void testOnDraw() {
         MockImageView mockImageView = new MockImageView(mActivity);
         MockDrawable drawable = new MockDrawable();
@@ -580,12 +403,6 @@
         assertTrue(drawable.hasDrawCalled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ImageView#onMeasure(int, int)}",
-        method = "onMeasure",
-        args = {int.class, int.class}
-    )
     public void testOnMeasure() {
         mImageView = findImageViewById(R.id.imageview);
         mImageView.measure(200, 150);
@@ -593,12 +410,6 @@
         assertTrue(mImageView.getMeasuredHeight() <= 150);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ImageView#onSetAlpha(int)}",
-        method = "onSetAlpha",
-        args = {int.class}
-    )
     public void testOnSetAlpha() {
         MockImageView mockImageView = new MockImageView(mActivity);
         assertTrue(mockImageView.onSetAlpha(0));
@@ -607,12 +418,6 @@
         assertFalse(mockImageView.onSetAlpha(0));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ImageView#setFrame(int, int, int, int)}",
-        method = "setFrame",
-        args = {int.class, int.class, int.class, int.class}
-    )
     public void testSetFrame() {
         MockImageView mockImageView = new MockImageView(mActivity);
         assertFalse(mockImageView.hasOnSizeChangedCalled());
@@ -628,12 +433,6 @@
         assertFalse(mockImageView.hasOnSizeChangedCalled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ImageView#verifyDrawable(Drawable)}",
-        method = "verifyDrawable",
-        args = {android.graphics.drawable.Drawable.class}
-    )
     public void testVerifyDrawable() {
         MockImageView mockImageView = new MockImageView(mActivity);
         MockDrawable drawable = new MockDrawable();
diff --git a/tests/tests/widget/src/android/widget/cts/LinearLayoutTest.java b/tests/tests/widget/src/android/widget/cts/LinearLayoutTest.java
index 9da5607..4465533 100644
--- a/tests/tests/widget/src/android/widget/cts/LinearLayoutTest.java
+++ b/tests/tests/widget/src/android/widget/cts/LinearLayoutTest.java
@@ -32,16 +32,10 @@
 import android.widget.TextView;
 
 import com.android.cts.stub.R;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
 /**
  * Test {@link LinearLayout}.
  */
-@TestTargetClass(LinearLayout.class)
 public class LinearLayoutTest extends ActivityInstrumentationTestCase<LinearLayoutStubActivity> {
     private Context mContext;
     private Activity mActivity;
@@ -57,22 +51,6 @@
         mContext = getInstrumentation().getTargetContext();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link LinearLayout}",
-            method = "LinearLayout",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link LinearLayout}",
-            method = "LinearLayout",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        )
-    })
-    @ToBeFixed(bug="1417734", explanation="LinearLayout#LinearLayout(Context, AttributeSet)" +
-            " should check whether the input Context is null")
     public void testConstructor() {
         new LinearLayout(mContext);
 
@@ -89,18 +67,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isBaselineAligned",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setBaselineAligned",
-            args = {boolean.class}
-        )
-    })
     public void testAccessBaselineAligned() {
         LinearLayout linearLayout = new LinearLayout(mContext);
         linearLayout.setBaselineAligned(true);
@@ -123,12 +89,6 @@
         assertTrue(linearLayout.isBaselineAligned());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link LinearLayout#getBaseline()}",
-        method = "getBaseline",
-        args = {}
-    )
     public void testGetBaseline() {
         LinearLayout linearLayout = new LinearLayout(mContext);
 
@@ -151,18 +111,6 @@
         assertEquals(lv3.getBaseline(), linearLayout.getBaseline());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBaselineAlignedChildIndex",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setBaselineAlignedChildIndex",
-            args = {int.class}
-        )
-    })
     public void testAccessBaselineAlignedChildIndex() {
         LinearLayout linearLayout = new LinearLayout(mContext);
         // set BaselineAlignedChildIndex
@@ -193,18 +141,6 @@
         assertEquals(1, linearLayout.getBaselineAlignedChildIndex());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setWeightSum",
-            args = {float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWeightSum",
-            args = {}
-        )
-    })
     /**
      * weightsum is a horizontal LinearLayout. There are three children in it.
      */
@@ -235,22 +171,6 @@
         assertEquals(Math.ceil(parentWidth * 0.3), weight03.getWidth(), 1.0);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "generateLayoutParams",
-            args = {android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "generateLayoutParams",
-            args = {android.view.ViewGroup.LayoutParams.class}
-        )
-    })
-    @ToBeFixed(bug="1417734", explanation="generateLayoutParams(AttributeSet)" +
-            " will throw a RuntimeException:" +
-            " Binary XML file line #-1: You must supply a layout_width attribute." +
-            " But 'layout_width' attribute have been assigned to be 'match_parent'.")
     public void testGenerateLayoutParams() {
         ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(320, 240);
         MockLinearLayout mockLinearLayout = new MockLinearLayout(mContext);
@@ -267,12 +187,6 @@
 //        assertEquals(LayoutParams.WRAP_CONTENT, layoutParams2.height);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link LinearLayout#checkLayoutParams(ViewGroup.LayoutParams)}",
-        method = "checkLayoutParams",
-        args = {android.view.ViewGroup.LayoutParams.class}
-    )
     public void testCheckLayoutParams() {
         MockLinearLayout mockLinearLayout = new MockLinearLayout(mContext);
 
@@ -283,12 +197,6 @@
         assertTrue(mockLinearLayout.checkLayoutParams(params));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link LinearLayout#generateDefaultLayoutParams()}",
-        method = "generateDefaultLayoutParams",
-        args = {}
-    )
     public void testGenerateDefaultLayoutParams() {
         MockLinearLayout mockLinearLayout = new MockLinearLayout(mContext);
 
@@ -310,44 +218,6 @@
         assertNull(mockLinearLayout.generateDefaultLayoutParams());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test layout three horizontal children",
-            method = "setGravity",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test layout three horizontal children",
-            method = "setVerticalGravity",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test layout three horizontal children",
-            method = "setOrientation",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test layout three horizontal children",
-            method = "getOrientation",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test layout three horizontal children",
-            method = "onMeasure",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test layout three horizontal children",
-            method = "onLayout",
-            args = {boolean.class, int.class, int.class, int.class, int.class}
-        )
-    })
     /**
      * layout of horizontal LinearLayout.
      * ----------------------------------------------------
@@ -400,44 +270,6 @@
         assertEquals(parent.getWidth(), bottomView.getRight());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test layout three vertical children",
-            method = "setGravity",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test layout three vertical children",
-            method = "setHorizontalGravity",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test layout three vertical children",
-            method = "setOrientation",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test layout three vertical children",
-            method = "getOrientation",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test layout three vertical children",
-            method = "onMeasure",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test layout three vertical children",
-            method = "onLayout",
-            args = {boolean.class, int.class, int.class, int.class, int.class}
-        )
-    })
     /**
      * layout of vertical LinearLayout.
      * -----------------------------------
diff --git a/tests/tests/widget/src/android/widget/cts/LinearLayout_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/LinearLayout_LayoutParamsTest.java
index 4b6257a..72f3ff6 100644
--- a/tests/tests/widget/src/android/widget/cts/LinearLayout_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/LinearLayout_LayoutParamsTest.java
@@ -19,10 +19,6 @@
 import com.android.cts.stub.R;
 import com.android.internal.util.XmlUtils;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import org.xmlpull.v1.XmlPullParserException;
 
@@ -34,40 +30,7 @@
 
 import java.io.IOException;
 
-@TestTargetClass(LinearLayout.LayoutParams.class)
 public class LinearLayout_LayoutParamsTest extends AndroidTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "LinearLayout.LayoutParams",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "LinearLayout.LayoutParams",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "LinearLayout.LayoutParams",
-            args = {android.view.ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "LinearLayout.LayoutParams",
-            args = {int.class, int.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "LinearLayout.LayoutParams",
-            args = {android.view.ViewGroup.MarginLayoutParams.class}
-        )
-    })
     public void testConstructor() throws XmlPullParserException, IOException {
         XmlResourceParser p = mContext.getResources().getLayout(R.layout.linearlayout_layout);
 
@@ -85,11 +48,6 @@
         new LinearLayout.LayoutParams(marginLayoutParams);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "debug",
-        args = {java.lang.String.class}
-    )
     public void testDebug() {
         LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(320, 240);
         assertNotNull(layoutParams.debug("test: "));
diff --git a/tests/tests/widget/src/android/widget/cts/ListViewTest.java b/tests/tests/widget/src/android/widget/cts/ListViewTest.java
index ba597c1..50a2f16 100644
--- a/tests/tests/widget/src/android/widget/cts/ListViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ListViewTest.java
@@ -19,11 +19,6 @@
 import com.android.cts.stub.R;
 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 org.xmlpull.v1.XmlPullParser;
 
@@ -53,7 +48,6 @@
 
 import junit.framework.Assert;
 
-@TestTargetClass(ListView.class)
 public class ListViewTest extends ActivityInstrumentationTestCase2<ListViewStubActivity> {
     private final String[] mCountryList = new String[] {
         "Argentina", "Australia", "China", "France", "Germany", "Italy", "Japan", "United States"
@@ -93,24 +87,6 @@
         mListView = (ListView) mActivity.findViewById(R.id.listview_default);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ListView",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ListView",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ListView",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testConstructor() {
         new ListView(mActivity);
         new ListView(mActivity, mAttributeSet);
@@ -138,18 +114,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAdapter",
-            args = {android.widget.ListAdapter.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMaxScrollAmount",
-            args = {}
-        )
-    })
     public void testGetMaxScrollAmount() {
         setAdapter(mAdapter_empty);
         int scrollAmount = mListView.getMaxScrollAmount();
@@ -169,23 +133,6 @@
         mInstrumentation.waitForIdleSync();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDividerHeight",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDividerHeight",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDivider",
-            args = {}
-        )
-    })
     public void testAccessDividerHeight() {
         mInstrumentation.runOnMainSync(new Runnable() {
             public void run() {
@@ -217,18 +164,6 @@
         assertEquals(10, r.bottom - r.top);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "setItemsCanFocus",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "getItemsCanFocus",
-            args = {}
-        )
-    })
     public void testAccessItemsCanFocus() {
         mListView.setItemsCanFocus(true);
         assertTrue(mListView.getItemsCanFocus());
@@ -239,18 +174,6 @@
         // TODO: how to check?
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAdapter",
-            args = {android.widget.ListAdapter.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAdapter",
-            args = {}
-        )
-    })
     public void testAccessAdapter() {
         mInstrumentation.runOnMainSync(new Runnable() {
             public void run() {
@@ -273,45 +196,7 @@
         assertEquals(mNameList.length, mListView.getCount());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setItemChecked",
-            args = {int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setChoiceMode",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getChoiceMode",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCheckedItemPosition",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isItemChecked",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCheckedItemPositions",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "clearChoices",
-            args = {}
-        )
-    })
     @UiThreadTest
-    @ToBeFixed(bug="2031502", explanation="setItemChecked(i,false) always unchecks all items")
     public void testAccessItemChecked() {
         // NONE mode
         mListView.setChoiceMode(ListView.CHOICE_MODE_NONE);
@@ -384,33 +269,6 @@
         assertFalse(mListView.isItemChecked(4));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFooterDividersEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addFooterView",
-            args = {android.view.View.class, java.lang.Object.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addFooterView",
-            args = {android.view.View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFooterViewsCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeFooterView",
-            args = {android.view.View.class}
-        )
-    })
     public void testAccessFooterView() {
         final TextView footerView1 = new TextView(mActivity);
         footerView1.setText("footerview1");
@@ -466,35 +324,6 @@
         assertEquals(0, mListView.getFooterViewsCount());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setHeaderDividersEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addHeaderView",
-            args = {android.view.View.class, java.lang.Object.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addHeaderView",
-            args = {android.view.View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getHeaderViewsCount",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeHeaderView",
-            args = {android.view.View.class}
-        )
-    })
-    @ToBeFixed(bug = "", explanation = "After add two header views, the setAdapter will fail, " +
-            "and throws out an java.lang.ClassCastException.")
     public void testAccessHeaderView() {
         final TextView headerView1 = (TextView) mActivity.findViewById(R.id.headerview1);
         final TextView headerView2 = (TextView) mActivity.findViewById(R.id.headerview2);
@@ -524,18 +353,6 @@
         assertEquals(2, mListView.getHeaderViewsCount());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDivider",
-            args = {android.graphics.drawable.Drawable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDivider",
-            args = {}
-        )
-    })
     public void testAccessDivider() {
         mInstrumentation.runOnMainSync(new Runnable() {
             public void run() {
@@ -569,23 +386,6 @@
         assertEquals(10, r.bottom - r.top);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSelection",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSelectionFromTop",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSelectionAfterHeaderView",
-            args = {}
-        )
-    })
     public void testSetSelection() {
         mInstrumentation.runOnMainSync(new Runnable() {
             public void run() {
@@ -622,32 +422,10 @@
         assertEquals(mCountryList[0], item);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onKeyDown",
-            args = {int.class, android.view.KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onKeyUp",
-            args = {int.class, android.view.KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onKeyMultiple",
-            args = {int.class, int.class, android.view.KeyEvent.class}
-        )
-    })
     public void testOnKeyUpDown() {
         // implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "performItemClick",
-        args = {android.view.View.class, int.class, long.class}
-    )
     public void testPerformItemClick() {
         mInstrumentation.runOnMainSync(new Runnable() {
             public void run() {
@@ -696,27 +474,10 @@
         assertEquals(2, onClickListener.getID());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onRestoreInstanceState",
-            args = {android.os.Parcelable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onSaveInstanceState",
-            args = {}
-        )
-    })
     public void testSaveAndRestoreInstanceState() {
         // implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dispatchKeyEvent",
-        args = {android.view.KeyEvent.class}
-    )
     public void testDispatchKeyEvent() {
         mInstrumentation.runOnMainSync(new Runnable() {
             public void run() {
@@ -757,11 +518,6 @@
         assertEquals(mCountryList[4], item);
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        method = "requestChildRectangleOnScreen",
-        args = {android.view.View.class, android.graphics.Rect.class, boolean.class}
-    )
     public void testRequestChildRectangleOnScreen() {
         mInstrumentation.runOnMainSync(new Runnable() {
             public void run() {
@@ -780,27 +536,10 @@
         // TODO: how to check?
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onTouchEvent",
-        args = {android.view.MotionEvent.class}
-    )
     public void testOnTouchEvent() {
         // implementation details, do NOT test
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "canAnimate",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAdapter",
-            args = {android.widget.ListAdapter.class}
-        )
-    })
     @UiThreadTest
     public void testCanAnimate() {
         MyListView listView = new MyListView(mActivity, mAttributeSet);
@@ -816,28 +555,11 @@
         assertTrue(listView.canAnimate());
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "dispatchDraw",
-        args = {android.graphics.Canvas.class}
-    )
     @UiThreadTest
     public void testDispatchDraw() {
         // implementation details, do NOT test
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "findViewTraversal",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addHeaderView",
-            args = {android.view.View.class}
-        )
-    })
     @UiThreadTest
     public void testFindViewTraversal() {
         MyListView listView = new MyListView(mActivity, mAttributeSet);
@@ -850,18 +572,6 @@
         assertSame(headerView, listView.findViewTraversal(R.id.headerview1));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "findViewWithTagTraversal",
-            args = {java.lang.Object.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addHeaderView",
-            args = {android.view.View.class}
-        )
-    })
     @UiThreadTest
     public void testFindViewWithTagTraversal() {
         MyListView listView = new MyListView(mActivity, mAttributeSet);
@@ -875,39 +585,18 @@
         assertSame(headerView, listView.findViewWithTagTraversal("header"));
     }
 
-    @TestTargetNew(
-        level = TestLevel.TODO,
-        method = "layoutChildren",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testLayoutChildren() {
         // TODO: how to test?
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onFinishInflate",
-        args = {}
-    )
     public void testOnFinishInflate() {
         // implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onFocusChanged",
-        args = {boolean.class, int.class, android.graphics.Rect.class}
-    )
     public void testOnFocusChanged() {
         // implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onMeasure",
-        args = {int.class, int.class}
-    )
     public void testOnMeasure() {
         // implementation details, do NOT test
     }
@@ -973,18 +662,6 @@
     /**
      * The following functions are merged from frameworktest.
      */
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "layoutChildren",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAdapter",
-            args = {android.widget.ListAdapter.class}
-        )
-    })
     @MediumTest
     public void testRequestLayout() throws Exception {
         ListView listView = new ListView(mActivity);
@@ -1007,18 +684,6 @@
         Assert.assertTrue(childView.onMeasureCalled);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSelection",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAdapter",
-            args = {android.widget.ListAdapter.class}
-        )
-    })
     @MediumTest
     public void testNoSelectableItems() throws Exception {
         ListView listView = new ListView(mActivity);
diff --git a/tests/tests/widget/src/android/widget/cts/MediaControllerTest.java b/tests/tests/widget/src/android/widget/cts/MediaControllerTest.java
index 9f27138..3736b29 100644
--- a/tests/tests/widget/src/android/widget/cts/MediaControllerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/MediaControllerTest.java
@@ -18,17 +18,13 @@
 
 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 android.app.Activity;
 import android.app.Instrumentation;
 import android.content.Context;
+import android.cts.util.PollingCheck;
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.UiThreadTest;
 import android.util.AttributeSet;
@@ -36,7 +32,6 @@
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.View.OnClickListener;
-import android.view.animation.cts.DelayedCheck;
 import android.widget.MediaController;
 import android.widget.VideoView;
 
@@ -47,7 +42,6 @@
 /**
  * Test {@link MediaController}.
  */
-@TestTargetClass(MediaController.class)
 public class MediaControllerTest extends
         ActivityInstrumentationTestCase2<MediaControllerStubActivity> {
     private MediaController mMediaController;
@@ -66,26 +60,6 @@
         mInstrumentation = getInstrumentation();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link MediaController}",
-            method = "MediaController",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link MediaController}",
-            method = "MediaController",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link MediaController}",
-            method = "MediaController",
-            args = {android.content.Context.class, boolean.class}
-        )
-    })
     public void testConstructor() {
         new MediaController(mActivity, null);
 
@@ -99,35 +73,12 @@
         new MediaController(mActivity, attrs);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link MediaController#onFinishInflate()}",
-            method = "onFinishInflate",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link MediaController#onFinishInflate()}",
-            method = "setAnchorView",
-            args = {android.view.View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link MediaController#onFinishInflate()}",
-            method = "setMediaPlayer",
-            args = {android.widget.MediaController.MediaPlayerControl.class}
-        )
-    })
     /**
      * scenario description:
      * 1. Show the MediaController.
      *
      */
     @UiThreadTest
-    @ToBeFixed(bug = "1695243", explanation = "setAnchorView() must be called before show(), " +
-            "javadoc does not declare the preconditions for showing. " +
-            "And javadoc does not declare the default status is paused.")
     public void testMediaController() {
         mMediaController = new MediaController(mActivity);
         final MockMediaPlayerControl mediaPlayerControl = new MockMediaPlayerControl();
@@ -157,34 +108,6 @@
         assertTrue(mMediaController.isShowing());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link MediaController#isShowing()}",
-            method = "isShowing",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link MediaController#isShowing()}",
-            method = "hide",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link MediaController#isShowing()}",
-            method = "show",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link MediaController#isShowing()}",
-            method = "show",
-            args = {int.class}
-        )
-    })
-    @ToBeFixed(bug = "1559790", explanation = "isShowing() should return false after time out, " +
-            "but MediaController still shows, this may be a bug.")
     public void testShow() {
         mMediaController = new MediaController(mActivity, true);
         assertFalse(mMediaController.isShowing());
@@ -222,7 +145,7 @@
         assertTrue(mMediaController.isShowing());
 
         // isShowing() should return false, but MediaController still shows, this may be a bug.
-        new DelayedCheck(timeout + 500) {
+        new PollingCheck(timeout + 500) {
             @Override
             protected boolean check() {
                 return mMediaController.isShowing();
@@ -261,15 +184,6 @@
         return mActivity.getFileStreamPath(VIDEO_NAME).getAbsolutePath();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link MediaController#onTrackballEvent(MotionEvent)}, " +
-                "this function always returns false",
-        method = "onTrackballEvent",
-        args = {android.view.MotionEvent.class}
-    )
-    @ToBeFixed(bug = "1559790", explanation = "MediaController does not show after " +
-            "a track ball event is processed.")
     public void testOnTrackballEvent() {
         mMediaController = new MediaController(mActivity);
         final MockMediaPlayerControl mediaPlayerControl = new MockMediaPlayerControl();
@@ -302,12 +216,6 @@
         mInstrumentation.waitForIdleSync();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link MediaController#setEnabled(boolean)}",
-        method = "setEnabled",
-        args = {boolean.class}
-    )
     @UiThreadTest
     public void testSetEnabled() {
         final View videoView = mActivity.findViewById(R.id.mediacontroller_videoview);
@@ -330,12 +238,6 @@
         assertFalse(mMediaController.isEnabled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        notes = "no way to trigger next/prev press",
-        method = "setPrevNextListeners",
-        args = {android.view.View.OnClickListener.class, android.view.View.OnClickListener.class}
-    )
     public void testSetPrevNextListeners() {
         final View videoView = mActivity.findViewById(R.id.mediacontroller_videoview);
         final MockMediaPlayerControl mediaPlayerControl = new MockMediaPlayerControl();
diff --git a/tests/tests/widget/src/android/widget/cts/MultiAutoCompleteTextViewTest.java b/tests/tests/widget/src/android/widget/cts/MultiAutoCompleteTextViewTest.java
index 0080e84..b37b4ef 100644
--- a/tests/tests/widget/src/android/widget/cts/MultiAutoCompleteTextViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/MultiAutoCompleteTextViewTest.java
@@ -18,11 +18,6 @@
 
 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;
 
@@ -42,7 +37,6 @@
 import android.widget.MultiAutoCompleteTextView.CommaTokenizer;
 import android.widget.MultiAutoCompleteTextView.Tokenizer;
 
-@TestTargetClass(MultiAutoCompleteTextView.class)
 public class MultiAutoCompleteTextViewTest extends ActivityInstrumentationTestCase2
         <MultiAutoCompleteTextViewStubActivity> {
     private MultiAutoCompleteTextView mMultiAutoCompleteTextView_country;
@@ -65,24 +59,6 @@
                 .findViewById(R.id.name_edit);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "MultiAutoCompleteTextView",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "MultiAutoCompleteTextView",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "MultiAutoCompleteTextView",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testConstructor() {
         XmlPullParser parser = mActivity.getResources()
                 .getXml(R.layout.multi_auto_complete_text_view_layout);
@@ -120,26 +96,7 @@
         m.setSelection(0, c.length());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTokenizer",
-            args = {Tokenizer.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "enoughToFilter",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "performValidation",
-            args = {}
-        )
-    })
     @UiThreadTest
-    @ToBeFixed(bug = "", explanation = "There will be an endless loop when call performValidation" +
-            " if using CommaTokenizer as the Tokenizer.")
     public void testMultiAutoCompleteTextView() {
         mMultiAutoCompleteTextView_country.setTokenizer(new CommaTokenizer());
         mMultiAutoCompleteTextView_name.setTokenizer(new CommaTokenizer());
@@ -177,11 +134,6 @@
         mMultiAutoCompleteTextView_name.setValidator(null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "performValidation",
-        args = {}
-    )
     @UiThreadTest
     public void testPerformValidation() {
         MockValidator v = new MockValidator();
@@ -199,20 +151,6 @@
         assertEquals(str + ", ", mMultiAutoCompleteTextView_country.getText().toString());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "performFiltering",
-            args = {java.lang.CharSequence.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "performFiltering",
-            args = {java.lang.CharSequence.class, int.class, int.class, int.class}
-        )
-    })
-    @ToBeFixed(bug = "1400249", explanation = "it's hard to do unit test, should be tested by" +
-               " functional test.")
     public void testPerformFiltering() {
         MyMultiAutoCompleteTextView multiAutoCompleteTextView =
             new MyMultiAutoCompleteTextView(mActivity);
@@ -237,11 +175,6 @@
         assertNotNull(multiAutoCompleteTextView.getFilter());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "replaceText",
-        args = {java.lang.CharSequence.class}
-    )
     public void testReplaceText() {
         MyMultiAutoCompleteTextView multiAutoCompleteTextView =
             new MyMultiAutoCompleteTextView(mActivity);
diff --git a/tests/tests/widget/src/android/widget/cts/MultiAutoCompleteTextView_CommaTokenizerTest.java b/tests/tests/widget/src/android/widget/cts/MultiAutoCompleteTextView_CommaTokenizerTest.java
index 267dfa6..254050f 100644
--- a/tests/tests/widget/src/android/widget/cts/MultiAutoCompleteTextView_CommaTokenizerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/MultiAutoCompleteTextView_CommaTokenizerTest.java
@@ -16,10 +16,6 @@
 
 package android.widget.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.ToBeFixed;
 
 import android.text.SpannableString;
 import android.text.Spanned;
@@ -28,7 +24,6 @@
 
 import junit.framework.TestCase;
 
-@TestTargetClass(CommaTokenizer.class)
 public class MultiAutoCompleteTextView_CommaTokenizerTest extends TestCase {
     private static final String TEST_TEXT = "first token, second token";
     CommaTokenizer mCommaTokenizer;
@@ -39,22 +34,10 @@
         mCommaTokenizer = new CommaTokenizer();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "MultiAutoCompleteTextView.CommaTokenizer",
-        args = {}
-    )
     public void testConstructor() {
         new CommaTokenizer();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "findTokenStart",
-        args = {java.lang.CharSequence.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "does not declare the corner cases." +
-            " 1. cursor is out of bound. 2. text is null.")
     public void testFindTokenStart() {
         int indexOfSecondToken = TEST_TEXT.indexOf("second");
         assertEquals(indexOfSecondToken,
@@ -89,13 +72,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "findTokenEnd",
-        args = {java.lang.CharSequence.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "does not declare the corner cases." +
-            " 1. cursor is out of bound. 2. text is null.")
     public void testFindTokenEnd() {
         int indexOfComma = TEST_TEXT.indexOf(",");
 
@@ -125,15 +101,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "terminateToken",
-        args = {java.lang.CharSequence.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "does not declare the corner cases." +
-            " 1. text is null." +
-            " 2. javadoc says ends with a token terminator (for example a space or comma)," +
-            " but actually ends with both comma and space")
     public void testTerminateToken() {
         String text = "end with comma,";
         assertEquals(text, mCommaTokenizer.terminateToken(text));
diff --git a/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java b/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
index f6a1aa7..997c2e9 100644
--- a/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
+++ b/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
@@ -18,11 +18,6 @@
 
 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 android.app.Activity;
 import android.app.Instrumentation;
@@ -45,7 +40,6 @@
 import android.widget.TextView;
 import android.widget.PopupWindow.OnDismissListener;
 
-@TestTargetClass(PopupWindow.class)
 public class PopupWindowTest extends
         ActivityInstrumentationTestCase2<MockPopupWindowStubActivity> {
     private Instrumentation mInstrumentation;
@@ -72,55 +66,6 @@
         mActivity = getActivity();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "PopupWindow",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "PopupWindow",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "PopupWindow",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "PopupWindow",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "PopupWindow",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "PopupWindow",
-            args = {android.view.View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "PopupWindow",
-            args = {android.view.View.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "PopupWindow",
-            args = {android.view.View.class, int.class, int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getContentView",
-            args = {}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for constructor is incomplete." +
-            "1. not clear what is supposed to happen when the LayoutParam is null.")
     public void testConstructor() {
         new PopupWindow(mActivity);
 
@@ -178,18 +123,6 @@
         assertTrue(mPopupWindow.isFocusable());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBackground",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setBackgroundDrawable",
-            args = {android.graphics.drawable.Drawable.class}
-        )
-    })
     public void testAccessBackground() {
         mPopupWindow = new PopupWindow(mActivity);
 
@@ -201,18 +134,6 @@
         assertNull(mPopupWindow.getBackground());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAnimationStyle",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAnimationStyle",
-            args = {int.class}
-        )
-    })
     public void testAccessAnimationStyle() {
         mPopupWindow = new PopupWindow(mActivity);
         // default is -1
@@ -231,18 +152,6 @@
         assertEquals(-100, mPopupWindow.getAnimationStyle());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setContentView",
-            args = {android.view.View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getContentView",
-            args = {}
-        )
-    })
     public void testAccessContentView() {
         mPopupWindow = new PopupWindow(mActivity);
         assertNull(mPopupWindow.getContentView());
@@ -265,18 +174,6 @@
         dismissPopup();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFocusable",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isFocusable",
-            args = {}
-        )
-    })
     public void testAccessFocusable() {
         mPopupWindow = new PopupWindow(mActivity);
         assertFalse(mPopupWindow.isFocusable());
@@ -288,18 +185,6 @@
         assertFalse(mPopupWindow.isFocusable());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setHeight",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getHeight",
-            args = {}
-        )
-    })
     public void testAccessHeight() {
         mPopupWindow = new PopupWindow(mActivity);
         // default is 0
@@ -335,18 +220,6 @@
         return wm.getDefaultDisplay();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setWidth",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getWidth",
-            args = {}
-        )
-    })
     public void testAccessWidth() {
         mPopupWindow = new PopupWindow(mActivity);
         assertEquals(0, mPopupWindow.getWidth());
@@ -371,11 +244,6 @@
         assertEquals(width, mPopupWindow.getWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "showAsDropDown",
-        args = {android.view.View.class}
-    )
     public void testShowAsDropDown() {
         int[] anchorXY = new int[2];
         int[] viewOnScreenXY = new int[2];
@@ -402,11 +270,6 @@
         dismissPopup();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "showAtLocation",
-        args = {android.view.View.class, int.class, int.class, int.class}
-    )
     public void testShowAtLocation() {
         int[] viewInWindowXY = new int[2];
         int[] viewOnScreenXY = new int[2];
@@ -439,11 +302,6 @@
         dismissPopup();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "showAsDropDown",
-        args = {android.view.View.class, int.class, int.class}
-    )
     public void testShowAsDropDownWithOffsets() {
         int[] anchorXY = new int[2];
         int[] viewOnScreenXY = new int[2];
@@ -472,18 +330,6 @@
         dismissPopup();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMaxAvailableHeight",
-            args = {android.view.View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMaxAvailableHeight",
-            args = {android.view.View.class, int.class}
-        )
-    })
     public void testGetMaxAvailableHeight() {
         mPopupWindow = createPopupWindow(createPopupContent());
 
@@ -520,11 +366,6 @@
         assertTrue(maxAvailableHeight <= avaliable);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "dismiss",
-        args = {}
-    )
     public void testDismiss() {
         mPopupWindow = createPopupWindow(createPopupContent());
         assertFalse(mPopupWindow.isShowing());
@@ -538,11 +379,6 @@
         assertFalse(mPopupWindow.isShowing());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setOnDismissListener",
-        args = {android.widget.PopupWindow.OnDismissListener.class}
-    )
     public void testSetOnDismissListener() {
         mPopupWindow = new PopupWindow(new TextView(mActivity));
         mPopupWindow.setOnDismissListener(null);
@@ -563,23 +399,6 @@
         assertEquals(2, onDismissListener.getOnDismissCalledCount());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "update",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setClippingEnabled",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setIgnoreCheekPress",
-            args = {}
-        )
-    })
     public void testUpdate() {
         mPopupWindow = createPopupWindow(createPopupContent());
         mPopupWindow.setBackgroundDrawable(null);
@@ -623,23 +442,6 @@
                 WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM & p.flags);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "update",
-            args = {int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "update",
-            args = {int.class, int.class, int.class, int.class, boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isShowing",
-            args = {}
-        )
-    })
     public void testUpdatePositionAndDimension() {
         int[] fstXY = new int[2];
         int[] sndXY = new int[2];
@@ -689,18 +491,6 @@
         dismissPopup();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "update",
-            args = {android.view.View.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isShowing",
-            args = {}
-        )
-    })
     public void testUpdateDimensionAndAlignAnchorView() {
         mPopupWindow = createPopupWindow(createPopupContent());
 
@@ -728,18 +518,6 @@
         mPopupWindow.dismiss();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "update",
-            args = {android.view.View.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isShowing",
-            args = {}
-        )
-    })
     public void testUpdateDimensionAndAlignAnchorViewWithOffsets() {
         int[] anchorXY = new int[2];
         int[] viewInWindowOff = new int[2];
@@ -813,18 +591,6 @@
         dismissPopup();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInputMethodMode",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setInputMethodMode",
-            args = {int.class}
-        )
-    })
     public void testAccessInputMethodMode() {
         mPopupWindow = new PopupWindow(mActivity);
         assertEquals(0, mPopupWindow.getInputMethodMode());
@@ -842,18 +608,6 @@
         assertEquals(-1, mPopupWindow.getInputMethodMode());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isClippingEnabled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setClippingEnabled",
-            args = {boolean.class}
-        )
-    })
     public void testAccessClippingEnabled() {
         mPopupWindow = new PopupWindow(mActivity);
         assertTrue(mPopupWindow.isClippingEnabled());
@@ -862,18 +616,6 @@
         assertFalse(mPopupWindow.isClippingEnabled());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isOutsideTouchable",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOutsideTouchable",
-            args = {boolean.class}
-        )
-    })
     public void testAccessOutsideTouchable() {
         mPopupWindow = new PopupWindow(mActivity);
         assertFalse(mPopupWindow.isOutsideTouchable());
@@ -882,18 +624,6 @@
         assertTrue(mPopupWindow.isOutsideTouchable());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isTouchable",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTouchable",
-            args = {boolean.class}
-        )
-    })
     public void testAccessTouchable() {
         mPopupWindow = new PopupWindow(mActivity);
         assertTrue(mPopupWindow.isTouchable());
@@ -902,11 +632,6 @@
         assertFalse(mPopupWindow.isTouchable());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isAboveAnchor",
-        args = {}
-    )
     public void testIsAboveAnchor() {
         mPopupWindow = createPopupWindow(createPopupContent());
         final View upperAnchor = mActivity.findViewById(R.id.anchor_upper);
@@ -933,11 +658,6 @@
         dismissPopup();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setTouchInterceptor",
-        args = {android.view.View.OnTouchListener.class}
-    )
     public void testSetTouchInterceptor() {
         mPopupWindow = new PopupWindow(new TextView(mActivity));
 
@@ -977,11 +697,6 @@
         assertEquals(2, onTouchListener.getOnTouchCalledCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setWindowLayoutMode",
-        args = {int.class, int.class}
-    )
     public void testSetWindowLayoutMode() {
         mPopupWindow = new PopupWindow(new TextView(mActivity));
         showPopup();
diff --git a/tests/tests/widget/src/android/widget/cts/ProgressBarTest.java b/tests/tests/widget/src/android/widget/cts/ProgressBarTest.java
index 1b9b517..8a0b9a0 100644
--- a/tests/tests/widget/src/android/widget/cts/ProgressBarTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ProgressBarTest.java
@@ -18,11 +18,6 @@
 
 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 android.content.Context;
 import android.graphics.Canvas;
@@ -36,7 +31,6 @@
 import android.view.animation.LinearInterpolator;
 import android.widget.ProgressBar;
 
-@TestTargetClass(ProgressBar.class)
 public class ProgressBarTest extends InstrumentationTestCase {
     // The target context.
     private Context mContext;
@@ -47,23 +41,6 @@
         mContext = getInstrumentation().getTargetContext();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ProgressBar",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ProgressBar",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ProgressBar",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
     public void testConstructor() {
         new ProgressBar(mContext);
 
@@ -72,18 +49,6 @@
         new ProgressBar(mContext, null, android.R.attr.progressBarStyle);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setIndeterminate",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isIndeterminate",
-            args = {}
-        )
-    })
     public void testSetIndeterminate() {
         ProgressBar progressBar = new ProgressBar(mContext);
         assertTrue(progressBar.isIndeterminate());
@@ -105,18 +70,6 @@
         assertFalse(progressBar.isIndeterminate());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getIndeterminateDrawable",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setIndeterminateDrawable",
-            args = {android.graphics.drawable.Drawable.class}
-        )
-    })
     public void testAccessIndeterminateDrawable() {
         ProgressBar progressBar = new ProgressBar(mContext);
 
@@ -134,18 +87,6 @@
         assertNull(progressBar.getIndeterminateDrawable());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getProgressDrawable",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgressDrawable",
-            args = {android.graphics.drawable.Drawable.class}
-        )
-    })
     public void testAccessProgressDrawable() {
         ProgressBar progressBar = new ProgressBar(mContext, null,
                 android.R.attr.progressBarStyleHorizontal);
@@ -164,18 +105,6 @@
         assertNull(progressBar.getProgressDrawable());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getProgress",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setProgress",
-            args = {int.class}
-        )
-    })
     public void testAccessProgress() {
         ProgressBar progressBar = new ProgressBar(mContext, null,
                 android.R.attr.progressBarStyleHorizontal);
@@ -203,18 +132,6 @@
         assertEquals(0, progressBar.getProgress());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSecondaryProgress",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSecondaryProgress",
-            args = {int.class}
-        )
-    })
     public void testAccessSecondaryProgress() {
         ProgressBar progressBar = new ProgressBar(mContext, null,
                 android.R.attr.progressBarStyleHorizontal);
@@ -242,11 +159,6 @@
         assertEquals(0, progressBar.getSecondaryProgress());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "incrementProgressBy",
-        args = {int.class}
-    )
     public void testIncrementProgressBy() {
         ProgressBar progressBar = new ProgressBar(mContext, null,
                 android.R.attr.progressBarStyleHorizontal);
@@ -272,11 +184,6 @@
         assertEquals(0, progressBar.getProgress());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "incrementSecondaryProgressBy",
-        args = {int.class}
-    )
     public void testIncrementSecondaryProgressBy() {
         ProgressBar progressBar = new ProgressBar(mContext, null,
                 android.R.attr.progressBarStyleHorizontal);
@@ -302,18 +209,6 @@
         assertEquals(0, progressBar.getSecondaryProgress());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "setInterpolator",
-            args = {android.view.animation.Interpolator.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "getInterpolator",
-            args = {}
-        )
-    })
     public void testAccessInterpolator() {
         ProgressBar progressBar = new ProgressBar(mContext);
 
@@ -326,13 +221,6 @@
         assertEquals(i, progressBar.getInterpolator());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setVisibility",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for setVisibility() is incomplete." +
-            "1. not clear what is supposed result if visibility isn't VISIBLE, INVISIBLE or GONE.")
     public void testSetVisibility() {
         ProgressBar progressBar = new ProgressBar(mContext, null,
                 android.R.attr.progressBarStyleHorizontal);
@@ -360,13 +248,6 @@
         assertEquals(expected, progressBar.getVisibility());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "invalidateDrawable",
-        args = {android.graphics.drawable.Drawable.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for invalidateDrawable() is incomplete." +
-            "1. not clear what is supposed to happen if drawable is null.")
     public void testInvalidateDrawable() {
         MockProgressBar mockProgressBar = new MockProgressBar(mContext);
 
@@ -395,28 +276,11 @@
         assertFalse(mockProgressBar.hasCalledInvalidate());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "postInvalidate",
-        args = {}
-    )
     public void testPostInvalidate() {
         MockProgressBar mockProgressBar = new MockProgressBar(mContext);
         mockProgressBar.postInvalidate();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMax",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setMax",
-            args = {int.class}
-        )
-    })
     public void testAccessMax() {
         ProgressBar progressBar = new ProgressBar(mContext, null,
                 android.R.attr.progressBarStyleHorizontal);
@@ -446,11 +310,6 @@
         assertEquals(0, progressBar.getProgress());
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onDraw",
-        args = {android.graphics.Canvas.class}
-    )
     public void testOnDraw() {
         // Do not test, it's controlled by View. Implementation details
     }
@@ -486,29 +345,14 @@
 
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onMeasure",
-        args = {int.class, int.class}
-    )
     public void testOnMeasure() {
         // onMeasure() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onSizeChanged",
-        args = {int.class, int.class, int.class, int.class}
-    )
     public void testOnSizeChange() {
         // onSizeChanged() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "verifyDrawable",
-        args = {android.graphics.drawable.Drawable.class}
-    )
     public void testVerifyDrawable() {
         MockProgressBar mockProgressBar = new MockProgressBar(mContext);
         assertTrue(mockProgressBar.verifyDrawable(null));
@@ -536,27 +380,10 @@
         assertTrue(mockProgressBar.verifyDrawable(d3));
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "drawableStateChanged",
-        args = {}
-    )
     public void testDrawableStateChanged() {
         // drawableStateChanged() is implementation details, do NOT test
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestoreInstanceState",
-            args = {android.os.Parcelable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSaveInstanceState",
-            args = {}
-        )
-    })
     public void testOnSaveAndRestoreInstanceState() {
         ProgressBar progressBar = new ProgressBar(mContext, null,
                 android.R.attr.progressBarStyleHorizontal);
diff --git a/tests/tests/widget/src/android/widget/cts/RadioButtonTest.java b/tests/tests/widget/src/android/widget/cts/RadioButtonTest.java
index 8f7cbb6..79a51c8 100644
--- a/tests/tests/widget/src/android/widget/cts/RadioButtonTest.java
+++ b/tests/tests/widget/src/android/widget/cts/RadioButtonTest.java
@@ -18,11 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
 import android.content.Context;
 import android.test.InstrumentationTestCase;
@@ -32,7 +27,6 @@
 /**
  * Test {@link RadioButton}.
  */
-@TestTargetClass(RadioButton.class)
 public class RadioButtonTest extends InstrumentationTestCase {
     private Context mContext;
 
@@ -42,31 +36,6 @@
         mContext = getInstrumentation().getTargetContext();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "RadioButton",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "RadioButton",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "RadioButton",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "RadioButton#RadioButton(Context), "
-            + "RadioButton#RadioButton(Context, AttributeSet) "
-            + "and RadioButton#RadioButton(Context, AttributeSet, int) "
-            + "when param Context is null")
     public void testConstructor() {
         AttributeSet attrs = mContext.getResources().getLayout(R.layout.radiogroup_1);
         assertNotNull(attrs);
@@ -97,12 +66,6 @@
         new RadioButton(mContext, attrs, Integer.MIN_VALUE);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link RadioButton#toggle()}",
-        method = "toggle",
-        args = {}
-    )
     public void testToggle() {
         RadioButton button = new RadioButton(mContext);
         assertFalse(button.isChecked());
diff --git a/tests/tests/widget/src/android/widget/cts/RadioGroupTest.java b/tests/tests/widget/src/android/widget/cts/RadioGroupTest.java
index e8d4d27..a7593c4 100644
--- a/tests/tests/widget/src/android/widget/cts/RadioGroupTest.java
+++ b/tests/tests/widget/src/android/widget/cts/RadioGroupTest.java
@@ -18,11 +18,6 @@
 
 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;
@@ -48,7 +43,6 @@
 /**
  * Test {@link RadioGroup}.
  */
-@TestTargetClass(RadioGroup.class)
 public class RadioGroupTest extends InstrumentationTestCase {
     private static final int BUTTON_ID_0 = 0;
 
@@ -71,22 +65,6 @@
         mDefaultRadioGroup = createDefaultRadioGroup();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors.",
-            method = "RadioGroup",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors.",
-            method = "RadioGroup",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        )
-    })
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "RadioGroup#RadioGroup(Context, AttributeSet) when param Context is null")
     public void testConstructors() {
         new RadioGroup(mContext);
 
@@ -95,12 +73,6 @@
         new RadioGroup(mContext, null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link RadioGroup#setOnHierarchyChangeListener(OnHierarchyChangeListener)",
-        method = "setOnHierarchyChangeListener",
-        args = {android.view.ViewGroup.OnHierarchyChangeListener.class}
-    )
     public void testSetOnHierarchyChangeListener() {
         MockOnHierarchyChangeListener listener = new MockOnHierarchyChangeListener();
         mDefaultRadioGroup.setOnHierarchyChangeListener(listener);
@@ -123,12 +95,6 @@
         mDefaultRadioGroup.addView(button3);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test PassThroughHierarchyChangeListener which is initialized in constructor",
-        method = "RadioGroup",
-        args = {android.content.Context.class}
-    )
     public void testInternalPassThroughHierarchyChangeListener() {
         mDefaultRadioGroup = new RadioGroup(mContext);
         RadioButton newButton = new RadioButton(mContext);
@@ -141,12 +107,6 @@
         assertEquals(newButton.hashCode(), newButton.getId());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test call back of OnCheckedChangeListener",
-        method = "setOnCheckedChangeListener",
-        args = {android.widget.RadioGroup.OnCheckedChangeListener.class}
-    )
     public void testInternalCheckedStateTracker() {
         mDefaultRadioGroup = new RadioGroup(mContext);
         RadioButton newButton = new RadioButton(mContext);
@@ -178,12 +138,6 @@
         assertHaveNotCalledOnCheckedChanged(listener);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link RadioGroup#getCheckedRadioButtonId()}",
-        method = "getCheckedRadioButtonId",
-        args = {}
-    )
     public void testGetCheckedRadioButtonId() {
         assertEquals(-1, mDefaultRadioGroup.getCheckedRadioButtonId());
 
@@ -204,14 +158,6 @@
         assertEquals(-3, mDefaultRadioGroup.getCheckedRadioButtonId());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link RadioGroup#clearCheck()}",
-        method = "clearCheck",
-        args = {}
-    )
-    @ToBeFixed(explanation = "Should not call OnCheckedChangeListener's method if "
-            + "none of the inside buttons checked state is changed.")
     public void testClearCheck() {
         MockOnCheckedChangeListener listener = new MockOnCheckedChangeListener();
         mDefaultRadioGroup.setOnCheckedChangeListener(listener);
@@ -248,14 +194,6 @@
         assertOnCheckedChangedParams(listener, 0, mDefaultRadioGroup, -1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link RadioGroup#check(int)}",
-        method = "check",
-        args = {int.class}
-    )
-    @ToBeFixed(explanation = "Should not call OnCheckedChangeListener's method if "
-            + "none of the inside buttons checked state is changed.")
     public void testCheck() {
         MockOnCheckedChangeListener listener = new MockOnCheckedChangeListener();
         mDefaultRadioGroup.setOnCheckedChangeListener(listener);
@@ -300,12 +238,6 @@
         mDefaultRadioGroup.check(0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link RadioGroup#setOnCheckedChangeListener(OnCheckedChangeListener)}",
-        method = "setOnCheckedChangeListener",
-        args = {android.widget.RadioGroup.OnCheckedChangeListener.class}
-    )
     public void testSetOnCheckedChangeListener() {
         MockOnCheckedChangeListener listener = new MockOnCheckedChangeListener();
         mDefaultRadioGroup.setOnCheckedChangeListener(listener);
@@ -345,12 +277,6 @@
         mDefaultRadioGroup.check(0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link RadioGroup#generateLayoutParams(AttributeSet)}",
-        method = "generateLayoutParams",
-        args = {android.util.AttributeSet.class}
-    )
     public void testGenerateLayoutParams() {
         mDefaultRadioGroup = new RadioGroup(mContext);
         RadioGroup.LayoutParams layoutParams =
@@ -380,12 +306,6 @@
         assertEquals(LayoutParams.MATCH_PARENT, layoutParams.height);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link RadioGroup#checkLayoutParams(android.view.ViewGroup.LayoutParams)}",
-        method = "checkLayoutParams",
-        args = {android.view.ViewGroup.LayoutParams.class}
-    )
     public void testCheckLayoutParams() {
         MockRadioGroup mRadioGroupWrapper = new MockRadioGroup(mContext);
 
@@ -404,12 +324,6 @@
         assertTrue(mRadioGroupWrapper.checkLayoutParams(radioParams));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link RadioGroup#generateDefaultLayoutParams()}",
-        method = "generateDefaultLayoutParams",
-        args = {}
-    )
     public void testGenerateDefaultLayoutParams() {
         MockRadioGroup radioGroupWrapper = new MockRadioGroup(mContext);
         LinearLayout.LayoutParams p = radioGroupWrapper.generateDefaultLayoutParams();
@@ -419,12 +333,6 @@
         assertEquals(RadioGroup.LayoutParams.WRAP_CONTENT, p.height);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link RadioGroup#onFinishInflate()}",
-        method = "onFinishInflate",
-        args = {}
-    )
     public void testOnFinishInflate() {
         MockRadioGroup radioGroup = new MockRadioGroup(mContext);
         int checkId = 100;
@@ -463,11 +371,6 @@
         assertFalse(button.isChecked());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addView",
-        args = {android.view.View.class, int.class, android.view.ViewGroup.LayoutParams.class}
-    )
     public void testAddView() {
         mDefaultRadioGroup.check(BUTTON_ID_0);
         assertEquals(BUTTON_ID_0, mDefaultRadioGroup.getCheckedRadioButtonId());
diff --git a/tests/tests/widget/src/android/widget/cts/RadioGroup_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/RadioGroup_LayoutParamsTest.java
index eda95c0..23155c7 100644
--- a/tests/tests/widget/src/android/widget/cts/RadioGroup_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/RadioGroup_LayoutParamsTest.java
@@ -18,11 +18,6 @@
 
 import com.android.internal.R;
 
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
@@ -43,7 +38,6 @@
 /**
  * Test {@link LayoutParams}.
  */
-@TestTargetClass(LayoutParams.class)
 public class RadioGroup_LayoutParamsTest extends AndroidTestCase {
     private LayoutParams mLayoutParams;
 
@@ -53,45 +47,6 @@
         mLayoutParams = null;
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "RadioGroup.LayoutParams",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "RadioGroup.LayoutParams",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "RadioGroup.LayoutParams",
-            args = {int.class, int.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "RadioGroup.LayoutParams",
-            args = {android.view.ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "RadioGroup.LayoutParams",
-            args = {android.view.ViewGroup.MarginLayoutParams.class}
-        )
-    })
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "RadioGroup.LayoutParams#RadioGroup.LayoutParams(ViewGroup.LayoutParams) "
-            + "when ViewGroup.LayoutParams is null "
-            + "and RadioGroup.LayoutParams#RadioGroup.LayoutParams(MarginLayoutParams) "
-            + "when param MarginLayoutParams is null "
-            + "and RadioGroup.LayoutParams#RadioGroup.LayoutParams(Context, AttributeSet) "
-            + "when param Context is null")
     public void testConstructor() {
         mLayoutParams = new RadioGroup.LayoutParams(Integer.MIN_VALUE, Integer.MAX_VALUE);
         assertEquals(Integer.MIN_VALUE, mLayoutParams.width);
@@ -182,11 +137,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setBaseAttributes",
-        args = {android.content.res.TypedArray.class, int.class, int.class}
-    )
     public void testSetBaseAttributes() {
         MockLayoutParams layoutParams = new MockLayoutParams(getContext(), null);
         // default values
diff --git a/tests/tests/widget/src/android/widget/cts/RatingBarTest.java b/tests/tests/widget/src/android/widget/cts/RatingBarTest.java
index ab91129..fe0e647 100644
--- a/tests/tests/widget/src/android/widget/cts/RatingBarTest.java
+++ b/tests/tests/widget/src/android/widget/cts/RatingBarTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.Context;
 import android.test.ActivityInstrumentationTestCase2;
@@ -32,7 +28,6 @@
 /**
  * Test {@link RatingBar}.
  */
-@TestTargetClass(RatingBar.class)
 public class RatingBarTest extends ActivityInstrumentationTestCase2<RatingBarStubActivity> {
     private Context mContext;
     private RatingBarStubActivity mActivity;
@@ -49,26 +44,6 @@
         mContext = getInstrumentation().getContext();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link RatingBar}",
-            method = "RatingBar",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link RatingBar}",
-            method = "RatingBar",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link RatingBar}",
-            method = "RatingBar",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
     public void testConstructor() {
         new RatingBar(mContext, null, com.android.internal.R.attr.ratingBarStyle);
 
@@ -84,20 +59,6 @@
         assertEquals(0.2f, ratingBar.getStepSize());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods which access OnRatingBarChangeListener",
-            method = "getOnRatingBarChangeListener",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods which access OnRatingBarChangeListener",
-            method = "setOnRatingBarChangeListener",
-            args = {android.widget.RatingBar.OnRatingBarChangeListener.class}
-        )
-    })
     @UiThreadTest
     public void testAccessOnRatingBarChangeListener() {
         RatingBar ratingBar = (RatingBar)mActivity.findViewById(R.id.ratingbar_constructor);
@@ -119,20 +80,6 @@
         assertFalse(listener.hasCalledOnRatingChanged());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods which access isIndicator",
-            method = "isIndicator",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods which access isIndicator",
-            method = "setIsIndicator",
-            args = {boolean.class}
-        )
-    })
     public void testAccessIndicator() {
         RatingBar ratingBar = new RatingBar(mContext);
 
@@ -143,20 +90,6 @@
         assertFalse(ratingBar.isIndicator());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods which access NumStars",
-            method = "setNumStars",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods which access NumStars",
-            method = "getNumStars",
-            args = {}
-        )
-    })
     public void testAccessNumStars() {
         MockRatingBar mockRatingBar = new MockRatingBar(mContext);
 
@@ -179,20 +112,6 @@
         assertEquals(Integer.MAX_VALUE, mockRatingBar.getNumStars());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods which access Rating",
-            method = "getRating",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods which access Rating",
-            method = "setRating",
-            args = {float.class}
-        )
-    })
     public void testAccessRating() {
         RatingBar ratingBar = new RatingBar(mContext);
 
@@ -209,12 +128,6 @@
         assertEquals((float) ratingBar.getNumStars(), ratingBar.getRating());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test setMax(int max)",
-        method = "setMax",
-        args = {int.class}
-    )
     public void testSetMax() {
         RatingBar ratingBar = new RatingBar(mContext);
 
@@ -233,20 +146,6 @@
         assertEquals(Integer.MAX_VALUE, ratingBar.getMax());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods which access StepSize",
-            method = "getStepSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods which access StepSize",
-            method = "setStepSize",
-            args = {float.class}
-        )
-    })
     public void testAccessStepSize() {
         RatingBar ratingBar = new RatingBar(mContext);
 
diff --git a/tests/tests/widget/src/android/widget/cts/RelativeLayoutTest.java b/tests/tests/widget/src/android/widget/cts/RelativeLayoutTest.java
index f047dad..d8d521b 100644
--- a/tests/tests/widget/src/android/widget/cts/RelativeLayoutTest.java
+++ b/tests/tests/widget/src/android/widget/cts/RelativeLayoutTest.java
@@ -19,11 +19,6 @@
 import com.android.cts.stub.R;
 import com.android.internal.util.XmlUtils;
 
-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;
@@ -47,7 +42,6 @@
 /**
  * Test {@link RelativeLayout}.
  */
-@TestTargetClass(RelativeLayout.class)
 public class RelativeLayoutTest extends
         ActivityInstrumentationTestCase2<RelativeLayoutStubActivity> {
     private Activity mActivity;
@@ -62,24 +56,6 @@
         mActivity = getActivity();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "RelativeLayout",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "RelativeLayout",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "RelativeLayout",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for constructors does not exist.")
     public void testConstructor() {
         new RelativeLayout(mActivity);
 
@@ -98,11 +74,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setIgnoreGravity",
-        args = {int.class}
-    )
     public void testSetIgnoreGravity() {
         // Initial gravity for this RelativeLayout is Gravity.Right.
         final RelativeLayout relativeLayout = (RelativeLayout) mActivity.findViewById(
@@ -136,11 +107,6 @@
         ViewAsserts.assertRightAligned(relativeLayout, view13);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setGravity",
-        args = {int.class}
-    )
     public void testSetGravity() {
         final RelativeLayout relativeLayout = (RelativeLayout) mActivity.findViewById(
                 R.id.relative_sublayout_gravity);
@@ -205,13 +171,6 @@
         assertEquals(view11.getTop(), view10.getBottom());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setHorizontalGravity",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for setHorizontalGravity()" +
-            " does not exist.")
     public void testSetHorizontalGravity() {
         final RelativeLayout relativeLayout = (RelativeLayout) mActivity.findViewById(
                 R.id.relative_sublayout_gravity);
@@ -250,13 +209,6 @@
         assertEquals(view11.getTop(), view10.getBottom());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setVerticalGravity",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for setVerticalGravity()" +
-            " does not exist.")
     public void testSetVerticalGravity() {
         final RelativeLayout relativeLayout = (RelativeLayout) mActivity.findViewById(
                 R.id.relative_sublayout_gravity);
@@ -297,11 +249,6 @@
         assertEquals(view11.getTop(), view10.getBottom());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getBaseline",
-        args = {}
-    )
     public void testGetBaseline() {
         RelativeLayout relativeLayout = new RelativeLayout(mActivity);
         assertEquals(-1, relativeLayout.getBaseline());
@@ -311,13 +258,6 @@
         assertEquals(view.getBaseline(), relativeLayout.getBaseline());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "generateLayoutParams",
-        args = {android.util.AttributeSet.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for generateLayoutParams() is" +
-            " incomplete, not clear what is supposed to happen when attrs is null.")
     public void testGenerateLayoutParams1() throws XmlPullParserException, IOException {
         RelativeLayout relativeLayout = new RelativeLayout(mActivity);
 
@@ -336,13 +276,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "generateLayoutParams",
-        args = {android.view.ViewGroup.LayoutParams.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for generateLayoutParams() is" +
-            " incomplete, not clear what is supposed to happen when the LayoutParam is null.")
     public void testGenerateLayoutParams2() {
         RelativeLayout.LayoutParams p = new RelativeLayout.LayoutParams(200, 300);
 
@@ -362,11 +295,6 @@
          }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "generateDefaultLayoutParams",
-        args = {}
-    )
     public void testGenerateDefaultLayoutParams() {
         MyRelativeLayout myRelativeLayout = new MyRelativeLayout(mActivity);
 
@@ -376,30 +304,14 @@
         assertEquals(ViewGroup.LayoutParams.WRAP_CONTENT, layoutParams.height);
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onMeasure",
-        args = {int.class, int.class}
-    )
     public void testOnMeasure() {
         // onMeasure() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onLayout",
-        args = {boolean.class, int.class, int.class, int.class, int.class}
-    )
     public void testOnLayout() {
         // onLayout() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "checkLayoutParams",
-        args = {android.view.ViewGroup.LayoutParams.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for checkLayoutParams() does not exist.")
     public void testCheckLayoutParams() {
         MyRelativeLayout myRelativeLayout = new MyRelativeLayout(mActivity);
 
diff --git a/tests/tests/widget/src/android/widget/cts/RelativeLayout_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/RelativeLayout_LayoutParamsTest.java
index 510be07..4c9d2ab 100644
--- a/tests/tests/widget/src/android/widget/cts/RelativeLayout_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/RelativeLayout_LayoutParamsTest.java
@@ -18,11 +18,6 @@
 
 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 android.test.ActivityInstrumentationTestCase2;
 import android.test.ViewAsserts;
@@ -33,7 +28,6 @@
 /**
  * Test {@link RelativeLayout.LayoutParams}.
  */
-@TestTargetClass(RelativeLayout.LayoutParams.class)
 public class RelativeLayout_LayoutParamsTest extends
         ActivityInstrumentationTestCase2<RelativeLayoutStubActivity> {
 
@@ -41,28 +35,6 @@
         super("com.android.cts.stub", RelativeLayoutStubActivity.class);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "RelativeLayout.LayoutParams",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "RelativeLayout.LayoutParams",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "RelativeLayout.LayoutParams",
-            args = {android.view.ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "RelativeLayout.LayoutParams",
-            args = {android.view.ViewGroup.MarginLayoutParams.class}
-        )
-    })
     public void testConstructor() {
         try {
             new RelativeLayout.LayoutParams(getActivity(), null);
@@ -188,24 +160,6 @@
         assertEquals(R.id.relative_view3, rules[RelativeLayout.ALIGN_BOTTOM]);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addRule",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRules",
-            args = {}
-        )
-    })
-     @ToBeFixed(bug = "1695243", explanation =
-             "the javadoc for getRules() or addRule(int) is incomplete." +
-             "1. not clear what is actual value for 'false' mentioned in javadoc of getRules()." +
-             "2. not clear what '-' means in '- for false' in javadoc of addRules()." +
-             "3. not clear what is supposed to happen when verb is exceptional." +
-             "4. not clear what is supposed to happen if verb is must refer to another sibling.")
     public void testAccessRule1() {
         RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(200, 300);
         int rules[]= layoutParams.getRules();
@@ -237,20 +191,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addRule",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRules",
-            args = {}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for addRule(int, int) is incomplete." +
-            "1. not clear what is supposed to happen when verb is exceptional.")
     public void testAccessRule2() {
         int rules[];
         RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(200, 300);
@@ -304,11 +244,6 @@
         assertEquals(Integer.MIN_VALUE, rules[RelativeLayout.ALIGN_LEFT]);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "debug",
-        args = {java.lang.String.class}
-    )
     public void testDebug() {
         RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(200, 300);
         assertNotNull(layoutParams.debug("test: "));
diff --git a/tests/tests/widget/src/android/widget/cts/RemoteViewsTest.java b/tests/tests/widget/src/android/widget/cts/RemoteViewsTest.java
index ddbe90d..891bdf7 100644
--- a/tests/tests/widget/src/android/widget/cts/RemoteViewsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/RemoteViewsTest.java
@@ -18,11 +18,6 @@
 
 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 android.app.Activity;
 import android.app.Instrumentation;
@@ -61,7 +56,6 @@
 /**
  * Test {@link RemoteViews}.
  */
-@TestTargetClass(RemoteViews.class)
 public class RemoteViewsTest extends ActivityInstrumentationTestCase2<RemoteViewsStubActivity> {
     private static final String PACKAGE_NAME = "com.android.cts.stub";
 
@@ -87,29 +81,12 @@
         mResult = mRemoteViews.apply(mActivity, null);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "RemoteViews",
-            args = {java.lang.String.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "RemoteViews",
-            args = {android.os.Parcel.class}
-        )
-    })
     public void testConstructor() {
         new RemoteViews(PACKAGE_NAME, R.layout.remoteviews_good);
 
         new RemoteViews(Parcel.obtain());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getPackage",
-        args = {}
-    )
     public void testGetPackage() {
         assertEquals(PACKAGE_NAME, mRemoteViews.getPackage());
 
@@ -117,11 +94,6 @@
         assertNull(mRemoteViews.getPackage());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLayoutId",
-        args = {}
-    )
     public void testGetLayoutId() {
         assertEquals(R.layout.remoteviews_good, mRemoteViews.getLayoutId());
 
@@ -135,11 +107,6 @@
         assertEquals(0, mRemoteViews.getLayoutId());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setViewVisibility",
-        args = {int.class, int.class}
-    )
     public void testSetViewVisibility() {
         View view = mResult.findViewById(R.id.remoteView_chronometer);
         assertEquals(View.VISIBLE, view.getVisibility());
@@ -157,14 +124,6 @@
         assertEquals(View.VISIBLE, view.getVisibility());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setTextViewText",
-        args = {int.class, java.lang.CharSequence.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of "
-            + "RemoteViews#reapply(Context, View) if the action cannot apply to any view "
-            + "because of the ClassCastException")
     public void testSetTextViewText() {
         TextView textView = (TextView) mResult.findViewById(R.id.remoteView_text);
         assertEquals("", textView.getText().toString());
@@ -187,11 +146,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setImageViewResource",
-        args = {int.class, int.class}
-    )
     public void testSetImageViewResource() {
         ImageView image = (ImageView) mResult.findViewById(R.id.remoteView_image);
         assertNull(image.getDrawable());
@@ -213,11 +167,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setImageViewUri",
-        args = {int.class, android.net.Uri.class}
-    )
     public void testSetImageViewUri() throws IOException {
         String path = getTestImagePath();
         File imageFile = new File(path);
@@ -248,14 +197,6 @@
         return getInstrumentation().getTargetContext().getFilesDir() + "/test.jpg";
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setChronometer",
-        args = {int.class, long.class, java.lang.String.class, boolean.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of "
-            + "RemoteViews#reapply(Context, View) if the action cannot apply to any view "
-            + "because of the ClassCastException")
     public void testSetChronometer() {
         long base1 = 50;
         long base2 = -50;
@@ -288,14 +229,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setProgressBar",
-        args = {int.class, int.class, int.class, boolean.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of "
-            + "RemoteViews#reapply(Context, View) if the action cannot apply to any view "
-            + "because of the ClassCastException")
     public void testSetProgressBar() {
         ProgressBar progress = (ProgressBar) mResult.findViewById(R.id.remoteView_progress);
         assertEquals(100, progress.getMax());
@@ -325,11 +258,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "apply",
-        args = {android.content.Context.class, android.view.ViewGroup.class}
-    )
     public void testApply() {
         assertNotNull(mResult);
         assertNotNull(mResult.findViewById(R.id.remoteViews_good));
@@ -343,11 +271,6 @@
         assertNotNull(mResult.findViewById(R.id.remoteView_text));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "reapply",
-        args = {android.content.Context.class, android.view.View.class}
-    )
     public void testReapply() {
         TextView text = new TextView(mActivity);
         ImageView image = (ImageView) mResult.findViewById(R.id.remoteView_image);
@@ -362,11 +285,6 @@
                 ((BitmapDrawable) image.getDrawable()).getBitmap());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onLoadClass",
-        args = {java.lang.Class.class}
-    )
     public void testOnLoadClass() {
         mRemoteViews = new RemoteViews(Parcel.obtain());
 
@@ -385,21 +303,11 @@
         assertFalse(mRemoteViews.onLoadClass(EditText.class));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "describeContents",
-        args = {}
-    )
     public void testDescribeContents() {
         mRemoteViews = new RemoteViews(Parcel.obtain());
         mRemoteViews.describeContents();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {android.os.Parcel.class, int.class}
-    )
     public void testWriteToParcel() {
         mRemoteViews.setTextViewText(R.id.remoteView_text, "This is content");
         mRemoteViews.setViewVisibility(R.id.remoteView_frame, View.GONE);
@@ -441,11 +349,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setImageViewBitmap",
-        args = {int.class, android.graphics.Bitmap.class}
-    )
     public void testSetImageViewBitmap() {
         ImageView image = (ImageView) mResult.findViewById(R.id.remoteView_image);
         assertNull(image.getDrawable());
@@ -466,11 +369,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setBitmap",
-        args = {int.class, java.lang.String.class, android.graphics.Bitmap.class}
-    )
     public void testSetBitmap() {
         ImageView image = (ImageView) mResult.findViewById(R.id.remoteView_image);
         assertNull(image.getDrawable());
@@ -491,11 +389,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setBoolean",
-        args = {int.class, java.lang.String.class, boolean.class}
-    )
     public void testSetBoolean() {
         ProgressBar progress = (ProgressBar) mResult.findViewById(R.id.remoteView_progress);
         // the view uses style progressBarHorizontal, so the default is false
@@ -514,11 +407,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setCharSequence",
-        args = {int.class, java.lang.String.class, java.lang.CharSequence.class}
-    )
     public void testSetCharSequence() {
         TextView textView = (TextView) mResult.findViewById(R.id.remoteView_text);
         assertEquals("", textView.getText().toString());
@@ -541,11 +429,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setInt",
-        args = {int.class, java.lang.String.class, int.class}
-    )
     public void testSetInt() {
         View view = mResult.findViewById(R.id.remoteView_chronometer);
         assertEquals(View.VISIBLE, view.getVisibility());
@@ -563,11 +446,6 @@
         assertEquals(View.VISIBLE, view.getVisibility());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setString",
-        args = {int.class, java.lang.String.class, java.lang.String.class}
-    )
     public void testSetString() {
         String format = "HH:MM:SS";
         Chronometer chronometer = (Chronometer) mResult.findViewById(R.id.remoteView_chronometer);
@@ -586,11 +464,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setUri",
-        args = {int.class, java.lang.String.class, android.net.Uri.class}
-    )
     public void testSetUri() throws IOException {
         String path = getTestImagePath();
         File imagefile = new File(path);
@@ -623,11 +496,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setTextColor",
-        args = {int.class, int.class}
-    )
     public void testSetTextColor() {
         TextView textView = (TextView) mResult.findViewById(R.id.remoteView_text);
 
@@ -648,11 +516,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setOnClickPendingIntent",
-        args = {int.class, android.app.PendingIntent.class}
-    )
     public void testSetOnClickPendingIntent() {
         Uri uri = Uri.parse("ctstest://RemoteView/test");
         Instrumentation instrumentation = getInstrumentation();
@@ -673,11 +536,6 @@
         newActivity.finish();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setLong",
-        args = {int.class, java.lang.String.class, long.class}
-    )
     public void testSetLong() {
         long base1 = 50;
         long base2 = -50;
@@ -700,11 +558,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setFloat",
-        args = {int.class, java.lang.String.class, float.class}
-    )
     public void testSetFloat() {
         LinearLayout linearLayout = (LinearLayout) mResult.findViewById(R.id.remoteView_linear);
         assertTrue(linearLayout.getWeightSum() <= 0.0f);
@@ -722,28 +575,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "setByte",
-            args = {int.class, java.lang.String.class, byte.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "setChar",
-            args = {int.class, java.lang.String.class, char.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "setShort",
-            args = {int.class, java.lang.String.class, short.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_FEASIBLE,
-            method = "setDouble",
-            args = {int.class, java.lang.String.class, double.class}
-        )
-    })
     public void testNotFeasibleSetters() {
         // there is no RemotableViewMethods to use them, how to test?
     }
diff --git a/tests/tests/widget/src/android/widget/cts/RemoteViews_ActionExceptionTest.java b/tests/tests/widget/src/android/widget/cts/RemoteViews_ActionExceptionTest.java
index dee764e..9f9f1d7 100644
--- a/tests/tests/widget/src/android/widget/cts/RemoteViews_ActionExceptionTest.java
+++ b/tests/tests/widget/src/android/widget/cts/RemoteViews_ActionExceptionTest.java
@@ -16,10 +16,6 @@
 
 package android.widget.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.test.InstrumentationTestCase;
 import android.widget.RemoteViews;
@@ -28,20 +24,7 @@
 /**
  * Test {@link ActionException}.
  */
-@TestTargetClass(ActionException.class)
 public class RemoteViews_ActionExceptionTest extends InstrumentationTestCase {
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "RemoteViews.ActionException",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "RemoteViews.ActionException",
-            args = {java.lang.Exception.class}
-        )
-    })
     public void testConstructor() {
         String message = "This is exception message";
         new RemoteViews.ActionException(message);
diff --git a/tests/tests/widget/src/android/widget/cts/ResourceCursorAdapterTest.java b/tests/tests/widget/src/android/widget/cts/ResourceCursorAdapterTest.java
index 64935c5..d91094c 100644
--- a/tests/tests/widget/src/android/widget/cts/ResourceCursorAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ResourceCursorAdapterTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.Context;
 import android.database.Cursor;
@@ -35,7 +31,6 @@
 /**
  * Test {@link ResourceCursorAdapter}.
  */
-@TestTargetClass(ResourceCursorAdapter.class)
 public class ResourceCursorAdapterTest extends InstrumentationTestCase {
     private ResourceCursorAdapter mResourceCursorAdapter;
 
@@ -56,18 +51,6 @@
         mCursor = createTestCursor(3, 3);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ResourceCursorAdapter",
-            args = {Context.class, int.class, Cursor.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ResourceCursorAdapter",
-            args = {Context.class, int.class, Cursor.class, boolean.class}
-        )
-    })
     public void testConstructor() {
         MockResourceCursorAdapter adapter = new MockResourceCursorAdapter(mContext, -1, null);
         // the default is true
@@ -85,11 +68,6 @@
         assertSame(mCursor, adapter.getCursor());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setViewResource",
-        args = {int.class}
-    )
     public void testSetViewResource() {
         mResourceCursorAdapter = new MockResourceCursorAdapter(mContext,
                 R.layout.cursoradapter_item0, mCursor);
@@ -105,12 +83,6 @@
         assertEquals(R.id.cursorAdapter_item1, result.getId());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ResourceCursorAdapter#setDropDownViewResource(int)}",
-        method = "setDropDownViewResource",
-        args = {int.class}
-    )
     public void testSetDropDownViewResource() {
         mResourceCursorAdapter = new MockResourceCursorAdapter(mContext,
                 R.layout.cursoradapter_item0, mCursor);
@@ -134,11 +106,6 @@
         assertEquals(R.id.cursorAdapter_item0, result.getId());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "newDropDownView",
-        args = {Context.class, Cursor.class, ViewGroup.class}
-    )
     // parameters Context and Cursor are never readin the method
     public void testNewDropDownView() {
         mResourceCursorAdapter = new MockResourceCursorAdapter(mContext,
@@ -154,11 +121,6 @@
         assertEquals(R.id.cursorAdapter_item1, result.getId());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "newView",
-        args = {Context.class, Cursor.class, ViewGroup.class}
-    )
     // The parameters Context and Cursor are never read in the method
     public void testNewView() {
         mResourceCursorAdapter = new MockResourceCursorAdapter(mContext,
diff --git a/tests/tests/widget/src/android/widget/cts/ResourceCursorTreeAdapterTest.java b/tests/tests/widget/src/android/widget/cts/ResourceCursorTreeAdapterTest.java
index 62f0709..4a5a9c9 100644
--- a/tests/tests/widget/src/android/widget/cts/ResourceCursorTreeAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ResourceCursorTreeAdapterTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
 
 import android.content.Context;
 import android.database.Cursor;
@@ -35,7 +31,6 @@
 /**
  * Test {@link ResourceCursorTreeAdapter}.
  */
-@TestTargetClass(ResourceCursorTreeAdapter.class)
 public class ResourceCursorTreeAdapterTest extends InstrumentationTestCase {
     private ResourceCursorTreeAdapter mResourceCursorTreeAdapter;
 
@@ -76,28 +71,6 @@
         mParent = (ViewGroup) layoutInflater.inflate(R.layout.cursoradapter_host, null);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "ResourceCursorTreeAdapter",
-            args = {android.content.Context.class, android.database.Cursor.class, int.class, 
-                    int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "ResourceCursorTreeAdapter",
-            args = {android.content.Context.class, android.database.Cursor.class, int.class, 
-                    int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ResourceCursorTreeAdapter",
-            args = {android.content.Context.class, android.database.Cursor.class, int.class, 
-                    int.class, int.class, int.class}
-        )
-    })
     public void testConstructor() {
         mResourceCursorTreeAdapter = new MockResourceCursorTreeAdapter(mContext, null,
                 mGroupLayout, mChildLayout);
@@ -121,12 +94,6 @@
         new MockResourceCursorTreeAdapter(mContext, null, -1, -1, -1, -1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "newChildView",
-        args = {android.content.Context.class, android.database.Cursor.class, boolean.class, 
-                android.view.ViewGroup.class}
-    )
     // The parameters Context and Cursor are never readin the method
     public void testNewChildView() {
         mResourceCursorTreeAdapter = new MockResourceCursorTreeAdapter(mContext, null,
@@ -148,12 +115,6 @@
         assertEquals(mNormalChildId, result.getId());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "newGroupView",
-        args = {android.content.Context.class, android.database.Cursor.class, boolean.class, 
-                android.view.ViewGroup.class}
-    )
     // The parameters Context and Cursor are never readin the method
     public void testNewGroupView() {
         mResourceCursorTreeAdapter = new MockResourceCursorTreeAdapter(mContext, null,
diff --git a/tests/tests/widget/src/android/widget/cts/ScrollViewTest.java b/tests/tests/widget/src/android/widget/cts/ScrollViewTest.java
index 681e641..e297744 100644
--- a/tests/tests/widget/src/android/widget/cts/ScrollViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ScrollViewTest.java
@@ -18,16 +18,12 @@
 
 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 android.app.Activity;
 import android.content.Context;
+import android.cts.util.PollingCheck;
 import android.graphics.Rect;
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.UiThreadTest;
@@ -39,14 +35,12 @@
 import android.view.ViewGroup;
 import android.view.View.MeasureSpec;
 import android.view.ViewGroup.LayoutParams;
-import android.view.animation.cts.DelayedCheck;
 import android.widget.ScrollView;
 import android.widget.TextView;
 
 /**
  * Test {@link ScrollView}.
  */
-@TestTargetClass(ScrollView.class)
 public class ScrollViewTest extends ActivityInstrumentationTestCase2<ScrollViewStubActivity> {
     // view dpi constants. Must match those defined in scroll_view layout
     private static final int ITEM_WIDTH_DPI  = 250;
@@ -87,23 +81,6 @@
         mScrollRight = mItemWidth - mPageWidth;
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ScrollView",
-            args = {Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ScrollView",
-            args = {Context.class, AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ScrollView",
-            args = {Context.class, AttributeSet.class, int.class}
-        )
-    })
     public void testConstructor() {
         XmlPullParser parser = mActivity.getResources().getLayout(R.layout.scrollview_layout);
         AttributeSet attrs = Xml.asAttributeSet(parser);
@@ -114,11 +91,6 @@
         new ScrollView(mActivity, attrs, 0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getMaxScrollAmount",
-        args = {}
-    )
     public void testGetMaxScrollAmount() {
         // the value is half of total layout height
         ScrollView scrollView = new ScrollView(mActivity);
@@ -129,14 +101,6 @@
         assertEquals((100 - 0) / 2, scrollView.getMaxScrollAmount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addView",
-        args = {View.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete."
-            + " @throws clause should be added into javadoc of "
-            + "ScrollView#addView(View) when there is already one child in the view.")
     public void testAddView() {
         ScrollView scrollView = new ScrollView(mActivity);
         TextView child0 = new TextView(mActivity);
@@ -154,14 +118,6 @@
         assertEquals(1, scrollView.getChildCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addView",
-        args = {View.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete."
-            + " @throws clause should be added into javadoc of "
-            + "ScrollView#addView(View, int) when there is already one child in the view.")
     public void testAddViewWithIndex() {
         ScrollView scrollView = new ScrollView(mActivity);
         TextView child0 = new TextView(mActivity);
@@ -203,15 +159,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addView",
-        args = {View.class, LayoutParams.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete."
-            + " @throws clause should be added into javadoc of "
-            + "ScrollView#addView(View, LayoutParams) when there is already"
-            + " one child in the view or the layoutparams is null")
     public void testAddViewWithLayoutParams() {
         ScrollView scrollView = new ScrollView(mActivity);
         TextView child0 = new TextView(mActivity);
@@ -241,15 +188,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addView",
-        args = {View.class, int.class, LayoutParams.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete."
-            + " @throws clause should be added into javadoc of "
-            + "ScrollView#addView(View, int, LayoutParams) when there is already"
-            + " one child in the view or the layoutparams is null")
     public void testAddViewWithIndexAndLayoutParams() {
         ScrollView scrollView = new ScrollView(mActivity);
         TextView child0 = new TextView(mActivity);
@@ -305,18 +243,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isFillViewport",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFillViewport",
-            args = {boolean.class}
-        )
-    })
     public void testAccessFillViewport() {
         ScrollView scrollView = new ScrollView(mActivity);
         assertFalse(scrollView.isFillViewport());
@@ -339,18 +265,6 @@
         assertTrue(scrollView.isLayoutRequested());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isSmoothScrollingEnabled",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSmoothScrollingEnabled",
-            args = {boolean.class}
-        )
-    })
     public void testAccessSmoothScrollingEnabled() throws Throwable {
         assertTrue(mScrollView.isSmoothScrollingEnabled());
 
@@ -382,7 +296,7 @@
                 mScrollView.fullScroll(View.FOCUS_DOWN);
             }
         });
-        delayedCheckSmoothScrolling(0, 0, 0, mScrollBottom);
+        pollingCheckSmoothScrolling(0, 0, 0, mScrollBottom);
         assertEquals(mScrollBottom, mScrollView.getScrollY(), TOLERANCE);
 
         runTestOnUiThread(new Runnable() {
@@ -390,15 +304,10 @@
                 mScrollView.fullScroll(View.FOCUS_UP);
             }
         });
-        delayedCheckSmoothScrolling(0, 0, mScrollBottom, 0);
+        pollingCheckSmoothScrolling(0, 0, mScrollBottom, 0);
         assertEquals(0, mScrollView.getScrollY());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "measureChild",
-        args = {View.class, int.class, int.class}
-    )
     public void testMeasureChild() {
         MyScrollView scrollView = new MyScrollView(mActivity);
 
@@ -420,11 +329,6 @@
         assertEquals(100, child.getMeasuredWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "measureChildWithMargins",
-        args = {View.class, int.class, int.class, int.class, int.class}
-    )
     public void testMeasureChildWithMargins() {
         MyScrollView mockScrollView = new MyScrollView(mActivity);
 
@@ -447,11 +351,6 @@
         assertEquals(100, child.getMeasuredWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "pageScroll",
-        args = {int.class}
-    )
     @UiThreadTest
     public void testPageScroll() {
         mScrollView.setSmoothScrollingEnabled(false);
@@ -478,11 +377,6 @@
         assertEquals(0, mScrollView.getScrollY());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "fullScroll",
-        args = {int.class}
-    )
     @UiThreadTest
     public void testFullScroll() {
         mScrollView.setSmoothScrollingEnabled(false);
@@ -501,11 +395,6 @@
         assertEquals(0, mScrollView.getScrollY());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "arrowScroll",
-        args = {int.class}
-    )
     @UiThreadTest
     public void testArrowScroll() {
         mScrollView.setSmoothScrollingEnabled(false);
@@ -532,11 +421,6 @@
         assertEquals(0, mScrollView.getScrollY());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "smoothScrollBy",
-        args = {int.class, int.class}
-    )
     public void testSmoothScrollBy() throws Throwable {
         assertEquals(0, mScrollView.getScrollX());
         assertEquals(0, mScrollView.getScrollY());
@@ -547,7 +431,7 @@
             }
         });
         // smoothScrollBy doesn't scroll in X
-        delayedCheckSmoothScrolling(0, 0, 0, mScrollBottom);
+        pollingCheckSmoothScrolling(0, 0, 0, mScrollBottom);
         assertEquals(0, mScrollView.getScrollX());
         assertEquals(mScrollBottom, mScrollView.getScrollY());
 
@@ -556,16 +440,11 @@
                 mScrollView.smoothScrollBy(-mScrollRight, -mScrollBottom);
             }
         });
-        delayedCheckSmoothScrolling(mScrollRight, 0, mScrollBottom, 0);
+        pollingCheckSmoothScrolling(mScrollRight, 0, mScrollBottom, 0);
         assertEquals(0, mScrollView.getScrollX());
         assertEquals(0, mScrollView.getScrollY());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "smoothScrollTo",
-        args = {int.class, int.class}
-    )
     public void testSmoothScrollTo() throws Throwable {
         assertEquals(0, mScrollView.getScrollX());
         assertEquals(0, mScrollView.getScrollY());
@@ -576,7 +455,7 @@
             }
         });
         // smoothScrollTo doesn't scroll in X
-        delayedCheckSmoothScrolling(0, 0, 0, mScrollBottom);
+        pollingCheckSmoothScrolling(0, 0, 0, mScrollBottom);
         assertEquals(0, mScrollView.getScrollX());
         assertEquals(mScrollBottom, mScrollView.getScrollY());
 
@@ -585,16 +464,11 @@
                 mScrollView.smoothScrollTo(mPageWidth, mPageHeight);
             }
         });
-        delayedCheckSmoothScrolling(0, 0, mScrollBottom, mPageHeight);
+        pollingCheckSmoothScrolling(0, 0, mScrollBottom, mPageHeight);
         assertEquals(0, mScrollView.getScrollX());
         assertEquals(mPageHeight, mScrollView.getScrollY());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "computeScrollDeltaToGetChildRectOnScreen",
-        args = {android.graphics.Rect.class}
-    )
     public void testComputeScrollDeltaToGetChildRectOnScreen() {
         mScrollView.setSmoothScrollingEnabled(false);
         int edge = mScrollView.getVerticalFadingEdgeLength();
@@ -611,11 +485,6 @@
         assertEquals(edge, mScrollView.computeScrollDeltaToGetChildRectOnScreen(rect));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "computeVerticalScrollRange",
-        args = {}
-    )
     public void testComputeVerticalScrollRange() {
         assertTrue(mScrollView.getChildCount() > 0);
         assertEquals(mItemHeight * ITEM_COUNT,
@@ -626,11 +495,6 @@
         assertEquals(0, myScrollView.computeVerticalScrollRange());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "requestChildFocus",
-        args = {View.class, View.class}
-    )
     @UiThreadTest
     public void testRequestChildFocus() {
         mScrollView.setSmoothScrollingEnabled(false);
@@ -650,11 +514,6 @@
         assertTrue(mScrollView.getScrollY() < scrollY);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "requestChildRectangleOnScreen",
-        args = {View.class, Rect.class, boolean.class}
-    )
     @UiThreadTest
     public void testRequestChildRectangleOnScreen() {
         mScrollView.setSmoothScrollingEnabled(false);
@@ -676,12 +535,6 @@
         assertEquals(edge, mScrollView.getScrollY());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "The method is simply called to make sure no exception is thrown.",
-        method = "requestLayout",
-        args = {}
-    )
     @UiThreadTest
     public void testRequestLayout() {
         mScrollView.requestLayout();
@@ -689,13 +542,6 @@
         assertTrue(mScrollView.isLayoutRequested());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "fling",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "As javadoc says, scrolls towards the top "
-            + "when velocityY is positive. But it scrolls to bottom actually.")
     public void testFling() throws Throwable {
         mScrollView.setSmoothScrollingEnabled(true);
         assertEquals(0, mScrollView.getScrollY());
@@ -706,7 +552,7 @@
                 mScrollView.fling(2000);
             }
         });
-        delayedCheckFling(0, true);
+        pollingCheckFling(0, true);
 
         final int currentY = mScrollView.getScrollY();
         // fling towards top
@@ -715,14 +561,9 @@
                 mScrollView.fling(-2000);
             }
         });
-        delayedCheckFling(currentY, false);
+        pollingCheckFling(currentY, false);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "scrollTo",
-        args = {int.class, int.class}
-    )
     @UiThreadTest
     public void testScrollTo() {
         mScrollView.setSmoothScrollingEnabled(false);
@@ -745,18 +586,6 @@
         assertEquals(0, mScrollView.getScrollX());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTopFadingEdgeStrength",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBottomFadingEdgeStrength",
-            args = {}
-        )
-    })
     public void testGetVerticalFadingEdgeStrengths() {
         assertTrue(mScrollView.getChildCount() > 0);
         assertTrue(mScrollView.getTopFadingEdgeStrength() <= 1.0f);
@@ -772,83 +601,38 @@
         assertTrue(mScrollView.getBottomFadingEdgeStrength() >= 0.0f);
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onLayout",
-        args = {boolean.class, int.class, int.class, int.class, int.class}
-    )
     public void testOnLayout() {
         // onLayout() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onMeasure",
-        args = {int.class, int.class}
-    )
     public void testOnMeasure() {
         // onMeasure() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "executeKeyEvent",
-        args = {KeyEvent.class}
-    )
     public void testExecuteKeyEvent() {
         // executeKeyEvent() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onRequestFocusInDescendants",
-        args = {int.class, Rect.class}
-    )
     public void testOnRequestFocusInDescendants() {
         // onRequestFocusInDescendants() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onSizeChanged",
-        args = {int.class, int.class, int.class, int.class}
-    )
     public void testOnSizeChanged() {
         // onSizeChanged() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "dispatchKeyEvent",
-        args = {KeyEvent.class}
-    )
     public void testDispatchKeyEvent() {
         // dispatchKeyEvent() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onInterceptTouchEvent",
-        args = {MotionEvent.class}
-    )
     public void testOnInterceptTouchEvent() {
         // onInterceptTouchEvent() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onTouchEvent",
-        args = {MotionEvent.class}
-    )
     public void testOnTouchEvent() {
         // onTouchEvent() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "computeScroll",
-        args = {}
-    )
     public void testComputeScroll() {
         // computeScroll() is implementation details, do NOT test
     }
@@ -860,7 +644,7 @@
         return current <= from && current >= to;
     }
 
-    private void delayedCheckSmoothScrolling(final int fromX, final int toX,
+    private void pollingCheckSmoothScrolling(final int fromX, final int toX,
             final int fromY, final int toY) {
 
         if (fromX == toX && fromY == toY) {
@@ -868,7 +652,7 @@
         }
 
         if (fromY != toY) {
-            new DelayedCheck() {
+            new PollingCheck() {
                 @Override
                 protected boolean check() {
                     return isInRange(mScrollView.getScrollY(), fromY, toY);
@@ -877,7 +661,7 @@
         }
 
         if (fromX != toX) {
-            new DelayedCheck() {
+            new PollingCheck() {
                 @Override
                 protected boolean check() {
                     return isInRange(mScrollView.getScrollX(), fromX, toX);
@@ -885,7 +669,7 @@
             }.run();
         }
 
-        new DelayedCheck() {
+        new PollingCheck() {
             @Override
             protected boolean check() {
                 return toX == mScrollView.getScrollX() && toY == mScrollView.getScrollY();
@@ -893,8 +677,8 @@
         }.run();
     }
 
-    private void delayedCheckFling(final int startPosition, final boolean movingDown) {
-        new DelayedCheck() {
+    private void pollingCheckFling(final int startPosition, final boolean movingDown) {
+        new PollingCheck() {
             @Override
             protected boolean check() {
                 if (movingDown) {
@@ -904,7 +688,7 @@
             }
         };
 
-        new DelayedCheck() {
+        new PollingCheck() {
             private int mPreviousScrollY = mScrollView.getScrollY();
 
             @Override
diff --git a/tests/tests/widget/src/android/widget/cts/ScrollerTest.java b/tests/tests/widget/src/android/widget/cts/ScrollerTest.java
index ecf1166..e92e721 100644
--- a/tests/tests/widget/src/android/widget/cts/ScrollerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ScrollerTest.java
@@ -16,10 +16,6 @@
 
 package android.widget.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.content.Context;
 import android.test.InstrumentationTestCase;
@@ -29,7 +25,6 @@
 /**
  * Test {@link Scroller}.
  */
-@TestTargetClass(Scroller.class)
 public class ScrollerTest extends InstrumentationTestCase {
     private Scroller mScroller;
 
@@ -42,38 +37,12 @@
         mScroller = new Scroller(mTargetContext);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "Scroller",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "Scroller",
-            args = {android.content.Context.class, android.view.animation.Interpolator.class}
-        )
-    })
     public void testConstructor() {
         new Scroller(mTargetContext);
 
         new Scroller(mTargetContext, new LinearInterpolator());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "forceFinished",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isFinished",
-            args = {}
-        )
-    })
     public void testIsFinished() {
         mScroller.forceFinished(true);
         assertTrue(mScroller.isFinished());
@@ -82,12 +51,6 @@
         assertFalse(mScroller.isFinished());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link Scroller#getDuration()}",
-        method = "getDuration",
-        args = {}
-    )
     public void testGetDuration() {
         assertEquals(0, mScroller.getDuration());
 
@@ -107,20 +70,6 @@
         assertTrue(mScroller.getDuration() > 0);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link Scroller#getFinalX()} and {@link Scroller#setFinalX(int)}",
-            method = "setFinalX",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link Scroller#getFinalX()} and {@link Scroller#setFinalX(int)}",
-            method = "getFinalX",
-            args = {}
-        )
-    })
     public void testAccessFinalX() {
         assertEquals(0, mScroller.getFinalX());
         assertTrue(mScroller.isFinished());
@@ -135,20 +84,6 @@
         assertFalse(mScroller.isFinished());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link Scroller#setFinalY(int)} and {@link Scroller#getFinalY()}",
-            method = "setFinalY",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link Scroller#setFinalY(int)} and {@link Scroller#getFinalY()}",
-            method = "getFinalY",
-            args = {}
-        )
-    })
     public void testAccessFinalY() {
         assertEquals(0, mScroller.getFinalY());
         assertTrue(mScroller.isFinished());
@@ -163,38 +98,6 @@
         assertFalse(mScroller.isFinished());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startScroll",
-            args = {int.class, int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "computeScrollOffset",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrX",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrY",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStartX",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStartY",
-            args = {}
-        )
-    })
     // We can not get the precise currX and currY when scrolling
     public void testScrollMode() {
         assertEquals(0, mScroller.getFinalX());
@@ -260,38 +163,6 @@
         assertFalse(mScroller.computeScrollOffset());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startScroll",
-            args = {int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "computeScrollOffset",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrX",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrY",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStartX",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStartY",
-            args = {}
-        )
-    })
     // We can not get the precise currX and currY when scrolling
     public void testScrollModeWithDefaultDuration() {
         assertEquals(0, mScroller.getFinalX());
@@ -327,39 +198,6 @@
         assertFalse(mScroller.computeScrollOffset());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "fling",
-            args = {int.class, int.class, int.class, int.class, int.class, int.class, int.class,
-                    int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "computeScrollOffset",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrX",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrY",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStartX",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStartY",
-            args = {}
-        )
-    })
     // We can not get the precise currX and currY when scrolling
     public void testFlingMode() {
         assertEquals(0, mScroller.getFinalX());
@@ -434,12 +272,6 @@
         assertFalse(mScroller.computeScrollOffset());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link Scroller#abortAnimation()}",
-        method = "abortAnimation",
-        args = {}
-    )
     public void testAbortAnimation() {
         mScroller.startScroll(0, 0, 2000, -2000, 5000);
         mScroller.computeScrollOffset();
@@ -463,11 +295,6 @@
         assertTrue(mScroller.isFinished());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "extendDuration",
-        args = {int.class}
-    )
     // We can not get the precise duration after it is extended
     public void testExtendDuration() {
         mScroller.startScroll(0, 0, 0, 0, 5000);
@@ -514,12 +341,6 @@
         assertTrue(mScroller.getCurrY() - curY < curY - 0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link Scroller#timePassed()}We can not get the precise time passed.",
-        method = "timePassed",
-        args = {}
-    )
     public void testTimePassed() {
         try {
             Thread.sleep(1000);
diff --git a/tests/tests/widget/src/android/widget/cts/SeekBarTest.java b/tests/tests/widget/src/android/widget/cts/SeekBarTest.java
index 7ce0148..266583f 100644
--- a/tests/tests/widget/src/android/widget/cts/SeekBarTest.java
+++ b/tests/tests/widget/src/android/widget/cts/SeekBarTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import android.app.Activity;
 import android.app.Instrumentation;
@@ -34,7 +30,6 @@
 /**
  * Test {@link SeekBar}.
  */
-@TestTargetClass(SeekBar.class)
 public class SeekBarTest extends ActivityInstrumentationTestCase2<SeekBarStubActivity> {
     private SeekBar mSeekBar;
 
@@ -54,23 +49,6 @@
         mSeekBar = (SeekBar) mActivity.findViewById(R.id.seekBar);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "SeekBar",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "SeekBar",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "SeekBar",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
     public void testConstructor() {
         new SeekBar(mActivity);
 
@@ -79,11 +57,6 @@
         new SeekBar(mActivity, null, com.android.internal.R.attr.seekBarStyle);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setOnSeekBarChangeListener",
-        args = {android.widget.SeekBar.OnSeekBarChangeListener.class}
-    )
     public void testSetOnSeekBarChangeListener() {
         MockOnSeekBarListener listener = new MockOnSeekBarListener();
 
diff --git a/tests/tests/widget/src/android/widget/cts/SimpleAdapterTest.java b/tests/tests/widget/src/android/widget/cts/SimpleAdapterTest.java
index d20582b..8b35a2f 100644
--- a/tests/tests/widget/src/android/widget/cts/SimpleAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/SimpleAdapterTest.java
@@ -18,11 +18,6 @@
 
 import com.android.internal.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.content.Context;
 import android.graphics.Bitmap;
@@ -44,7 +39,6 @@
 /**
  * Test {@link SimpleAdapter}.
  */
-@TestTargetClass(SimpleAdapter.class)
 public class SimpleAdapterTest extends InstrumentationTestCase {
     private static final int DEFAULT_ROW_COUNT = 20;
 
@@ -103,24 +97,11 @@
                 R.layout.simple_list_item_1, COLUMNS_FROM, VIEWS_TO);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test constructor",
-        method = "SimpleAdapter",
-        args = {android.content.Context.class, java.util.List.class, int.class,
-                java.lang.String[].class, int[].class}
-    )
     public void testConstructor() {
         new SimpleAdapter(mContext, createTestList(DEFAULT_COLUMN_COUNT, DEFAULT_ROW_COUNT),
                 R.layout.simple_list_item_1, COLUMNS_FROM, VIEWS_TO);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link SimpleAdapter#getCount()}",
-        method = "getCount",
-        args = {}
-    )
     public void testGetCount() {
         mSimpleAdapter = new SimpleAdapter(mContext,
                 createTestList(DEFAULT_COLUMN_COUNT, DEFAULT_ROW_COUNT),
@@ -132,14 +113,6 @@
         assertEquals(10, mSimpleAdapter.getCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link SimpleAdapter#getItem(int)}",
-        method = "getItem",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "SimpleAdapter#getItem(int) if the param position is out of index")
     public void testGetItem() {
         assertEquals("01", ((Map<?, ?>) mSimpleAdapter.getItem(0)).get("column1"));
         assertEquals("191", ((Map<?, ?>) mSimpleAdapter.getItem(19)).get("column1"));
@@ -157,14 +130,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link SimpleAdapter#getItemId(int)}",
-        method = "getItemId",
-        args = {int.class}
-    )
-    @ToBeFixed(explanation = "SimpleAdapter#getItemId(int) should check whether "
-            + "the param position is out of index")
     public void testGetItemId() {
         assertEquals(0, mSimpleAdapter.getItemId(0));
 
@@ -176,14 +141,6 @@
         assertEquals(20, mSimpleAdapter.getItemId(20));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link SimpleAdapter#getView(int, View, ViewGroup)}",
-        method = "getView",
-        args = {int.class, android.view.View.class, android.view.ViewGroup.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "SimpleAdapter#getView(int, View, ViewGroup) if the param position is out of index")
     public void testGetView() {
         // use the layout passed in to constructor
         View result = mSimpleAdapter.getView(0, null, mAdapterHost);
@@ -233,12 +190,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link SimpleAdapter#setDropDownViewResource(int)}",
-        method = "setDropDownViewResource",
-        args = {int.class}
-    )
     public void testSetDropDownViewResource() {
         mSimpleAdapter.setDropDownViewResource(R.layout.simple_list_item_2);
         View result = mSimpleAdapter.getDropDownView(0, null, mAdapterHost);
@@ -259,15 +210,6 @@
         assertEquals("191", ((TextView) result).getText().toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link SimpleAdapter#getDropDownView(int, View, ViewGroup)}",
-        method = "getDropDownView",
-        args = {int.class, android.view.View.class, android.view.ViewGroup.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into j"
-            + "avadoc of SimpleAdapter#getDropDownView(int, View, ViewGroup) if "
-            + "the param position is out of index")
     public void testGetDropDownView() {
         View result = mSimpleAdapter.getDropDownView(0, null, mAdapterHost);
         assertTrue(result instanceof TextView);
@@ -316,18 +258,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setViewBinder",
-            args = {android.widget.SimpleAdapter.ViewBinder.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getViewBinder",
-            args = {}
-        )
-    })
     public void testAccessViewBinder() {
         // no binder default
         assertNull(mSimpleAdapter.getViewBinder());
@@ -346,22 +276,6 @@
         assertNull(mSimpleAdapter.getViewBinder());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link SimpleAdapter#setViewImage(ImageView, String)",
-            method = "setViewImage",
-            args = {android.widget.ImageView.class, java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link SimpleAdapter#setViewImage(ImageView, String)",
-            method = "setViewImage",
-            args = {android.widget.ImageView.class, int.class}
-        )
-    })
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "SimpleAdapter#setViewImage(ImageView, String) if the param String is null")
     public void testSetViewImage() {
         // String represents resId
         ImageView view = new ImageView(mContext);
@@ -419,12 +333,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link SimpleAdapter#setViewText(TextView, String)}",
-        method = "setViewText",
-        args = {android.widget.TextView.class, java.lang.String.class}
-    )
     public void testSetViewText() {
         TextView view = new TextView(mContext);
         mSimpleAdapter.setViewText(view, "expected");
@@ -434,12 +342,6 @@
         assertEquals("", view.getText().toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link SimpleAdapter#getFilter()}",
-        method = "getFilter",
-        args = {}
-    )
     public void testGetFilter() {
         assertNotNull(mSimpleAdapter.getFilter());
     }
diff --git a/tests/tests/widget/src/android/widget/cts/SimpleCursorAdapterTest.java b/tests/tests/widget/src/android/widget/cts/SimpleCursorAdapterTest.java
index e6e9d47..59660e0 100644
--- a/tests/tests/widget/src/android/widget/cts/SimpleCursorAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/SimpleCursorAdapterTest.java
@@ -18,11 +18,6 @@
 
 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 android.content.Context;
 import android.database.Cursor;
@@ -47,7 +42,6 @@
 /**
  * Test {@link SimpleCursorAdapter}.
  */
-@TestTargetClass(SimpleCursorAdapter.class)
 public class SimpleCursorAdapterTest extends InstrumentationTestCase {
     private static final int ADAPTER_ROW_COUNT = 20;
 
@@ -106,27 +100,12 @@
                 mCursor, COLUMNS_FROM, VIEWS_TO);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "SimpleCursorAdapter",
-        args = {android.content.Context.class, int.class, android.database.Cursor.class,
-                java.lang.String[].class, int[].class}
-    )
     public void testConstructor() {
         new SimpleCursorAdapter(mContext, R.layout.cursoradapter_item0,
                 createTestCursor(DEFAULT_COLUMN_COUNT, ADAPTER_ROW_COUNT),
                 COLUMNS_FROM, VIEWS_TO);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "bindView",
-        args = {android.view.View.class, android.content.Context.class,
-                android.database.Cursor.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "SimpleCursorAdapter#bindView(View, Context, Cursor) if the param view is "
-            + "not TextView or ImageView and ViewBinder failed to bind the view")
     public void testBindView() {
         TextView listItem = (TextView) mSimpleCursorAdapter.newView(mContext, null, null);
 
@@ -170,18 +149,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getViewBinder",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setViewBinder",
-            args = {ViewBinder.class}
-        )
-    })
     public void testAccessViewBinder() {
         assertNull(mSimpleCursorAdapter.getViewBinder());
 
@@ -197,11 +164,6 @@
         assertNull(mSimpleCursorAdapter.getViewBinder());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setViewText",
-        args = {TextView.class, String.class}
-    )
     public void testSetViewText() {
         TextView view = new TextView(mContext);
         mSimpleCursorAdapter.setViewText(view, "expected");
@@ -211,13 +173,6 @@
         assertEquals("", view.getText().toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setViewImage",
-        args = {ImageView.class, String.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "SimpleCursorAdapter#setViewImage(ImageView, String) if the param String is null")
     public void testSetViewImage() {
         // resId
         int sceneryImgResId = com.android.cts.stub.R.drawable.scenery;
@@ -264,20 +219,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getStringConversionColumn",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setStringConversionColumn",
-            args = {int.class}
-        )
-    })
-    @ToBeFixed(explanation = "SimpleCursorAdapter#setStringConversionColumn(int) "
-            + "should check whether the param stringConversionColumn is out of index")
     public void testAccessStringConversionColumn() {
         // default is -1
         assertEquals(-1, mSimpleCursorAdapter.getStringConversionColumn());
@@ -294,18 +235,6 @@
         assertEquals(Integer.MIN_VALUE, mSimpleCursorAdapter.getStringConversionColumn());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCursorToStringConverter",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setCursorToStringConverter",
-            args = {CursorToStringConverter.class}
-        )
-    })
     public void testAccessCursorToStringConverter() {
         // default is null
         assertNull(mSimpleCursorAdapter.getCursorToStringConverter());
@@ -318,15 +247,6 @@
         assertNull(mSimpleCursorAdapter.getCursorToStringConverter());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link SimpleCursorAdapter#changeCursor(Cursor)}",
-        method = "changeCursor",
-        args = {Cursor.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "SimpleCursorAdapter#changeCursor(Cursor) if the param cursor does not contain"
-            + "any column passed in the constructor")
     public void testChangeCursor() {
         // have "column1"
         Cursor curWith3Columns = createTestCursor(3, ADAPTER_ROW_COUNT);
@@ -344,15 +264,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link SimpleCursorAdapter#convertToString(Cursor)}",
-        method = "convertToString",
-        args = {Cursor.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "SimpleCursorAdapter#convertToString(Cursor) if the StringConversionColumn set "
-            + "by  SimpleCursorAdapter#setStringConversionColumn(int) is beyond the columns count")
     public void testConvertToString() {
         mCursor.moveToFirst();
         assertEquals("", mSimpleCursorAdapter.convertToString(null));
@@ -392,11 +303,6 @@
         assertTrue(((MockCursorToStringConverter) converter).hasCalledConvertToString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "newView",
-        args = {Context.class, Cursor.class, ViewGroup.class}
-    )
     public void testNewView() {
         LayoutInflater layoutInflater = (LayoutInflater) mContext.getSystemService(
                 Context.LAYOUT_INFLATER_SERVICE);
@@ -411,11 +317,6 @@
         assertEquals(R.id.cursorAdapter_item0, result.getId());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "newDropDownView",
-        args = {Context.class, Cursor.class, ViewGroup.class}
-    )
     public void testNewDropDownView() {
         LayoutInflater layoutInflater = (LayoutInflater) mContext.getSystemService(
                 Context.LAYOUT_INFLATER_SERVICE);
@@ -426,11 +327,6 @@
         assertEquals(R.id.cursorAdapter_item0, result.getId());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "changeCursorAndColumns",
-        args = {Cursor.class, String[].class, int[].class}
-    )
     public void testChangeCursorAndColumns() {
         assertSame(mCursor, mSimpleCursorAdapter.getCursor());
 
diff --git a/tests/tests/widget/src/android/widget/cts/SimpleCursorTreeAdapterTest.java b/tests/tests/widget/src/android/widget/cts/SimpleCursorTreeAdapterTest.java
index bbb96c4..bf9e358 100644
--- a/tests/tests/widget/src/android/widget/cts/SimpleCursorTreeAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/SimpleCursorTreeAdapterTest.java
@@ -18,11 +18,6 @@
 
 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 android.content.Context;
 import android.database.Cursor;
@@ -38,7 +33,6 @@
 /**
  * Test {@link SimpleCursorTreeAdapter}.
  */
-@TestTargetClass(SimpleCursorTreeAdapter.class)
 public class SimpleCursorTreeAdapterTest extends InstrumentationTestCase {
     private static final int GROUP_LAYOUT = R.layout.cursoradapter_group0;
 
@@ -76,32 +70,6 @@
         mContext = getInstrumentation().getTargetContext();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "SimpleCursorTreeAdapter",
-            args = {android.content.Context.class, android.database.Cursor.class, int.class,
-                    int.class, java.lang.String[].class, int[].class, int.class, int.class,
-                    java.lang.String[].class, int[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "SimpleCursorTreeAdapter",
-            args = {android.content.Context.class, android.database.Cursor.class, int.class,
-                    int.class, java.lang.String[].class, int[].class, int.class,
-                    java.lang.String[].class, int[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "SimpleCursorTreeAdapter",
-            args = {android.content.Context.class, android.database.Cursor.class, int.class,
-                    java.lang.String[].class, int[].class, int.class, java.lang.String[].class,
-                    int[].class}
-        )
-    })
     public void testConstructor() {
         mGroupCursor = createTestCursor(2, 20, "group");
         new MockSimpleCursorTreeAdapter(mContext, mGroupCursor,
@@ -117,12 +85,6 @@
                 CHILD_LAYOUT, CHILD_LAYOUT, COLUMNS_CHILD_FROM, VIEWS_CHILD_TO);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "bindChildView",
-        args = {android.view.View.class, android.content.Context.class,
-                android.database.Cursor.class, boolean.class}
-    )
     public void testBindChildView() {
         mGroupCursor = createTestCursor(2, 20, "group");
         mChildCursor = createTestCursor(3, 4, "child");
@@ -141,12 +103,6 @@
         assertEquals("child12", view.getText().toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "bindGroupView",
-        args = {android.view.View.class, android.content.Context.class,
-                android.database.Cursor.class, boolean.class}
-    )
     // The param context and isExpanded is never readed.
     public void testBindGroupView() {
         mGroupCursor = createTestCursor(2, 20, "group");
@@ -164,14 +120,6 @@
         assertEquals("group11", view.getText().toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link SimpleCursorTreeAdapter#setViewImage(ImageView, String)}",
-        method = "setViewImage",
-        args = {android.widget.ImageView.class, java.lang.String.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "SimpleCursorTreeAdapter#setViewImage(ImageView, String) if the param String is null")
     public void testSetViewImage() {
         mGroupCursor = createTestCursor(2, 20, "group");
         mSimpleCursorTreeAdapter = new MockSimpleCursorTreeAdapter(mContext, mGroupCursor,
diff --git a/tests/tests/widget/src/android/widget/cts/SimpleExpandableListAdapterTest.java b/tests/tests/widget/src/android/widget/cts/SimpleExpandableListAdapterTest.java
index 090821e..7c4fe23 100644
--- a/tests/tests/widget/src/android/widget/cts/SimpleExpandableListAdapterTest.java
+++ b/tests/tests/widget/src/android/widget/cts/SimpleExpandableListAdapterTest.java
@@ -18,11 +18,6 @@
 
 import com.android.internal.R;
 
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
 import android.content.Context;
 import android.test.InstrumentationTestCase;
@@ -41,7 +36,6 @@
 /**
  * Test {@link SimpleExpandableListAdapter}.
  */
-@TestTargetClass(SimpleExpandableListAdapter.class)
 public class SimpleExpandableListAdapterTest extends InstrumentationTestCase {
     private static final int EXPANDED_GROUP_LAYOUT = R.layout.simple_expandable_list_item_2;
 
@@ -107,32 +101,6 @@
                 com.android.cts.stub.R.layout.cursoradapter_host, null);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "SimpleExpandableListAdapter",
-            args = {android.content.Context.class, java.util.List.class, int.class, int.class, 
-                    java.lang.String[].class, int[].class, java.util.List.class, int.class, 
-                    int.class, java.lang.String[].class, int[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "SimpleExpandableListAdapter",
-            args = {android.content.Context.class, java.util.List.class, int.class, int.class, 
-                    java.lang.String[].class, int[].class, java.util.List.class, int.class, 
-                    java.lang.String[].class, int[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors",
-            method = "SimpleExpandableListAdapter",
-            args = {android.content.Context.class, java.util.List.class, int.class, 
-                    java.lang.String[].class, int[].class, java.util.List.class, int.class, 
-                    java.lang.String[].class, int[].class}
-        )
-    })
     public void testConstructor() {
         new SimpleExpandableListAdapter(mContext,
                 mGroupList, GROUP_LAYOUT, COLUMNS_GROUP_FROM, VIEWS_GROUP_TO,
@@ -150,15 +118,6 @@
                 COLUMNS_CHILD_FROM, VIEWS_CHILD_TO);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link SimpleExpandableListAdapter#getChild(int, int)}",
-        method = "getChild",
-        args = {int.class, int.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "SimpleExpandableListAdapter#getChild(int, int) if the param groupPosition or "
-            + "childPosition is out of index.")
     public void testGetChild() {
         HashMap<String, String> expected = new HashMap<String, String>();
         expected.put("column0", "child00");
@@ -193,14 +152,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link SimpleExpandableListAdapter#getChildId(int, int)}",
-        method = "getChildId",
-        args = {int.class, int.class}
-    )
-    @ToBeFixed(explanation = "Should throw IndexOutOfBoundsException if groupPosition "
-        + "or childPosition is out of bounds")
     public void testGetChildId() {
         assertEquals(0, mSimpleExpandableListAdapter.getChildId(0, 0));
         assertEquals(3, mSimpleExpandableListAdapter.getChildId(3, 3));
@@ -212,15 +163,6 @@
         assertEquals(4, mSimpleExpandableListAdapter.getChildId(0, 4));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getChildView",
-        args = {int.class, int.class, boolean.class, android.view.View.class, 
-                android.view.ViewGroup.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "SimpleExpandableListAdapter#getChildView(int, int, boolean, View, ViewGroup if "
-            + "the param groupPosition or childPosition is out of index.")
     public void testGetChildView() {
         // the normal and last use same layout
         View result = mSimpleExpandableListAdapter.getChildView(0, 0, false, null, mAdapterHost);
@@ -285,12 +227,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link SimpleExpandableListAdapter#newChildView(boolean, ViewGroup)}",
-        method = "newChildView",
-        args = {boolean.class, android.view.ViewGroup.class}
-    )
     public void testNewChildView() {
         // the normal and last use same layout
         View result = mSimpleExpandableListAdapter.newChildView(false, mAdapterHost);
@@ -317,15 +253,6 @@
         assertNotNull(result.findViewById(R.id.text1));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link SimpleExpandableListAdapter#getChildrenCount(int)}",
-        method = "getChildrenCount",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "SimpleExpandableListAdapter#getChildrenCount(int) if "
-            + "the param groupPosition is out of index.")
     public void testGetChildrenCount() {
         assertEquals(1, mSimpleExpandableListAdapter.getChildrenCount(0));
         assertEquals(2, mSimpleExpandableListAdapter.getChildrenCount(1));
@@ -345,15 +272,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link SimpleExpandableListAdapter#getGroup(int)}",
-        method = "getGroup",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "SimpleExpandableListAdapter#getGroup(int) if "
-            + "the param groupPosition is out of index.")
     public void testGetGroup() {
         HashMap<String, String> expected = new HashMap<String, String>();
         expected.put("column0", "group00");
@@ -376,12 +294,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link SimpleExpandableListAdapter#getGroupCount()}",
-        method = "getGroupCount",
-        args = {}
-    )
     public void testGetGroupCount() {
         assertEquals(4, mSimpleExpandableListAdapter.getGroupCount());
 
@@ -391,14 +303,6 @@
         assertEquals(9, mSimpleExpandableListAdapter.getGroupCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link SimpleExpandableListAdapter#getGroupId(int)}",
-        method = "getGroupId",
-        args = {int.class}
-    )
-    @ToBeFixed(explanation = "Should throw IndexOutOfBoundsException if groupPosition "
-            + "is out of bounds")
     public void testGetGroupId() {
         assertEquals(0, mSimpleExpandableListAdapter.getGroupId(0));
         assertEquals(3, mSimpleExpandableListAdapter.getGroupId(3));
@@ -408,14 +312,6 @@
         assertEquals(4, mSimpleExpandableListAdapter.getGroupId(4));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getGroupView",
-        args = {int.class, boolean.class, android.view.View.class, android.view.ViewGroup.class}
-    )
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "SimpleExpandableListAdapter#getGroupView(int, boolean, View, ViewGroup if "
-            + "the param groupPosition is out of index.")
     public void testGetGroupView() {
         // the collapsed and expanded use same layout
         View result = mSimpleExpandableListAdapter.getGroupView(0, false, null, mAdapterHost);
@@ -468,12 +364,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link SimpleExpandableListAdapter#newGroupView(boolean, ViewGroup)}",
-        method = "newGroupView",
-        args = {boolean.class, android.view.ViewGroup.class}
-    )
     public void testNewGroupView() {
         // the collapsed and expanded use same layout
         View result = mSimpleExpandableListAdapter.newGroupView(false, mAdapterHost);
@@ -500,13 +390,6 @@
         assertNotNull(result.findViewById(R.id.text1));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isChildSelectable",
-        args = {int.class, int.class}
-    )
-    @ToBeFixed(explanation = "Should throw IndexOutOfBoundsException if groupPosition "
-            + "or childPosition is out of bounds")
     public void testIsChildSelectable() {
         assertTrue(mSimpleExpandableListAdapter.isChildSelectable(0, 0));
         assertTrue(mSimpleExpandableListAdapter.isChildSelectable(3, 3));
@@ -518,11 +401,6 @@
         assertTrue(mSimpleExpandableListAdapter.isChildSelectable(0, 1));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "hasStableIds",
-        args = {}
-    )
     public void testHasStableIds() {
         assertTrue(mSimpleExpandableListAdapter.hasStableIds());
     }
diff --git a/tests/tests/widget/src/android/widget/cts/SlidingDrawerTest.java b/tests/tests/widget/src/android/widget/cts/SlidingDrawerTest.java
index 3207a15..cbec79f 100644
--- a/tests/tests/widget/src/android/widget/cts/SlidingDrawerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/SlidingDrawerTest.java
@@ -18,23 +18,19 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
 import android.app.Activity;
 import android.content.Context;
+import android.cts.util.PollingCheck;
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.UiThreadTest;
 import android.util.AttributeSet;
 import android.util.Xml;
 import android.view.MotionEvent;
 import android.view.View;
-import android.view.animation.cts.DelayedCheck;
 import android.widget.ImageView;
 import android.widget.SlidingDrawer;
 import android.widget.TextView;
@@ -47,7 +43,6 @@
 /**
  * Test {@link SlidingDrawer}.
  */
-@TestTargetClass(SlidingDrawer.class)
 public class SlidingDrawerTest
         extends ActivityInstrumentationTestCase2<SlidingDrawerStubActivity> {
 
@@ -66,18 +61,6 @@
         mLock = new Object();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "SlidingDrawer",
-            args = {Context.class, AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "SlidingDrawer",
-            args = {Context.class, AttributeSet.class, int.class}
-        )
-    })
     public void testConstructor() throws XmlPullParserException, IOException {
         XmlPullParser parser = mActivity.getResources().getLayout(R.layout.sliding_drawer_layout);
         AttributeSet attrs = Xml.asAttributeSet(parser);
@@ -97,11 +80,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getHandle",
-        args = {}
-    )
     public void testGetHandle() {
         SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer);
         View handle = drawer.getHandle();
@@ -109,11 +87,6 @@
         assertEquals(R.id.handle, handle.getId());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getContent",
-        args = {}
-    )
     public void testGetContent() {
         SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer);
         View content = drawer.getContent();
@@ -121,23 +94,6 @@
         assertEquals(R.id.content, content.getId());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "open",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "close",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isOpened",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testOpenAndClose() {
         SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer);
@@ -154,28 +110,6 @@
         assertEquals(View.GONE, content.getVisibility());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "animateOpen",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "animateClose",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isOpened",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isMoving",
-            args = {}
-        )
-    })
     public void testAnimateOpenAndClose() throws Throwable {
         final SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer);
         View content = drawer.getContent();
@@ -192,7 +126,7 @@
         assertFalse(drawer.isOpened());
         assertEquals(View.GONE, content.getVisibility());
 
-        new DelayedCheck() {
+        new PollingCheck() {
             @Override
             protected boolean check() {
                 return !drawer.isMoving();
@@ -210,7 +144,7 @@
         assertTrue(drawer.isOpened());
         assertEquals(View.GONE, content.getVisibility());
 
-        new DelayedCheck() {
+        new PollingCheck() {
             @Override
             protected boolean check() {
                 return !drawer.isMoving();
@@ -220,23 +154,6 @@
         assertEquals(View.GONE, content.getVisibility());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "animateToggle",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isOpened",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isMoving",
-            args = {}
-        )
-    })
     public void testAnimateToggle() throws Throwable {
         final SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer);
         View content = drawer.getContent();
@@ -253,7 +170,7 @@
         assertFalse(drawer.isOpened());
         assertEquals(View.GONE, content.getVisibility());
 
-        new DelayedCheck() {
+        new PollingCheck() {
             @Override
             protected boolean check() {
                 return !drawer.isMoving();
@@ -271,7 +188,7 @@
         assertTrue(drawer.isOpened());
         assertEquals(View.GONE, content.getVisibility());
 
-        new DelayedCheck() {
+        new PollingCheck() {
             @Override
             protected boolean check() {
                 return !drawer.isMoving();
@@ -281,18 +198,6 @@
         assertEquals(View.GONE, content.getVisibility());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "toggle",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isOpened",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testToggle() {
         SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer);
@@ -309,18 +214,6 @@
         assertEquals(View.GONE, content.getVisibility());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "lock",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "unlock",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testLockAndUnlock() {
         SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer);
@@ -348,11 +241,6 @@
         assertEquals(View.VISIBLE, content.getVisibility());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setOnDrawerOpenListener",
-        args = {android.widget.SlidingDrawer.OnDrawerOpenListener.class}
-    )
     @UiThreadTest
     public void testSetOnDrawerOpenListener() {
         SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer);
@@ -365,11 +253,6 @@
         assertTrue(listener.hadOpenedDrawer());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setOnDrawerCloseListener",
-        args = {android.widget.SlidingDrawer.OnDrawerCloseListener.class}
-    )
     @UiThreadTest
     public void testSetOnDrawerCloseListener() {
         SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer);
@@ -385,11 +268,6 @@
         assertTrue(listener.hadClosedDrawer());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setOnDrawerScrollListener",
-        args = {android.widget.SlidingDrawer.OnDrawerScrollListener.class}
-    )
     public void testSetOnDrawerScrollListener() throws Throwable {
         final SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer);
         MockOnDrawerScrollListener listener = new MockOnDrawerScrollListener();
@@ -418,56 +296,26 @@
         assertTrue(listener.hadEndedScroll());
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onLayout",
-        args = {boolean.class, int.class, int.class, int.class, int.class}
-    )
     public void testOnLayout() {
         // onLayout() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onMeasure",
-        args = {int.class, int.class}
-    )
     public void testOnMeasure() {
         // onMeasure() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onFinishInflate",
-        args = {}
-    )
     public void testOnFinishInflate() {
         // onFinishInflate() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "dispatchDraw",
-        args = {android.graphics.Canvas.class}
-    )
     public void testDispatchDraw() {
         // dispatchDraw() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onInterceptTouchEvent",
-        args = {MotionEvent.class}
-    )
     public void testOnInterceptTouchEvent() {
         // onInterceptTouchEvent() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onTouchEvent",
-        args = {MotionEvent.class}
-    )
     public void testOnTouchEvent() {
         // onTouchEvent() is implementation details, do NOT test
     }
diff --git a/tests/tests/widget/src/android/widget/cts/SpinnerTest.java b/tests/tests/widget/src/android/widget/cts/SpinnerTest.java
index 18b7162..8ffd90b 100644
--- a/tests/tests/widget/src/android/widget/cts/SpinnerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/SpinnerTest.java
@@ -18,11 +18,6 @@
 
 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 android.app.AlertDialog;
 import android.app.Dialog;
@@ -36,7 +31,6 @@
 /**
  * Test {@link Spinner}.
  */
-@TestTargetClass(Spinner.class)
 public class SpinnerTest extends ActivityInstrumentationTestCase2<RelativeLayoutStubActivity> {
     private Context mTargetContext;
 
@@ -50,23 +44,6 @@
         mTargetContext = getInstrumentation().getTargetContext();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Spinner",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Spinner",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "Spinner",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
     public void testConstructor() {
         new Spinner(mTargetContext);
 
@@ -78,11 +55,6 @@
         assertEquals(mTargetContext.getString(R.string.text_view_hello), spinner.getPrompt());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getBaseline",
-        args = {}
-    )
     @UiThreadTest
     public void testGetBaseline() {
         Spinner spinner = new Spinner(mTargetContext);
@@ -97,13 +69,6 @@
         assertTrue(spinner.getBaseline() > 0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setOnItemClickListener",
-        args = {android.widget.AdapterView.OnItemClickListener.class}
-    )
-    @ToBeFixed( bug = "1695243", explanation = "setOnItemClickListener() always throws" +
-            " RuntimeException, but does not mentioned in javadoc.")
     public void testSetOnItemClickListener() {
         Spinner spinner = new Spinner(mTargetContext);
 
@@ -114,11 +79,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        method = "performClick",
-        args = {}
-    )
     @UiThreadTest
     public void testPerformClick() {
         final Spinner spinner = (Spinner) getActivity().findViewById(R.id.spinner1);
@@ -129,11 +89,6 @@
         // Or do UI check?
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onClick",
-        args = {android.content.DialogInterface.class, int.class}
-    )
     public void testOnClick() {
         Spinner spinner = new Spinner(mTargetContext);
         // normal value
@@ -159,18 +114,6 @@
         assertFalse(dialog.isShowing());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL,
-            method = "setPrompt",
-            args = {java.lang.CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPrompt",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testAccessPrompt() {
         final String promptText = "prompt text";
@@ -186,13 +129,6 @@
         // TODO: find the dialog and get its title to assert whether setPrompt() takes effect?
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        method = "setPromptId",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for setInterpolator() is incomplete." +
-            "not clear what is supposed to happen if promptId is exceptional.")
     public void testsetPromptId() {
         Spinner spinner = new Spinner(mTargetContext);
 
@@ -216,11 +152,6 @@
         // TODO: find the dialog and get its title to assert whether setPromptId() takes effect?
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onLayout",
-        args = {boolean.class, int.class, int.class, int.class, int.class}
-    )
     public void testOnLayout() {
         // onLayout() is implementation details, do NOT test
     }
diff --git a/tests/tests/widget/src/android/widget/cts/TabHostTest.java b/tests/tests/widget/src/android/widget/cts/TabHostTest.java
index a0d0eee..07334ad 100644
--- a/tests/tests/widget/src/android/widget/cts/TabHostTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TabHostTest.java
@@ -18,11 +18,6 @@
 
 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 android.app.Activity;
 import android.app.ActivityGroup;
@@ -39,7 +34,6 @@
 /**
  * Test {@link TabHost}.
  */
-@TestTargetClass(TabHost.class)
 public class TabHostTest extends ActivityInstrumentationTestCase2<TabHostStubActivity> {
     private static final String TAG_TAB1 = "tab 1";
     private static final String TAG_TAB2 = "tab 2";
@@ -57,29 +51,12 @@
         mActivity = getActivity();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "TabHost",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "TabHost",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        )
-    })
     public void testConstructor() {
         new TabHost(mActivity);
 
         new TabHost(mActivity, null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "newTabSpec",
-        args = {java.lang.String.class}
-    )
     public void testNewTabSpec() {
         TabHost tabHost = new TabHost(mActivity);
 
@@ -93,12 +70,6 @@
      * 1. the tabWidget view and tabContent view associated with tabHost are created.
      * 2. no exception occurs when doing normal operation after setup().
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test setup()",
-        method = "setup",
-        args = {}
-    )
     public void testSetup1() throws Throwable {
         final Activity activity = launchActivity("com.android.cts.stub", StubActivity.class, null);
 
@@ -130,11 +101,6 @@
      * 1. the tabWidget view and tabContent view associated with tabHost are created.
      * 2. no exception occurs when uses TabSpec.setContent(android.content.Intent) after setup().
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setup",
-        args = {android.app.LocalActivityManager.class}
-    )
     public void testSetup2() throws Throwable {
         final ActivityGroup activity = launchActivity("com.android.cts.stub",
                 ActivityGroup.class, null);
@@ -165,23 +131,10 @@
         activity.finish();
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onTouchModeChanged",
-        args = {boolean.class}
-    )
     public void testOnTouchModeChanged() {
         // implementation details
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addTab",
-        args = {android.widget.TabHost.TabSpec.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for addTab() is incomplete." +
-            "1. not clear what is supposed to happen if tabSpec is null." +
-            "2. no description about the IllegalArgumentException thrown from this method.")
     @UiThreadTest
     public void testAddTab() {
         TabHost tabHost = mActivity.getTabHost();
@@ -216,13 +169,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        method = "clearAllTabs",
-        args = {}
-    )
-    @ToBeFixed(explanation = "clearAllTabs() cannot be called on a TabHost that's currently being"
-            + " displayed. After doing so, NPE is thrown in the UI thread and the process dies.")
     @UiThreadTest
     public void testClearAllTabs() {
         TabHost tabHost = mActivity.getTabHost();
@@ -249,12 +195,6 @@
         */
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getTabWidget",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete.")
     public void testGetTabWidget() {
         TabHost tabHost = mActivity.getTabHost();
 
@@ -268,19 +208,6 @@
                 getActivity());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrentTab",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setCurrentTab",
-            args = {int.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete.")
     @UiThreadTest
     public void testAccessCurrentTab() {
         TabHost tabHost = mActivity.getTabHost();
@@ -303,12 +230,6 @@
         assertEquals(0, tabHost.getCurrentTab());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getCurrentTabView",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete.")
     @UiThreadTest
     public void testGetCurrentTabView() {
         TabHost tabHost = mActivity.getTabHost();
@@ -324,12 +245,6 @@
         assertSame(tabHost.getTabWidget().getChildAt(1), tabHost.getCurrentTabView());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getCurrentView",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete.")
     @UiThreadTest
     public void testGetCurrentView() {
         TabHost tabHost = mActivity.getTabHost();
@@ -344,12 +259,6 @@
         assertTrue(tabHost.getCurrentView() instanceof ListView);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setCurrentTabByTag",
-        args = {java.lang.String.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete.")
     @UiThreadTest
     public void testSetCurrentTabByTag() {
         TabHost tabHost = mActivity.getTabHost();
@@ -374,11 +283,6 @@
         assertEquals(0, tabHost.getCurrentTab());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getTabContentView",
-        args = {}
-    )
     @UiThreadTest
     public void testGetTabContentView() {
         TabHost tabHost = mActivity.getTabHost();
@@ -409,21 +313,11 @@
         assertEquals(TabHostStubActivity.INITIAL_VIEW_TEXT, child2.getText().toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "dispatchKeyEvent",
-        args = {android.view.KeyEvent.class}
-    )
     @UiThreadTest
     public void testDispatchKeyEvent() {
         // Implementation details.
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "dispatchWindowFocusChanged",
-        args = {boolean.class}
-    )
     @UiThreadTest
     public void testDispatchWindowFocusChanged() {
         // Implementation details
@@ -434,11 +328,6 @@
      * 1. the specified callback should be invoked when the selected state of any of the items
      * in this list changes
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setOnTabChangedListener",
-        args = {android.widget.TabHost.OnTabChangeListener.class}
-    )
     @UiThreadTest
     public void testSetOnTabChangedListener() {
         TabHost tabHost = mActivity.getTabHost();
@@ -465,13 +354,6 @@
         assertFalse(listener.hasCalledOnTabChanged());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getCurrentTabTag()",
-        method = "getCurrentTabTag",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete.")
     @UiThreadTest
     public void testGetCurrentTabTag() {
         TabHost tabHost = mActivity.getTabHost();
@@ -485,18 +367,6 @@
         assertEquals(TAG_TAB2, tabHost.getCurrentTabTag());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onDetachedFromWindow",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onAttachedToWindow",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testOnAttachedToAndDetachedFromWindow() {
         // implementation details
diff --git a/tests/tests/widget/src/android/widget/cts/TabHost_TabSpecTest.java b/tests/tests/widget/src/android/widget/cts/TabHost_TabSpecTest.java
index 6a6b5b9..470a666 100644
--- a/tests/tests/widget/src/android/widget/cts/TabHost_TabSpecTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TabHost_TabSpecTest.java
@@ -18,9 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.app.Activity;
 import android.app.Instrumentation;
@@ -43,7 +40,6 @@
 /**
  * Test {@link TabSpec}.
  */
-@TestTargetClass(TabSpec.class)
 public class TabHost_TabSpecTest extends ActivityInstrumentationTestCase2<TabHostStubActivity> {
     private static final String TAG_TAB2 = "tab 2";
 
@@ -61,11 +57,6 @@
         mTabHost = mActivity.getTabHost();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setIndicator",
-        args = {java.lang.CharSequence.class}
-    )
     @UiThreadTest
     public void testSetIndicator1() {
         TabSpec tabSpec = mTabHost.newTabSpec(TAG_TAB2);
@@ -89,11 +80,6 @@
         assertEquals("", tvTitle.getText().toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setIndicator",
-        args = {java.lang.CharSequence.class, android.graphics.drawable.Drawable.class}
-    )
     @UiThreadTest
     public void testSetIndicator2() {
         TabSpec tabSpec = mTabHost.newTabSpec(TAG_TAB2);
@@ -147,11 +133,6 @@
         assertNull(ivIcon.getDrawable());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setContent",
-        args = {int.class}
-    )
     @UiThreadTest
     public void testSetContent1() {
         TabSpec tabSpec2 = mTabHost.newTabSpec("tab spec 2");
@@ -173,11 +154,6 @@
         assertTrue(mTabHost.getCurrentView() instanceof ListView);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setContent",
-        args = {android.widget.TabHost.TabContentFactory.class}
-    )
     @UiThreadTest
     public void testSetContent2() {
         TabSpec tabSpec2 = mTabHost.newTabSpec("tab spec 2");
@@ -198,11 +174,6 @@
         assertTrue(mTabHost.getCurrentView() instanceof ListView);
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        method = "setContent",
-        args = {android.content.Intent.class}
-    )
     public void testSetContent3() {
         // The scheme of uri string must be "ctstest" to launch MockURLSpanTestActivity
         Uri uri = Uri.parse("ctstest://tabhost_tabspec/test");
diff --git a/tests/tests/widget/src/android/widget/cts/TabWidgetTest.java b/tests/tests/widget/src/android/widget/cts/TabWidgetTest.java
index 2327965..b5c46c5 100644
--- a/tests/tests/widget/src/android/widget/cts/TabWidgetTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TabWidgetTest.java
@@ -16,11 +16,6 @@
 
 package android.widget.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.app.Activity;
 import android.content.Context;
@@ -37,7 +32,6 @@
 /**
  * Test {@link TabWidget}.
  */
-@TestTargetClass(TabWidget.class)
 public class TabWidgetTest extends ActivityInstrumentationTestCase2<TabHostStubActivity> {
     private Activity mActivity;
 
@@ -51,23 +45,6 @@
         mActivity = getActivity();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "TabWidget",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "TabWidget",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "TabWidget",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
     public void testConstructor() {
         new TabWidget(mActivity);
 
@@ -76,11 +53,6 @@
         new TabWidget(mActivity, null, 0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "childDrawableStateChanged",
-        args = {android.view.View.class}
-    )
     public void testChildDrawableStateChanged() {
         MockTabWidget mockTabWidget = new MockTabWidget(mActivity);
         TextView tv0 = new TextView(mActivity);
@@ -101,20 +73,10 @@
         assertFalse(mockTabWidget.hasCalledInvalidate());
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "dispatchDraw",
-        args = {android.graphics.Canvas.class}
-    )
     public void testDispatchDraw() {
         // implementation details
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setCurrentTab",
-        args = {int.class}
-    )
     @UiThreadTest
     public void testSetCurrentTab() {
         TabHostStubActivity activity = getActivity();
@@ -133,13 +95,6 @@
         assertFalse(tabWidget.getChildAt(1).isFocused());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "focusCurrentTab",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for focusCurrentTab() is incomplete." +
-            " not clear what is supposed to happen if a wrong index passed to this method.")
     @UiThreadTest
     public void testFocusCurrentTab() {
         TabHostStubActivity activity = getActivity();
@@ -183,11 +138,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setEnabled",
-        args = {boolean.class}
-    )
     public void testSetEnabled() {
         TabWidget tabWidget = new TabWidget(mActivity);
         tabWidget.addView(new TextView(mActivity));
@@ -207,17 +157,6 @@
         assertTrue(tabWidget.getChildAt(1).isEnabled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addView",
-        args = {android.view.View.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for addView() is incomplete." +
-            "1. not clear what is supposed to happen if child is null." +
-            "2. not clear what is supposed to happen if child is a kind of AdapterView." +
-            "3. In javadoc, it says that the default parameters are set on the child " +
-            "   if no layout parameters are already set on the child, but the default width " +
-            "   and weight is not equals what returned from generateDefaultLayoutParams().")
     public void testAddView() {
         MockTabWidget mockTabWidget = new MockTabWidget(mActivity);
 
@@ -255,20 +194,10 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onFocusChange",
-        args = {android.view.View.class, boolean.class}
-    )
     public void testOnFocusChange() {
         // onFocusChange() is implementation details, do NOT test
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onSizeChanged",
-        args = {int.class, int.class, int.class, int.class}
-    )
     public void testOnSizeChanged() {
         // implementation details
     }
diff --git a/tests/tests/widget/src/android/widget/cts/TableLayoutTest.java b/tests/tests/widget/src/android/widget/cts/TableLayoutTest.java
index 8214102..ea84071 100644
--- a/tests/tests/widget/src/android/widget/cts/TableLayoutTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TableLayoutTest.java
@@ -18,11 +18,6 @@
 
 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 android.content.Context;
 import android.content.res.XmlResourceParser;
@@ -44,7 +39,6 @@
 /**
  * Test {@link TableLayout}.
  */
-@TestTargetClass(TableLayout.class)
 public class TableLayoutTest extends ActivityInstrumentationTestCase2<TableStubActivity> {
     private Context mContext;
 
@@ -58,20 +52,6 @@
         mContext = getInstrumentation().getContext();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link TableLayout}",
-            method = "TableLayout",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link TableLayout}",
-            method = "TableLayout",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        )
-    })
     @UiThreadTest
     public void testConstructor() {
         new TableLayout(mContext);
@@ -90,12 +70,6 @@
         assertTrue(tableLayout.isColumnShrinkable(1));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test setOnHierarchyChangeListener(OnHierarchyChangeListener listener)",
-        method = "setOnHierarchyChangeListener",
-        args = {android.view.ViewGroup.OnHierarchyChangeListener.class}
-    )
     public void testSetOnHierarchyChangeListener() {
         TableLayout tableLayout = new TableLayout(mContext);
 
@@ -116,12 +90,6 @@
         assertFalse(listener.hasCalledOnChildViewRemoved());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test requestLayout()",
-        method = "requestLayout",
-        args = {}
-    )
     public void testRequestLayout() {
         TableLayout tableLayout = new TableLayout(mContext);
         tableLayout.addView(new TextView(mContext));
@@ -137,20 +105,6 @@
         assertTrue(tableLayout.getChildAt(1).isLayoutRequested());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods which access ShrinkAllColumns",
-            method = "isShrinkAllColumns",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods which access ShrinkAllColumns",
-            method = "setShrinkAllColumns",
-            args = {boolean.class}
-        )
-    })
     public void testAccessShrinkAllColumns() {
         TableLayout tableLayout = new TableLayout(mContext);
         assertFalse(tableLayout.isShrinkAllColumns());
@@ -161,20 +115,6 @@
         assertFalse(tableLayout.isShrinkAllColumns());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods which access StretchAllColumns",
-            method = "isStretchAllColumns",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods which access StretchAllColumns",
-            method = "setStretchAllColumns",
-            args = {boolean.class}
-        )
-    })
     public void testAccessStretchAllColumns() {
         TableLayout tableLayout = new TableLayout(mContext);
         assertFalse(tableLayout.isStretchAllColumns());
@@ -185,20 +125,6 @@
         assertFalse(tableLayout.isStretchAllColumns());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods which access ColumnCollapsed",
-            method = "isColumnCollapsed",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods which access ColumnCollapsed",
-            method = "setColumnCollapsed",
-            args = {int.class, boolean.class}
-        )
-    })
     public void testAccessColumnCollapsed() {
         TableLayout tableLayout = new TableLayout(mContext);
         tableLayout.addView(new TextView(mContext));
@@ -237,20 +163,6 @@
         assertTrue(tableLayout.getChildAt(1).isLayoutRequested());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods which access ColumnStretchable",
-            method = "isColumnStretchable",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods which access ColumnStretchable",
-            method = "setColumnStretchable",
-            args = {int.class, boolean.class}
-        )
-    })
     public void testAccessColumnStretchable() {
         TableLayout tableLayout = new TableLayout(mContext);
         tableLayout.addView(new TableRow(mContext));
@@ -290,22 +202,6 @@
 
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test whether columns are actually stretched",
-            method = "setColumnStretchable",
-            args = {java.lang.Integer.class, java.lang.Boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test whether columns are actually stretched",
-            method = "setStretchAllColumns",
-            args = {java.lang.Boolean.class}
-        )
-    })
-    @ToBeFixed( bug = "", explanation = "After set a column unable to be stretched," +
-            " the other strtchable columns are not strtched as much as available.")
     public void testColumnStretchableEffect() {
         final TableStubActivity activity = getActivity();
         getInstrumentation().runOnMainSync(new Runnable() {
@@ -439,20 +335,6 @@
         assertEquals(orignalWidth2, column2.getWidth());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods which access ColumnShrinkable",
-            method = "isColumnShrinkable",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test methods which access ColumnShrinkable",
-            method = "setColumnShrinkable",
-            args = {int.class, boolean.class}
-        )
-    })
     public void testAccessColumnShrinkable() {
         TableLayout tableLayout = new TableLayout(mContext);
         tableLayout.addView(new TableRow(mContext));
@@ -491,13 +373,6 @@
         assertTrue(tableLayout.getChildAt(1).isLayoutRequested());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test addView(View child)",
-        method = "addView",
-        args = {android.view.View.class}
-    )
-    @ToBeFixed( bug = "1417734", explanation = "NullPointerException issue")
     public void testAddView1() {
         TableLayout tableLayout = new TableLayout(mContext);
 
@@ -534,14 +409,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test addView(View child, int index)",
-        method = "addView",
-        args = {android.view.View.class, int.class}
-    )
-    @ToBeFixed( bug = "1417734", explanation = "IndexOutOfBoundsException and " +
-            "NullPointerException issue")
     public void testAddView2() {
         TableLayout tableLayout = new TableLayout(mContext);
 
@@ -583,13 +450,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test addView(View child, ViewGroup.LayoutParams params)",
-        method = "addView",
-        args = {android.view.View.class, android.view.ViewGroup.LayoutParams.class}
-    )
-    @ToBeFixed( bug = "1417734", explanation = "NullPointerException issue")
     public void testAddView3() {
         TableLayout tableLayout = new TableLayout(mContext);
 
@@ -628,14 +488,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test addView(View child, int index, ViewGroup.LayoutParams params)",
-        method = "addView",
-        args = {android.view.View.class, int.class, android.view.ViewGroup.LayoutParams.class}
-    )
-    @ToBeFixed( bug = "1417734", explanation = "IndexOutOfBoundsException and " +
-            "NullPointerException issue")
     public void testAddView4() {
         TableLayout tableLayout = new TableLayout(mContext);
 
@@ -699,12 +551,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test generateLayoutParams(AttributeSet attrs)",
-        method = "generateLayoutParams",
-        args = {android.util.AttributeSet.class}
-    )
     public void testGenerateLayoutParams1() {
         TableLayout tableLayout = new TableLayout(mContext);
 
@@ -717,12 +563,6 @@
         assertNotNull(tableLayout.generateLayoutParams((AttributeSet) null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test checkLayoutParams(ViewGroup.LayoutParams p)",
-        method = "checkLayoutParams",
-        args = {android.view.ViewGroup.LayoutParams.class}
-    )
     public void testCheckLayoutParams() {
         MockTableLayout mockTableLayout = new MockTableLayout(mContext);
 
@@ -735,12 +575,6 @@
         assertFalse(mockTableLayout.checkLayoutParams(null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test generateDefaultLayoutParams()",
-        method = "generateDefaultLayoutParams",
-        args = {}
-    )
     public void testGenerateDefaultLayoutParams() {
         MockTableLayout mockTableLayout = new MockTableLayout(mContext);
 
@@ -749,13 +583,6 @@
         assertTrue(layoutParams instanceof TableLayout.LayoutParams);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test generateLayoutParams(ViewGroup.LayoutParams p)",
-        method = "generateLayoutParams",
-        args = {android.view.ViewGroup.LayoutParams.class}
-    )
-    @ToBeFixed( bug = "1417734", explanation = "NullPointerException issue")
     public void testGenerateLayoutParams2() {
         MockTableLayout mockTableLayout = new MockTableLayout(mContext);
 
@@ -773,28 +600,12 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test onLayout(boolean changed, int l, int t, int r, int b)",
-        method = "onLayout",
-        args = {boolean.class, int.class, int.class, int.class, int.class}
-    )
-    @ToBeFixed( bug = "1400249", explanation = "hard to do unit test," +
-            " will be tested by functional test.")
     public void testOnLayout() {
         MockTableLayout mockTableLayout = new MockTableLayout(mContext);
 
         mockTableLayout.onLayout(false, 0, 0, 20, 20);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test onMeasure(int widthMeasureSpec, int heightMeasureSpec)",
-        method = "onMeasure",
-        args = {int.class, int.class}
-    )
-    @ToBeFixed( bug = "1400249", explanation = "hard to do unit test," +
-            " will be tested by functional test.")
     public void testOnMeasure() {
         MockTableLayout mockTableLayout = new MockTableLayout(mContext);
 
diff --git a/tests/tests/widget/src/android/widget/cts/TableLayout_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/TableLayout_LayoutParamsTest.java
index 43e7793..d63979a 100644
--- a/tests/tests/widget/src/android/widget/cts/TableLayout_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TableLayout_LayoutParamsTest.java
@@ -27,18 +27,12 @@
 import com.android.internal.R;
 import com.android.internal.util.XmlUtils;
 
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
 import org.xmlpull.v1.XmlPullParser;
 
 /**
  * Test {@link TableLayout.LayoutParams}.
  */
-@TestTargetClass(TableLayout.LayoutParams.class)
 public class TableLayout_LayoutParamsTest extends InstrumentationTestCase {
     private Context mTargetContext;
 
@@ -48,44 +42,6 @@
         mTargetContext = getInstrumentation().getTargetContext();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link TableLayout.LayoutParams}.",
-            method = "TableLayout.LayoutParams",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link TableLayout.LayoutParams}.",
-            method = "TableLayout.LayoutParams",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link TableLayout.LayoutParams}.",
-            method = "TableLayout.LayoutParams",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link TableLayout.LayoutParams}.",
-            method = "TableLayout.LayoutParams",
-            args = {int.class, int.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link TableLayout.LayoutParams}.",
-            method = "TableLayout.LayoutParams",
-            args = {android.view.ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link TableLayout.LayoutParams}.",
-            method = "TableLayout.LayoutParams",
-            args = {android.view.ViewGroup.MarginLayoutParams.class}
-        )
-    })
     public void testConstructor() {
         new TableLayout.LayoutParams(mTargetContext, null);
 
@@ -111,13 +67,6 @@
         assertEquals(300, layoutParams.height);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test setBaseAttributes(TypedArray a, int widthAttr, int heightAttr)",
-        method = "setBaseAttributes",
-        args = {android.content.res.TypedArray.class, int.class, int.class}
-    )
-    @ToBeFixed( bug = "1417734", explanation = "NullPointerException issue")
     public void testSetBaseAttributes() {
         MockTableLayout_LayoutParams mockLayoutParams = new MockTableLayout_LayoutParams(200, 300);
         assertEquals(TableLayout.LayoutParams.MATCH_PARENT, mockLayoutParams.width);
diff --git a/tests/tests/widget/src/android/widget/cts/TableRowTest.java b/tests/tests/widget/src/android/widget/cts/TableRowTest.java
index c12722c..9ab4d13 100644
--- a/tests/tests/widget/src/android/widget/cts/TableRowTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TableRowTest.java
@@ -35,16 +35,10 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
 /**
  * Test {@link TableRow}.
  */
-@TestTargetClass(TableRow.class)
 public class TableRowTest extends ActivityInstrumentationTestCase2<TableStubActivity> {
     Context mContext;
     Context mTargetContext;
@@ -60,32 +54,12 @@
         mTargetContext = getInstrumentation().getTargetContext();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link TableRow}.",
-            method = "TableRow",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link TableRow}.",
-            method = "TableRow",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        )
-    })
     public void testConstructor() {
         new TableRow(mContext);
 
         new TableRow(mContext, null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test setOnHierarchyChangeListener(OnHierarchyChangeListener listener)",
-        method = "setOnHierarchyChangeListener",
-        args = {android.view.ViewGroup.OnHierarchyChangeListener.class}
-    )
     public void testSetOnHierarchyChangeListener() {
         TableRow tableRow = new TableRow(mContext);
 
@@ -106,12 +80,6 @@
         assertFalse(listener.hasCalledOnChildViewRemoved());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getVirtualChildAt(int i)",
-        method = "getVirtualChildAt",
-        args = {int.class}
-    )
     @UiThreadTest
     public void testGetVirtualChildAt() {
         TableStubActivity activity = getActivity();
@@ -143,12 +111,6 @@
                 ((TextView) tableRow.getVirtualChildAt(4)).getText().toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test getVirtualChildCount()",
-        method = "getVirtualChildCount",
-        args = {}
-    )
     @UiThreadTest
     public void testGetVirtualChildCount() {
         TableStubActivity activity = getActivity();
@@ -166,12 +128,6 @@
         assertEquals(5, tableRow.getVirtualChildCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test generateLayoutParams(AttributeSet attrs)",
-        method = "generateLayoutParams",
-        args = {android.util.AttributeSet.class}
-    )
     public void testGenerateLayoutParams() {
         TableRow tableRow = new TableRow(mContext);
 
@@ -184,12 +140,6 @@
         assertNotNull(tableRow.generateLayoutParams((AttributeSet) null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test checkLayoutParams(ViewGroup.LayoutParams p)",
-        method = "checkLayoutParams",
-        args = {android.view.ViewGroup.LayoutParams.class}
-    )
     public void testCheckLayoutParams() {
         MockTableRow mockTableRow = new MockTableRow(mContext);
 
@@ -202,12 +152,6 @@
         assertFalse(mockTableRow.checkLayoutParams(null));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test generateDefaultLayoutParams()",
-        method = "generateDefaultLayoutParams",
-        args = {}
-    )
     public void testGenerateDefaultLayoutParams() {
         MockTableRow mockTableRow = new MockTableRow(mContext);
 
@@ -216,13 +160,6 @@
         assertTrue(layoutParams instanceof TableRow.LayoutParams);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test generateLayoutParams(ViewGroup.LayoutParams p)",
-        method = "generateLayoutParams",
-        args = {android.view.ViewGroup.LayoutParams.class}
-    )
-    @ToBeFixed( bug = "1417734", explanation = "NullPointerException issue")
     public void testGenerateLayoutParams2() {
         MockTableRow mockTableRow = new MockTableRow(mContext);
 
@@ -240,28 +177,12 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test onLayout(boolean changed, int l, int t, int r, int b)",
-        method = "onLayout",
-        args = {boolean.class, int.class, int.class, int.class, int.class}
-    )
-    @ToBeFixed( bug = "1400249", explanation = "hard to do unit test," +
-            " will be tested by functional test.")
     public void testOnLayout() {
         MockTableRow mockTableRow = new MockTableRow(mContext);
 
         mockTableRow.onLayout(false, 0, 0, 200, 300);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test onMeasure(int widthMeasureSpec, int heightMeasureSpec)",
-        method = "onMeasure",
-        args = {int.class, int.class}
-    )
-    @ToBeFixed( bug = "1400249", explanation = "hard to do unit test," +
-            " will be tested by functional test.")
     public void testOnMeasure() {
         MockTableRow mockTableRow = new MockTableRow(mContext);
 
diff --git a/tests/tests/widget/src/android/widget/cts/TableRow_LayoutParamsTest.java b/tests/tests/widget/src/android/widget/cts/TableRow_LayoutParamsTest.java
index 4fc7baf..1d6793f 100644
--- a/tests/tests/widget/src/android/widget/cts/TableRow_LayoutParamsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TableRow_LayoutParamsTest.java
@@ -32,18 +32,12 @@
 import com.android.internal.R;
 import com.android.internal.util.XmlUtils;
 
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
 import org.xmlpull.v1.XmlPullParser;
 
 /**
  * Test {@link TableRow.LayoutParams}.
  */
-@TestTargetClass(TableRow.LayoutParams.class)
 public class TableRow_LayoutParamsTest
         extends ActivityInstrumentationTestCase2<TableStubActivity> {
     Context mTargetContext;
@@ -58,50 +52,6 @@
         mTargetContext = getInstrumentation().getTargetContext();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link TableRow.LayoutParams}",
-            method = "TableRow.LayoutParams",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link TableRow.LayoutParams}",
-            method = "TableRow.LayoutParams",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link TableRow.LayoutParams}",
-            method = "TableRow.LayoutParams",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link TableRow.LayoutParams}",
-            method = "TableRow.LayoutParams",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link TableRow.LayoutParams}",
-            method = "TableRow.LayoutParams",
-            args = {int.class, int.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link TableRow.LayoutParams}",
-            method = "TableRow.LayoutParams",
-            args = {android.view.ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link TableRow.LayoutParams}",
-            method = "TableRow.LayoutParams",
-            args = {android.view.ViewGroup.MarginLayoutParams.class}
-        )
-    })
     @UiThreadTest
     public void testConstructor() {
         new TableRow.LayoutParams(mTargetContext, null);
@@ -160,14 +110,6 @@
      * setBaseAttributes(android.content.res.TypedArray, int, int)}
      * .
      */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test setBaseAttributes(TypedArray a, int widthAttr, int heightAttr)",
-        method = "setBaseAttributes",
-        args = {android.content.res.TypedArray.class, int.class, int.class}
-    )
-    @ToBeFixed( bug = "1417734", explanation = "NullPointerException and " +
-            "ArrayIndexOutOfBoundsException issue")
     public void testSetBaseAttributes() {
         MockTableRow_LayoutParams mockLayoutParams = new MockTableRow_LayoutParams(200, 300);
         assertEquals(200, mockLayoutParams.width);
diff --git a/tests/tests/widget/src/android/widget/cts/TextSwitcherTest.java b/tests/tests/widget/src/android/widget/cts/TextSwitcherTest.java
index 60595e0..7812807 100644
--- a/tests/tests/widget/src/android/widget/cts/TextSwitcherTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TextSwitcherTest.java
@@ -16,11 +16,6 @@
 
 package android.widget.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.content.Context;
 import android.test.InstrumentationTestCase;
@@ -32,7 +27,6 @@
 /**
  * Test {@link TextSwitcher}.
  */
-@TestTargetClass(TextSwitcher.class)
 public class TextSwitcherTest extends InstrumentationTestCase {
     private Context mContext;
 
@@ -51,29 +45,12 @@
         mContext = getInstrumentation().getContext();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "TextSwitcher",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "TextSwitcher",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        )
-    })
     public void testConstructor() {
         new TextSwitcher(mContext);
 
         new TextSwitcher(mContext, null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setText",
-        args = {java.lang.CharSequence.class}
-    )
     public void testSetText() {
         final String viewText1 = "Text 1";
         final String viewText2 = "Text 2";
@@ -113,11 +90,6 @@
         assertSame(tv2, textSwitcher.getCurrentView());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setCurrentText",
-        args = {java.lang.CharSequence.class}
-    )
     public void testSetCurrentText() {
         final String viewText1 = "Text 1";
         final String viewText2 = "Text 2";
@@ -158,13 +130,6 @@
         assertSame(tv1, textSwitcher.getCurrentView());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "addView",
-        args = {android.view.View.class, int.class, android.view.ViewGroup.LayoutParams.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "the javadoc for addView() is incomplete." +
-            "1. not clear what is supposed to happen if the LayoutParams is null.")
     public void testAddView() {
         TextSwitcher textSwitcher = new TextSwitcher(mContext);
 
diff --git a/tests/tests/widget/src/android/widget/cts/TextViewTest.java b/tests/tests/widget/src/android/widget/cts/TextViewTest.java
index c714d8a..12544b9 100755
--- a/tests/tests/widget/src/android/widget/cts/TextViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TextViewTest.java
@@ -21,11 +21,6 @@
 
 import android.graphics.Path;
 import android.graphics.RectF;
-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;
 
@@ -35,6 +30,7 @@
 import android.content.Intent;
 import android.content.res.ColorStateList;
 import android.content.res.Resources.NotFoundException;
+import android.cts.util.PollingCheck;
 import android.graphics.Bitmap;
 import android.graphics.Color;
 import android.graphics.Paint;
@@ -86,7 +82,6 @@
 import android.view.ContextMenu.ContextMenuInfo;
 import android.view.View.OnCreateContextMenuListener;
 import android.view.View.OnLongClickListener;
-import android.view.animation.cts.DelayedCheck;
 import android.view.inputmethod.BaseInputConnection;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.ExtractedText;
@@ -102,7 +97,6 @@
 /**
  * Test {@link TextView}.
  */
-@TestTargetClass(TextView.class)
 public class TextViewTest extends ActivityInstrumentationTestCase2<TextViewStubActivity> {
 
     private TextView mTextView;
@@ -127,23 +121,6 @@
         mInstrumentation = getInstrumentation();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "TextView",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "TextView",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "TextView",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
     public void testConstructor() {
         new TextView(mActivity);
 
@@ -152,18 +129,6 @@
         new TextView(mActivity, null, 0);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getText",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setText",
-            args = {java.lang.CharSequence.class}
-        )
-    })
     @UiThreadTest
     public void testAccessText() {
         TextView tv = findTextView(R.id.textview_text);
@@ -176,11 +141,6 @@
         assertEquals("", tv.getText().toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLineHeight",
-        args = {}
-    )
     public void testGetLineHeight() {
         mTextView = new TextView(mActivity);
         assertTrue(mTextView.getLineHeight() > 0);
@@ -189,11 +149,6 @@
         assertTrue(mTextView.getLineHeight() > 0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLayout",
-        args = {}
-    )
     public void testGetLayout() {
         mActivity.runOnUiThread(new Runnable() {
             public void run() {
@@ -217,18 +172,6 @@
         assertNotNull(mTextView.getLayout());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getKeyListener",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setKeyListener",
-            args = {android.text.method.KeyListener.class}
-        )
-    })
     public void testAccessKeyListener() {
         mActivity.runOnUiThread(new Runnable() {
             public void run() {
@@ -260,18 +203,6 @@
         assertSame(qwertyKeyListener, mTextView.getKeyListener());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setMovementMethod",
-            args = {android.text.method.MovementMethod.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getMovementMethod",
-            args = {}
-        )
-    })
     public void testAccessMovementMethod() {
         final CharSequence LONG_TEXT = "Scrolls the specified widget to the specified "
                 + "coordinates, except constrains the X scrolling position to the horizontal "
@@ -321,11 +252,6 @@
         assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText()));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "length",
-        args = {}
-    )
     @UiThreadTest
     public void testLength() {
         mTextView = findTextView(R.id.textview_text);
@@ -341,18 +267,6 @@
         assertEquals(0, mTextView.length());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setGravity",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getGravity",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testAccessGravity() {
         mActivity.setContentView(R.layout.textview_gravity);
@@ -396,18 +310,6 @@
         assertEquals(-1, mTextView.getGravity());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setAutoLinkMask",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getAutoLinkMask",
-            args = {}
-        )
-    })
     public void testAccessAutoLinkMask() {
         mTextView = findTextView(R.id.textview_text);
         final CharSequence text1 =
@@ -462,23 +364,6 @@
                 getAutoLinkMask(R.id.autolink_compound4));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTextSize",
-            args = {float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTextSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTextSize",
-            args = {int.class, float.class}
-        )
-    })
     public void testAccessTextSize() {
         DisplayMetrics metrics = mActivity.getResources().getDisplayMetrics();
 
@@ -505,31 +390,6 @@
                 mTextView.getTextSize(), 0.01f);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTextColor",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrentTextColor",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTextColors",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTextColor",
-            args = {android.content.res.ColorStateList.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, "
-            + "should add @throws clause into javadoc of "
-            + "TextView#setTextColor(ColorStateList) when param colors is null")
     public void testAccessTextColor() {
         mTextView = new TextView(mActivity);
 
@@ -562,14 +422,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        method = "getTextColor",
-        args = {android.content.Context.class, android.content.res.TypedArray.class, int.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, "
-            + "should add @throws clause into javadoc of "
-            + "TextView#getTextColor(Context, TypedArray, int) when param attrs is null")
     public void testGetTextColor() {
         // TODO: How to get a suitable TypedArray to test this method.
 
@@ -580,51 +432,12 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setHighlightColor",
-        args = {int.class}
-    )
-    @ToBeFixed(bug = "1386429", explanation = "No getter to check the value.")
     public void testSetHighlightColor() {
         mTextView = new TextView(mActivity);
 
         mTextView.setHighlightColor(0x00ff00ff);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setShadowLayer",
-            args = {float.class, float.class, float.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isPaddingOffsetRequired",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLeftPaddingOffset",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTopPaddingOffset",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRightPaddingOffset",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getBottomPaddingOffset",
-            args = {}
-        )
-    })
-    @ToBeFixed(bug = "1386429", explanation = "No getter to check the shaow color value.")
     public void testSetShadowLayer() {
         MockTextView textView = new MockTextView(mActivity);
 
@@ -653,11 +466,6 @@
         assertEquals(0, textView.getBottomPaddingOffset());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setSelectAllOnFocus",
-        args = {boolean.class}
-    )
     @UiThreadTest
     public void testSetSelectAllOnFocus() {
         mActivity.setContentView(R.layout.textview_selectallonfocus);
@@ -719,11 +527,6 @@
         assertEquals(0, mTextView.getSelectionEnd());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getPaint",
-        args = {}
-    )
     public void testGetPaint() {
         mTextView = new TextView(mActivity);
         TextPaint tp = mTextView.getPaint();
@@ -732,18 +535,6 @@
         assertEquals(mTextView.getPaintFlags(), tp.getFlags());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setLinksClickable",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLinksClickable",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testAccessLinksClickable() {
         mActivity.setContentView(R.layout.textview_hint_linksclickable_freezestext);
@@ -774,28 +565,6 @@
         assertTrue(mTextView.getMovementMethod() instanceof LinkMovementMethod);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setHintTextColor",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getHintTextColors",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrentHintTextColor",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setHintTextColor",
-            args = {android.content.res.ColorStateList.class}
-        )
-    })
     public void testAccessHintTextColor() {
         mTextView = new TextView(mActivity);
         // using int values
@@ -827,23 +596,6 @@
         assertEquals(mTextView.getCurrentTextColor(), mTextView.getCurrentHintTextColor());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setLinkTextColor",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLinkTextColors",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setLinkTextColor",
-            args = {android.content.res.ColorStateList.class}
-        )
-    })
     public void testAccessLinkTextColor() {
         mTextView = new TextView(mActivity);
         // normal
@@ -871,18 +623,6 @@
         assertEquals(Color.BLACK, mTextView.getPaint().linkColor);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPaintFlags",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPaintFlags",
-            args = {}
-        )
-    })
     public void testAccessPaintFlags() {
         mTextView = new TextView(mActivity);
         assertEquals(Paint.DEV_KERN_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG, mTextView.getPaintFlags());
@@ -896,38 +636,6 @@
                 mTextView.getPaintFlags());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setMinHeight",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setMaxHeight",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setHeight",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setMaxWidth",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setMinWidth",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setWidth",
-            args = {int.class}
-        )
-    })
     public void testHeightAndWidth() {
         mTextView = findTextView(R.id.textview_text);
         int originalWidth = mTextView.getWidth();
@@ -991,11 +699,6 @@
         assertEquals(originalWidth - 1, mTextView.getWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setMinEms",
-        args = {int.class}
-    )
     public void testSetMinEms() {
         mTextView = findTextView(R.id.textview_text);
         assertEquals(1, mTextView.getLineCount());
@@ -1010,11 +713,6 @@
         assertEquals(originalWidth, mTextView.getWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setMaxEms",
-        args = {int.class}
-    )
     public void testSetMaxEms() {
         mTextView = findTextView(R.id.textview_text);
         assertEquals(1, mTextView.getLineCount());
@@ -1031,11 +729,6 @@
                 mTextView.getWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setEms",
-        args = {int.class}
-    )
     public void testSetEms() {
         mTextView = findTextView(R.id.textview_text);
         assertEquals("check height", 1, mTextView.getLineCount());
@@ -1053,11 +746,6 @@
                 mTextView.getWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setLineSpacing",
-        args = {float.class, float.class}
-    )
     public void testSetLineSpacing() {
         mTextView = new TextView(mActivity);
         int originalLineHeight = mTextView.getLineHeight();
@@ -1099,34 +787,10 @@
         assertEquals(FastMath.round(expected), mTextView.getLineHeight());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onSaveInstanceState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onRestoreInstanceState",
-            args = {android.os.Parcelable.class}
-        )
-    })
     public void testInstanceState() {
         // Do not test. Implementation details.
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "setFreezesText",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.PARTIAL_COMPLETE,
-            method = "getFreezesText",
-            args = {}
-        )
-    })
     public void testAccessFreezesText() throws Throwable {
         layout(R.layout.textview_hint_linksclickable_freezestext);
 
@@ -1209,15 +873,6 @@
         assertEquals(text.toString(), mTextView.getText().toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setEditableFactory",
-        args = {android.text.Editable.Factory.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, "
-            + "should add @throws clause into javadoc of "
-            + "TextView#setEditableFactory(android.text.Editable.Factory) "
-            + "when param factory is null")
     public void testSetEditableFactory() {
         mTextView = new TextView(mActivity);
         String text = "sample";
@@ -1254,15 +909,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setSpannableFactory",
-        args = {android.text.Spannable.Factory.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, "
-            + "should add @throws clause into javadoc of "
-            + "TextView#setSpannableFactory(android.text.Spannable.Factory) "
-            + "when param factory is null")
     public void testSetSpannableFactory() {
         mTextView = new TextView(mActivity);
         String text = "sample";
@@ -1299,18 +945,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addTextChangedListener",
-            args = {android.text.TextWatcher.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeTextChangedListener",
-            args = {android.text.TextWatcher.class}
-        )
-    })
     public void testTextChangedListener() {
         mTextView = new TextView(mActivity);
         MockTextWatcher watcher0 = new MockTextWatcher();
@@ -1375,11 +1009,6 @@
         assertFalse(watcher1.hasCalledAfterTextChanged());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setTextKeepState",
-        args = {java.lang.CharSequence.class}
-    )
     public void testSetTextKeepState1() {
         mTextView = new TextView(mActivity);
 
@@ -1428,11 +1057,6 @@
         assertEquals(shortString.length(), mTextView.getSelectionEnd());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getEditableText",
-        args = {}
-    )
     @UiThreadTest
     public void testGetEditableText() {
         TextView tv = findTextView(R.id.textview_text);
@@ -1459,16 +1083,7 @@
         assertNull(tv.getEditableText());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setText",
-        args = {char[].class, int.class, int.class}
-    )
     @UiThreadTest
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, "
-            + "should add @throws clause into javadoc of "
-            + "TextView#setText(char[], int, int) when param start or len makes "
-            + "the index out of bounds")
     public void testSetText2() {
         String string = "This is a test for setting text content by char array";
         char[] input = string.toCharArray();
@@ -1502,18 +1117,6 @@
         assertEquals("", tv.getText().toString());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setText",
-            args = {java.lang.CharSequence.class, android.widget.TextView.BufferType.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTextKeepState",
-            args = {java.lang.CharSequence.class, android.widget.TextView.BufferType.class}
-        )
-    })
     @UiThreadTest
     public void testSetText1() {
         mTextView = findTextView(R.id.textview_text);
@@ -1613,15 +1216,7 @@
         assertEquals(-1, mTextView.getSelectionEnd());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setText",
-        args = {int.class}
-    )
     @UiThreadTest
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, "
-            + "should add @throws clause into javadoc of "
-            + "TextView#setText(int) when param resid is illegal")
     public void testSetText3() {
         TextView tv = findTextView(R.id.textview_text);
 
@@ -1638,15 +1233,7 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setText",
-        args = {int.class, android.widget.TextView.BufferType.class}
-    )
     @UiThreadTest
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, "
-            + "should add @throws clause into javadoc of "
-            + "TextView#setText(int, BufferType) when param resid is illegal")
     public void testSetText() {
         TextView tv = findTextView(R.id.textview_text);
 
@@ -1668,23 +1255,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setHint",
-            args = {java.lang.CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setHint",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getHint",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testAccessHint() {
         mActivity.setContentView(R.layout.textview_hint_linksclickable_freezestext);
@@ -1718,23 +1288,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getError",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setError",
-            args = {java.lang.CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setError",
-            args = {java.lang.CharSequence.class, android.graphics.drawable.Drawable.class}
-        )
-    })
     public void testAccessError() {
         mTextView = findTextView(R.id.textview_text);
         assertNull(mTextView.getError());
@@ -1802,21 +1355,6 @@
         assertNull(mTextView.getError());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setFilters",
-            args = {android.text.InputFilter[].class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getFilters",
-            args = {}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, "
-            + "should add @throws clause into javadoc of "
-            + "TextView#setFilters(InputFilter[]) when param filters is null")
     public void testAccessFilters() {
         final InputFilter[] expected = { new InputFilter.AllCaps(),
                 new InputFilter.LengthFilter(2) };
@@ -1853,14 +1391,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getFocusedRect",
-        args = {android.graphics.Rect.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete,"
-            + "should add @throws clause into javadoc of "
-            + "TextView#getFocusedRect(Rect) when param rect is null")
     public void testGetFocusedRect() {
         Rect rc = new Rect();
 
@@ -1964,11 +1494,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLineCount",
-        args = {}
-    )
     public void testGetLineCount() {
         mTextView = findTextView(R.id.textview_text);
         // this is an one line text with default setting.
@@ -1992,11 +1517,6 @@
         assertEquals(0, mTextView.getLineCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getLineBounds",
-        args = {int.class, android.graphics.Rect.class}
-    )
     public void testGetLineBounds() {
         Rect rc = new Rect();
         mTextView = new TextView(mActivity);
@@ -2031,11 +1551,6 @@
         assertEquals(mTextView.getHeight() - mTextView.getTotalPaddingBottom(), rc.bottom);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getBaseline",
-        args = {}
-    )
     public void testGetBaseLine() {
         mTextView = new TextView(mActivity);
         assertEquals(-1, mTextView.getBaseline());
@@ -2054,18 +1569,6 @@
         assertEquals(expected, mTextView.getBaseline());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyDown",
-            args = {int.class, android.view.KeyEvent.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onKeyUp",
-            args = {int.class, android.view.KeyEvent.class}
-        )
-    })
     public void testPressKey() {
         final QwertyKeyListener qwertyKeyListener
                 = QwertyKeyListener.getInstance(false, Capitalize.NONE);
@@ -2087,11 +1590,6 @@
         assertEquals("a", mTextView.getText().toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setIncludeFontPadding",
-        args = {boolean.class}
-    )
     public void testSetIncludeFontPadding() {
         mTextView = findTextView(R.id.textview_text);
         mActivity.runOnUiThread(new Runnable() {
@@ -2114,18 +1612,6 @@
         assertTrue(mTextView.getHeight() < oldHeight);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "computeScroll",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setScroller",
-            args = {android.widget.Scroller.class}
-        )
-    })
     public void testScroll() {
         mTextView = new TextView(mActivity);
 
@@ -2150,11 +1636,6 @@
         assertEquals(480, mTextView.getScrollY());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "debug",
-        args = {int.class}
-    )
     public void testDebug() {
         mTextView = new TextView(mActivity);
         mTextView.debug(0);
@@ -2164,23 +1645,6 @@
         mTextView.debug(1);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSelectionStart",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getSelectionEnd",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hasSelection",
-            args = {}
-        )
-    })
     public void testSelection() {
         mTextView = new TextView(mActivity);
         String text = "This is the content";
@@ -2205,18 +1669,6 @@
         assertTrue(mTextView.hasSelection());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setEllipsize",
-            args = {android.text.TextUtils.TruncateAt.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getEllipsize",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testAccessEllipsize() {
         mActivity.setContentView(R.layout.textview_ellipsize);
@@ -2257,12 +1709,6 @@
         // there is no method to check if '...yLongVeryLongWord' is painted in the screen.
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setCursorVisible",
-        args = {boolean.class}
-    )
-    @ToBeFixed(bug = "1386429", explanation="No getter to check the value.")
     public void testSetCursorVisible() {
         mTextView = new TextView(mActivity);
 
@@ -2270,56 +1716,26 @@
         mTextView.setCursorVisible(false);
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onWindowFocusChanged",
-        args = {boolean.class}
-    )
     public void testOnWindowFocusChanged() {
         // Do not test. Implementation details.
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onTouchEvent",
-        args = {android.view.MotionEvent.class}
-    )
     public void testOnTouchEvent() {
         // Do not test. Implementation details.
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onTrackballEvent",
-        args = {android.view.MotionEvent.class}
-    )
     public void testOnTrackballEvent() {
         // Do not test. Implementation details.
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        method = "getTextColors",
-        args = {android.content.Context.class, android.content.res.TypedArray.class}
-    )
     public void testGetTextColors() {
         // TODO: How to get a suitable TypedArray to test this method.
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onKeyShortcut",
-        args = {int.class, android.view.KeyEvent.class}
-    )
     public void testOnKeyShortcut() {
         // Do not test. Implementation details.
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "performLongClick",
-        args = {}
-    )
     @UiThreadTest
     public void testPerformLongClick() {
         mTextView = findTextView(R.id.textview_text);
@@ -2347,68 +1763,7 @@
         assertTrue(onCreateContextMenuListener.hasCreatedContextMenu());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getText",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrentHintTextColor",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrentTextColor",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLinkTextColors",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTextScaleX",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTextSize",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTypeface",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getHintTextColors",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTextScaleX",
-            args = {float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTypeface",
-            args = {android.graphics.Typeface.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTypeface",
-            args = {android.graphics.Typeface.class, int.class}
-        )
-    })
     @UiThreadTest
-    @ToBeFixed(bug = "1386429", explanation = "mTextView.getTypeface() will be null "
-            + "if typeface didn't be set or set to normal "
-            + "and style didn't set or set to normal in xml."
-            + "And there is no getter to check the highlight colour.")
     public void testTextAttr() {
         mTextView = findTextView(R.id.textview_textAttr);
         // getText
@@ -2465,24 +1820,7 @@
         assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "append",
-            args = {java.lang.CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "append",
-            args = {java.lang.CharSequence.class, int.class, int.class}
-        )
-    })
     @UiThreadTest
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, "
-            + "should add @throws clause into javadoc of "
-            + "TextView#append(CharSequence) when param text is null and should "
-            + "add @throws clause into javadoc of TextView#append(CharSequence, int, int) "
-            + "when param start or end is out of bounds")
     public void testAppend() {
         mTextView = new TextView(mActivity);
 
@@ -2529,18 +1867,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getTransformationMethod",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setTransformationMethod",
-            args = {android.text.method.TransformationMethod.class}
-        )
-    })
     public void testAccessTransformationMethod() {
         // check the password attribute in xml
         mTextView = findTextView(R.id.textview_password);
@@ -2580,7 +1906,7 @@
         mInstrumentation.waitForIdleSync();
 
         // it will get transformed after a while
-        new DelayedCheck(TIMEOUT) {
+        new PollingCheck(TIMEOUT) {
             @Override
             protected boolean check() {
                 // "******"
@@ -2599,58 +1925,6 @@
         assertNull(mTextView.getTransformationMethod());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setCompoundDrawablePadding",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setCompoundDrawables",
-            args = {Drawable.class, Drawable.class, Drawable.class, Drawable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setCompoundDrawablesWithIntrinsicBounds",
-            args = {Drawable.class, Drawable.class, Drawable.class, Drawable.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setCompoundDrawablesWithIntrinsicBounds",
-            args = {int.class, int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCompoundDrawablePadding",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCompoundDrawables",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCompoundPaddingBottom",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCompoundPaddingLeft",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCompoundPaddingRight",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCompoundPaddingTop",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testCompound() {
         mTextView = new TextView(mActivity);
@@ -2735,18 +2009,6 @@
         assertEquals(mTextView.getPaddingBottom(), mTextView.getCompoundPaddingBottom());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSingleLine",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSingleLine",
-            args = {boolean.class}
-        )
-    })
     public void testSingleLine() {
         final TextView textView = new TextView(mActivity);
         setSpannableText(textView, "This is a really long sentence"
@@ -2796,11 +2058,6 @@
         assertEquals(singleLineWidth, textView.getLayout().getWidth());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setMaxLines",
-        args = {int.class}
-    )
     @UiThreadTest
     public void testSetMaxLines() {
         mTextView = findTextView(R.id.textview_text);
@@ -2824,14 +2081,7 @@
         assertTrue(mTextView.getHeight() <= maxLines * mTextView.getLineHeight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setMaxLines",
-        args = {int.class}
-    )
     @UiThreadTest
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, "
-            + "this method should not accept neagtive values as maximum line count")
     public void testSetMaxLinesException() {
         mTextView = new TextView(mActivity);
         mActivity.setContentView(mTextView);
@@ -2839,11 +2089,6 @@
         mTextView.setMaxLines(-1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setMinLines",
-        args = {int.class}
-    )
     public void testSetMinLines() {
         mTextView = findTextView(R.id.textview_text);
         setWidth(mTextView.getWidth() >> 3);
@@ -2857,11 +2102,6 @@
         assertTrue((originalLines + 1) * mTextView.getLineHeight() <= mTextView.getHeight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setLines",
-        args = {int.class}
-    )
     public void testSetLines() {
         mTextView = findTextView(R.id.textview_text);
         // make it multiple lines
@@ -2875,14 +2115,7 @@
         assertTrue((originalLines + 1) * mTextView.getLineHeight() <= mTextView.getHeight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setLines",
-        args = {int.class}
-    )
     @UiThreadTest
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, "
-            + "this method should not accept neagtive values as maximum line count")
     public void testSetLinesException() {
         mTextView = new TextView(mActivity);
         mActivity.setContentView(mTextView);
@@ -2890,11 +2123,6 @@
         mTextView.setLines(-1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getExtendedPaddingTop",
-        args = {}
-    )
     @UiThreadTest
     public void testGetExtendedPaddingTop() {
         mTextView = findTextView(R.id.textview_text);
@@ -2914,11 +2142,6 @@
         assertTrue(mTextView.getExtendedPaddingTop() > 0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getExtendedPaddingBottom",
-        args = {}
-    )
     @UiThreadTest
     public void testGetExtendedPaddingBottom() {
         mTextView = findTextView(R.id.textview_text);
@@ -2938,11 +2161,6 @@
         assertTrue(mTextView.getExtendedPaddingBottom() > 0);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getTotalPaddingTop",
-        args = {}
-    )
     public void testGetTotalPaddingTop() {
         mTextView = findTextView(R.id.textview_text);
         // Initialized value
@@ -2969,11 +2187,6 @@
         assertEquals(expected, mTextView.getTotalPaddingTop());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getTotalPaddingBottom",
-        args = {}
-    )
     public void testGetTotalPaddingBottom() {
         mTextView = findTextView(R.id.textview_text);
         // Initialized value
@@ -3002,11 +2215,6 @@
         assertEquals(expected, mTextView.getTotalPaddingBottom());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getTotalPaddingLeft",
-        args = {}
-    )
     @UiThreadTest
     public void testGetTotalPaddingLeft() {
         mTextView = findTextView(R.id.textview_text);
@@ -3025,11 +2233,6 @@
         assertEquals(mTextView.getCompoundPaddingLeft(), mTextView.getTotalPaddingLeft());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getTotalPaddingRight",
-        args = {}
-    )
     @UiThreadTest
     public void testGetTotalPaddingRight() {
         mTextView = findTextView(R.id.textview_text);
@@ -3048,11 +2251,6 @@
         assertEquals(mTextView.getCompoundPaddingRight(), mTextView.getTotalPaddingRight());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getUrls",
-        args = {}
-    )
     public void testGetUrls() {
         mTextView = new TextView(mActivity);
 
@@ -3084,11 +2282,6 @@
         assertEquals(2, spans.length);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setPadding",
-        args = {int.class, int.class, int.class, int.class}
-    )
     public void testSetPadding() {
         mTextView = new TextView(mActivity);
 
@@ -3105,13 +2298,6 @@
         assertEquals(40, mTextView.getPaddingBottom());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setTextAppearance",
-        args = {android.content.Context.class, int.class}
-    )
-    @ToBeFixed(bug = "1386429", explanation = "There is no getter to check "
-            + "the Highlight color value.")
     public void testSetTextAppearance() {
         mTextView = new TextView(mActivity);
 
@@ -3141,20 +2327,10 @@
         assertEquals(null, mTextView.getTypeface());
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onPreDraw",
-        args = {}
-    )
     public void testOnPreDraw() {
         // Do not test. Implementation details.
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setHorizontallyScrolling",
-        args = {boolean.class}
-    )
     public void testSetHorizontallyScrolling() {
         // make the text view has more than one line
         mTextView = findTextView(R.id.textview_text);
@@ -3168,11 +2344,6 @@
         assertTrue(mTextView.getLineCount() > 1);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "computeHorizontalScrollRange",
-        args = {}
-    )
     public void testComputeHorizontalScrollRange() {
         MockTextView textView = new MockTextView(mActivity);
         // test when layout is null
@@ -3187,11 +2358,6 @@
         assertEquals(textView.getLayout().getWidth(), textView.computeHorizontalScrollRange());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "computeVerticalScrollRange",
-        args = {}
-    )
     public void testComputeVerticalScrollRange() {
         MockTextView textView = new MockTextView(mActivity);
         // test when layout is null
@@ -3206,11 +2372,6 @@
         assertEquals(textView.getLayout().getHeight(), textView.computeVerticalScrollRange());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "drawableStateChanged",
-        args = {}
-    )
     public void testDrawableStateChanged() {
         MockTextView textView = new MockTextView(mActivity);
 
@@ -3219,12 +2380,6 @@
         assertTrue(textView.hasCalledDrawableStateChanged());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "This method always returns false.",
-        method = "getDefaultEditable",
-        args = {}
-    )
     public void testGetDefaultEditable() {
         MockTextView textView = new MockTextView(mActivity);
 
@@ -3232,12 +2387,6 @@
         assertFalse(textView.getDefaultEditable());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "This method always returns null.",
-        method = "getDefaultMovementMethod",
-        args = {}
-    )
     public void testGetDefaultMovementMethod() {
         MockTextView textView = new MockTextView(mActivity);
 
@@ -3245,65 +2394,30 @@
         assertNull(textView.getDefaultMovementMethod());
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onCreateContextMenu",
-        args = {android.view.ContextMenu.class}
-    )
     public void testOnCreateContextMenu() {
         // Do not test. Implementation details.
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onDetachedFromWindow",
-        args = {}
-    )
     public void testOnDetachedFromWindow() {
         // Do not test. Implementation details.
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onDraw",
-        args = {android.graphics.Canvas.class}
-    )
     public void testOnDraw() {
         // Do not test. Implementation details.
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onFocusChanged",
-        args = {boolean.class, int.class, android.graphics.Rect.class}
-    )
     public void testOnFocusChanged() {
         // Do not test. Implementation details.
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onMeasure",
-        args = {int.class, int.class}
-    )
     public void testOnMeasure() {
         // Do not test. Implementation details.
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onTextChanged",
-        args = {java.lang.CharSequence.class, int.class, int.class, int.class}
-    )
     public void testOnTextChanged() {
         // Do not test. Implementation details.
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setFrame",
-        args = {int.class, int.class, int.class, int.class}
-    )
     public void testSetFrame() {
         MockTextView textView = new MockTextView(mActivity);
 
@@ -3325,18 +2439,6 @@
         assertEquals(-1, textView.getFrameBottom());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRightFadingEdgeStrength",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLeftFadingEdgeStrength",
-            args = {}
-        )
-    })
     public void testGetFadingEdgeStrength() {
         final MockTextView textViewLeft = (MockTextView) mActivity.findViewById(
                 R.id.mock_textview_left);
@@ -3376,28 +2478,6 @@
         assertEquals(1.0f, textViewCenter.getRightFadingEdgeStrength(), 0.01f);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getRightFadingEdgeStrength",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getLeftFadingEdgeStrength",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setMarqueeRepeatLimit",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setSelected",
-            args = {boolean.class}
-        )
-    })
 
     public void testMarquee() {
         final MockTextView textView = new MockTextView(mActivity);
@@ -3432,7 +2512,7 @@
 
         // wait for the marquee to run
         // fading is shown on both sides if the marquee runs for a while
-        new DelayedCheck(TIMEOUT) {
+        new PollingCheck(TIMEOUT) {
             @Override
             protected boolean check() {
                 return textView.getLeftFadingEdgeStrength() > 0.0f
@@ -3446,7 +2526,7 @@
         // wait for the marquee to continue
         // the left fading becomes thicker while the right fading becomes thiner
         // as the text moves towards left
-        new DelayedCheck(TIMEOUT) {
+        new PollingCheck(TIMEOUT) {
             @Override
             protected boolean check() {
                 return leftFadingEdgeStrength < textView.getLeftFadingEdgeStrength()
@@ -3494,29 +2574,10 @@
         assertTrue(textView.getRightFadingEdgeStrength() > 0.0f);
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onKeyMultiple",
-        args = {int.class, int.class, android.view.KeyEvent.class}
-    )
     public void testOnKeyMultiple() {
         // Do not test. Implementation details.
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setInputExtras",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInputExtras",
-            args = {boolean.class}
-        )
-    })
-    @ToBeFixed(bug = "1569298", explanation = "NullPointerException occurs when we call "
-            + "android.widget.TextView#setInputExtras(int xmlResId)")
     public void testAccessInputExtras() throws XmlPullParserException, IOException {
         TextView textView = new TextView(mActivity);
         textView.setText(null, BufferType.EDITABLE);
@@ -3540,18 +2601,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setInputType",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInputType",
-            args = {}
-        )
-    })
     public void testAccessContentType() {
         TextView textView = new TextView(mActivity);
         textView.setText(null, BufferType.EDITABLE);
@@ -3626,18 +2675,6 @@
         assertTrue(textView.getKeyListener() instanceof TextKeyListener);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInputType",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setRawInputType",
-            args = {int.class}
-        )
-    })
     public void testAccessRawContentType() {
         TextView textView = new TextView(mActivity);
         textView.setText(null, BufferType.EDITABLE);
@@ -3716,81 +2753,14 @@
         assertNull(textView.getKeyListener());
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onPrivateIMECommand",
-        args = {String.class, Bundle.class}
-    )
     public void testOnPrivateIMECommand() {
         // Do not test. Implementation details.
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onAttachedToWindow",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onBeginBatchEdit",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onCheckIsTextEditor",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onCommitCompletion",
-            args = {android.view.inputmethod.CompletionInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onCreateInputConnection",
-            args = {android.view.inputmethod.EditorInfo.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onEditorAction",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onEndBatchEdit",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onFinishTemporaryDetach",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onSelectionChanged",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onStartTemporaryDetach",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.NOT_NECESSARY,
-            method = "onTextContextMenuItem",
-            args = {int.class}
-        )
-    })
     public void testFoo() {
         // Do not test. Implementation details.
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "verifyDrawable",
-        args = {android.graphics.drawable.Drawable.class}
-    )
     public void testVerifyDrawable() {
         MockTextView textView = new MockTextView(mActivity);
 
@@ -3801,18 +2771,6 @@
         assertTrue(textView.verifyDrawable(d));
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setPrivateImeOptions",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getPrivateImeOptions",
-            args = {}
-        )
-    })
     public void testAccessPrivateImeOptions() {
         mTextView = findTextView(R.id.textview_text);
         assertNull(mTextView.getPrivateImeOptions());
@@ -3824,11 +2782,6 @@
         assertNull(mTextView.getPrivateImeOptions());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setOnEditorActionListener",
-        args = {android.widget.TextView.OnEditorActionListener.class}
-    )
     public void testSetOnEditorActionListener() {
         mTextView = findTextView(R.id.textview_text);
 
@@ -3842,18 +2795,6 @@
         assertTrue(listener.isOnEditorActionCalled());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setImeOptions",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getImeOptions",
-            args = {}
-        )
-    })
     public void testAccessImeOptions() {
         mTextView = findTextView(R.id.textview_text);
         assertEquals(EditorInfo.IME_NULL, mTextView.getImeOptions());
@@ -3868,23 +2809,6 @@
         assertEquals(EditorInfo.IME_NULL, mTextView.getImeOptions());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setImeActionLabel",
-            args = {java.lang.CharSequence.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getImeActionLabel",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getImeActionId",
-            args = {}
-        )
-    })
     public void testAccessImeActionLabel() {
         mTextView = findTextView(R.id.textview_text);
         assertNull(mTextView.getImeActionLabel());
@@ -3895,11 +2819,6 @@
         assertEquals(1, mTextView.getImeActionId());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setExtractedText",
-        args = {android.view.inputmethod.ExtractedText.class}
-    )
     @UiThreadTest
     public void testSetExtractedText() {
         mTextView = findTextView(R.id.textview_text);
@@ -3913,11 +2832,6 @@
         assertEquals("test", mTextView.getText().toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "moveCursorToVisibleOffset",
-        args = {}
-    )
     public void testMoveCursorToVisibleOffset() throws Throwable {
         mTextView = findTextView(R.id.textview_text);
 
@@ -3967,11 +2881,6 @@
         mInstrumentation.waitForIdleSync();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "isInputMethodTarget",
-        args = {}
-    )
     @UiThreadTest
     public void testIsInputMethodTarget() {
         mTextView = findTextView(R.id.textview_text);
@@ -3985,19 +2894,6 @@
         assertTrue(mTextView.isInputMethodTarget());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "beginBatchEdit",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "endBatchEdit",
-            args = {}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
     public void testBeginEndBatchEdit() {
         mTextView = findTextView(R.id.textview_text);
 
@@ -4005,12 +2901,6 @@
         mTextView.endBatchEdit();
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        notes = "it's hard to do unit test, should be tested by functional test",
-        method = "bringPointIntoView",
-        args = {int.class}
-    )
     @UiThreadTest
     public void testBringPointIntoView() throws Throwable {
         mTextView = findTextView(R.id.textview_text);
@@ -4020,23 +2910,12 @@
         assertFalse(mTextView.bringPointIntoView(2));
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        notes = "it's hard to do unit test, should be tested by functional test",
-        method = "cancelLongPress",
-        args = {}
-    )
     public void testCancelLongPress() {
         mTextView = findTextView(R.id.textview_text);
         TouchUtils.longClickView(this, mTextView);
         mTextView.cancelLongPress();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "clearComposingText",
-        args = {}
-    )
     @UiThreadTest
     public void testClearComposingText() {
         mTextView = findTextView(R.id.textview_text);
@@ -4055,12 +2934,6 @@
         assertEquals(-1, BaseInputConnection.getComposingSpanStart(text));
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_FEASIBLE,
-        notes = "it's hard to do unit test, should be tested by functional test",
-        method = "computeVerticalScrollExtent",
-        args = {}
-    )
     public void testComputeVerticalScrollExtent() {
         MockTextView textView = new MockTextView(mActivity);
         assertEquals(0, textView.computeVerticalScrollExtent());
@@ -4071,11 +2944,6 @@
         assertEquals(0, textView.computeVerticalScrollExtent());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "didTouchFocusSelect",
-        args = {}
-    )
     @UiThreadTest
     public void testDidTouchFocusSelect() {
         mTextView = new TextView(mActivity);
@@ -4086,14 +2954,6 @@
         assertTrue(mTextView.didTouchFocusSelect());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "extractText",
-        args = {android.view.inputmethod.ExtractedTextRequest.class,
-                android.view.inputmethod.ExtractedText.class}
-    )
-    @ToBeFixed(bug = "", explanation = "even the TextView did not contains editable content, " +
-            "it also returns true.")
     public void testExtractText() {
         mTextView = new TextView(mActivity);
 
diff --git a/tests/tests/widget/src/android/widget/cts/TextView_SaveStateTest.java b/tests/tests/widget/src/android/widget/cts/TextView_SaveStateTest.java
index 18e3066..801a6fd 100644
--- a/tests/tests/widget/src/android/widget/cts/TextView_SaveStateTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TextView_SaveStateTest.java
@@ -16,9 +16,6 @@
 
 package android.widget.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
 
 import android.os.Parcel;
 import android.test.InstrumentationTestCase;
@@ -29,13 +26,7 @@
 /**
  * Test {@link TextView.SavedState}.
  */
-@TestTargetClass(TextView.SavedState.class)
 public class TextView_SaveStateTest extends InstrumentationTestCase {
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "toString",
-        args = {}
-    )
     public void testToString() {
         Parcel source = creatTestParcel(0, 0, true, "This is content");
         TextView.SavedState state = TextView.SavedState.CREATOR.createFromParcel(source);
@@ -48,11 +39,6 @@
         assertNotNull(state.toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "writeToParcel",
-        args = {android.os.Parcel.class, int.class}
-    )
     public void testWriteToParcel() {
         Parcel source = creatTestParcel(0, 0, true, "This is content");
         TextView.SavedState state = TextView.SavedState.CREATOR.createFromParcel(source);
diff --git a/tests/tests/widget/src/android/widget/cts/TimePickerTest.java b/tests/tests/widget/src/android/widget/cts/TimePickerTest.java
index 8287ae6..2ab01a3 100644
--- a/tests/tests/widget/src/android/widget/cts/TimePickerTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TimePickerTest.java
@@ -16,11 +16,6 @@
 
 package android.widget.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.app.Activity;
 import android.app.Instrumentation;
@@ -34,7 +29,6 @@
 /**
  * Test {@link TimePicker}.
  */
-@TestTargetClass(TimePicker.class)
 public class TimePickerTest extends ActivityInstrumentationTestCase2<StubActivity> {
     private TimePicker mTimePicker;
 
@@ -56,27 +50,6 @@
         mActivity = getActivity();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "TimePicker",
-            args = {Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "TimePicker",
-            args = {Context.class, AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "TimePicker",
-            args = {Context.class, AttributeSet.class, int.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete."
-            + " @throws clause should be added into javadoc of "
-            + "TimePicker#TimePicker(Context), TimePicker#TimePicker(Context, AttributeSet)"
-            + "and TimePicker#TimePicker(Context, AttributeSet, int) when param Context is null")
     public void testConstructors() {
         AttributeSet attrs =
             mContext.getResources().getLayout(com.android.cts.stub.R.layout.timepicker);
@@ -111,11 +84,6 @@
         new TimePicker(mContext, attrs, Integer.MIN_VALUE);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setEnabled",
-        args = {boolean.class}
-    )
     public void testSetEnabled() {
         mTimePicker = new TimePicker(mContext);
         assertTrue(mTimePicker.isEnabled());
@@ -127,11 +95,6 @@
         assertTrue(mTimePicker.isEnabled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setOnTimeChangedListener",
-        args = {OnTimeChangedListener.class}
-    )
     public void testSetOnTimeChangedListener() {
         int initialHour = 13;
         int initialMinute = 50;
@@ -173,19 +136,6 @@
         assertFalse(listener.hasCalledOnTimeChanged());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setCurrentHour",
-            args = {Integer.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrentHour",
-            args = {}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "setCurrentHour should be in range 0~23")
     public void testAccessCurrentHour() {
         mTimePicker = new TimePicker(mContext);
 
@@ -217,18 +167,6 @@
         assertEquals(Integer.valueOf(23), mTimePicker.getCurrentHour());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "is24HourView",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setIs24HourView",
-            args = {java.lang.Boolean.class}
-        )
-    })
     public void testAccessIs24HourView() {
         mTimePicker = new TimePicker(mContext);
         assertFalse(mTimePicker.is24HourView());
@@ -240,18 +178,6 @@
         assertFalse(mTimePicker.is24HourView());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setCurrentMinute",
-            args = {Integer.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getCurrentMinute",
-            args = {}
-        )
-    })
     public void testAccessCurrentMinute() {
         mTimePicker = new TimePicker(mContext);
 
@@ -268,28 +194,11 @@
         assertEquals(Integer.valueOf(59), mTimePicker.getCurrentMinute());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getBaseline",
-        args = {}
-    )
     public void testGetBaseline() {
         mTimePicker = new TimePicker(mContext);
         assertEquals(-1, mTimePicker.getBaseline());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onSaveInstanceState",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "onRestoreInstanceState",
-            args = {Parcelable.class}
-        )
-    })
     public void testOnSaveInstanceStateAndOnRestoreInstanceState() {
         MyTimePicker source = new MyTimePicker(mContext);
         MyTimePicker dest = new MyTimePicker(mContext);
diff --git a/tests/tests/widget/src/android/widget/cts/ToastTest.java b/tests/tests/widget/src/android/widget/cts/ToastTest.java
index c54b205..9586731 100644
--- a/tests/tests/widget/src/android/widget/cts/ToastTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ToastTest.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 android.app.Activity;
 import android.app.Instrumentation;
+import android.cts.util.PollingCheck;
 import android.graphics.drawable.Drawable;
 import android.os.SystemClock;
 import android.test.ActivityInstrumentationTestCase2;
@@ -33,11 +29,9 @@
 import android.view.Gravity;
 import android.view.View;
 import android.view.WindowManager;
-import android.view.animation.cts.DelayedCheck;
 import android.widget.ImageView;
 import android.widget.Toast;
 
-@TestTargetClass(android.widget.Toast.class)
 public class ToastTest extends ActivityInstrumentationTestCase2<StubActivity> {
     private static final String TEST_TOAST_TEXT = "test toast";
     private static final long TIME_FOR_UI_OPERATION  = 1000L;
@@ -59,13 +53,6 @@
         mToast = new Toast(mActivity);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "Toast",
-        args = {android.content.Context.class}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of " +
-            "Toast constructor when the input Context is null")
     public void testConstructor() {
         new Toast(mActivity);
 
@@ -78,7 +65,7 @@
     }
 
     private void assertShowToast(final View view) {
-        new DelayedCheck(TIME_OUT) {
+        new PollingCheck(TIME_OUT) {
             @Override
             protected boolean check() {
                 return null != view.getParent();
@@ -88,7 +75,7 @@
 
     private void assertShowAndHide(final View view) {
         assertShowToast(view);
-        new DelayedCheck(TIME_OUT) {
+        new PollingCheck(TIME_OUT) {
             @Override
             protected boolean check() {
                 return null == view.getParent();
@@ -102,11 +89,6 @@
         assertNull(view.getParent());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "show",
-        args = {}
-    )
     public void testShow() {
         mActivity.runOnUiThread(new Runnable() {
             public void run() {
@@ -133,13 +115,6 @@
         assertShowToast(view);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "show",
-        args = {}
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. It can" +
-            " not be shown if did not set any view.")
     @UiThreadTest
     public void testShowFailure() {
         // do not have any views.
@@ -152,11 +127,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "cancel",
-        args = {}
-    )
     public void testCancel() throws InterruptedException {
         mActivity.runOnUiThread(new Runnable() {
             public void run() {
@@ -180,18 +150,6 @@
         assertNotShowToast(view);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setView",
-            args = {android.view.View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getView",
-            args = {}
-        )
-    })
     public void testAccessView() {
         mActivity.runOnUiThread(new Runnable() {
             public void run() {
@@ -216,18 +174,6 @@
         assertShowAndHide(imageView);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDuration",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDuration",
-            args = {}
-        )
-    })
     public void testAccessDuration() {
         long start = SystemClock.uptimeMillis();
         mActivity.runOnUiThread(new Runnable() {
@@ -260,23 +206,6 @@
         assertTrue(longDuration > shortDuration);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setMargin",
-            args = {float.class, float.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getHorizontalMargin",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getVerticalMargin",
-            args = {}
-        )
-    })
     public void testAccessMargin() {
         mActivity.runOnUiThread(new Runnable() {
             public void run() {
@@ -332,30 +261,6 @@
         assertTrue(xy1[1] < xy2[1]);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setGravity",
-            args = {int.class, int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getGravity",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getXOffset",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getYOffset",
-            args = {}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete." +
-            " It's not clear about how do xOffset and yOffset take effect.")
     public void testAccessGravity() {
         mActivity.runOnUiThread(new Runnable() {
             public void run() {
@@ -417,15 +322,7 @@
         assertEquals(bottomXY[1] - yOffset, bottomOffsetXY[1]);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "makeText",
-        args = {android.content.Context.class, java.lang.CharSequence.class, int.class}
-    )
     @UiThreadTest
-    @ToBeFixed(bug = "1695243", explanation = "1. should add @throws clause into javadoc of " +
-            "Toast#makeText(Context, CharSequence, int) when context is null. 2. javadoc " +
-            "declares it just contains a text view, but actually it's a LinearLayout")
     public void testMakeText1() {
         mToast = Toast.makeText(mActivity, "android", Toast.LENGTH_SHORT);
         assertNotNull(mToast);
@@ -453,15 +350,7 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "makeText",
-        args = {android.content.Context.class, int.class, int.class}
-    )
     @UiThreadTest
-    @ToBeFixed(bug = "1695243", explanation = "1. should add @throws clause into javadoc of " +
-            "Toast#makeText(Context, CharSequence, int) when context is null. 2. javadoc " +
-            "declares it just contains a text view, but actually it's a LinearLayout")
     public void testMakeText2() {
         mToast = Toast.makeText(mActivity, R.string.hello_world, Toast.LENGTH_LONG);
 
@@ -484,14 +373,7 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setText",
-        args = {int.class}
-    )
     @UiThreadTest
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of " +
-            "Toast#setText(int) when set a negative resouce id")
     public void testSetText1() {
         mToast = Toast.makeText(mActivity, R.string.text, Toast.LENGTH_LONG);
 
@@ -509,14 +391,7 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setText",
-        args = {java.lang.CharSequence.class}
-    )
     @UiThreadTest
-    @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc of " +
-            "Toast#setText(CharSequence) when view is null")
     public void testSetText2() {
         mToast = Toast.makeText(mActivity, R.string.text, Toast.LENGTH_LONG);
 
diff --git a/tests/tests/widget/src/android/widget/cts/ToggleButtonTest.java b/tests/tests/widget/src/android/widget/cts/ToggleButtonTest.java
index 211b3e3..ca1c94f 100644
--- a/tests/tests/widget/src/android/widget/cts/ToggleButtonTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ToggleButtonTest.java
@@ -28,16 +28,10 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
 /**
  * Test {@link ToggleButton}.
  */
-@TestTargetClass(ToggleButton.class)
 public class ToggleButtonTest extends AndroidTestCase {
     private static final String TEXT_OFF = "text off";
     private static final String TEXT_ON = "text on";
@@ -55,28 +49,6 @@
         mToggleButton = new ToggleButton(mContext, mAttrSet);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test constructors",
-            method = "ToggleButton",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test constructors",
-            method = "ToggleButton",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test constructors",
-            method = "ToggleButton",
-            args = {android.content.Context.class}
-        )
-    })
-    @ToBeFixed(bug = "1371108",
-            explanation = "There should not be a NullPointerException thrown out.")
     public void testConstructor() {
         new ToggleButton(mContext, mAttrSet, 0);
         new ToggleButton(mContext, mAttrSet);
@@ -104,20 +76,6 @@
         }
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test setTextOff and getTextOff",
-            method = "setTextOff",
-            args = {java.lang.CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test setTextOff and getTextOff",
-            method = "getTextOff",
-            args = {}
-        )
-    })
     public void testAccessTextOff() {
         mToggleButton.setTextOff("android");
         assertEquals("android", mToggleButton.getTextOff());
@@ -130,12 +88,6 @@
         assertEquals("", mToggleButton.getTextOff());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test drawableStateChanged",
-        method = "drawableStateChanged",
-        args = {}
-    )
     public void testDrawableStateChanged() {
         MockToggleButton toggleButton = new MockToggleButton(mContext);
 
@@ -154,25 +106,11 @@
         assertEquals(toggleButton.getDrawableState(), drawable.getState());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test onFinishInflate",
-        method = "onFinishInflate",
-        args = {}
-    )
-    @ToBeFixed(bug = "1400085", explanation = "This method will effect the UI. "
-            + "The best way to test this is looking at the actual view.")
     public void testOnFinishInflate() {
         MockToggleButton toggleButton = new MockToggleButton(mContext);
         toggleButton.onFinishInflate();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test setChecked",
-        method = "setChecked",
-        args = {boolean.class}
-    )
     public void testSetChecked() {
         assertFalse(mToggleButton.isChecked());
 
@@ -183,26 +121,6 @@
         assertFalse(mToggleButton.isChecked());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Check the text of button when change button status",
-            method = "setChecked",
-            args = {boolean.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Check the text of button when change button status",
-            method = "setTextOff",
-            args = {java.lang.CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Check the text of button when change button status",
-            method = "setTextOn",
-            args = {java.lang.CharSequence.class}
-        )
-    })
     public void testToggleText() {
         mToggleButton.setText("default text");
         mToggleButton.setTextOn(TEXT_ON);
@@ -230,12 +148,6 @@
         assertEquals(TEXT_ON, mToggleButton.getText().toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "test setBackgroundDrawable",
-        method = "setBackgroundDrawable",
-        args = {android.graphics.drawable.Drawable.class}
-    )
     public void testSetBackgroundDrawable() {
         Drawable drawable = mContext.getResources().getDrawable(R.drawable.scenery);
 
@@ -247,20 +159,6 @@
         assertNull(mToggleButton.getBackground());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test setTextOn and getTextOn",
-            method = "setTextOn",
-            args = {java.lang.CharSequence.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "test setTextOn and getTextOn",
-            method = "getTextOn",
-            args = {}
-        )
-    })
     public void testAccessTextOn() {
         mToggleButton.setTextOn("cts");
         assertEquals("cts", mToggleButton.getTextOn());
diff --git a/tests/tests/widget/src/android/widget/cts/TwoLineListItemTest.java b/tests/tests/widget/src/android/widget/cts/TwoLineListItemTest.java
index ad5dff6..5ef5961 100644
--- a/tests/tests/widget/src/android/widget/cts/TwoLineListItemTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TwoLineListItemTest.java
@@ -18,11 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
 import android.app.Activity;
 import android.content.Context;
@@ -36,7 +31,6 @@
 /**
  * Test {@link TwoLineListItem}.
  */
-@TestTargetClass(TwoLineListItem.class)
 public class TwoLineListItemTest extends
         ActivityInstrumentationTestCase<TwoLineListItemStubActivity> {
     private Activity mActivity;
@@ -51,31 +45,6 @@
         mActivity = getActivity();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors.",
-            method = "TwoLineListItem",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors.",
-            method = "TwoLineListItem",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructors.",
-            method = "TwoLineListItem",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
-    @ToBeFixed(bug = "1417734", explanation = "should add @throws clause into javadoc of "
-            + "TwoLineListItem#TwoLineListItem(Context), "
-            + "TwoLineListItem#TwoLineListItem(Context, AttributeSet) "
-            + "and TwoLineListItem#TwoLineListItem(Context, AttributeSet, int) "
-            + "when param Context is null")
     public void testConstructor() {
         AttributeSet attrs = mActivity.getResources().getLayout(R.layout.twolinelistitem);
         assertNotNull(attrs);
@@ -106,18 +75,6 @@
         new TwoLineListItem(mActivity, attrs, Integer.MIN_VALUE);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getText1",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getText2",
-            args = {}
-        )
-    })
     public void testGetTexts() {
         TwoLineListItem twoLineListItem =
             (TwoLineListItem) mActivity.findViewById(R.id.twoLineListItem);
@@ -131,11 +88,6 @@
                 twoLineListItem.getText2().getText().toString());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "onFinishInflate",
-        args = {}
-    )
     public void testOnFinishInflate() {
         MockTwoLineListItem twoLineListItem = new MockTwoLineListItem(mActivity);
         TextView text1 = new TextView(mActivity);
diff --git a/tests/tests/widget/src/android/widget/cts/VideoViewTest.java b/tests/tests/widget/src/android/widget/cts/VideoViewTest.java
index 57ea598..679a298 100644
--- a/tests/tests/widget/src/android/widget/cts/VideoViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/VideoViewTest.java
@@ -18,21 +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 android.app.Activity;
 import android.app.Instrumentation;
 import android.content.Context;
+import android.cts.util.PollingCheck;
 import android.media.MediaPlayer;
 import android.media.MediaPlayer.OnCompletionListener;
 import android.media.MediaPlayer.OnErrorListener;
 import android.media.MediaPlayer.OnPreparedListener;
 import android.test.ActivityInstrumentationTestCase2;
 import android.view.View.MeasureSpec;
-import android.view.animation.cts.DelayedCheck;
 import android.widget.MediaController;
 import android.widget.VideoView;
 
@@ -43,7 +39,6 @@
 /**
  * Test {@link VideoView}.
  */
-@TestTargetClass(VideoView.class)
 public class VideoViewTest extends ActivityInstrumentationTestCase2<VideoViewStubActivity> {
     /** The maximum time to wait for an operation. */
     private static final long   TIME_OUT = 15000L;
@@ -161,23 +156,6 @@
         mVideoView.setMediaController(mMediaController);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "VideoView",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "VideoView",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "VideoView",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
     public void testConstructor() {
         new VideoView(mActivity);
 
@@ -186,23 +164,6 @@
         new VideoView(mActivity, null, 0);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setVideoPath",
-            args = {java.lang.String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOnPreparedListener",
-            args = {android.media.MediaPlayer.OnPreparedListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOnCompletionListener",
-            args = {android.media.MediaPlayer.OnCompletionListener.class}
-        )
-    })
     public void testPlayVideo1() throws Throwable {
         final MockOnPreparedListener preparedListener = new MockOnPreparedListener();
         mVideoView.setOnPreparedListener(preparedListener);
@@ -214,7 +175,7 @@
                 mVideoView.setVideoPath(mVideoPath);
             }
         });
-        new DelayedCheck(TIME_OUT) {
+        new PollingCheck(TIME_OUT) {
             @Override
             protected boolean check() {
                 return preparedListener.isTriggered();
@@ -228,7 +189,7 @@
             }
         });
         // wait time is longer than duration in case system is sluggish
-        new DelayedCheck(mVideoView.getDuration() + TIME_OUT) {
+        new PollingCheck(mVideoView.getDuration() + TIME_OUT) {
             @Override
             protected boolean check() {
                 return completionListener.isTriggered();
@@ -236,11 +197,6 @@
         }.run();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setOnErrorListener",
-        args = {android.media.MediaPlayer.OnErrorListener.class}
-    )
     public void testSetOnErrorListener() throws Throwable {
         final MockOnErrorListener listener = new MockOnErrorListener();
         mVideoView.setOnErrorListener(listener);
@@ -254,7 +210,7 @@
         });
         mInstrumentation.waitForIdleSync();
 
-        new DelayedCheck(TIME_OUT) {
+        new PollingCheck(TIME_OUT) {
             @Override
             protected boolean check() {
                 return listener.isTriggered();
@@ -262,11 +218,6 @@
         }.run();
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getBufferPercentage",
-        args = {}
-    )
     public void testGetBufferPercentage() throws Throwable {
         final MockOnPreparedListener prepareListener = new MockOnPreparedListener();
         mVideoView.setOnPreparedListener(prepareListener);
@@ -278,7 +229,7 @@
         });
         mInstrumentation.waitForIdleSync();
 
-        new DelayedCheck(TIME_OUT) {
+        new PollingCheck(TIME_OUT) {
             @Override
             protected boolean check() {
                 return prepareListener.isTriggered();
@@ -288,11 +239,6 @@
         assertTrue(percent >= 0 && percent <= 100);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "resolveAdjustedSize",
-        args = {int.class, int.class}
-    )
     public void testResolveAdjustedSize() {
         mVideoView = new VideoView(mActivity);
 
@@ -308,11 +254,6 @@
         assertEquals(specSize, resolvedSize);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getDuration",
-        args = {}
-    )
     public void testGetDuration() throws Throwable {
         runTestOnUiThread(new Runnable() {
             public void run() {
@@ -323,11 +264,6 @@
         assertTrue(Math.abs(mVideoView.getDuration() - TEST_VIDEO_DURATION) < DURATION_DELTA);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setMediaController",
-        args = {android.widget.MediaController.class}
-    )
     public void testSetMediaController() {
         final MediaController ctlr = new MediaController(mActivity);
         mVideoView.setMediaController(ctlr);
diff --git a/tests/tests/widget/src/android/widget/cts/ViewAnimatorTest.java b/tests/tests/widget/src/android/widget/cts/ViewAnimatorTest.java
index accbe6d..72f5559 100644
--- a/tests/tests/widget/src/android/widget/cts/ViewAnimatorTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ViewAnimatorTest.java
@@ -18,10 +18,6 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
 
 import org.xmlpull.v1.XmlPullParser;
 
@@ -39,7 +35,6 @@
 import android.widget.RelativeLayout;
 import android.widget.ViewAnimator;
 
-@TestTargetClass(ViewAnimator.class)
 public class ViewAnimatorTest extends
         ActivityInstrumentationTestCase2<ViewAnimatorStubActivity> {
     private ViewAnimator mViewAnimator;
@@ -67,40 +62,11 @@
         assertNotNull(mViewAnimator);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ViewAnimator",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ViewAnimator",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        )
-    })
     public void testConstructor() {
         new ViewAnimator(mActivity);
         new ViewAnimator(mActivity, mAttributeSet);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setInAnimation",
-            args = {android.view.animation.Animation.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setInAnimation",
-            args = {android.content.Context.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getInAnimation",
-            args = {}
-        )
-    })
     public void testAccessInAnimation() {
         AnimationSet expected = new AnimationSet(mActivity, mAttributeSet);
         assertNull(mViewAnimator.getInAnimation());
@@ -118,11 +84,6 @@
         assertEquals(500, animation.getDuration());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "showNext",
-        args = {}
-    )
     @UiThreadTest
     public void testShowNext() {
         final View v1 = mActivity.findViewById(R.id.ok);
@@ -161,11 +122,6 @@
         assertEquals(0, mViewAnimator.getChildCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL,
-        method = "setAnimateFirstView",
-        args = {boolean.class}
-    )
     public void testSetAnimateFirstView() {
         mViewAnimator.setAnimateFirstView(true);
         mViewAnimator.setAnimateFirstView(false);
@@ -173,18 +129,6 @@
         // TODO: how to check
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDisplayedChild",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDisplayedChild",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testAccessDisplayedChild() {
         final View v1 = mActivity.findViewById(R.id.ok);
@@ -219,18 +163,6 @@
         assertEquals(0, mViewAnimator.getChildCount());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setDisplayedChild",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getDisplayedChild",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testAccessDisplayedChildBoundary() {
         final View v1 = mActivity.findViewById(R.id.ok);
@@ -259,11 +191,6 @@
         assertEquals(0, mViewAnimator.getChildCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getBaseline",
-        args = {}
-    )
     @UiThreadTest
     public void testGetBaseline() {
         final View v1 = mActivity.findViewById(R.id.ok);
@@ -290,11 +217,6 @@
         assertEquals(0, mViewAnimator.getChildCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "showPrevious",
-        args = {}
-    )
     @UiThreadTest
     public void testShowPrevious() {
         final View v1 = mActivity.findViewById(R.id.ok);
@@ -334,11 +256,6 @@
         assertEquals(0, mViewAnimator.getChildCount());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getCurrentView",
-        args = {}
-    )
     @UiThreadTest
     public void testGetCurrentView() {
         final View v = mActivity.findViewById(R.id.label);
@@ -358,18 +275,6 @@
         assertEquals(0, mViewAnimator.getChildCount());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "addView",
-            args = {android.view.View.class, int.class, android.view.ViewGroup.LayoutParams.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeAllViews",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testAddView() {
         final View v1 = mActivity.findViewById(R.id.ok);
@@ -394,23 +299,6 @@
         assertEquals(0, mViewAnimator.getChildCount());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOutAnimation",
-            args = {android.view.animation.Animation.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "setOutAnimation",
-            args = {android.content.Context.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getOutAnimation",
-            args = {}
-        )
-    })
     public void testAccessOutAnimation() {
         AnimationSet expected = new AnimationSet(mActivity, mAttributeSet);
         assertNull(mViewAnimator.getOutAnimation());
@@ -427,38 +315,6 @@
         assertEquals(500, animation.getDuration());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeView",
-            args = {android.view.View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeViewAt",
-            args = {int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeViewInLayout",
-            args = {android.view.View.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeViews",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeViewsInLayout",
-            args = {int.class, int.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "removeAllViews",
-            args = {}
-        )
-    })
     @UiThreadTest
     public void testRemoveViews() {
         final View v1 = mActivity.findViewById(R.id.ok);
diff --git a/tests/tests/widget/src/android/widget/cts/ViewFlipperTest.java b/tests/tests/widget/src/android/widget/cts/ViewFlipperTest.java
index b61e59c..bcb417a 100644
--- a/tests/tests/widget/src/android/widget/cts/ViewFlipperTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ViewFlipperTest.java
@@ -18,11 +18,6 @@
 
 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;
 
@@ -37,7 +32,6 @@
 /**
  * Test {@link ViewFlipper}.
  */
-@TestTargetClass(ViewFlipper.class)
 public class ViewFlipperTest extends ActivityInstrumentationTestCase<ViewFlipperStubActivity> {
     private Activity mActivity;
 
@@ -51,22 +45,6 @@
         assertNotNull(mActivity);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link ViewFlipper}",
-            method = "ViewFlipper",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link ViewFlipper}",
-            method = "ViewFlipper",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        )
-    })
-    @ToBeFixed(bug="1417734", explanation="ViewFlipper#ViewFlipper(Context, AttributeSet)" +
-            " should check whether the input Context is null")
     public void testConstructor() {
         new ViewFlipper(mActivity);
 
@@ -83,36 +61,12 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ViewFlipper#setFlipInterval(int)}",
-        method = "setFlipInterval",
-        args = {int.class}
-    )
-    @ToBeFixed(bug="1386429", explanation="No getter and can't check indirectly")
     public void testSetFlipInterval() {
         ViewFlipper viewFlipper = new ViewFlipper(mActivity);
         viewFlipper.setFlipInterval(0);
         viewFlipper.setFlipInterval(-1);
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "startFlipping",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "stopFlipping",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "isFlipping",
-            args = {}
-        )
-    })
     public void testViewFlipper() throws Throwable {
         // NOTE: This value needs to be kept in sync with the value set in
         // layout/viewflipper_layout.xml
diff --git a/tests/tests/widget/src/android/widget/cts/ViewSwitcherTest.java b/tests/tests/widget/src/android/widget/cts/ViewSwitcherTest.java
index 9cb58e0..b7bac6c 100644
--- a/tests/tests/widget/src/android/widget/cts/ViewSwitcherTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ViewSwitcherTest.java
@@ -30,16 +30,10 @@
 
 import com.android.cts.stub.R;
 
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
 /**
  * Test {@link ViewSwitcher}.
  */
-@TestTargetClass(ViewSwitcher.class)
 public class ViewSwitcherTest extends AndroidTestCase {
     private ViewSwitcher mViewSwitcher;
 
@@ -49,22 +43,6 @@
         mViewSwitcher = null;
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link ViewSwitcher}",
-            method = "ViewSwitcher",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test constructor(s) of {@link ViewSwitcher}",
-            method = "ViewSwitcher",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        )
-    })
-    @ToBeFixed(bug = "1417734", explanation = "ViewSwitcher#ViewSwitcher(Context, AttributeSet)" +
-            " should check whether the input Context is null")
     public void testConstructor() {
         new ViewSwitcher(getContext());
 
@@ -75,12 +53,6 @@
         new ViewSwitcher(getContext(), attrs);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ViewSwitcher#setFactory(ViewFactory)}",
-        method = "setFactory",
-        args = {android.widget.ViewSwitcher.ViewFactory.class}
-    )
     public void testSetFactory() {
         mViewSwitcher = new ViewSwitcher(getContext());
 
@@ -89,12 +61,6 @@
         assertTrue(factory.hasMakeViewCalled());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ViewSwitcher#reset()}",
-        method = "reset",
-        args = {}
-    )
     public void testReset() {
         mViewSwitcher = new ViewSwitcher(getContext());
 
@@ -110,20 +76,6 @@
         assertEquals(View.GONE, lv2.getVisibility());
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link ViewSwitcher#getNextView()}",
-            method = "getNextView",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            notes = "Test {@link ViewSwitcher#getNextView()}",
-            method = "addView",
-            args = {android.view.View.class, int.class, android.view.ViewGroup.LayoutParams.class}
-        )
-    })
     public void testGetNextView() {
         mViewSwitcher = new ViewSwitcher(getContext());
 
diff --git a/tests/tests/widget/src/android/widget/cts/ZoomButtonTest.java b/tests/tests/widget/src/android/widget/cts/ZoomButtonTest.java
index 4bb412c..94c2669 100644
--- a/tests/tests/widget/src/android/widget/cts/ZoomButtonTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ZoomButtonTest.java
@@ -18,26 +18,20 @@
 
 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 android.app.Activity;
+import android.cts.util.PollingCheck;
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.UiThreadTest;
 import android.util.AttributeSet;
 import android.util.Xml;
 import android.view.View;
 import android.view.View.OnClickListener;
-import android.view.animation.cts.DelayedCheck;
 import android.widget.ListView;
 import android.widget.ZoomButton;
 
-@TestTargetClass(ZoomButton.class)
 public class ZoomButtonTest extends ActivityInstrumentationTestCase2<ZoomButtonStubActivity> {
     private ZoomButton mZoomButton;
     private Activity mActivity;
@@ -54,25 +48,6 @@
         mActivity = getActivity();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ZoomButton",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ZoomButton",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ZoomButton",
-            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, " +
-            "should add @throws clause into javadoc.")
     public void testConstructor() {
         new ZoomButton(mActivity);
 
@@ -105,11 +80,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "setEnabled",
-        args = {boolean.class}
-    )
     public void testSetEnabled() {
         assertFalse(mZoomButton.isPressed());
         mZoomButton.setEnabled(true);
@@ -127,13 +97,6 @@
         assertFalse(mZoomButton.isPressed());
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ZoomButton#dispatchUnhandledMove(View, int)}, " +
-                "this function always returns false",
-        method = "dispatchUnhandledMove",
-        args = {android.view.View.class, int.class}
-    )
     @UiThreadTest
     public void testDispatchUnhandledMove() {
         assertFalse(mZoomButton.dispatchUnhandledMove(new ListView(mActivity), View.FOCUS_DOWN));
@@ -141,13 +104,6 @@
         assertFalse(mZoomButton.dispatchUnhandledMove(null, View.FOCUS_DOWN));
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "Test {@link ZoomButton#onLongClick(View)}, " +
-                "this function always returns true and the parameter 'View v' is ignored.",
-        method = "onLongClick",
-        args = {android.view.View.class}
-    )
     public void testOnLongClick() {
         final MockOnClickListener listener = new MockOnClickListener();
         mZoomButton.setOnClickListener(listener);
@@ -157,7 +113,7 @@
 
         assertFalse(listener.hasOnClickCalled());
         mZoomButton.performLongClick();
-        new DelayedCheck(speed + 500) {
+        new PollingCheck(speed + 500) {
             @Override
             protected boolean check() {
                 return listener.hasOnClickCalled();
@@ -165,30 +121,14 @@
         };
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onTouchEvent",
-        args = {android.view.MotionEvent.class}
-    )
     public void testOnTouchEvent() {
         // Do not test. Implementation details.
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        method = "onKeyUp",
-        args = {int.class, android.view.KeyEvent.class}
-    )
     public void testOnKeyUp() {
         // Do not test. Implementation details.
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL_COMPLETE,
-        method = "setZoomSpeed",
-        args = {long.class}
-    )
-    @ToBeFixed(bug = "1400249", explanation = "how to check zoom speed after set.")
     public void testSetZoomSpeed() {
         mZoomButton.setZoomSpeed(100);
 
diff --git a/tests/tests/widget/src/android/widget/cts/ZoomControlsTest.java b/tests/tests/widget/src/android/widget/cts/ZoomControlsTest.java
index 617e1d8..5dc7a0e 100644
--- a/tests/tests/widget/src/android/widget/cts/ZoomControlsTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ZoomControlsTest.java
@@ -16,11 +16,6 @@
 
 package android.widget.cts;
 
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.ToBeFixed;
 
 import android.content.Context;
 import android.test.InstrumentationTestCase;
@@ -32,7 +27,6 @@
 /**
  * Test {@link ZoomControls}.
  */
-@TestTargetClass(ZoomControls.class)
 public class ZoomControlsTest extends InstrumentationTestCase {
     private Context mContext;
 
@@ -42,31 +36,12 @@
         mContext = getInstrumentation().getContext();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ZoomControls",
-            args = {android.content.Context.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "ZoomControls",
-            args = {android.content.Context.class, android.util.AttributeSet.class}
-        )
-    })
     public void testConstructor() {
         new ZoomControls(mContext);
 
         new ZoomControls(mContext, null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        method = "setOnZoomInClickListener",
-        args = {android.view.View.OnClickListener.class},
-        notes = "not possible to trigger a zoom button click programmatically using public API"
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete.")
     public void testSetOnZoomInClickListener() {
         ZoomControls zoomControls = new ZoomControls(mContext);
 
@@ -84,13 +59,6 @@
         }
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        method = "setOnZoomOutClickListener",
-        args = {android.view.View.OnClickListener.class},
-        notes = "not possible to trigger a zoom button click programmatically using public API"
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete.")
     public void testSetOnZoomOutClickListener() {
         ZoomControls zoomControls = new ZoomControls(mContext);
 
@@ -102,12 +70,6 @@
         zoomControls.setOnZoomOutClickListener(null);
     }
 
-    @TestTargetNew(
-        level = TestLevel.PARTIAL_COMPLETE,
-        method = "setZoomSpeed",
-        args = {long.class}
-    )
-    @ToBeFixed(bug = "1400249", explanation = "how to check zoom speed after set.")
     public void testSetZoomSpeed() {
         ZoomControls zoomControls = new ZoomControls(mContext);
 
@@ -116,29 +78,10 @@
         // TODO: how to check?
     }
 
-    @TestTargetNew(
-        level = TestLevel.NOT_NECESSARY,
-        notes = "this method always return true",
-        method = "onTouchEvent",
-        args = {android.view.MotionEvent.class}
-    )
     public void testOnTouchEvent() {
         // onTouchEvent() is implementation details, do NOT test
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "show",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "hide",
-            args = {}
-        )
-    })
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete.")
     public void testShowAndHide() {
         final ZoomControls zoomControls = new ZoomControls(mContext);
         assertEquals(View.VISIBLE, zoomControls.getVisibility());
@@ -150,37 +93,18 @@
         assertEquals(View.VISIBLE, zoomControls.getVisibility());
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        method = "setIsZoomInEnabled",
-        args = {boolean.class},
-        notes="not feasible to test effect of calling this method"
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete.")
     public void testSetIsZoomInEnabled() {
         ZoomControls zoomControls = new ZoomControls(mContext);
         zoomControls.setIsZoomInEnabled(false);
         zoomControls.setIsZoomInEnabled(true);
     }
 
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        method = "setIsZoomOutEnabled",
-        args = {boolean.class},
-        notes="not feasible to test effect of calling this method"
-    )
-    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete.")
     public void testSetIsZoomOutEnabled() {
         ZoomControls zoomControls = new ZoomControls(mContext);
         zoomControls.setIsZoomOutEnabled(false);
         zoomControls.setIsZoomOutEnabled(true);
     }
 
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "hasFocus",
-        args = {}
-    )
     @UiThreadTest
     public void testHasFocus() {
         ZoomControls zoomControls = new ZoomControls(mContext);
diff --git a/tests/vm-tests/AndroidManifest.xml b/tests/vm-tests/AndroidManifest.xml
deleted file mode 100644
index ffd5a93..0000000
--- a/tests/vm-tests/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.vm-tests">
-    <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"
-                     android:label="cts framework tests"/>
-
-</manifest>
diff --git a/tools/build/test_executable.mk b/tools/build/test_executable.mk
index bfd5bee..8b445a3 100644
--- a/tools/build/test_executable.mk
+++ b/tools/build/test_executable.mk
@@ -25,14 +25,18 @@
 
 include $(BUILD_EXECUTABLE)
 
-cts_executable_xml := $(CTS_NATIVE_XML_OUT)/$(LOCAL_MODULE).xml
+cts_executable_xml := $(CTS_TESTCASES_OUT)/$(LOCAL_MODULE).xml
 
 $(cts_executable_xml): PRIVATE_PATH := $(LOCAL_PATH)
 $(cts_executable_xml): PRIVATE_TEST_PACKAGE := $(LOCAL_CTS_TEST_PACKAGE)
 $(cts_executable_xml): PRIVATE_EXECUTABLE := $(LOCAL_MODULE)
-$(cts_executable_xml): $(addprefix $(LOCAL_PATH)/,$(LOCAL_SRC_FILES)) | $(CTS_NATIVE_XML_GENERATOR)
+$(cts_executable_xml): $(addprefix $(LOCAL_PATH)/,$(LOCAL_SRC_FILES)) $(CTS_EXPECTATIONS) $(CTS_NATIVE_TEST_SCANNER) $(CTS_XML_GENERATOR)
 	$(hide) echo Generating test description for native package $(PRIVATE_TEST_PACKAGE)
-	$(hide) $(CTS_NATIVE_XML_GENERATOR) -p $(PRIVATE_TEST_PACKAGE) \
-			-n $(PRIVATE_EXECUTABLE) \
-			-s $(PRIVATE_PATH) \
-			-o $@
+	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
+	$(hide) $(CTS_NATIVE_TEST_SCANNER) -s $(PRIVATE_PATH) \
+						-t $(PRIVATE_TEST_PACKAGE) | \
+			$(CTS_XML_GENERATOR) -t native \
+						-n $(PRIVATE_EXECUTABLE) \
+						-p $(PRIVATE_TEST_PACKAGE) \
+						-e $(CTS_EXPECTATIONS) \
+						-o $@
diff --git a/tools/build/test_host_java_library.mk b/tools/build/test_host_java_library.mk
new file mode 100644
index 0000000..9512bfa
--- /dev/null
+++ b/tools/build/test_host_java_library.mk
@@ -0,0 +1,38 @@
+# 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.
+
+#
+# Builds a host library and defines a rule to generate the associated test
+# package XML needed by CTS.
+#
+
+include $(BUILD_HOST_JAVA_LIBRARY)
+
+cts_library_xml := $(CTS_TESTCASES_OUT)/$(LOCAL_MODULE).xml
+
+$(cts_library_xml): PRIVATE_PATH := $(LOCAL_PATH)/src
+$(cts_library_xml): PRIVATE_TEST_PACKAGE := $(LOCAL_CTS_TEST_PACKAGE)
+$(cts_library_xml): PRIVATE_LIBRARY := $(LOCAL_MODULE)
+$(cts_library_xml): PRIVATE_JAR_PATH := $(LOCAL_MODULE).jar
+$(cts_library_xml): $(HOST_OUT_JAVA_LIBRARIES)/$(LOCAL_MODULE).jar $(CTS_EXPECTATIONS) $(CTS_JAVA_TEST_SCANNER_DOCLET) $(CTS_JAVA_TEST_SCANNER) $(CTS_XML_GENERATOR)
+	$(hide) echo Generating test description for host library $(PRIVATE_LIBRARY)
+	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
+	$(hide) $(CTS_JAVA_TEST_SCANNER) -s $(PRIVATE_PATH) \
+						-d $(CTS_JAVA_TEST_SCANNER_DOCLET) | \
+			$(CTS_XML_GENERATOR) -t hostSideOnly \
+						-j $(PRIVATE_JAR_PATH) \
+						-n $(PRIVATE_LIBRARY) \
+						-p $(PRIVATE_TEST_PACKAGE) \
+						-e $(CTS_EXPECTATIONS) \
+						-o $@
diff --git a/tools/build/test_package.mk b/tools/build/test_package.mk
new file mode 100644
index 0000000..1cf4ecc
--- /dev/null
+++ b/tools/build/test_package.mk
@@ -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.
+
+#
+# Builds a package and defines a rule to generate the associated test
+# package XML needed by CTS.
+#
+# Replace "include $(BUILD_PACKAGE)" with "include $(BUILD_CTS_PACKAGE)"
+#
+
+include $(BUILD_PACKAGE)
+
+cts_package_apk := $(CTS_TESTCASES_OUT)/$(LOCAL_PACKAGE_NAME).apk
+cts_package_xml := $(CTS_TESTCASES_OUT)/$(LOCAL_PACKAGE_NAME).xml
+
+$(cts_package_apk): PRIVATE_PACKAGE := $(LOCAL_PACKAGE_NAME)
+$(cts_package_apk): $(call intermediates-dir-for,APPS,$(LOCAL_PACKAGE_NAME))/package.apk | $(ACP)
+	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
+	$(hide) $(ACP) -fp $(call intermediates-dir-for,APPS,$(PRIVATE_PACKAGE))/package.apk $@
+
+$(cts_package_xml): PRIVATE_PATH := $(LOCAL_PATH)
+$(cts_package_xml): PRIVATE_INSTRUMENTATION := $(LOCAL_INSTRUMENTATION_FOR)
+$(cts_package_xml): PRIVATE_PACKAGE := $(LOCAL_PACKAGE_NAME)
+$(cts_package_xml): PRIVATE_TEST_PACKAGE := android.$(notdir $(LOCAL_PATH))
+$(cts_package_xml): PRIVATE_MANIFEST := $(LOCAL_PATH)/AndroidManifest.xml
+$(cts_package_xml): $(call intermediates-dir-for,APPS,$(LOCAL_PACKAGE_NAME))/package.apk $(CTS_EXPECTATIONS) $(CTS_JAVA_TEST_SCANNER_DOCLET) $(CTS_JAVA_TEST_SCANNER) $(CTS_XML_GENERATOR)
+	$(hide) echo Generating test description for java package $(PRIVATE_PACKAGE)
+	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
+	$(hide) $(CTS_JAVA_TEST_SCANNER) -s $(PRIVATE_PATH) \
+						-d $(CTS_JAVA_TEST_SCANNER_DOCLET) | \
+			$(CTS_XML_GENERATOR) -m $(PRIVATE_MANIFEST) \
+						-i "$(PRIVATE_INSTRUMENTATION)" \
+						-n $(PRIVATE_PACKAGE) \
+						-p $(PRIVATE_TEST_PACKAGE) \
+						-e $(CTS_EXPECTATIONS) \
+						-o $@
diff --git a/tools/cfassembler/Android.mk b/tools/cfassembler/Android.mk
new file mode 100644
index 0000000..8e0f351
--- /dev/null
+++ b/tools/cfassembler/Android.mk
@@ -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.
+
+LOCAL_PATH := $(call my-dir)
+
+# cfassembler host module
+#============================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_IS_HOST_MODULE := true
+LOCAL_MODULE_CLASS := EXECUTABLES
+LOCAL_MODULE := cfassembler
+
+include $(BUILD_SYSTEM)/base_rules.mk
+
+$(LOCAL_BUILT_MODULE): $(HOST_OUT_JAVA_LIBRARIES)/cfassembler$(COMMON_JAVA_PACKAGE_SUFFIX)
+$(LOCAL_BUILT_MODULE): $(LOCAL_PATH)/etc/cfassembler | $(ACP)
+	@echo "Copy: $(PRIVATE_MODULE) ($@)"
+	$(copy-file-to-new-target)
+	$(hide) chmod 755 $@
+
+INTERNAL_DALVIK_MODULES += $(LOCAL_INSTALLED_MODULE)
+
+# cfassembler java library
+# ============================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := src/dxconvext/ClassFileAssembler.java src/dxconvext/util/FileUtils.java
+LOCAL_JAR_MANIFEST := etc/cfassembler_manifest.txt
+
+LOCAL_MODULE:= cfassembler
+
+include $(BUILD_HOST_JAVA_LIBRARY)
+
+INTERNAL_DALVIK_MODULES += $(LOCAL_INSTALLED_MODULE)
diff --git a/tools/dx-tests/etc/cfassembler b/tools/cfassembler/etc/cfassembler
similarity index 100%
rename from tools/dx-tests/etc/cfassembler
rename to tools/cfassembler/etc/cfassembler
diff --git a/tools/dx-tests/etc/cfassembler_manifest.txt b/tools/cfassembler/etc/cfassembler_manifest.txt
similarity index 100%
rename from tools/dx-tests/etc/cfassembler_manifest.txt
rename to tools/cfassembler/etc/cfassembler_manifest.txt
diff --git a/tools/dx-tests/src/dxconvext/ClassFileAssembler.java b/tools/cfassembler/src/dxconvext/ClassFileAssembler.java
similarity index 100%
rename from tools/dx-tests/src/dxconvext/ClassFileAssembler.java
rename to tools/cfassembler/src/dxconvext/ClassFileAssembler.java
diff --git a/tools/dx-tests/src/dxconvext/ClassFileParser.java b/tools/cfassembler/src/dxconvext/ClassFileParser.java
similarity index 100%
rename from tools/dx-tests/src/dxconvext/ClassFileParser.java
rename to tools/cfassembler/src/dxconvext/ClassFileParser.java
diff --git a/tools/dx-tests/src/dxconvext/util/FileUtils.java b/tools/cfassembler/src/dxconvext/util/FileUtils.java
similarity index 100%
rename from tools/dx-tests/src/dxconvext/util/FileUtils.java
rename to tools/cfassembler/src/dxconvext/util/FileUtils.java
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiClass.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiClass.java
index de2e3eb..101be7f 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiClass.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiClass.java
@@ -26,22 +26,31 @@
 
     private final String mName;
 
+    private final boolean mDeprecated;
+
     private final List<ApiConstructor> mApiConstructors = new ArrayList<ApiConstructor>();
 
     private final List<ApiMethod> mApiMethods = new ArrayList<ApiMethod>();
 
-    ApiClass(String name) {
-        this.mName = name;
+    ApiClass(String name, boolean deprecated) {
+        mName = name;
+        mDeprecated = deprecated;
     }
 
+    @Override
     public int compareTo(ApiClass another) {
         return mName.compareTo(another.mName);
     }
 
+    @Override
     public String getName() {
         return mName;
     }
 
+    public boolean isDeprecated() {
+        return mDeprecated;
+    }
+
     public void addConstructor(ApiConstructor constructor) {
         mApiConstructors.add(constructor);
     }
@@ -97,6 +106,7 @@
         return mApiConstructors.size() + mApiMethods.size();
     }
 
+    @Override
     public float getCoveragePercentage() {
         return (float) getNumCoveredMethods() / getTotalMethods() * 100;
     }
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiConstructor.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiConstructor.java
index b38bd34..8d721e6 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiConstructor.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiConstructor.java
@@ -27,13 +27,17 @@
 
     private final List<String> mParameterTypes;
 
+    private final boolean mDeprecated;
+
     private boolean mIsCovered;
 
-    ApiConstructor(String name, List<String> parameterTypes) {
-        this.mName = name;
-        this.mParameterTypes = new ArrayList<String>(parameterTypes);
+    ApiConstructor(String name, List<String> parameterTypes, boolean deprecated) {
+        mName = name;
+        mParameterTypes = new ArrayList<String>(parameterTypes);
+        mDeprecated = deprecated;
     }
 
+    @Override
     public int compareTo(ApiConstructor another) {
         return mParameterTypes.size() - another.mParameterTypes.size();
     }
@@ -46,6 +50,10 @@
         return Collections.unmodifiableList(mParameterTypes);
     }
 
+    public boolean isDeprecated() {
+        return mDeprecated;
+    }
+
     public boolean isCovered() {
         return mIsCovered;
     }
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiMethod.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiMethod.java
index eb67b8e..053cd12 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiMethod.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiMethod.java
@@ -29,14 +29,18 @@
 
     private final String mReturnType;
 
+    private boolean mDeprecated;
+
     private boolean mIsCovered;
 
-    ApiMethod(String name, List<String> parameterTypes, String returnType) {
-        this.mName = name;
-        this.mParameterTypes = new ArrayList<String>(parameterTypes);
-        this.mReturnType = returnType;
+    ApiMethod(String name, List<String> parameterTypes, String returnType, boolean deprecated) {
+        mName = name;
+        mParameterTypes = new ArrayList<String>(parameterTypes);
+        mReturnType = returnType;
+        mDeprecated = deprecated;
     }
 
+    @Override
     public int compareTo(ApiMethod another) {
         return mName.compareTo(another.mName);
     }
@@ -53,6 +57,10 @@
         return mReturnType;
     }
 
+    public boolean isDeprecated() {
+        return mDeprecated;
+    }
+
     public boolean isCovered() {
         return mIsCovered;
     }
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiPackage.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiPackage.java
index f0ca889..ddc6fb4 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiPackage.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/ApiPackage.java
@@ -29,9 +29,10 @@
     private final Map<String, ApiClass> mApiClassMap = new HashMap<String, ApiClass>();
 
     ApiPackage(String name) {
-        this.mName = name;
+        mName = name;
     }
 
+    @Override
     public String getName() {
         return mName;
     }
@@ -64,6 +65,7 @@
         return total;
     }
 
+    @Override
     public float getCoveragePercentage() {
         return (float) getNumCoveredMethods() / getTotalMethods() * 100;
     }
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/CurrentXmlHandler.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/CurrentXmlHandler.java
index 41ee0dc..f3abd86 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/CurrentXmlHandler.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/CurrentXmlHandler.java
@@ -36,6 +36,8 @@
 
     private String mCurrentMethodReturnType;
 
+    private boolean mDeprecated;
+
     private List<String> mCurrentParameterTypes = new ArrayList<String>();
 
     private ApiCoverage mApiCoverage = new ApiCoverage();
@@ -49,27 +51,30 @@
             throws SAXException {
         super.startElement(uri, localName, name, attributes);
         if ("package".equalsIgnoreCase(localName)) {
-            mCurrentPackageName = CurrentXmlHandler.getValue(attributes, "name");
+            mCurrentPackageName = getValue(attributes, "name");
 
             ApiPackage apiPackage = new ApiPackage(mCurrentPackageName);
             mApiCoverage.addPackage(apiPackage);
 
         } else if ("class".equalsIgnoreCase(localName)
                 || "interface".equalsIgnoreCase(localName)) {
-            mCurrentClassName = CurrentXmlHandler.getValue(attributes, "name");
+            mCurrentClassName = getValue(attributes, "name");
+            mDeprecated = isDeprecated(attributes);
 
-            ApiClass apiClass = new ApiClass(mCurrentClassName);
+            ApiClass apiClass = new ApiClass(mCurrentClassName, mDeprecated);
             ApiPackage apiPackage = mApiCoverage.getPackage(mCurrentPackageName);
             apiPackage.addClass(apiClass);
 
         } else if ("constructor".equalsIgnoreCase(localName)) {
+            mDeprecated = isDeprecated(attributes);
             mCurrentParameterTypes.clear();
         }  else if ("method".equalsIgnoreCase(localName)) {
-            mCurrentMethodName = CurrentXmlHandler.getValue(attributes, "name");
-            mCurrentMethodReturnType = CurrentXmlHandler.getValue(attributes, "return");
+            mDeprecated = isDeprecated(attributes);
+            mCurrentMethodName = getValue(attributes, "name");
+            mCurrentMethodReturnType = getValue(attributes, "return");
             mCurrentParameterTypes.clear();
         } else if ("parameter".equalsIgnoreCase(localName)) {
-            mCurrentParameterTypes.add(CurrentXmlHandler.getValue(attributes, "type"));
+            mCurrentParameterTypes.add(getValue(attributes, "type"));
         }
     }
 
@@ -77,14 +82,18 @@
     public void endElement(String uri, String localName, String name) throws SAXException {
         super.endElement(uri, localName, name);
         if ("constructor".equalsIgnoreCase(localName)) {
+            if (mCurrentParameterTypes.isEmpty()) {
+                // Don't add empty default constructors...
+                return;
+            }
             ApiConstructor apiConstructor = new ApiConstructor(mCurrentClassName,
-                    mCurrentParameterTypes);
+                    mCurrentParameterTypes, mDeprecated);
             ApiPackage apiPackage = mApiCoverage.getPackage(mCurrentPackageName);
             ApiClass apiClass = apiPackage.getClass(mCurrentClassName);
             apiClass.addConstructor(apiConstructor);
         }  else if ("method".equalsIgnoreCase(localName)) {
             ApiMethod apiMethod = new ApiMethod(mCurrentMethodName, mCurrentParameterTypes,
-                    mCurrentMethodReturnType);
+                    mCurrentMethodReturnType, mDeprecated);
             ApiPackage apiPackage = mApiCoverage.getPackage(mCurrentPackageName);
             ApiClass apiClass = apiPackage.getClass(mCurrentClassName);
             apiClass.addMethod(apiMethod);
@@ -97,4 +106,8 @@
                 .replaceAll("<.+>", "")
                 .replace("$", ".");
     }
+
+    private boolean isDeprecated(Attributes attributes) {
+        return "deprecated".equals(attributes.getValue("deprecated"));
+    }
 }
\ No newline at end of file
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/HtmlReport.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/HtmlReport.java
index de9b7a6..9243fe0 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/HtmlReport.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/HtmlReport.java
@@ -37,11 +37,12 @@
 class HtmlReport {
 
     public static void printHtmlReport(final List<File> testApks, final ApiCoverage apiCoverage,
-            final OutputStream out) throws IOException, TransformerException, InterruptedException {
+            final OutputStream out) throws IOException, TransformerException {
         final PipedOutputStream xmlOut = new PipedOutputStream();
         final PipedInputStream xmlIn = new PipedInputStream(xmlOut);
 
         Thread t = new Thread(new Runnable() {
+            @Override
             public void run() {
                 XmlReport.printXmlReport(testApks, apiCoverage, xmlOut);
 
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/XmlReport.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/XmlReport.java
index 68acf06..94ccbb4 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/XmlReport.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/XmlReport.java
@@ -72,12 +72,14 @@
                         out.println("<class name=\"" + apiClass.getName()
                                 + "\" numCovered=\"" + apiClass.getNumCoveredMethods()
                                 + "\" numTotal=\"" + apiClass.getTotalMethods()
+                                + "\" deprecated=\"" + apiClass.isDeprecated()
                                 + "\" coveragePercentage=\""
                                     + Math.round(apiClass.getCoveragePercentage())
                                 + "\">");
 
                         for (ApiConstructor constructor : apiClass.getConstructors()) {
                             out.println("<constructor name=\"" + constructor.getName()
+                                    + "\" deprecated=\"" + constructor.isDeprecated()
                                     + "\" covered=\"" + constructor.isCovered() + "\">");
 
                             for (String parameterType : constructor.getParameterTypes()) {
@@ -90,6 +92,7 @@
                         for (ApiMethod method : apiClass.getMethods()) {
                             out.println("<method name=\"" + method.getName()
                                     + "\" returnType=\"" + method.getReturnType()
+                                    + "\" deprecated=\"" + method.isDeprecated()
                                     + "\" covered=\"" + method.isCovered() + "\">");
 
                             for (String parameterType : method.getParameterTypes()) {
diff --git a/tools/cts-api-coverage/src/res/api-coverage.xsl b/tools/cts-api-coverage/src/res/api-coverage.xsl
index 91fe802..95994e2 100644
--- a/tools/cts-api-coverage/src/res/api-coverage.xsl
+++ b/tools/cts-api-coverage/src/res/api-coverage.xsl
@@ -61,15 +61,19 @@
                     }
 
                     .red {
-                        background-color: #FF0000;
+                        background-color: #FF6666;
                     }
 
                     .yellow {
-                        background-color: #FFFF00;
+                        background-color: #FFFF66;
                     }
 
                     .green {
-                        background-color: #00FF00;
+                        background-color: #66FF66;
+                    }
+
+                    .deprecated {
+                        text-decoration: line-through;
                     }
                 </style>
             </head>
@@ -118,7 +122,7 @@
     
     <xsl:template name="packageOrClassListItem">
         <xsl:param name="bulletClass" />
-        
+
         <xsl:variable name="colorClass">
             <xsl:choose>
                 <xsl:when test="@coveragePercentage &lt;= 50">red</xsl:when>
@@ -127,8 +131,15 @@
             </xsl:choose>
         </xsl:variable>
         
+        <xsl:variable name="deprecatedClass">
+            <xsl:choose>
+                <xsl:when test="@deprecated = 'true'">deprecated</xsl:when>
+                <xsl:otherwise></xsl:otherwise>
+            </xsl:choose>
+        </xsl:variable>
+
         <li class="{$bulletClass}" onclick="toggleVisibility('{@name}')">
-            <span class="{$colorClass}">
+            <span class="{$colorClass} {$deprecatedClass}">
                 <b><xsl:value-of select="@name" /></b>
                 &nbsp;<xsl:value-of select="@coveragePercentage" />%
                 &nbsp;(<xsl:value-of select="@numCovered" />/<xsl:value-of select="@numTotal" />)
@@ -137,7 +148,15 @@
     </xsl:template>
   
   <xsl:template name="methodListItem">
-    <span class="method">
+
+    <xsl:variable name="deprecatedClass">
+        <xsl:choose>
+            <xsl:when test="@deprecated = 'true'">deprecated</xsl:when>
+            <xsl:otherwise></xsl:otherwise>
+        </xsl:choose>
+    </xsl:variable>
+
+    <span class="method {$deprecatedClass}">
       <xsl:choose>
         <xsl:when test="@covered = 'true'">[X]</xsl:when>
         <xsl:otherwise>[ ]</xsl:otherwise>
@@ -147,7 +166,7 @@
     </span>
     <br />
   </xsl:template>
-  
+
   <xsl:template name="formatParameters">(<xsl:for-each select="parameter">
       <xsl:value-of select="@type" />
       <xsl:if test="not(position() = last())">,&nbsp;</xsl:if>
diff --git a/tools/cts-java-scanner-doclet/Android.mk b/tools/cts-java-scanner-doclet/Android.mk
new file mode 100644
index 0000000..51b141e
--- /dev/null
+++ b/tools/cts-java-scanner-doclet/Android.mk
@@ -0,0 +1,26 @@
+# 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 := cts-java-scanner-doclet
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_CLASSPATH := $(HOST_JDK_TOOLS_JAR) cts/tools/utils/lib/junit.jar
+
+include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/tools/cts-java-scanner-doclet/src/com/android/cts/javascannerdoclet/CtsJavaScannerDoclet.java b/tools/cts-java-scanner-doclet/src/com/android/cts/javascannerdoclet/CtsJavaScannerDoclet.java
new file mode 100644
index 0000000..808473a
--- /dev/null
+++ b/tools/cts-java-scanner-doclet/src/com/android/cts/javascannerdoclet/CtsJavaScannerDoclet.java
@@ -0,0 +1,101 @@
+/*
+ * 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.javascannerdoclet;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.TransformerFactoryConfigurationError;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import com.sun.javadoc.AnnotationDesc;
+import com.sun.javadoc.AnnotationTypeDoc;
+import com.sun.javadoc.AnnotationValue;
+import com.sun.javadoc.ClassDoc;
+import com.sun.javadoc.Doclet;
+import com.sun.javadoc.MethodDoc;
+import com.sun.javadoc.RootDoc;
+import com.sun.javadoc.AnnotationDesc.ElementValuePair;
+
+/**
+ * Doclet that outputs in the following format:
+ *
+ * suite:android.holo.cts
+ * case:HoloTest
+ * test:testHolo
+ * test:testHoloDialog
+ */
+public class CtsJavaScannerDoclet extends Doclet {
+
+    static final String JUNIT_TEST_CASE_CLASS_NAME = "junit.framework.testcase";
+
+    public static boolean start(RootDoc root) {
+        ClassDoc[] classes = root.classes();
+        if (classes == null) {
+            return false;
+        }
+
+        PrintWriter writer = new PrintWriter(System.out);
+
+        for (ClassDoc clazz : classes) {
+            if (clazz.isAbstract() || !isValidJUnitTestCase(clazz)) {
+                continue;
+            }
+            writer.append("suite:").println(clazz.containingPackage().name());
+            writer.append("case:").println(clazz.name());
+            for (; clazz != null; clazz = clazz.superclass()) {
+                for (MethodDoc method : clazz.methods()) {
+                    if (!method.name().startsWith("test")) {
+                        continue;
+                    }
+                    writer.append("test:").println(method.name());
+                }
+            }
+        }
+
+        writer.close();
+        return true;
+    }
+
+    private static boolean isValidJUnitTestCase(ClassDoc clazz) {
+        while((clazz = clazz.superclass()) != null) {
+            if (JUNIT_TEST_CASE_CLASS_NAME.equals(clazz.qualifiedName().toLowerCase())) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
diff --git a/tools/cts-java-scanner/Android.mk b/tools/cts-java-scanner/Android.mk
new file mode 100644
index 0000000..8b6c906
--- /dev/null
+++ b/tools/cts-java-scanner/Android.mk
@@ -0,0 +1,43 @@
+# 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)
+
+# We use copy-file-to-new-target so that the installed
+# script file's timestamp is at least as new as the
+# .jar file it wraps.
+
+# the hat script
+# ============================================================
+include $(CLEAR_VARS)
+LOCAL_IS_HOST_MODULE := true
+LOCAL_MODULE_CLASS := EXECUTABLES
+LOCAL_MODULE := cts-java-scanner
+LOCAL_MODULE_TAGS := optional
+
+include $(BUILD_SYSTEM)/base_rules.mk
+
+$(LOCAL_BUILT_MODULE): $(HOST_OUT_JAVA_LIBRARIES)/$(LOCAL_MODULE)$(COMMON_JAVA_PACKAGE_SUFFIX)
+$(LOCAL_BUILT_MODULE): $(LOCAL_PATH)/etc/$(LOCAL_MODULE) | $(ACP)
+	@echo "Copy: $(PRIVATE_MODULE) ($@)"
+	$(copy-file-to-new-target)
+	$(hide) chmod 755 $@
+
+# the other stuff
+# ============================================================
+subdirs := $(addprefix $(LOCAL_PATH)/,$(addsuffix /Android.mk, \
+		src \
+	))
+
+include $(subdirs)
diff --git a/tools/cts-java-scanner/etc/cts-java-scanner b/tools/cts-java-scanner/etc/cts-java-scanner
new file mode 100644
index 0000000..378eee8
--- /dev/null
+++ b/tools/cts-java-scanner/etc/cts-java-scanner
@@ -0,0 +1,46 @@
+#!/bin/bash
+#
+# 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.
+
+# Set up prog to be the path of this script, including following symlinks,
+# and set up progdir to be the fully-qualified pathname of its directory.
+prog="$0"
+while [ -h "${prog}" ]; do
+    newProg=`/bin/ls -ld "${prog}"`
+    newProg=`expr "${newProg}" : ".* -> \(.*\)$"`
+    if expr "x${newProg}" : 'x/' >/dev/null; then
+        prog="${newProg}"
+    else
+        progdir=`dirname "${prog}"`
+        prog="${progdir}/${newProg}"
+    fi
+done
+oldwd=`pwd`
+progdir=`dirname "${prog}"`
+cd "${progdir}"
+progdir=`pwd`
+prog="${progdir}"/`basename "${prog}"`
+cd "${oldwd}"
+
+libdir=`dirname $progdir`/framework
+
+javaOpts=""
+while expr "x$1" : 'x-J' >/dev/null; do
+    opt=`expr "$1" : '-J\(.*\)'`
+    javaOpts="${javaOpts} -${opt}"
+    shift
+done
+
+exec java $javaOpts -jar $libdir/cts-java-scanner.jar "$@"
diff --git a/tools/cts-java-scanner/src/Android.mk b/tools/cts-java-scanner/src/Android.mk
new file mode 100644
index 0000000..ec42bcf
--- /dev/null
+++ b/tools/cts-java-scanner/src/Android.mk
@@ -0,0 +1,28 @@
+# 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)
+
+
+# cts-java-scanner java library
+# ============================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(call all-subdir-java-files)
+LOCAL_JAR_MANIFEST := MANIFEST.mf
+
+LOCAL_MODULE := cts-java-scanner
+LOCAL_MODULE_TAGS := optional
+
+include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/tools/cts-java-scanner/src/MANIFEST.mf b/tools/cts-java-scanner/src/MANIFEST.mf
new file mode 100644
index 0000000..642f226
--- /dev/null
+++ b/tools/cts-java-scanner/src/MANIFEST.mf
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+Main-Class: com.android.cts.javascanner.CtsJavaScanner
diff --git a/tools/cts-java-scanner/src/com/android/cts/javascanner/CtsJavaScanner.java b/tools/cts-java-scanner/src/com/android/cts/javascanner/CtsJavaScanner.java
new file mode 100644
index 0000000..a843fc6
--- /dev/null
+++ b/tools/cts-java-scanner/src/com/android/cts/javascanner/CtsJavaScanner.java
@@ -0,0 +1,71 @@
+/*
+ * 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.javascanner;
+
+import java.io.File;
+import java.util.Arrays;
+
+/**
+ * Class that searches a source directory for native gTests and outputs a
+ * list of test classes and methods.
+ */
+public class CtsJavaScanner {
+
+    private static void usage(String[] args) {
+        System.err.println("Arguments: " + Arrays.asList(args));
+        System.err.println("Usage: cts-java-scanner -s SOURCE_DIR -d DOCLET_PATH");
+        System.exit(1);
+    }
+
+    public static void main(String[] args) throws Exception {
+        File sourceDir = null;
+        File docletPath = null;
+
+        for (int i = 0; i < args.length; i++) {
+            if ("-s".equals(args[i])) {
+                sourceDir = new File(getArg(args, ++i, "Missing value for source directory"));
+            } else if ("-d".equals(args[i])) {
+                docletPath = new File(getArg(args, ++i, "Missing value for docletPath"));
+            } else {
+                System.err.println("Unsupported flag: " + args[i]);
+                usage(args);
+            }
+        }
+
+        if (sourceDir == null) {
+            System.err.println("Source directory is required");
+            usage(args);
+        }
+
+        if (docletPath == null) {
+            System.err.println("Doclet path is required");
+            usage(args);
+        }
+
+        DocletRunner runner = new DocletRunner(sourceDir, docletPath);
+        System.exit(runner.runJavaDoc());
+    }
+
+    private static String getArg(String[] args, int index, String message) {
+        if (index < args.length) {
+            return args[index];
+        } else {
+            System.err.println(message);
+            usage(args);
+            return null;
+        }
+    }
+}
diff --git a/tools/cts-java-scanner/src/com/android/cts/javascanner/DocletRunner.java b/tools/cts-java-scanner/src/com/android/cts/javascanner/DocletRunner.java
new file mode 100644
index 0000000..8a371fd
--- /dev/null
+++ b/tools/cts-java-scanner/src/com/android/cts/javascanner/DocletRunner.java
@@ -0,0 +1,114 @@
+/*
+ * 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.javascanner;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Scanner;
+
+class DocletRunner {
+
+    private final File mSourceDir;
+    private final File mDocletPath;
+
+    DocletRunner(File sourceDir, File docletPath) {
+        mSourceDir = sourceDir;
+        mDocletPath = docletPath;
+    }
+
+    int runJavaDoc() throws IOException, InterruptedException {
+        List<String> args = new ArrayList<String>();
+        args.add("javadoc");
+        args.add("-doclet");
+        args.add("com.android.cts.javascannerdoclet.CtsJavaScannerDoclet");
+        args.add("-docletpath");
+        args.add(mDocletPath.toString());
+        args.add("-sourcepath");
+        args.add(getSourcePath(mSourceDir));
+        args.add("-classpath");
+        args.add(getClassPath());
+        args.addAll(getSourceFiles(mSourceDir));
+
+        Process process = new ProcessBuilder(args).start();
+        Scanner scanner = null;
+        try {
+            scanner = new Scanner(process.getInputStream());
+            while (scanner.hasNextLine()) {
+                System.out.println(scanner.nextLine());
+            }
+        } finally {
+            if (scanner != null) {
+                scanner.close();
+            }
+        }
+
+        return process.waitFor();
+    }
+
+    private String getSourcePath(File sourceDir) {
+        List<String> sourcePath = new ArrayList<String>();
+        sourcePath.add("./frameworks/base/core/java");
+        sourcePath.add("./frameworks/base/test-runner/src");
+        sourcePath.add("./libcore/junit/src/main/java");
+        sourcePath.add("./development/tools/hosttestlib/src");
+        sourcePath.add("./libcore/dalvik/src/main/java");
+        sourcePath.add("./cts/tests/src");
+        sourcePath.add(sourceDir.toString());
+        return join(sourcePath, ":");
+    }
+
+    private String getClassPath() {
+        List<String> classPath = new ArrayList<String>();
+        classPath.add("./prebuilt/common/tradefed/tradefed-prebuilt.jar");
+        return join(classPath, ":");
+    }
+
+    private List<String> getSourceFiles(File sourceDir) {
+        List<String> sourceFiles = new ArrayList<String>();
+
+        File[] files = sourceDir.listFiles(new FileFilter() {
+            @Override
+            public boolean accept(File pathname) {
+                return pathname.isDirectory() || pathname.toString().endsWith(".java");
+            }
+        });
+
+        for (File file : files) {
+            if (file.isDirectory()) {
+                sourceFiles.addAll(getSourceFiles(file));
+            } else {
+                sourceFiles.add(file.toString());
+            }
+        }
+
+        return sourceFiles;
+    }
+
+    private String join(List<String> options, String delimiter) {
+        StringBuilder builder = new StringBuilder();
+        int numOptions = options.size();
+        for (int i = 0; i < numOptions; i++) {
+            builder.append(options.get(i));
+            if (i + 1 < numOptions) {
+                builder.append(delimiter);
+            }
+        }
+        return builder.toString();
+    }
+}
diff --git a/tools/cts-native-scanner/Android.mk b/tools/cts-native-scanner/Android.mk
new file mode 100644
index 0000000..f8b1629
--- /dev/null
+++ b/tools/cts-native-scanner/Android.mk
@@ -0,0 +1,43 @@
+# 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)
+
+# We use copy-file-to-new-target so that the installed
+# script file's timestamp is at least as new as the
+# .jar file it wraps.
+
+# the hat script
+# ============================================================
+include $(CLEAR_VARS)
+LOCAL_IS_HOST_MODULE := true
+LOCAL_MODULE_CLASS := EXECUTABLES
+LOCAL_MODULE := cts-native-scanner
+LOCAL_MODULE_TAGS := optional
+
+include $(BUILD_SYSTEM)/base_rules.mk
+
+$(LOCAL_BUILT_MODULE): $(HOST_OUT_JAVA_LIBRARIES)/$(LOCAL_MODULE)$(COMMON_JAVA_PACKAGE_SUFFIX)
+$(LOCAL_BUILT_MODULE): $(LOCAL_PATH)/etc/$(LOCAL_MODULE) | $(ACP)
+	@echo "Copy: $(PRIVATE_MODULE) ($@)"
+	$(copy-file-to-new-target)
+	$(hide) chmod 755 $@
+
+# the other stuff
+# ============================================================
+subdirs := $(addprefix $(LOCAL_PATH)/,$(addsuffix /Android.mk, \
+		src \
+	))
+
+include $(subdirs)
diff --git a/tools/cts-native-scanner/etc/cts-native-scanner b/tools/cts-native-scanner/etc/cts-native-scanner
new file mode 100644
index 0000000..bf6138f
--- /dev/null
+++ b/tools/cts-native-scanner/etc/cts-native-scanner
@@ -0,0 +1,46 @@
+#!/bin/bash
+#
+# 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.
+
+# Set up prog to be the path of this script, including following symlinks,
+# and set up progdir to be the fully-qualified pathname of its directory.
+prog="$0"
+while [ -h "${prog}" ]; do
+    newProg=`/bin/ls -ld "${prog}"`
+    newProg=`expr "${newProg}" : ".* -> \(.*\)$"`
+    if expr "x${newProg}" : 'x/' >/dev/null; then
+        prog="${newProg}"
+    else
+        progdir=`dirname "${prog}"`
+        prog="${progdir}/${newProg}"
+    fi
+done
+oldwd=`pwd`
+progdir=`dirname "${prog}"`
+cd "${progdir}"
+progdir=`pwd`
+prog="${progdir}"/`basename "${prog}"`
+cd "${oldwd}"
+
+libdir=`dirname $progdir`/framework
+
+javaOpts=""
+while expr "x$1" : 'x-J' >/dev/null; do
+    opt=`expr "$1" : '-J\(.*\)'`
+    javaOpts="${javaOpts} -${opt}"
+    shift
+done
+
+exec java $javaOpts -jar $libdir/cts-native-scanner.jar "$@"
diff --git a/tools/cts-native-scanner/src/Android.mk b/tools/cts-native-scanner/src/Android.mk
new file mode 100644
index 0000000..9c97b1d
--- /dev/null
+++ b/tools/cts-native-scanner/src/Android.mk
@@ -0,0 +1,28 @@
+# 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)
+
+
+# cts-native-scanner java library
+# ============================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(call all-subdir-java-files)
+LOCAL_JAR_MANIFEST := MANIFEST.mf
+
+LOCAL_MODULE := cts-native-scanner
+LOCAL_MODULE_TAGS := optional
+
+include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/tools/cts-native-scanner/src/MANIFEST.mf b/tools/cts-native-scanner/src/MANIFEST.mf
new file mode 100644
index 0000000..85eb991
--- /dev/null
+++ b/tools/cts-native-scanner/src/MANIFEST.mf
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+Main-Class: com.android.cts.nativescanner.CtsNativeScanner
diff --git a/tools/cts-native-scanner/src/com/android/cts/nativescanner/CtsNativeScanner.java b/tools/cts-native-scanner/src/com/android/cts/nativescanner/CtsNativeScanner.java
new file mode 100644
index 0000000..a7599b0
--- /dev/null
+++ b/tools/cts-native-scanner/src/com/android/cts/nativescanner/CtsNativeScanner.java
@@ -0,0 +1,75 @@
+/*
+ * 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.nativescanner;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Class that searches a source directory for native gTests and outputs a
+ * list of test classes and methods.
+ */
+public class CtsNativeScanner {
+
+    private static void usage(String[] args) {
+        System.err.println("Arguments: " + Arrays.asList(args));
+        System.err.println("Usage: cts-native-scanner -s SOURCE_DIR -t TEST_SUITE");
+        System.exit(1);
+    }
+
+    public static void main(String[] args) throws Exception {
+        File sourceDir = null;
+        String testSuite = null;
+
+        for (int i = 0; i < args.length; i++) {
+            if ("-s".equals(args[i])) {
+                sourceDir = new File(getArg(args, ++i, "Missing value for source directory"));
+            } else if ("-t".equals(args[i])) {
+                testSuite = getArg(args, ++i, "Missing value for test suite");
+            } else {
+                System.err.println("Unsupported flag: " + args[i]);
+                usage(args);
+            }
+        }
+
+        if (sourceDir == null) {
+            System.out.println("Source directory is required");
+            usage(args);
+        }
+
+        if (testSuite == null) {
+            System.out.println("Test suite is required");
+            usage(args);
+        }
+
+        TestScanner scanner = new TestScanner(sourceDir, testSuite);
+        List<String> testNames = scanner.getTestNames();
+        for (String name : testNames) {
+            System.out.println(name);
+        }
+    }
+
+    private static String getArg(String[] args, int index, String message) {
+        if (index < args.length) {
+            return args[index];
+        } else {
+            System.err.println(message);
+            usage(args);
+            return null;
+        }
+    }
+}
diff --git a/tools/cts-native-scanner/src/com/android/cts/nativescanner/TestScanner.java b/tools/cts-native-scanner/src/com/android/cts/nativescanner/TestScanner.java
new file mode 100644
index 0000000..9411566
--- /dev/null
+++ b/tools/cts-native-scanner/src/com/android/cts/nativescanner/TestScanner.java
@@ -0,0 +1,113 @@
+/*
+ * 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.nativescanner;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Scanner;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Scanner of C++ gTest source files.
+ *
+ * It looks for test declarations and outputs a file following this format:
+ *
+ * class:TestClass1
+ * method:testMethod1
+ * method:testMethod2
+ * class:TestClass2
+ * method:testMethod1
+ *
+ */
+class TestScanner {
+
+    /** Directory to recursively scan for gTest test declarations. */
+    private final File mSourceDir;
+
+    private final String mTestSuite;
+
+    TestScanner(File sourceDir, String testSuite) {
+        mSourceDir = sourceDir;
+        mTestSuite = testSuite;
+    }
+
+    public List<String> getTestNames() throws IOException {
+        List<String> testNames = new ArrayList<String>();
+        scanDir(mSourceDir, testNames);
+        return testNames;
+    }
+
+    private void scanDir(File dir, List<String> testNames) throws FileNotFoundException {
+        // Find both C++ files to find tests and directories to look for more tests!
+        File[] files = dir.listFiles(new FilenameFilter() {
+            @Override
+            public boolean accept(File dir, String filename) {
+                return filename.endsWith(".cpp") || filename.endsWith(".cc")
+                        || new File(dir, filename).isDirectory();
+            }
+        });
+
+        for (int i = 0; i < files.length; i++) {
+            File file = files[i];
+            if (file.isDirectory()) {
+                scanDir(file, testNames);
+            } else {
+                scanFile(file, testNames);
+            }
+        }
+    }
+    // We want to find lines like class SLObjectCreationTest : public ::testing::Test { ...
+    // and extract the "SLObjectCreationTest" as group #1
+    private static final Pattern CLASS_REGEX =
+            Pattern.compile("\\s*class\\s+(\\w+).*");
+
+    // We want to find lines like TEST_F(SLObjectCreationTest, testAudioPlayerFromFdCreation) { ...
+    // and extract the "testAudioPlayerFromFdCreation" as group #1
+    private static final Pattern METHOD_REGEX =
+            Pattern.compile("\\s*TEST_F\\(\\w+,\\s*(\\w+)\\).*");
+
+    private void scanFile(File file, List<String> testNames) throws FileNotFoundException {
+        Scanner scanner = null;
+        try {
+            scanner = new Scanner(file);
+            while (scanner.hasNextLine()) {
+                String line = scanner.nextLine();
+                Matcher matcher = CLASS_REGEX.matcher(line);
+                if (matcher.matches()) {
+                    testNames.add("suite:" + mTestSuite);
+                    testNames.add("case:" + matcher.group(1));
+                    continue;
+                }
+
+                matcher = METHOD_REGEX.matcher(line);
+                if (matcher.matches()) {
+                    testNames.add("test:" + matcher.group(1));
+                    continue;
+                }
+            }
+        } finally {
+            if (scanner != null) {
+                scanner.close();
+            }
+        }
+    }
+}
diff --git a/tools/cts-native-xml-generator/Android.mk b/tools/cts-native-xml-generator/Android.mk
deleted file mode 100644
index c02d745..0000000
--- a/tools/cts-native-xml-generator/Android.mk
+++ /dev/null
@@ -1,43 +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.
-
-LOCAL_PATH := $(call my-dir)
-
-# We use copy-file-to-new-target so that the installed
-# script file's timestamp is at least as new as the
-# .jar file it wraps.
-
-# the hat script
-# ============================================================
-include $(CLEAR_VARS)
-LOCAL_IS_HOST_MODULE := true
-LOCAL_MODULE_CLASS := EXECUTABLES
-LOCAL_MODULE := cts-native-xml-generator
-LOCAL_MODULE_TAGS := optional
-
-include $(BUILD_SYSTEM)/base_rules.mk
-
-$(LOCAL_BUILT_MODULE): $(HOST_OUT_JAVA_LIBRARIES)/$(LOCAL_MODULE)$(COMMON_JAVA_PACKAGE_SUFFIX)
-$(LOCAL_BUILT_MODULE): $(LOCAL_PATH)/etc/$(LOCAL_MODULE) | $(ACP)
-	@echo "Copy: $(PRIVATE_MODULE) ($@)"
-	$(copy-file-to-new-target)
-	$(hide) chmod 755 $@
-
-# the other stuff
-# ============================================================
-subdirs := $(addprefix $(LOCAL_PATH)/,$(addsuffix /Android.mk, \
-		src \
-	))
-
-include $(subdirs)
diff --git a/tools/cts-native-xml-generator/etc/cts-native-xml-generator b/tools/cts-native-xml-generator/etc/cts-native-xml-generator
deleted file mode 100644
index cae5f4a..0000000
--- a/tools/cts-native-xml-generator/etc/cts-native-xml-generator
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/bin/bash
-#
-# 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.
-
-# Set up prog to be the path of this script, including following symlinks,
-# and set up progdir to be the fully-qualified pathname of its directory.
-prog="$0"
-while [ -h "${prog}" ]; do
-    newProg=`/bin/ls -ld "${prog}"`
-    newProg=`expr "${newProg}" : ".* -> \(.*\)$"`
-    if expr "x${newProg}" : 'x/' >/dev/null; then
-        prog="${newProg}"
-    else
-        progdir=`dirname "${prog}"`
-        prog="${progdir}/${newProg}"
-    fi
-done
-oldwd=`pwd`
-progdir=`dirname "${prog}"`
-cd "${progdir}"
-progdir=`pwd`
-prog="${progdir}"/`basename "${prog}"`
-cd "${oldwd}"
-
-libdir=`dirname $progdir`/framework
-
-javaOpts=""
-while expr "x$1" : 'x-J' >/dev/null; do
-    opt=`expr "$1" : '-J\(.*\)'`
-    javaOpts="${javaOpts} -${opt}"
-    shift
-done
-
-exec java $javaOpts -jar $libdir/cts-native-xml-generator.jar "$@"
diff --git a/tools/cts-native-xml-generator/src/Android.mk b/tools/cts-native-xml-generator/src/Android.mk
deleted file mode 100644
index ed93457..0000000
--- a/tools/cts-native-xml-generator/src/Android.mk
+++ /dev/null
@@ -1,29 +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.
-
-LOCAL_PATH := $(call my-dir)
-
-
-# cts-native-xml-generator java library
-# ============================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(call all-subdir-java-files)
-LOCAL_JAVA_RESOURCE_DIRS := 
-LOCAL_JAR_MANIFEST := MANIFEST.mf
-
-LOCAL_MODULE := cts-native-xml-generator
-LOCAL_MODULE_TAGS := optional
-
-include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/tools/cts-native-xml-generator/src/MANIFEST.mf b/tools/cts-native-xml-generator/src/MANIFEST.mf
deleted file mode 100644
index b8bde72..0000000
--- a/tools/cts-native-xml-generator/src/MANIFEST.mf
+++ /dev/null
@@ -1,2 +0,0 @@
-Manifest-Version: 1.0
-Main-Class: com.android.cts.nativexml.CtsNativeXmlGenerator
diff --git a/tools/cts-native-xml-generator/src/com/android/cts/nativexml/CtsNativeXmlGenerator.java b/tools/cts-native-xml-generator/src/com/android/cts/nativexml/CtsNativeXmlGenerator.java
deleted file mode 100644
index 1a436dd..0000000
--- a/tools/cts-native-xml-generator/src/com/android/cts/nativexml/CtsNativeXmlGenerator.java
+++ /dev/null
@@ -1,89 +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.nativexml;
-
-import java.io.File;
-import java.util.Arrays;
-
-/**
- * Class that searches a source directory for native gTests and outputs a
- * test package xml.
- */
-public class CtsNativeXmlGenerator {
-
-    private static void usage(String[] args) {
-        System.err.println("Arguments: " + Arrays.asList(args));
-        System.err.println("Usage: cts-native-xml-generator -p PACKAGE_NAME -n EXECUTABLE_NAME "
-                + "-s SOURCE_DIR [-o OUTPUT_FILE]");
-        System.exit(1);
-    }
-
-    public static void main(String[] args) throws Exception {
-        String appPackageName = null;
-        String name = null;
-        File sourceDir = null;
-        String outputPath = null;
-
-        for (int i = 0; i < args.length; i++) {
-            if ("-p".equals(args[i])) {
-                if (i + 1 < args.length) {
-                    appPackageName = args[++i];
-                } else {
-                    System.err.println("Missing value for test package");
-                    usage(args);
-                }
-            } else if ("-n".equals(args[i])) {
-                if (i + 1 < args.length) {
-                    name = args[++i];
-                } else {
-                    System.err.println("Missing value for executable name");
-                    usage(args);
-                }
-            } else if ("-o".equals(args[i])) {
-                if (i + 1 < args.length) {
-                    outputPath = args[++i];
-                } else {
-                    System.err.println("Missing value for output file");
-                    usage(args);
-                }
-            } else if ("-s".equals(args[i])) {
-                if (i + 1 < args.length) {
-                    sourceDir = new File(args[++i]);
-                } else {
-                    System.err.println("Missing value for source directory");
-                    usage(args);
-                }
-            } else {
-                System.err.println("Unsupported flag: " + args[i]);
-                usage(args);
-            }
-        }
-
-        if (appPackageName == null) {
-            System.out.println("Package name is required");
-            usage(args);
-        } else if (name == null) {
-            System.out.println("Executable name is required");
-            usage(args);
-        } else if (sourceDir == null) {
-            System.out.println("Source directory is required");
-            usage(args);
-        }
-
-        Generator generator = new Generator(appPackageName, name, sourceDir, outputPath);
-        generator.writePackageXml();
-    }
-}
diff --git a/tools/cts-native-xml-generator/src/com/android/cts/nativexml/Generator.java b/tools/cts-native-xml-generator/src/com/android/cts/nativexml/Generator.java
deleted file mode 100644
index 7c074b8..0000000
--- a/tools/cts-native-xml-generator/src/com/android/cts/nativexml/Generator.java
+++ /dev/null
@@ -1,177 +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.nativexml;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.util.Scanner;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Generator of TestPackage XML files for native gTests.
- *
- * It scours all the C++ source files in a given source directory looking
- * for test declarations and outputs a XML test listing.
- */
-class Generator {
-
-    /** Test package name like "android.nativemedia" to group the tests. */
-    private final String mAppPackageName;
-
-    /** Name of the native executable. */
-    private final String mName;
-
-    /** Directory to recursively scan for gTest test declarations. */
-    private final File mSourceDir;
-
-    /** Path to output file or null to just dump to standard out. */
-    private final String mOutputPath;
-
-    Generator(String appPackageName, String name, File sourceDir, String outputPath) {
-        mAppPackageName = appPackageName;
-        mName = name;
-        mSourceDir = sourceDir;
-        mOutputPath = outputPath;
-    }
-
-    public void writePackageXml() throws IOException {
-        OutputStream output = System.out;
-        if (mOutputPath != null) {
-            File outputFile = new File(mOutputPath);
-            File outputDir = outputFile.getParentFile();
-            if (!outputDir.exists()) {
-                outputDir.mkdirs();
-                if (!outputDir.exists()) {
-                    System.err.println("Couldn't make output directory: " + outputDir);
-                    System.exit(1);
-                }
-            }
-            output = new FileOutputStream(outputFile);
-        }
-
-        PrintWriter writer = null;
-        try {
-            writer = new PrintWriter(output);
-            writer.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
-            writeTestPackage(writer);
-        } finally {
-            if (writer != null) {
-                writer.close();
-            }
-        }
-    }
-
-    private void writeTestPackage(PrintWriter writer) throws FileNotFoundException {
-        writer.append("<TestPackage appPackageName=\"")
-                .append(mAppPackageName)
-                .append("\" name=\"")
-                .append(mName)
-                .println("\" testType=\"native\" version=\"1.0\">");
-        writeTestSuite(writer);
-        writer.println("</TestPackage>");
-    }
-
-    private void writeTestSuite(PrintWriter writer) throws FileNotFoundException {
-        /*
-         * Given "android.foo.bar.baz"...
-         *
-         * <TestSuite name="android">
-         *   <TestSuite name="foo">
-         *     <TestSuite name="bar">
-         *       <TestSuite name="baz">
-         */
-        Scanner scanner = null;
-        try {
-            scanner = new Scanner(mAppPackageName);
-            scanner.useDelimiter("\\.");
-
-            int numLevels = 0;
-            for (; scanner.hasNext(); numLevels++) {
-                String packagePart = scanner.next();
-                writer.append("<TestSuite name=\"").append(packagePart).println("\">");
-            }
-
-            writeTestCases(writer, mSourceDir);
-
-            for (; numLevels > 0; numLevels--) {
-                writer.println("</TestSuite>");
-            }
-        } finally {
-            if (scanner != null) {
-                scanner.close();
-            }
-        }
-    }
-
-    private void writeTestCases(PrintWriter writer, File dir) throws FileNotFoundException {
-        // Find both C++ files to find tests and directories to look for more tests!
-        File[] files = dir.listFiles(new FilenameFilter() {
-            @Override
-            public boolean accept(File dir, String filename) {
-                return filename.endsWith(".cpp") || new File(dir, filename).isDirectory();
-            }
-        });
-
-        for (int i = 0; i < files.length; i++) {
-            File file = files[i];
-            if (file.isDirectory()) {
-                writeTestCases(writer, file);
-            } else {
-                // Take the test name from the name of the file. It's probably
-                // more accurate to take the name from inside the file...
-                String fileName = file.getName();
-                int extension = fileName.lastIndexOf('.');
-                if (extension != -1) {
-                    fileName = fileName.substring(0, extension);
-                }
-
-                writer.append("<TestCase name=\"").append(fileName).println("\">");
-                writeTests(writer, file);
-                writer.println("</TestCase>");
-            }
-        }
-    }
-
-    // We want to find lines like TEST_F(SLObjectCreationTest, testAudioPlayerFromFdCreation) { ...
-    // and extract the "testAudioPlayerFromFdCreation" as group #1
-    private static final Pattern TEST_REGEX = Pattern.compile("\\s*TEST_F\\(\\w+,\\s*(\\w+)\\).*");
-
-    private void writeTests(PrintWriter writer, File file) throws FileNotFoundException {
-        Scanner scanner = null;
-        try {
-            scanner = new Scanner(file);
-            while (scanner.hasNextLine()) {
-                String line = scanner.nextLine();
-                Matcher matcher = TEST_REGEX.matcher(line);
-                if (matcher.matches()) {
-                    String name = matcher.group(1);
-                    writer.append("<Test name=\"").append(name).println("\" />");
-                }
-            }
-        } finally {
-            if (scanner != null) {
-                scanner.close();
-            }
-        }
-    }
-}
diff --git a/tools/cts-xml-generator/Android.mk b/tools/cts-xml-generator/Android.mk
new file mode 100644
index 0000000..5842dd8
--- /dev/null
+++ b/tools/cts-xml-generator/Android.mk
@@ -0,0 +1,43 @@
+# 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)
+
+# We use copy-file-to-new-target so that the installed
+# script file's timestamp is at least as new as the
+# .jar file it wraps.
+
+# the hat script
+# ============================================================
+include $(CLEAR_VARS)
+LOCAL_IS_HOST_MODULE := true
+LOCAL_MODULE_CLASS := EXECUTABLES
+LOCAL_MODULE := cts-xml-generator
+LOCAL_MODULE_TAGS := optional
+
+include $(BUILD_SYSTEM)/base_rules.mk
+
+$(LOCAL_BUILT_MODULE): $(HOST_OUT_JAVA_LIBRARIES)/$(LOCAL_MODULE)$(COMMON_JAVA_PACKAGE_SUFFIX)
+$(LOCAL_BUILT_MODULE): $(LOCAL_PATH)/etc/$(LOCAL_MODULE) | $(ACP)
+	@echo "Copy: $(PRIVATE_MODULE) ($@)"
+	$(copy-file-to-new-target)
+	$(hide) chmod 755 $@
+
+# the other stuff
+# ============================================================
+subdirs := $(addprefix $(LOCAL_PATH)/,$(addsuffix /Android.mk, \
+		src \
+	))
+
+include $(subdirs)
diff --git a/tools/cts-xml-generator/etc/cts-xml-generator b/tools/cts-xml-generator/etc/cts-xml-generator
new file mode 100644
index 0000000..5f05af6
--- /dev/null
+++ b/tools/cts-xml-generator/etc/cts-xml-generator
@@ -0,0 +1,46 @@
+#!/bin/bash
+#
+# 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.
+
+# Set up prog to be the path of this script, including following symlinks,
+# and set up progdir to be the fully-qualified pathname of its directory.
+prog="$0"
+while [ -h "${prog}" ]; do
+    newProg=`/bin/ls -ld "${prog}"`
+    newProg=`expr "${newProg}" : ".* -> \(.*\)$"`
+    if expr "x${newProg}" : 'x/' >/dev/null; then
+        prog="${newProg}"
+    else
+        progdir=`dirname "${prog}"`
+        prog="${progdir}/${newProg}"
+    fi
+done
+oldwd=`pwd`
+progdir=`dirname "${prog}"`
+cd "${progdir}"
+progdir=`pwd`
+prog="${progdir}"/`basename "${prog}"`
+cd "${oldwd}"
+
+libdir=`dirname $progdir`/framework
+
+javaOpts=""
+while expr "x$1" : 'x-J' >/dev/null; do
+    opt=`expr "$1" : '-J\(.*\)'`
+    javaOpts="${javaOpts} -${opt}"
+    shift
+done
+
+exec java $javaOpts -jar $libdir/cts-xml-generator.jar "$@"
diff --git a/tools/cts-xml-generator/src/Android.mk b/tools/cts-xml-generator/src/Android.mk
new file mode 100644
index 0000000..62f8692
--- /dev/null
+++ b/tools/cts-xml-generator/src/Android.mk
@@ -0,0 +1,30 @@
+# 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)
+
+
+# cts-xml-generator java library
+# ============================================================
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(call all-subdir-java-files)
+LOCAL_JAR_MANIFEST := MANIFEST.mf
+
+LOCAL_MODULE := cts-xml-generator
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_STATIC_JAVA_LIBRARIES := vogarexpectlib
+
+include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/tools/cts-xml-generator/src/MANIFEST.mf b/tools/cts-xml-generator/src/MANIFEST.mf
new file mode 100644
index 0000000..ce4178e
--- /dev/null
+++ b/tools/cts-xml-generator/src/MANIFEST.mf
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+Main-Class: com.android.cts.xmlgenerator.CtsXmlGenerator
diff --git a/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/CtsXmlGenerator.java b/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/CtsXmlGenerator.java
new file mode 100644
index 0000000..ce4fdd7
--- /dev/null
+++ b/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/CtsXmlGenerator.java
@@ -0,0 +1,125 @@
+/*
+ * 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.xmlgenerator;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+import vogar.ExpectationStore;
+import vogar.ModeId;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+
+/** Class that outputs a test package xml. */
+public class CtsXmlGenerator {
+
+    private static void usage(String[] args) {
+        System.err.println("Arguments: " + Arrays.asList(args));
+        System.err.println("Usage: cts-xml-generator -p PACKAGE_NAME -n NAME [-t TEST_TYPE]"
+                + " [-j JAR_PATH] [-i INSTRUMENTATION] [-m MANIFEST_FILE] [-e EXPECTATION_FILE]"
+                + " [-o OUTPUT_FILE]");
+        System.exit(1);
+    }
+
+    public static void main(String[] args) throws Exception {
+        String appPackageName = null;
+        String name = null;
+        String outputPath = null;
+        Set<File> expectationFiles = new HashSet<File>();
+        File manifestFile = null;
+        String instrumentation = null;
+        String testType = null;
+        String jarPath = null;
+
+        for (int i = 0; i < args.length; i++) {
+            if ("-p".equals(args[i])) {
+                appPackageName = getArg(args, ++i, "Missing value for test package");
+            } else if ("-n".equals(args[i])) {
+                name = getArg(args, ++i, "Missing value for executable name");
+            } else if ("-t".equals(args[i])) {
+                testType = getArg(args, ++i, "Missing value for test type");
+            } else if ("-j".equals(args[i])) {
+                jarPath = getArg(args, ++i, "Missing value for jar path");
+            } else if ("-m".equals(args[i])) {
+                manifestFile = new File(getArg(args, ++i, "Missing value for manifest"));
+            } else if ("-i".equals(args[i])) {
+                instrumentation = getArg(args, ++i, "Missing value for instrumentation");
+            } else if ("-e".equals(args[i])) {
+                expectationFiles.add(new File(getArg(args, ++i,
+                        "Missing value for expectation store")));
+            } else if ("-o".equals(args[i])) {
+                outputPath = getArg(args, ++i, "Missing value for output file");
+            } else {
+                System.err.println("Unsupported flag: " + args[i]);
+                usage(args);
+            }
+        }
+
+        String appNameSpace = null;
+        String runner = null;
+        String targetNameSpace = null;
+
+        if (manifestFile != null) {
+            Document manifest = DocumentBuilderFactory.newInstance().newDocumentBuilder()
+                    .parse(manifestFile);
+            Element documentElement = manifest.getDocumentElement();
+            appNameSpace = documentElement.getAttribute("package");
+            runner = getElementAttribute(documentElement, "instrumentation",
+                    "android:name");
+            targetNameSpace = getElementAttribute(documentElement, "instrumentation",
+                    "android:targetPackage");
+        }
+
+        if (appPackageName == null) {
+            System.out.println("Package name is required");
+            usage(args);
+        } else if (name == null) {
+            System.out.println("Executable name is required");
+            usage(args);
+        }
+
+        ExpectationStore store = ExpectationStore.parse(expectationFiles, ModeId.DEVICE);
+        XmlGenerator generator = new XmlGenerator(store, appNameSpace, appPackageName,
+                name, runner, instrumentation, targetNameSpace, jarPath, testType, outputPath);
+        generator.writePackageXml();
+    }
+
+    private static String getArg(String[] args, int index, String message) {
+        if (index < args.length) {
+            return args[index];
+        } else {
+            System.err.println(message);
+            usage(args);
+            return null;
+        }
+    }
+
+    private static String getElementAttribute(Element parentElement, String elementName,
+            String attributeName) {
+        NodeList nodeList = parentElement.getElementsByTagName(elementName);
+        if (nodeList.getLength() > 0) {
+             Element element = (Element) nodeList.item(0);
+             return element.getAttribute(attributeName);
+        }
+        return null;
+    }
+}
diff --git a/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/TestCase.java b/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/TestCase.java
new file mode 100644
index 0000000..bab3476
--- /dev/null
+++ b/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/TestCase.java
@@ -0,0 +1,44 @@
+/*
+ * 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.xmlgenerator;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+class TestCase {
+
+    private final String mName;
+
+    private final List<String> mTests = new ArrayList<String>();
+
+    public TestCase(String name) {
+        mName = name;
+    }
+
+    public String getName() {
+        return mName;
+    }
+
+    public void addTest(String test) {
+        mTests.add(test);
+    }
+
+    public Collection<String> getTests() {
+        return Collections.unmodifiableCollection(mTests);
+    }
+}
diff --git a/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/TestListParser.java b/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/TestListParser.java
new file mode 100644
index 0000000..76e1437
--- /dev/null
+++ b/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/TestListParser.java
@@ -0,0 +1,101 @@
+/*
+ * 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.xmlgenerator;
+
+import java.io.InputStream;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Scanner;
+
+/**
+ * Parser of test lists that are in the format of:
+ *
+ * suite:android.holo.cts
+ * case:HoloTest
+ * test:testHolo
+ * test:testHoloDialog
+ */
+class TestListParser {
+
+    public Collection<TestSuite> parse(InputStream input) {
+        Map<String, TestSuite> suiteMap = new HashMap<String, TestSuite>();
+        TestSuite currentSuite = null;
+        TestCase currentCase = null;
+        Scanner scanner = null;
+        try {
+            scanner = new Scanner(input);
+            while(scanner.hasNextLine()) {
+                String line = scanner.nextLine();
+                String[] tokens = line.split(":");
+                if (tokens.length != 2) {
+                    continue;
+                }
+
+                String key = tokens[0];
+                String value = tokens[1];
+                if ("suite".equals(key)) {
+                    currentSuite = handleSuite(suiteMap, value);
+                } else if ("case".equals(key)) {
+                    currentCase = handleCase(currentSuite, value);
+                } else if ("test".equals(key)) {
+                    handleTest(currentCase, value);
+                }
+            }
+        } finally {
+            if (scanner != null) {
+                scanner.close();
+            }
+        }
+        return suiteMap.values();
+    }
+
+    private TestSuite handleSuite(Map<String, TestSuite> suiteMap, String fullSuite) {
+        String[] suites = fullSuite.split("\\.");
+        int numSuites = suites.length;
+        TestSuite lastSuite = null;
+
+        for (int i = 0; i < numSuites; i++) {
+            String name = suites[i];
+            if (lastSuite != null) {
+                if (lastSuite.hasSuite(name)) {
+                    lastSuite = lastSuite.getSuite(name);
+                } else {
+                    TestSuite newSuite = new TestSuite(name);
+                    lastSuite.addSuite(newSuite);
+                    lastSuite = newSuite;
+                }
+            } else if (suiteMap.containsKey(name)) {
+                lastSuite = suiteMap.get(name);
+            } else {
+                lastSuite = new TestSuite(name);
+                suiteMap.put(name, lastSuite);
+            }
+        }
+
+        return lastSuite;
+    }
+
+    private TestCase handleCase(TestSuite suite, String caseName) {
+        TestCase testCase = new TestCase(caseName);
+        suite.addCase(testCase);
+        return testCase;
+    }
+
+    private void handleTest(TestCase testCase, String test) {
+        testCase.addTest(test);
+    }
+}
diff --git a/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/TestSuite.java b/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/TestSuite.java
new file mode 100644
index 0000000..3c29603
--- /dev/null
+++ b/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/TestSuite.java
@@ -0,0 +1,64 @@
+/*
+ * 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.xmlgenerator;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+class TestSuite {
+
+    private final String mName;
+
+    private final Map<String, TestSuite> mSuites = new HashMap<String, TestSuite>();
+
+    private final List<TestCase> mCases = new ArrayList<TestCase>();
+
+    public TestSuite(String name) {
+        mName = name;
+    }
+
+    public String getName() {
+        return mName;
+    }
+
+    public boolean hasSuite(String name) {
+        return mSuites.containsKey(name);
+    }
+
+    public TestSuite getSuite(String name) {
+        return mSuites.get(name);
+    }
+
+    public void addSuite(TestSuite suite) {
+        mSuites.put(suite.mName, suite);
+    }
+
+    public Collection<TestSuite> getSuites() {
+        return Collections.unmodifiableCollection(mSuites.values());
+    }
+
+    public void addCase(TestCase testCase) {
+        mCases.add(testCase);
+    }
+
+    public Collection<TestCase> getCases() {
+        return Collections.unmodifiableCollection(mCases);
+    }
+}
diff --git a/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/XmlGenerator.java b/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/XmlGenerator.java
new file mode 100644
index 0000000..cd2275d
--- /dev/null
+++ b/tools/cts-xml-generator/src/com/android/cts/xmlgenerator/XmlGenerator.java
@@ -0,0 +1,195 @@
+/*
+ * 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.xmlgenerator;
+
+import vogar.Expectation;
+import vogar.ExpectationStore;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.util.Collection;
+
+/**
+ * Generator of TestPackage XML files for native tests.
+ *
+ * It takes in an input of the following form:
+ *
+ * suite: x.y.z
+ * case:TestClass1
+ * test:testMethod1
+ * test:testMethod2
+ * case:TestClass2
+ * test:testMethod1
+ * suite: x.y
+ * case:TestClass3
+ * test:testMethod2
+ */
+class XmlGenerator {
+
+    /** Example: com.android.cts.holo */
+    private final String mAppNamespace;
+
+    /** Test package name like "android.nativemedia" to group the tests. */
+    private final String mAppPackageName;
+
+    /** Name of the native executable. */
+    private final String mName;
+
+    /** Test runner */
+    private final String mRunner;
+
+    private final String mTargetBinaryName;
+
+    private final String mTargetNameSpace;
+
+    private final String mJarPath;
+
+    private final String mTestType;
+
+    /** Path to output file or null to just dump to standard out. */
+    private final String mOutputPath;
+
+    /** ExpectationStore to filter out known failures. */
+    private final ExpectationStore mExpectations;
+
+    XmlGenerator(ExpectationStore expectations, String appNameSpace, String appPackageName,
+            String name, String runner, String targetBinaryName, String targetNameSpace,
+            String jarPath, String testType, String outputPath) {
+        mAppNamespace = appNameSpace;
+        mAppPackageName = appPackageName;
+        mName = name;
+        mRunner = runner;
+        mTargetBinaryName = targetBinaryName;
+        mTargetNameSpace = targetNameSpace;
+        mJarPath = jarPath;
+        mTestType = testType;
+        mOutputPath = outputPath;
+        mExpectations = expectations;
+    }
+
+    public void writePackageXml() throws IOException {
+        OutputStream output = System.out;
+        if (mOutputPath != null) {
+            File outputFile = new File(mOutputPath);
+            output = new FileOutputStream(outputFile);
+        }
+
+        PrintWriter writer = null;
+        try {
+            writer = new PrintWriter(output);
+            writer.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
+            writeTestPackage(writer);
+        } finally {
+            if (writer != null) {
+                writer.close();
+            }
+        }
+    }
+
+    private void writeTestPackage(PrintWriter writer) {
+        writer.append("<TestPackage");
+        if (mAppNamespace != null) {
+            writer.append(" appNameSpace=\"").append(mAppNamespace).append("\"");
+        }
+
+        writer.append(" appPackageName=\"").append(mAppPackageName).append("\"");
+        writer.append(" name=\"").append(mName).append("\"");
+
+        if (mRunner != null) {
+            writer.append(" runner=\"").append(mRunner).append("\"");
+        }
+
+        if (mAppNamespace != null && mTargetNameSpace != null
+                && !mAppNamespace.equals(mTargetNameSpace)) {
+            writer.append(" targetBinaryName=\"").append(mTargetBinaryName).append("\"");
+            writer.append(" targetNameSpace=\"").append(mTargetNameSpace).append("\"");
+        }
+
+        if (mTestType != null) {
+            writer.append(" testType=\"").append(mTestType).append("\"");
+        }
+
+        if (mJarPath != null) {
+            writer.append(" jarPath=\"").append(mJarPath).append("\"");
+        }
+
+        writer.println(" version=\"1.0\">");
+
+        TestListParser parser = new TestListParser();
+        Collection<TestSuite> suites = parser.parse(System.in);
+        StringBuilder nameCollector = new StringBuilder();
+        writeTestSuites(writer, suites, nameCollector);
+        writer.println("</TestPackage>");
+    }
+
+    private void writeTestSuites(PrintWriter writer, Collection<TestSuite> suites,
+            StringBuilder nameCollector) {
+        for (TestSuite suite : suites) {
+            writer.append("<TestSuite name=\"").append(suite.getName()).println("\">");
+
+            String namePart = suite.getName();
+            if (nameCollector.length() > 0) {
+                namePart = "." + namePart;
+            }
+            nameCollector.append(namePart);
+
+            writeTestSuites(writer, suite.getSuites(), nameCollector);
+            writeTestCases(writer, suite.getCases(), nameCollector);
+
+            nameCollector.delete(nameCollector.length() - namePart.length(),
+                    nameCollector.length());
+            writer.println("</TestSuite>");
+        }
+    }
+
+    private void writeTestCases(PrintWriter writer, Collection<TestCase> cases,
+            StringBuilder nameCollector) {
+        for (TestCase testCase : cases) {
+            String name = testCase.getName();
+            writer.append("<TestCase name=\"").append(name).println("\">");
+            nameCollector.append('.').append(name);
+
+            writeTests(writer, testCase.getTests(), nameCollector);
+
+            nameCollector.delete(nameCollector.length() - name.length() - 1,
+                    nameCollector.length());
+            writer.println("</TestCase>");
+        }
+    }
+
+    private void writeTests(PrintWriter writer, Collection<String> tests,
+            StringBuilder nameCollector) {
+        for (String test : tests) {
+            nameCollector.append('#').append(test);
+            writer.append("<Test name=\"").append(test).append("\"");
+            if (isKnownFailure(mExpectations, nameCollector.toString())) {
+                writer.append(" expectation=\"failure\"");
+            }
+            writer.println(" />");
+
+            nameCollector.delete(nameCollector.length() - test.length() - 1,
+                    nameCollector.length());
+        }
+    }
+
+    public static boolean isKnownFailure(ExpectationStore expectationStore, String testName) {
+        return expectationStore != null && expectationStore.get(testName) != Expectation.SUCCESS;
+    }
+}
diff --git a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoInstrument.java b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoInstrument.java
index c9fcc83..565ac7f 100644
--- a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoInstrument.java
+++ b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoInstrument.java
@@ -288,7 +288,7 @@
         try {
             String[] rootProcesses = RootProcessScanner.getRootProcesses();
             for (String rootProcess : rootProcesses) {
-                builder.append(rootProcess).append(';');
+                builder.append(rootProcess).append(':').append(0).append(';');
             }
         } catch (Exception exception) {
             Log.e(TAG, "Error getting processes: " + exception.getMessage(), exception);
@@ -343,5 +343,4 @@
 
         return builder.toString();
     }
-
 }
diff --git a/tools/dx-tests/Android.mk b/tools/dx-tests/Android.mk
deleted file mode 100644
index d249cea..0000000
--- a/tools/dx-tests/Android.mk
+++ /dev/null
@@ -1,73 +0,0 @@
-# Copyright (C) 2008 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT 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)
-
-# run-dx-tests host module
-#===========================================================
-
-include $(CLEAR_VARS)
-LOCAL_IS_HOST_MODULE := true
-LOCAL_MODULE_CLASS := EXECUTABLES
-LOCAL_MODULE := dx-tests
-
-LOCAL_JAVA_LIBRARIES := dx
-
-
-include $(BUILD_SYSTEM)/base_rules.mk
-
-ALL_SRC_FILES := $(patsubst ./%,%,$(shell cd $(LOCAL_PATH) && find src/dxc/junit -name "*.java" -o -name "*.j" -o -name "*.cfh"))
-ABSOLUTE_SRC_FILES := $(addprefix $(LOCAL_PATH)/,$(ALL_SRC_FILES))
-
-$(LOCAL_BUILT_MODULE): PRIVATE_CURRENT_MODULE_SCRIPT := $(LOCAL_PATH)/etc/compileall
-$(LOCAL_BUILT_MODULE): PRIVATE_BASE := $(LOCAL_PATH)
-$(LOCAL_BUILT_MODULE): PRIVATE_INTERMEDIATES := $(intermediates)
-$(LOCAL_BUILT_MODULE): $(DX) $(TARGET_OUT_EXECUTABLES)/dalvikvm
-$(LOCAL_BUILT_MODULE): $(LOCAL_PATH)/etc/starttests $(LOCAL_PATH)/etc/compileall ${ABSOLUTE_SRC_FILES} $(HOST_OUT_JAVA_LIBRARIES)/dx.jar $(HOST_OUT_JAVA_LIBRARIES)/cfassembler.jar | $(ACP)
-	@echo "Copy: $(PRIVATE_MODULE) ($@)"
-	$(copy-file-to-new-target)
-	$(hide) chmod 755 $@
-	$(hide) PATH=$(HOST_OUT_EXECUTABLES):$$PATH $(PRIVATE_CURRENT_MODULE_SCRIPT) "$(PRIVATE_BASE)" "$(HOST_JAVAC)" "$(PRIVATE_INTERMEDIATES)" "$(HOST_OUT_JAVA_LIBRARIES)/dx.jar:$(HOST_OUT_JAVA_LIBRARIES)/cfassembler.jar" "$(HOST_OUT)"
-
-# cfassembler host module
-#============================================================
-
-include $(CLEAR_VARS)
-
-LOCAL_IS_HOST_MODULE := true
-LOCAL_MODULE_CLASS := EXECUTABLES
-LOCAL_MODULE := cfassembler
-
-include $(BUILD_SYSTEM)/base_rules.mk
-
-$(LOCAL_BUILT_MODULE): $(HOST_OUT_JAVA_LIBRARIES)/cfassembler$(COMMON_JAVA_PACKAGE_SUFFIX)
-$(LOCAL_BUILT_MODULE): $(LOCAL_PATH)/etc/cfassembler | $(ACP)
-	@echo "Copy: $(PRIVATE_MODULE) ($@)"
-	$(copy-file-to-new-target)
-	$(hide) chmod 755 $@
-
-INTERNAL_DALVIK_MODULES += $(LOCAL_INSTALLED_MODULE)
-
-# cfassembler java library
-# ============================================================
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := src/dxconvext/ClassFileAssembler.java src/dxconvext/util/FileUtils.java
-LOCAL_JAR_MANIFEST := etc/cfassembler_manifest.txt
-
-LOCAL_MODULE:= cfassembler
-
-include $(BUILD_HOST_JAVA_LIBRARY)
-
-INTERNAL_DALVIK_MODULES += $(LOCAL_INSTALLED_MODULE)
diff --git a/tools/dx-tests/dx-tests.css b/tools/dx-tests/dx-tests.css
deleted file mode 100644
index a315a73..0000000
--- a/tools/dx-tests/dx-tests.css
+++ /dev/null
@@ -1,59 +0,0 @@
-h1 {
-    font-family: serif;
-    color: #222266;
-}
-
-h2 {
-    font-family: serif;
-    border-top-style: solid;
-    border-top-width: 2px;
-    border-color: #ccccdd;
-    padding-top: 12px;
-    margin-top: 48px;
-    margin-bottom: 2px;
-    color: #222266;
-}
-
-@media print {
-    table {
-        font-size: 8pt;
-    }
-}
-
-@media screen {
-    table {
-        font-size: 10pt;
-    }
-}
-
-
-/* general for all tables */
-
-table {
-    border-collapse: collapse;
-    margin-top: 24px;
-    margin-bottom: 24px;
-    margin-left: 48px;
-    margin-right: 48px;
-}
-
-table th {
-    font-family: sans-serif;
-    background: #aabbff;
-    text-align: left;
-}
-
-table td {
-    font-family: sans-serif;
-    border-top-style: solid;
-    border-bottom-style: solid;
-    border-width: 1px;
-    border-color: #aaaaff;
-    padding-top: 4px;
-    padding-bottom: 4px;
-    padding-left: 4px;
-    padding-right: 6px;
-    background: #eeeeff;
-    margin-top: 4pt;
-    margin-bottom: 0pt;
-}
diff --git a/tools/dx-tests/dx-tests.html b/tools/dx-tests/dx-tests.html
deleted file mode 100644
index 832f701..0000000
--- a/tools/dx-tests/dx-tests.html
+++ /dev/null
@@ -1,141 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-<html>
-  <head>
-    <title>DX Converter Test Suite</title>
-    <link rel=stylesheet href="dx-tests.css">
-  </head>
-
-  <body>
-    <h1>DX Converter Test Suite</h1>
-    <p>Version 1.0</p>
-    <p>Copyright &copy; 2008 The Android Open Source Project
-
-    <h2>Overview</h2>
-
-    <p>    
-      This directory contains a test suite for the DX converter. It tests the
-      capabilities of the DX converter in a black-box manner, based on the
-      usual specifications for <code>.class</code> files. The suite does both
-      functional and verifier tests. Regarding the latter, the DX converter has
-      only limited bytecode verification capabilities, but the combination of DX
-      and the Dalvik VM is supposed to perform bytecode verification equivalent
-      to that done in other virtual machines. Please see
-        
-      <pre>
-        docs/dalvik/java-constraints.html
-        docs/dalvik/verifier.html
-      </pre>
-        
-      for further details.
-    </p>
-
-    <h2>How to build</h2>
-    
-    <p>
-      The test suite is normally included in a full build of the Android
-      project. If it needs to be built individually, a simple
-        
-      <pre>
-        make dx-tests
-      </pre>
-        
-      or an
-        
-      <pre>
-        mm
-      </pre>
-        
-      in this directory will do.
-    </p>
-
-    <h2>How to run</h2>
-        
-    <p>
-      The suite can be invoked by executing
-    
-      <pre>
-        dx-tests
-      </pre>
-    
-      from any location, assuming the suite has been built. This will run
-      all tests. If you want to limit the suite to the test cases
-      corresponding to a single instruction, you can specifiy the mnemonic
-      as a parameter. For example
-
-      <pre>
-        dx-tests anewarray
-      </pre>
-      
-      executes the tests for the <code>anewarray</code> instruction.
-      Please see the corresponding specification for all the mnemonics. Two
-      additional parameters are possible that don't represent instructions.
-      These run sanity checks for the suite itself and general verifier tests,
-      respectively: 
-
-      <pre>
-        dx-tests sanity
-        dx-tests verifier
-      </pre>
-
-      The suite is normally run for the fast version of the interpreter. To run
-      it for the portable interpreter, pass <code>--portable</code> as the first
-      parameter. Passing <code>--help</code> results in a brief overview of the
-      options.
-    </p>
-
-    <p>      
-      The suite is compatible with both emulator and simulator 
-      builds. For an emulator build, please make sure you have
-      either an emulator running or a device attached via USB before
-      invoking the test suite.
-    </p>
-
-    <p>
-      The suite might easily take 30 minutes or more for execution,
-      depending on the environment. It will generate a full HTML
-      report with details on all test cases. While running, console output
-      is produced to give a quick impression of the progress and results.
-      For both types of output, each individual test results falls into one of
-      the following categories:
-    </p>
-            
-    <table>
-      <tr>
-        <th>Type in report</th><th>Type on console</th><th>Description</th>
-      </tr>
-      <tr>
-        <td>Success</td>
-        <td>.</td>
-        <td>
-          The test case passed successfully.
-        </td>
-      </tr>
-      <tr>
-        <td>Functional failure</td>
-        <td>F</td>
-        <td>
-          A functional (normal or boundary) or an exception test case
-          failed.
-        </td>
-        </tr>
-        <tr>
-          <td>Verifier failure</td>
-          <td>V</td>
-          <td>
-            A verifier test case failed. Either the verifier accepted
-            some invalid piece of code or it rejected a valid one.
-          </td>
-        </tr>
-        <tr>
-          <td>Warning</td>
-          <td>W</td>
-          <td>
-            A verifier test case threw <code>VerifyError</code>, where a
-            different VM would have thrown a different exception. This is
-            specified Dalvik behavior, though, hence just the warning.
-          </td>
-        </tr>
-      </table> 
-  </body>
-</html>
diff --git a/tools/dx-tests/etc/compileall b/tools/dx-tests/etc/compileall
deleted file mode 100755
index 57bcec6..0000000
--- a/tools/dx-tests/etc/compileall
+++ /dev/null
@@ -1,114 +0,0 @@
-#!/bin/bash
-#
-# Copyright (C) 2008 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-echo "building dx-test-suite"
-#
-# generates .class files from the .j (jasmin) and .cfh (hex format) files for the dxconverter test project.
-# the dx executable must be on the PATH.
-# only for lunch 2 at the moment - TODO check which commands are available in busybox/toolbox on the device
-#
-
-prog="$0"
-while [ -h "${prog}" ]; do
-    newProg=`/bin/ls -ld "${prog}"`
-    newProg=`expr "${newProg}" : ".* -> \(.*\)$"`
-    if expr "x${newProg}" : 'x/' >/dev/null; then
-        prog="${newProg}"
-    else
-        progdir=`dirname "${prog}"`
-        prog="${progdir}/${newProg}"
-    fi
-done
-oldwd=`pwd`
-progdir=`dirname "${prog}"`
-cd "${progdir}"
-progdir=`pwd`
-prog="${progdir}"/`basename "${prog}"`
-cd "${oldwd}"
-
-libdir=`dirname $progdir`/framework
-
-javaOpts=""
-while expr "x$1" : 'x-J' >/dev/null; do
-    opt=`expr "$1" : '-J\(.*\)'`
-    javaOpts="${javaOpts} -${opt}"
-    shift
-done
-
-#echo "progdir: $progdir"
-#echo "android build top: $ANDROID_BUILD_TOP"
-project_home=$1
-javac=$2
-tmpdir=$3 # ANDROID_BUILD_TOP/$3
-dxjarpath=$4
-outdir=$5
-project_src=$project_home/src
-project_lib=$project_home/lib
-project_data=$project_home/data
-javac_out=$tmpdir/classout
-javafiles=$tmpdir/_javafiles
-mainfilesdir=$tmpdir/mainfiles
-mainfileslist=$tmpdir/_mainfileslist
-
-#echo "home: $project_home"
-
-if [ "$tmpdir" = "" ]; then
-    echo "error: intermediates dir not set/found!!";
-    exit 1;
-else
-    echo "tmp/intermediates dir (rel): $tmpdir"
-fi
-rm -rf $javac_out
-rm -rf $javafiles
-
-# compile all files from javafiles
-echo "compiling all java files (with package dxc.junit.**)"
-find $project_src/dxc/junit -name '*.java' > $javafiles
-echo "$project_src/util/CollectAllTests.java" >> $javafiles
-mkdir -p $javac_out
-jfiles=\@$javafiles
-javac -d $javac_out -classpath ${dxjarpath} -sourcepath $project_src $jfiles
-
-echo "compiling all jasmin (*.j)"
-
-find $project_src/dxc/junit -name '*.j' | sort > $tmpdir/alljasminfiles
-java -classpath $project_home/utilclasses:$project_lib/jasmin.jar util.CompileAllJasmin $tmpdir/alljasminfiles $javac_out  &> /dev/null
-
-echo "compiling all .cfh files into .class files"
-for acfhfile in `find $project_src/dxc/junit -name '*.cfh'`
-do
-    #echo "cfh file:$acfhfile"
-    java -classpath ${dxjarpath} dxconvext.ClassFileAssembler $acfhfile $javac_out &> /dev/null
-done
-
-echo "generating Main_*.java files reading from $project_home writing to $mainfilesdir"
-mkdir -p $mainfilesdir
-# generate the Main_*.java files
-java -cp $project_lib/junit.jar:$javac_out util.CollectAllTests $project_home $mainfilesdir 
-# compile the Main_*.java files
-find $mainfilesdir/dxc/junit -name '*.java' > $mainfileslist
-echo "compile the Main_*.java files"
-javac -d $javac_out -classpath $project_lib/junit.jar:$javac_out -sourcepath $mainfilesdir \@$mainfileslist
-
-# now copy relevant data from intermediates dir to its final destination
-fdest=$outdir/cts/dxconverter
-mkdir -p $fdest/data
-acp -r $javac_out $fdest/
-acp $mainfilesdir/data/scriptdata $fdest/data/scriptdata
-
-echo "dxconverter test suite sucessfully built!"
-echo "intermediate Main_*.java files (for stacktrace analysis) can be found under $mainfilesdir" 
-
diff --git a/tools/dx-tests/etc/morescripts/countTests.sh b/tools/dx-tests/etc/morescripts/countTests.sh
deleted file mode 100755
index ff0b323..0000000
--- a/tools/dx-tests/etc/morescripts/countTests.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/bin/bash
-#
-# Copyright (C) 2008 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-cd ../../src
-
-echo "normal tests (testN...): "
-egrep -R 'public void testN[0-9][0-9]?' * | grep ".java" | sed -e '/.svn/d' | sort | wc -l
-
-echo "border egde tests (testB...): "
-egrep -R 'public void testB[0-9][0-9]?' * | grep ".java" | sed -e '/.svn/d' | sort | wc -l
-
-echo "exception tests (testE...): "
-egrep -R 'public void testE[0-9][0-9]?' * | grep ".java" | sed -e '/.svn/d' | sort | wc -l
-
-echo "verify error tests (testVFE...): "
-egrep -R 'public void testVFE[0-9][0-9]?' * | grep ".java" | sed -e '/.svn/d' | sort | wc -l
diff --git a/tools/dx-tests/etc/morescripts/detailCount.sh b/tools/dx-tests/etc/morescripts/detailCount.sh
deleted file mode 100755
index c7aae42..0000000
--- a/tools/dx-tests/etc/morescripts/detailCount.sh
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/bash
-#
-# Copyright (C) 2008 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-#
-# sed -e '/.svn/d' |
-# ---------------------------------------------------------
-
-echo ">>> statistics about kind of tests (normal, border edge, exception, verify)"
-cd ../../src
-for mypack in `find dxc -maxdepth 4 -mindepth 4 -name "Test_*.java" | sort`
-do
-    resN=`egrep -c 'public void testN[0-9][0-9]?' $mypack`
-    resB=`egrep -c 'public void testB[0-9][0-9]?' $mypack`
-    resE=`egrep -c 'public void testE[0-9][0-9]?' $mypack`
-    resVFE=`egrep -c 'public void testVFE[0-9][0-9]?' $mypack`
-    echo "file:$mypack, N:$resN, B:$resB, E:$resE, VFE:$resVFE"
-done
diff --git a/tools/dx-tests/etc/starttests b/tools/dx-tests/etc/starttests
deleted file mode 100755
index b062fe7..0000000
--- a/tools/dx-tests/etc/starttests
+++ /dev/null
@@ -1,341 +0,0 @@
-#!/bin/bash
-#
-# Copyright (C) 2008 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Set up prog to be the path of this script, including following symlinks,
-# and set up progdir to be the fully-qualified pathname of its directory.
-
-prog="$0"
-while [ -h "${prog}" ]; do
-    newProg=`/bin/ls -ld "${prog}"`
-    newProg=`expr "${newProg}" : ".* -> \(.*\)$"`
-    if expr "x${newProg}" : 'x/' >/dev/null; then
-        prog="${newProg}"
-    else
-        progdir=`dirname "${prog}"`
-        prog="${progdir}/${newProg}"
-    fi
-done
-oldwd=`pwd`
-progdir=`dirname "${prog}"`
-cd "${progdir}"
-progdir=`pwd`
-prog="${progdir}"/`basename "${prog}"`
-cd "${oldwd}"
-
-libdir=`dirname $progdir`/framework
-
-javaOpts=""
-while expr "x$1" : 'x-J' >/dev/null; do
-    opt=`expr "$1" : '-J\(.*\)'`
-    javaOpts="${javaOpts} -${opt}"
-    shift
-done
-
-#exec java $javaOpts -jar $libdir/hat.jar "$@"
-
-#######################################################################
-# Original content of invocation script follows. Uses values cleverly
-# deduced by the above code.
-#######################################################################
-
-selection=$1
-interpreter="fast"
-if [ "$selection" = "--portable" ]; then
-    selection=$2;
-    interpreter="portable"
-fi
-
-datadir=/tmp/${USER}
-rm -rf $datadir/dalvik-cache
-mkdir -p $datadir
-mkdir -p $datadir/dalvik-cache
-
-base=$OUT
-framework=$base/system/framework
-export ANDROID_PRINTF_LOG=tag
-export ANDROID_LOG_TAGS='*:s' # was: jdwp:i dalvikvm:i dalvikvmi:i'
-export ANDROID_DATA=$datadir
-export ANDROID_ROOT=$base/system
-export LD_LIBRARY_PATH=$base/system/lib
-export DYLD_LIBRARY_PATH=$base/system/lib
-debug_opts="-Xcheck:jni"
-exe=$base/system/bin/dalvikvm
-bpath=$framework/core.jar
-BASEDIR=$progdir/../cts/dxconverter
-
-echo "--------------------------------------------------"
-echo "DX Converter Test Suite"
-echo "Version 1.0"
-echo "Copyright (c) 2008 The Android Open Source Project"
-echo ""
-
-if [ "$selection" = "--help" ]; then
-    echo "Usage: dx-tests [--help|--portable] [<mnemonic>]"
-    echo ""
-    echo "    --help      prints this help message"
-    echo "    --portable  uses the portable interpreter;"
-    echo "                default is the fast one"
-    echo ""
-    echo "    <mnemonic>  specifies the instruction to test;"
-    echo "                default is to run all tests"
-    echo ""
-    exit 1;
-fi
-
-# we need for launching: the dx tool, the dalvikvm executable, and the directory with all .class files
-# - prep dxcore.jar
-# - init reportfile
-# for each package as stated in data/scriptdata (like dxc/junit/opcode/aaload) do
-#   - clear tmpoutput
-#   - try to dx Test_opcode.class and all .class files in the ./jm directory into a classes.jar file
-#   - launch dalvikvm, let it write output &> to tmpoutput (surrounded by magic key for start/stop)
-#   - look at tmpoutput -> green or red test result
-#   - append the result to the report.html file (table form)
-#   - clear the tmpoutput, the classes.jar etc.
-# end for
-# - close the report file and cat its path to stdout
-
-# sanity checks:
-# dx around?
-curmode=""
-dx --version &> /dev/null
-if [ ! $? -eq 0 ]
-then
-    echo "error:could not start dx tool"
-    exit 1;
-fi
- 
-if [ "$TARGET_SIMULATOR" = "true" ]; then
-    echo "Simulator mode, $interpreter interpreter";
-    curmode="simulator"
-    if [ -f $exe ]; then
-        version=`${exe} -version 2> /dev/null | grep -o "version.*$"`
-        echo "Using Dalvik VM ${version}"
-    else
-        echo "No Dalvik VM found at $exe";
-        exit 1;
-    fi
-else
-    echo "Emulator mode, $interpreter interpreter";
-    curmode="emulator"
-    version=`adb shell dalvikvm -version 2> /dev/null | grep -o "version.*$"`
-    if [ "${version}" != "" ]; then
-        echo "Using Dalvik VM ${version}"
-    else
-        echo "No emulator or device found";
-        exit 1;
-    fi
-fi
-
-echo ""
-
-latestpath=""
-curdate=`date`
-dxtmpdir=$BASEDIR/dxtmp
-dxruntmpdir=$BASEDIR/dxruntmp
-javac_out=$BASEDIR/classout
-report=$BASEDIR/report.html
-mkdir -p $dxtmpdir
-rm -f $report
-pre_report="<html><head><style>
-table tr.ok { background:#a0ffa0; }
-table tr.nok { background:#ffa0a0; }
-table tr.wok { background:#ffffa0; }
-table tr.lok { background:#aaaaff; }
-</style></head>
-<body>
-<h1>DX test suite results</h1>
-Generated $curdate (using the $curmode)
-<p>
-<table width='100%'>
-<tr><td>Status</td><td>Target</td><td>Category</td><td>Details</td></tr>"
-post_report="</body></html>"
-echo $pre_report > $report
-
-# ----------- generating dxcore.jar
-cd $javac_out
-# consists of dxc.junit.DxAbstractMain and dxc.junit.DxUtil
-dx --dex --positions=lines --output="$BASEDIR/dxcore.jar" dxc/junit/DxAbstractMain.class dxc/junit/DxUtil.class
-
-# ----------- generating jars for each opcode test ------------
-
-export jpassedcnt=0
-export jwarningcnt=0
-export jvfefailedcnt=0
-export jfailedcnt=0
-export jallcnt=0
-export jcolumns=0
-
-function classnameToPath()
-{
-    echo $1 | sed -e 's#\.#/#g;s#$#.class#'
-}
-
-function lecho()
-{
-    if [ ! -z $CTS_DX_DEBUG ]; then echo $@; fi
-}
-
-while read -u 3 myline;
-do
-    mainclass=`echo $myline | cut -d";" -f1` # e.g dxc.junit.verify.t482_9.Main_testVFE2
-    classfiles=`classnameToPath $mainclass`
-    
-    testclasses=`echo $myline | cut -d";" -f2` # e.g dxc.junit.verity.t482_9.jm.T_t482_9_1
-    
-    for testclass in $testclasses; do
-        classfiles="$classfiles "`classnameToPath $testclass`;
-    done
-    
-    jtitle=`echo $myline | cut -d";" -f3`
-    jcomment=`echo $myline | cut -d";" -f4`
-    details=`echo $myline | cut -d";" -f5`
-    
-    if [ "$selection" == "" ] || [ "$jtitle" == "$selection" ]; then
-    
-        (( jallcnt += 1 ))   
-    
-    
-        rm -rf $dxtmpdir/*
-        mkdir -p $dxtmpdir
-        cd $dxtmpdir            
-        
-        for testclass in $classfiles; do
-            lecho -n "dexing $testclass : "
-            mkdir -p `dirname ${dxtmpdir}/${testclass}`
-            cp ${javac_out}/${testclass} ${dxtmpdir}/${testclass}
-            
-            dx --dex --positions=lines $testclass &>/dev/null
-            
-            if [ $? -eq 0 ]; then
-                lecho " dexable";
-            else
-                lecho " not dexable->remove";
-                rm $testclass
-            fi
-        done
-        
-        dx --dex --positions=lines --output="$BASEDIR/dxclasses.jar" .
-            
-        # run the previously prepared jar files in the dalvik vm.
-        # the dalvik vm executable (dalvikvm) must be on the PATH.
-        # 
-        ### echo -n ">>> launch dalvikvm for class: $mainclass"
-        cd $BASEDIR
-        rm -f $BASEDIR/dalvikout
-        # write dalvik output to file
-        echo -n "mk_b:" > $BASEDIR/dalvikout
-            #echo ">>> launch dex package -classpath $BASEDIR/dxcore.jar:$BASEDIR/dxclasses.jar $mainclass"
-    
-        if [ "$TARGET_SIMULATOR" = "true" ]; then
-            ### echo " on simulator";
-            $valgrind $exe -Xint:$interpreter -Xmx512M -Xss32K -Xbootclasspath:$bpath -DacceptCNF=true -classpath $BASEDIR/dxcore.jar:$BASEDIR/dxclasses.jar $debug_opts $mainclass "$@" >> $BASEDIR/dalvikout 2>&1
-            RESULTCODE=$?
-            if [ ${RESULTCODE} -ne 0 ]; then
-                echo "execute dalvikvm failed with resultcode: ${RESULTCODE}" >> $BASEDIR/dalvikout 2>&1
-            fi
-        else
-            # adb shell dalvikvm -Xint:$interpreter -Djava.io.tmpdir=/data/local/tmp -classpath /data/dxcore.jar:/data/dxclasses.jar dxc.junit.opcodes.aload.Main_testN2
-            # either no output (ok) or
-            # java.lang.RuntimeException: test did not cause the expected verify error, but:java.lang.RuntimeException, msg:AssertionFailedError msg:expected a verification exception
-            #    at dxc.junit.DxUtil.checkVerifyException(DxUtil.java:65)
-            #    at dxc.junit.opcodes.aload.Test_aload.testVFE10(Test_aload.java:181)
-            #    at dxc.junit.opcodes.aload.Main_testVFE10.main(Main_testVFE10.java:5)
-            #    at dalvik.system.NativeStart.main(Native Method)
-        
-            ### echo " on emulator/device with adb push"
-            adb push $BASEDIR/dxcore.jar /data/dxcore.jar &> /dev/null
-            adb push $BASEDIR/dxclasses.jar /data/dxclasses.jar &> /dev/null
-            adb shell "dalvikvm -Djava.io.tmpdir=/data/local/tmp -classpath /data/dxcore.jar:/data/dxclasses.jar $mainclass && echo -n dvmpassed:" >> $BASEDIR/dalvikout 2>&1
-        fi
-        
-        echo -n "mk_s:" >> $BASEDIR/dalvikout
-        # verify tmpout only contains mkdxc_start;mkdxc_stop -> no system.out/err because of exception.
-            # if ok -> green report line else red report with info between mkdxc_start and stop
-        ### echo "vmresult: $vmresult"
-        vmresult=`cat $BASEDIR/dalvikout`
-        if [[ ("$vmresult" == "mk_b:mk_s:") || ("$vmresult" == "mk_b:dvmpassed:mk_s:") ]]; then
-            (( jpassedcnt += 1 )) 
-            echo "<tr class=\"ok\"><td>Success</td><td>$jtitle</td><td>$jcomment</td><td>$details</td></tr>" >> $report
-            ### echo " -> PASSED (passed:$jpassedcnt, failed:$jfailedcnt, vfe failed:$jvfefailedcnt, warnings:$jwarningcnt)"
-            echo -n "."
-        elif [[ ("$vmresult" == "mk_b:dvmvfe:mk_s:") || ("$vmresult" == "mk_b:dvmvfe:dvmpassed:mk_s:") ]]; then
-            (( jwarningcnt += 1 )) 
-            echo "<tr class=\"wok\"><td>Warning</td><td>$jtitle</td><td>$jcomment</td><td>Special behavior regarding VerifyError</td></tr>" >> $report
-            ### echo " -> WARNING (passed:$jpassedcnt, failed:$jfailedcnt, vfe failed:$jvfefailedcnt, warnings:$jwarningcnt)"
-            echo -n "W"
-        else
-           vmres=`cat $BASEDIR/dalvikout | sed -e 's/mk_b://;s/mk_s://'`
-           vmres="$details<br><pre>$vmres</pre>"    
-            # red with additional info if a VFE failed, red if either a N,B, or E failed
-            jtype=`echo "$mainclass" | sed -e 's/.*_test\([^0-9]*\)[0-9].*/\1/' `
-            if [ "$jtype" == "VFE" ]; then
-                (( jvfefailedcnt += 1 ))
-                echo -n "<tr class=\"nok\"><td>Verifier failure</td><td>$jtitle</td><td>$jcomment</td><td>$vmres</td></tr>" >> $report
-                ### echo " -> VFE FAILED (passed:$jpassedcnt, failed:$jfailedcnt, vfe failed:$jvfefailedcnt, warnings:$jwarningcnt)"
-                echo -n "V"
-            else
-                (( jfailedcnt += 1 )) 
-                echo -n "<tr class=\"nok\"><td>Functional failure</td><td>$jtitle</td><td>$jcomment</td><td>$vmres</td></tr>" >> $report
-                ### echo " -> FAILED (passed:$jpassedcnt, failed:$jfailedcnt, vfe failed:$jvfefailedcnt, warnings:$jwarningcnt)"
-                echo -n "F"
-            fi
-        fi
-        
-        (( jcolumns += 1 ))
-        if [ ${jcolumns} -eq 40 ]; then
-            echo ""
-            (( jcolumns = 0 ))
-        fi
-        
-    fi
-      
-done 3<$BASEDIR/data/scriptdata #we use fd nr 3 to avoid subshelling via cat since this looses all variables (and thus also the counters we are interested in).
-
-echo "</table>" >> $report
-let jallcalccnt=$jpassedcnt+$jfailedcnt+$jvfefailedcnt+$jwarningcnt
-if [ $jallcalccnt -ne $jallcnt ]; then
-    echo "<br>error: green & red != total , $jallcalccnt -ne $jallcnt" >> $report
-    exit 1;
-fi
-
-echo "<br>Tests run: ${jallcnt}" >> $report
-echo "<br>Functional failures: ${jfailedcnt}" >> $report
-echo "<br>Verifier failures: ${jvfefailedcnt}" >> $report
-echo "<br>Warnings: ${jwarningcnt}" >> $report
-
-echo $post_report >> $report
-
-if [[ jcolumns -ne 0 ]]; then
-    echo ""
-fi
-
-echo ""
-
-if [[ jallcnt -eq jpassedcnt ]]; then
-    echo "OK (${jpassedcnt} tests)"
-else
-    echo "FAILURES!!!"
-    echo ""
-    echo "Tests run          : ${jallcnt}"
-    echo "Functional failures: ${jfailedcnt}"
-    echo "Verifier failures  : ${jvfefailedcnt}"
-    echo "Warnings           : ${jwarningcnt}"
-fi
-
-echo ""
-echo "Please see complete report in ${report}"
-echo "--------------------------------------------------"
diff --git a/tools/dx-tests/lib/jasmin.jar b/tools/dx-tests/lib/jasmin.jar
deleted file mode 100644
index 87db0d0..0000000
--- a/tools/dx-tests/lib/jasmin.jar
+++ /dev/null
Binary files differ
diff --git a/tools/dx-tests/lib/junit.jar b/tools/dx-tests/lib/junit.jar
deleted file mode 100644
index 674d71e..0000000
--- a/tools/dx-tests/lib/junit.jar
+++ /dev/null
Binary files differ
diff --git a/tools/dx-tests/scripts/assemble_cfh.sh b/tools/dx-tests/scripts/assemble_cfh.sh
deleted file mode 100755
index 0c8e9c7..0000000
--- a/tools/dx-tests/scripts/assemble_cfh.sh
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/bin/bash
-#
-# Copyright (C) 2008 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# compiles all .cfh files into .class files
-abase=`pwd`
-srcd="$abase/src"
-cout=$abase/out/classes_cfh
-cp=$abase/out/classes_jasmin
-cp2=$abase/out/classes_javac
-
-echo "del old files"
-rm -rf $cout/*
-echo "done del"
-
-echo "src folder:$srcd"
-for myfile in `find $srcd -name "*.cfh"`
-do
-    echo "file:$myfile"
-    java -cp $cout:$cp:$cp2 dxconvext.ClassFileAssembler $myfile $cout
-done
-
-echo "Done!"
diff --git a/tools/dx-tests/scripts/collect_dasm_files.sh b/tools/dx-tests/scripts/collect_dasm_files.sh
deleted file mode 100644
index d4275c0..0000000
--- a/tools/dx-tests/scripts/collect_dasm_files.sh
+++ /dev/null
@@ -1,154 +0,0 @@
-#!/bin/bash
-#
-# Copyright (C) 2008 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-BASEDIR=`pwd`
-CLASSFOLDERS='out/classes_cfh out/classes_jasmin out/classes_javac'
-
-function findClassFile()
-{
-    i=0;
-    for path in $1; 
-    do
-        if [ -f ${path}/$2 ]; then
-            CLASSFOLDER=$path
-            return
-        fi
-    done
-}
-
-function mapOpcode()
-{
-    MAPPED_OPCODE=""
-    if [ -z $1 ]; then
-        MAPPED_OPCODE=""
-        return;
-    fi
-    
-    line=`grep -e "^$1    " ${BASEDIR}/data/opcode_mapping`
-    if [ $? -ne 0 ]; then
-        MAPPED_OPCODE=""
-    else
-        echo $line
-        MAPPED_OPCODE=`echo -n $line | cut -d" " -f2`
-    fi
-}
-
-while read -u 3 myline;
-do
-    jpackageclass=`echo $myline | cut -d";" -f1` # e.g dxc.junit.verify.t482_9.Main_testVFE2
-    jpackageclassfile=`echo $jpackageclass | sed -e 's/\./\//g;s/$/.java/'`
-    echo $jpackageclassfile
-    jtestclass=`echo $myline | cut -d";" -f2` # e.g dxc.junit.verity.t482_9.jm.T_t482_9_1
-    jtestclassfile=`echo $jtestclass | sed -e 's/\./\//g;s/$/.class/'`
-    jtestsourcefile=`echo $jtestclass | sed -e 's/\./\//g;s/$/.java/'`
-#    echo $jtestclassfile
-    
-rm -rf out/tmp
-mkdir -p out/tmp
-
-findClassFile "${CLASSFOLDERS}" $jtestclassfile
-cd ${CLASSFOLDER}
-cp -P --parent $jtestclassfile ${BASEDIR}/out/tmp/
-cd ${BASEDIR}
-
-#findClassFile "${CLASSFOLDERS}" $jpackageclassfile
-#cd ${CLASSFOLDER}
-#cp -P --parents $jpackageclassfile ${BASEDIR}/out/tmp/
-#cd ${BASEDIR}
-
-# echo ${CLASSFOLDER}/${jtestclassfile}
-
-OPCODE=`echo $jtestclass | sed -e 's/.*T_\(.*\)_[0-9]\+[_]*[a-z]*/\1/'`
-mapOpcode ${OPCODE}
-# echo ${OPCODE} " - " ${MAPPED_OPCODE}
-if [ -z ${MAPPED_OPCODE} ]; then
-    continue
-fi
-
-for subcode in `echo $MAPPED_OPCODE | cut -d";" -f1,2 --output-delimiter=" "`; do
-
-    SCRIPT="s#out/classes_[^/]*/dxc/\(.*\)/${OPCODE}/jm/T_${OPCODE}\(.*\)\.class#src/dot/\1/${subcode}/d/T_${subcode}\2.d#"
-    FILEDEST=`echo ${CLASSFOLDER}/${jtestclassfile} | sed -e $SCRIPT`
-    echo ${FILEDEST}
-#    SCRIPT="s#out/classes_[^/]*/dxc/\(.*\)${OPCODE}/Main_\(.*\)\.class#src/dot/\1/${subcode}/Main_\2.d#"
-#    FILEDEST=`echo ${CLASSFOLDER}/${jpackageclassfile} | sed -e $SCRIPT`
-#    echo ${FILEDEST}
-    
-    cd out/tmp
-    OUT=`dx --dex --no-optimize --positions=lines --output="/tmp/dxclasses.jar" ${jtestclassfile} 2>&1`
-    
-    if [ $? -eq 0 ]; then
-        cd ${BASEDIR}
-        mkdir -p `dirname ${FILEDEST}`
-        dexdump -g /tmp/dxclasses.jar > ${FILEDEST}
-        sed -i -e 's/dxc\([\.|\/]\)junit/dot\1junit/' ${FILEDEST}
-        SCRIPT="s/${OPCODE}\([\.|\/]\)jm\([\.|\/]\)/${subcode}\1d\2/g"
-        sed -i -e ${SCRIPT} ${FILEDEST}
-        SCRIPT="s/T_${OPCODE}/T_${subcode}/g"
-        sed -i -e ${SCRIPT} ${FILEDEST}
-        
-        SCRIPT="s#dxc/\(.*\)/${OPCODE}/\(.*\)#src/dot/\1/${subcode}/\2#"
-        jpackagedestfile=`echo ${jpackageclassfile} | sed -e $SCRIPT`
-        cp src/${jpackageclassfile} ${jpackagedestfile}
-        sed -i -e 's/dxc\([\.|\/]\)junit/dot\1junit/' ${jpackagedestfile}
-        SCRIPT="s/${OPCODE}\([\.|\/]\)jm\([\.|\/]\)/${subcode}\1d\2/g"
-        sed -i -e ${SCRIPT} ${jpackagedestfile}
-        SCRIPT="s/T_${OPCODE}/T_${subcode}/g"
-        sed -i -e ${SCRIPT} ${jpackagedestfile}
-        sed -i -e "s/\(package .*\)${OPCODE}/\1${subcode}/" ${jpackagedestfile}
-
-
-        SCRIPT="s#dxc/\(.*\)/${OPCODE}/jm/\(.*\)${OPCODE}\(.*\).class#src/dot/\1/${subcode}/d/\2${subcode}\3.java#"
-        jpackagedestfile=`echo ${jtestclassfile} | sed -e $SCRIPT`
-        cp src/${jtestsourcefile} ${jpackagedestfile}
-        sed -i -e 's/dxc\([\.|\/]\)junit/dot\1junit/' ${jpackagedestfile}
-        SCRIPT="s/${OPCODE}\([\.|\/]\)jm\([\.|\/|;]\)/${subcode}\1d\2/g"
-        sed -i -e ${SCRIPT} ${jpackagedestfile}
-        SCRIPT="s/T_${OPCODE}/T_${subcode}/g"
-        sed -i -e ${SCRIPT} ${jpackagedestfile}
-        sed -i -e "s/\(package .*\)${OPCODE}/\1${subcode}/" ${jpackagedestfile}
-        
-        srcdir=`dirname ${jtestsourcefile}`
-        for srcfile in `find src/${srcdir} -maxdepth 1 -type f ! -name "T_*.java" -a -name "*.java"`; do
-            echo $srcfile
-            SCRIPT="s#dxc/\(.*\)/${OPCODE}/jm/\(.*\).java#dot/\1/${subcode}/d/\2.java#"
-            jpackagedestfile=`echo ${srcfile} | sed -e $SCRIPT`
-            cp ${srcfile} ${jpackagedestfile}
-            sed -i -e 's/dxc\([\.|\/]\)junit/dot\1junit/' ${jpackagedestfile}
-            SCRIPT="s/${OPCODE}\([\.|\/]\)jm\([\.|\/|;]\)/${subcode}\1d\2/g"
-            sed -i -e ${SCRIPT} ${jpackagedestfile}
-            SCRIPT="s/T_${OPCODE}/T_${subcode}/g"
-            sed -i -e ${SCRIPT} ${jpackagedestfile}
-            sed -i -e "s/\(package .*\)${OPCODE}/\1${subcode}/" ${jpackagedestfile}
-        done
-        
-        srcdir=`dirname ${jpackageclassfile}`
-        for srcfile in `find src/${srcdir} -maxdepth 1 -type f ! -name "Main_*.java" -a ! -name "Test_*.java" -a -name "*.java"`; do
-            echo $srcfile
-            SCRIPT="s#dxc/\(.*\)/${OPCODE}/\(.*\)#dot/\1/${subcode}/\2#"
-            jpackagedestfile=`echo ${srcfile} | sed -e $SCRIPT`
-            cp -v ${srcfile} ${jpackagedestfile}
-        done
-        
-    else
-        echo "--- not dexable"
-    fi
-    cd ${BASEDIR}
-done
-
-
-done 3<$BASEDIR/data/scriptdata
-
diff --git a/tools/dx-tests/scripts/jm.sh b/tools/dx-tests/scripts/jm.sh
deleted file mode 100755
index c9c1848..0000000
--- a/tools/dx-tests/scripts/jm.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-#
-# Copyright (C) 2008 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# 
-echo "compile jasmin files"
-rm -rf out/classes_jasmin/*
-java -jar lib/jasmin.jar -d out/classes_jasmin src/dxc/junit/**/**/**/*.j
-echo "Done!"
\ No newline at end of file
diff --git a/tools/dx-tests/scripts/validate-tests.sh b/tools/dx-tests/scripts/validate-tests.sh
deleted file mode 100755
index df73cf1..0000000
--- a/tools/dx-tests/scripts/validate-tests.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/bash
-# Quick and dirty way to validate the DX tests against a JVM. Note that
-# even the JVM has different bugs and verification behavior depending
-# on the version. The tests pass 100% for the following setup:
-# 
-# java version "1.6.0"
-# Java(TM) SE Runtime Environment (build 1.6.0-b105)
-# Java HotSpot(TM) Server VM (build 1.6.0-b105, mixed mode)
-#
-# Linux ... 2.6.18.5-gg42workstation-mixed64-32 #1 SMP
-# Tue Nov 25 21:45:59 PST 2008 x86_64 GNU/Linux
-#
-# You can only run the tests if the "dx-tests" target has been built before.
-# 
-java -cp ./lib/junit.jar:$ANDROID_BUILD_TOP/out/target/common/cts/dxconverter/classout/ junit.textui.TestRunner dxc.junit.AllTests
-
-
diff --git a/tools/dx-tests/src/dxc/Main.java b/tools/dx-tests/src/dxc/Main.java
deleted file mode 100644
index 04031da..0000000
--- a/tools/dx-tests/src/dxc/Main.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc;
-
-import dxc.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/dx-tests/src/dxc/junit/AllTests.java b/tools/dx-tests/src/dxc/junit/AllTests.java
deleted file mode 100644
index d5867bf..0000000
--- a/tools/dx-tests/src/dxc/junit/AllTests.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.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 basic functionality
-        suite.addTest(dxc.junit.argsreturns.AllTests.suite());
-        // tests all opcodes
-        suite.addTest(dxc.junit.opcodes.AllTests.suite());
-        // tests all constraints that should be enforced by the verifier,
-        // but which do apply to more than one bytecode
-        suite.addTest(dxc.junit.verify.AllTests.suite());
-        return suite;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/DxAbstractMain.java b/tools/dx-tests/src/dxc/junit/DxAbstractMain.java
deleted file mode 100644
index 157e489..0000000
--- a/tools/dx-tests/src/dxc/junit/DxAbstractMain.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package dxc.junit;
-
-public class DxAbstractMain {
-    
-    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/dx-tests/src/dxc/junit/DxTestCase.java b/tools/dx-tests/src/dxc/junit/DxTestCase.java
deleted file mode 100644
index 00b57e8..0000000
--- a/tools/dx-tests/src/dxc/junit/DxTestCase.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package dxc.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/dx-tests/src/dxc/junit/DxUtil.java b/tools/dx-tests/src/dxc/junit/DxUtil.java
deleted file mode 100644
index f1c90b3..0000000
--- a/tools/dx-tests/src/dxc/junit/DxUtil.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package dxc.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 ClassNotFoundException || t instanceof LinkageError) {
-                if (t instanceof VerifyError) {
-                    if (((VerifyError)t).getMessage().contains("Main_")) {
-                        System.out.print("verify failed on Main_");
-                    }
-                }
-                // ok, this is what we expected
-        } else {
-            throw new RuntimeException("Verify error expected", t);
-        }
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/argsreturns/AllTests.java b/tools/dx-tests/src/dxc/junit/argsreturns/AllTests.java
deleted file mode 100644
index fc32868..0000000
--- a/tools/dx-tests/src/dxc/junit/argsreturns/AllTests.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.argsreturns;
-
-import dxc.junit.argsreturns.pargsreturn.Test_pargsreturn;
-
-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 basic java vm opcodes: "
-                + "calling method with parameters and return");
-        suite.addTestSuite(Test_pargsreturn.class);
-        return suite;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/argsreturns/pargsreturn/Test_pargsreturn.java b/tools/dx-tests/src/dxc/junit/argsreturns/pargsreturn/Test_pargsreturn.java
deleted file mode 100644
index e6f0f04..0000000
--- a/tools/dx-tests/src/dxc/junit/argsreturns/pargsreturn/Test_pargsreturn.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.argsreturns.pargsreturn;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.argsreturns.pargsreturn.jm.T1;
-import dxc.junit.argsreturns.pargsreturn.jm.T2;
-import dxc.junit.argsreturns.pargsreturn.jm.T3;
-import dxc.junit.argsreturns.pargsreturn.jm.T4;
-
-public class Test_pargsreturn extends DxTestCase {
-
-    /**
-     * @title checks return value of a constant
-     */
-    public void testN1() {
-        assertEquals(1234, new T1().run());
-    }
-    
-    /**
-     * @title checks whether the correct int value is returned.
-     */
-    public void testN2() {
-        assertEquals(1234, new T2().run(1234));
-    }
-    
-    /**
-     * @title tests whether the correct int value is set.
-     */
-    public void testN3() {
-        T3 t = new T3();
-        t.run(1234);
-        assertEquals(1234, t.i1);
-    }
-
-    /**
-     * @title tests correct setting of field values
-     */
-    public void testN4() {
-        T4 t = new T4();
-        t.run(1234);
-        assertEquals(50000000000l, t.j1);
-        assertEquals(1234, t.i1);
-    }
-
-    
-    
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/argsreturns/pargsreturn/jm/T1.j b/tools/dx-tests/src/dxc/junit/argsreturns/pargsreturn/jm/T1.j
deleted file mode 100644
index 46eb6b8..0000000
--- a/tools/dx-tests/src/dxc/junit/argsreturns/pargsreturn/jm/T1.j
+++ /dev/null
@@ -1,30 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T1.java
-.class public dxc/junit/argsreturns/pargsreturn/jm/T1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 1
-    .limit locals 1
-    sipush 1234
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/argsreturns/pargsreturn/jm/T1.java b/tools/dx-tests/src/dxc/junit/argsreturns/pargsreturn/jm/T1.java
deleted file mode 100644
index 196ae8d..0000000
--- a/tools/dx-tests/src/dxc/junit/argsreturns/pargsreturn/jm/T1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.argsreturns.pargsreturn.jm;
-
-public class T1 {
-    public int run() {
-        return 1234;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/argsreturns/pargsreturn/jm/T2.j b/tools/dx-tests/src/dxc/junit/argsreturns/pargsreturn/jm/T2.j
deleted file mode 100644
index 141877c..0000000
--- a/tools/dx-tests/src/dxc/junit/argsreturns/pargsreturn/jm/T2.j
+++ /dev/null
@@ -1,30 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T2.java
-.class public dxc/junit/argsreturns/pargsreturn/jm/T2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-    iload_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/argsreturns/pargsreturn/jm/T2.java b/tools/dx-tests/src/dxc/junit/argsreturns/pargsreturn/jm/T2.java
deleted file mode 100644
index b89bfd3..0000000
--- a/tools/dx-tests/src/dxc/junit/argsreturns/pargsreturn/jm/T2.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.argsreturns.pargsreturn.jm;
-
-public class T2 {
-    public int run(int i) {
-        return i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/argsreturns/pargsreturn/jm/T3.j b/tools/dx-tests/src/dxc/junit/argsreturns/pargsreturn/jm/T3.j
deleted file mode 100644
index d4ead13..0000000
--- a/tools/dx-tests/src/dxc/junit/argsreturns/pargsreturn/jm/T3.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T3.java
-.class public dxc/junit/argsreturns/pargsreturn/jm/T3
-.super java/lang/Object
-
-.field public i1 I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)V
-    .limit stack 2
-    .limit locals 2
-    aload_0
-    iload_1
-    putfield dxc.junit.argsreturns.pargsreturn.jm.T3.i1 I
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/argsreturns/pargsreturn/jm/T3.java b/tools/dx-tests/src/dxc/junit/argsreturns/pargsreturn/jm/T3.java
deleted file mode 100644
index e50f39e..0000000
--- a/tools/dx-tests/src/dxc/junit/argsreturns/pargsreturn/jm/T3.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.argsreturns.pargsreturn.jm;
-
-public class T3 {
-    public int i1;
-    
-    public void run(int i) {
-        i1 = i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/argsreturns/pargsreturn/jm/T4.j b/tools/dx-tests/src/dxc/junit/argsreturns/pargsreturn/jm/T4.j
deleted file mode 100644
index 1b294c6..0000000
--- a/tools/dx-tests/src/dxc/junit/argsreturns/pargsreturn/jm/T4.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T4.java
-.class public dxc/junit/argsreturns/pargsreturn/jm/T4
-.super java/lang/Object
-
-.field public i1 I
-.field public j1 J
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)V
-    .limit stack 3
-    .limit locals 2
-    aload_0
-    iload_1
-    putfield dxc.junit.argsreturns.pargsreturn.jm.T4.i1 I
-
-    aload_0
-    ldc2_w 50000000000
-    putfield dxc.junit.argsreturns.pargsreturn.jm.T4.j1 J
-
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/argsreturns/pargsreturn/jm/T4.java b/tools/dx-tests/src/dxc/junit/argsreturns/pargsreturn/jm/T4.java
deleted file mode 100644
index bb8da48..0000000
--- a/tools/dx-tests/src/dxc/junit/argsreturns/pargsreturn/jm/T4.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.argsreturns.pargsreturn.jm;
-
-public class T4 {
-    public int i1;
-    public long j1;
-    
-    public void run(int i) {
-        throw new UnsupportedOperationException();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/AllTests.java b/tools/dx-tests/src/dxc/junit/opcodes/AllTests.java
deleted file mode 100644
index 2c49ccc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/AllTests.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.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 java vm opcodes");
-        suite.addTestSuite(dxc.junit.opcodes.aaload.Test_aaload.class);
-        suite.addTestSuite(dxc.junit.opcodes.aastore.Test_aastore.class);
-        suite
-                .addTestSuite(dxc.junit.opcodes.aconst_null.Test_aconst_null.class);
-        suite.addTestSuite(dxc.junit.opcodes.aload.Test_aload.class);
-        suite.addTestSuite(dxc.junit.opcodes.aload_0.Test_aload_0.class);
-        suite.addTestSuite(dxc.junit.opcodes.aload_1.Test_aload_1.class);
-        suite.addTestSuite(dxc.junit.opcodes.aload_2.Test_aload_2.class);
-        suite.addTestSuite(dxc.junit.opcodes.aload_3.Test_aload_3.class);
-        suite.addTestSuite(dxc.junit.opcodes.anewarray.Test_anewarray.class);
-        suite.addTestSuite(dxc.junit.opcodes.areturn.Test_areturn.class);
-        suite
-                .addTestSuite(dxc.junit.opcodes.arraylength.Test_arraylength.class);
-        suite.addTestSuite(dxc.junit.opcodes.astore.Test_astore.class);
-        suite.addTestSuite(dxc.junit.opcodes.astore_0.Test_astore_0.class);
-        suite.addTestSuite(dxc.junit.opcodes.astore_1.Test_astore_1.class);
-        suite.addTestSuite(dxc.junit.opcodes.astore_2.Test_astore_2.class);
-        suite.addTestSuite(dxc.junit.opcodes.astore_3.Test_astore_3.class);
-        suite.addTestSuite(dxc.junit.opcodes.athrow.Test_athrow.class);
-        suite.addTestSuite(dxc.junit.opcodes.baload.Test_baload.class);
-        suite.addTestSuite(dxc.junit.opcodes.bastore.Test_bastore.class);
-        suite.addTestSuite(dxc.junit.opcodes.bipush.Test_bipush.class);
-        suite.addTestSuite(dxc.junit.opcodes.caload.Test_caload.class);
-        suite.addTestSuite(dxc.junit.opcodes.castore.Test_castore.class);
-        suite.addTestSuite(dxc.junit.opcodes.checkcast.Test_checkcast.class);
-        suite.addTestSuite(dxc.junit.opcodes.d2f.Test_d2f.class);
-        suite.addTestSuite(dxc.junit.opcodes.d2i.Test_d2i.class);
-        suite.addTestSuite(dxc.junit.opcodes.d2l.Test_d2l.class);
-        suite.addTestSuite(dxc.junit.opcodes.dadd.Test_dadd.class);
-        suite.addTestSuite(dxc.junit.opcodes.daload.Test_daload.class);
-        suite.addTestSuite(dxc.junit.opcodes.dastore.Test_dastore.class);
-        suite.addTestSuite(dxc.junit.opcodes.dcmpg.Test_dcmpg.class);
-        suite.addTestSuite(dxc.junit.opcodes.dcmpl.Test_dcmpl.class);
-        suite.addTestSuite(dxc.junit.opcodes.dconst_0.Test_dconst_0.class);
-        suite.addTestSuite(dxc.junit.opcodes.dconst_1.Test_dconst_1.class);
-        suite.addTestSuite(dxc.junit.opcodes.ddiv.Test_ddiv.class);
-        suite.addTestSuite(dxc.junit.opcodes.dload.Test_dload.class);
-        suite.addTestSuite(dxc.junit.opcodes.dload_0.Test_dload_0.class);
-        suite.addTestSuite(dxc.junit.opcodes.dload_1.Test_dload_1.class);
-        suite.addTestSuite(dxc.junit.opcodes.dload_2.Test_dload_2.class);
-        suite.addTestSuite(dxc.junit.opcodes.dload_3.Test_dload_3.class);
-        suite.addTestSuite(dxc.junit.opcodes.dmul.Test_dmul.class);
-        suite.addTestSuite(dxc.junit.opcodes.dneg.Test_dneg.class);
-        suite.addTestSuite(dxc.junit.opcodes.drem.Test_drem.class);
-        suite.addTestSuite(dxc.junit.opcodes.dreturn.Test_dreturn.class);
-        suite.addTestSuite(dxc.junit.opcodes.dstore.Test_dstore.class);
-        suite.addTestSuite(dxc.junit.opcodes.dstore_0.Test_dstore_0.class);
-        suite.addTestSuite(dxc.junit.opcodes.dstore_1.Test_dstore_1.class);
-        suite.addTestSuite(dxc.junit.opcodes.dstore_2.Test_dstore_2.class);
-        suite.addTestSuite(dxc.junit.opcodes.dstore_3.Test_dstore_3.class);
-        suite.addTestSuite(dxc.junit.opcodes.dsub.Test_dsub.class);
-        suite.addTestSuite(dxc.junit.opcodes.dup.Test_dup.class);
-        suite.addTestSuite(dxc.junit.opcodes.dup_x1.Test_dup_x1.class);
-        suite.addTestSuite(dxc.junit.opcodes.dup_x2.Test_dup_x2.class);
-        suite.addTestSuite(dxc.junit.opcodes.dup2.Test_dup2.class);
-        suite.addTestSuite(dxc.junit.opcodes.dup2_x1.Test_dup2_x1.class);
-        suite.addTestSuite(dxc.junit.opcodes.dup2_x2.Test_dup2_x2.class);
-        suite.addTestSuite(dxc.junit.opcodes.f2d.Test_f2d.class);
-        suite.addTestSuite(dxc.junit.opcodes.f2i.Test_f2i.class);
-        suite.addTestSuite(dxc.junit.opcodes.f2l.Test_f2l.class);
-        suite.addTestSuite(dxc.junit.opcodes.fadd.Test_fadd.class);
-        suite.addTestSuite(dxc.junit.opcodes.faload.Test_faload.class);
-        suite.addTestSuite(dxc.junit.opcodes.fastore.Test_fastore.class);
-        suite.addTestSuite(dxc.junit.opcodes.fcmpg.Test_fcmpg.class);
-        suite.addTestSuite(dxc.junit.opcodes.fcmpl.Test_fcmpl.class);
-        suite.addTestSuite(dxc.junit.opcodes.fconst_0.Test_fconst_0.class);
-        suite.addTestSuite(dxc.junit.opcodes.fconst_1.Test_fconst_1.class);
-        suite.addTestSuite(dxc.junit.opcodes.fconst_2.Test_fconst_2.class);
-        suite.addTestSuite(dxc.junit.opcodes.fdiv.Test_fdiv.class);
-        suite.addTestSuite(dxc.junit.opcodes.fload.Test_fload.class);
-        suite.addTestSuite(dxc.junit.opcodes.fload_0.Test_fload_0.class);
-        suite.addTestSuite(dxc.junit.opcodes.fload_1.Test_fload_1.class);
-        suite.addTestSuite(dxc.junit.opcodes.fload_2.Test_fload_2.class);
-        suite.addTestSuite(dxc.junit.opcodes.fload_3.Test_fload_3.class);
-        suite.addTestSuite(dxc.junit.opcodes.fmul.Test_fmul.class);
-        suite.addTestSuite(dxc.junit.opcodes.fneg.Test_fneg.class);
-        suite.addTestSuite(dxc.junit.opcodes.frem.Test_frem.class);
-        suite.addTestSuite(dxc.junit.opcodes.freturn.Test_freturn.class);
-        suite.addTestSuite(dxc.junit.opcodes.fstore.Test_fstore.class);
-        suite.addTestSuite(dxc.junit.opcodes.fstore_0.Test_fstore_0.class);
-        suite.addTestSuite(dxc.junit.opcodes.fstore_1.Test_fstore_1.class);
-        suite.addTestSuite(dxc.junit.opcodes.fstore_2.Test_fstore_2.class);
-        suite.addTestSuite(dxc.junit.opcodes.fstore_3.Test_fstore_3.class);
-        suite.addTestSuite(dxc.junit.opcodes.fsub.Test_fsub.class);
-        suite.addTestSuite(dxc.junit.opcodes.getfield.Test_getfield.class);
-        suite.addTestSuite(dxc.junit.opcodes.getstatic.Test_getstatic.class);
-        suite.addTestSuite(dxc.junit.opcodes.opc_goto.Test_opc_goto.class);
-        suite.addTestSuite(dxc.junit.opcodes.goto_w.Test_goto_w.class);
-        suite.addTestSuite(dxc.junit.opcodes.i2b.Test_i2b.class);
-        suite.addTestSuite(dxc.junit.opcodes.i2c.Test_i2c.class);
-        suite.addTestSuite(dxc.junit.opcodes.i2d.Test_i2d.class);
-        suite.addTestSuite(dxc.junit.opcodes.i2f.Test_i2f.class);
-        suite.addTestSuite(dxc.junit.opcodes.i2l.Test_i2l.class);
-        suite.addTestSuite(dxc.junit.opcodes.i2s.Test_i2s.class);
-        suite.addTestSuite(dxc.junit.opcodes.iaload.Test_iaload.class);
-        suite.addTestSuite(dxc.junit.opcodes.iadd.Test_iadd.class);
-        suite.addTestSuite(dxc.junit.opcodes.iand.Test_iand.class);
-        suite.addTestSuite(dxc.junit.opcodes.iastore.Test_iastore.class);
-        suite.addTestSuite(dxc.junit.opcodes.iconst_m1.Test_iconst_m1.class);
-        suite.addTestSuite(dxc.junit.opcodes.iconst_0.Test_iconst_0.class);
-        suite.addTestSuite(dxc.junit.opcodes.iconst_1.Test_iconst_1.class);
-        suite.addTestSuite(dxc.junit.opcodes.iconst_2.Test_iconst_2.class);
-        suite.addTestSuite(dxc.junit.opcodes.iconst_3.Test_iconst_3.class);
-        suite.addTestSuite(dxc.junit.opcodes.iconst_4.Test_iconst_4.class);
-        suite.addTestSuite(dxc.junit.opcodes.iconst_5.Test_iconst_5.class);
-        suite.addTestSuite(dxc.junit.opcodes.idiv.Test_idiv.class);
-        suite.addTestSuite(dxc.junit.opcodes.if_acmpeq.Test_if_acmpeq.class);
-        suite.addTestSuite(dxc.junit.opcodes.if_acmpne.Test_if_acmpne.class);
-        suite.addTestSuite(dxc.junit.opcodes.if_icmpeq.Test_if_icmpeq.class);
-        suite.addTestSuite(dxc.junit.opcodes.if_icmpge.Test_if_icmpge.class);
-        suite.addTestSuite(dxc.junit.opcodes.if_icmpgt.Test_if_icmpgt.class);
-        suite.addTestSuite(dxc.junit.opcodes.if_icmple.Test_if_icmple.class);
-        suite.addTestSuite(dxc.junit.opcodes.if_icmplt.Test_if_icmplt.class);
-        suite.addTestSuite(dxc.junit.opcodes.if_icmpne.Test_if_icmpne.class);
-        suite.addTestSuite(dxc.junit.opcodes.ifeq.Test_ifeq.class);
-        suite.addTestSuite(dxc.junit.opcodes.ifge.Test_ifge.class);
-        suite.addTestSuite(dxc.junit.opcodes.ifgt.Test_ifgt.class);
-        suite.addTestSuite(dxc.junit.opcodes.ifle.Test_ifle.class);
-        suite.addTestSuite(dxc.junit.opcodes.iflt.Test_iflt.class);
-        suite.addTestSuite(dxc.junit.opcodes.ifne.Test_ifne.class);
-        suite.addTestSuite(dxc.junit.opcodes.ifnonnull.Test_ifnonnull.class);
-        suite.addTestSuite(dxc.junit.opcodes.ifnull.Test_ifnull.class);
-        suite.addTestSuite(dxc.junit.opcodes.iinc.Test_iinc.class);
-        suite.addTestSuite(dxc.junit.opcodes.iload.Test_iload.class);
-        suite.addTestSuite(dxc.junit.opcodes.iload_0.Test_iload_0.class);
-        suite.addTestSuite(dxc.junit.opcodes.iload_1.Test_iload_1.class);
-        suite.addTestSuite(dxc.junit.opcodes.iload_2.Test_iload_2.class);
-        suite.addTestSuite(dxc.junit.opcodes.iload_3.Test_iload_3.class);
-        suite.addTestSuite(dxc.junit.opcodes.imul.Test_imul.class);
-        suite.addTestSuite(dxc.junit.opcodes.ineg.Test_ineg.class);
-        suite
-                .addTestSuite(dxc.junit.opcodes.opc_instanceof.Test_opc_instanceof.class);
-        suite
-                .addTestSuite(dxc.junit.opcodes.invokeinterface.Test_invokeinterface.class);
-        suite
-                .addTestSuite(dxc.junit.opcodes.invokespecial.Test_invokespecial.class);
-        suite
-                .addTestSuite(dxc.junit.opcodes.invokestatic.Test_invokestatic.class);
-        suite
-                .addTestSuite(dxc.junit.opcodes.invokevirtual.Test_invokevirtual.class);
-        suite.addTestSuite(dxc.junit.opcodes.ior.Test_ior.class);
-        suite.addTestSuite(dxc.junit.opcodes.irem.Test_irem.class);
-        suite.addTestSuite(dxc.junit.opcodes.ireturn.Test_ireturn.class);
-        suite.addTestSuite(dxc.junit.opcodes.ishl.Test_ishl.class);
-        suite.addTestSuite(dxc.junit.opcodes.ishr.Test_ishr.class);
-        suite.addTestSuite(dxc.junit.opcodes.istore.Test_istore.class);
-        suite.addTestSuite(dxc.junit.opcodes.istore_0.Test_istore_0.class);
-        suite.addTestSuite(dxc.junit.opcodes.istore_1.Test_istore_1.class);
-        suite.addTestSuite(dxc.junit.opcodes.istore_2.Test_istore_2.class);
-        suite.addTestSuite(dxc.junit.opcodes.istore_3.Test_istore_3.class);
-        suite.addTestSuite(dxc.junit.opcodes.isub.Test_isub.class);
-        suite.addTestSuite(dxc.junit.opcodes.iushr.Test_iushr.class);
-        suite.addTestSuite(dxc.junit.opcodes.ixor.Test_ixor.class);
-        suite.addTestSuite(dxc.junit.opcodes.jsr.Test_jsr.class);
-        suite.addTestSuite(dxc.junit.opcodes.jsr_w.Test_jsr_w.class);
-        suite.addTestSuite(dxc.junit.opcodes.l2d.Test_l2d.class);
-        suite.addTestSuite(dxc.junit.opcodes.l2f.Test_l2f.class);
-        suite.addTestSuite(dxc.junit.opcodes.l2i.Test_l2i.class);
-        suite.addTestSuite(dxc.junit.opcodes.ladd.Test_ladd.class);
-        suite.addTestSuite(dxc.junit.opcodes.laload.Test_laload.class);
-        suite.addTestSuite(dxc.junit.opcodes.land.Test_land.class);
-        suite.addTestSuite(dxc.junit.opcodes.lastore.Test_lastore.class);
-        suite.addTestSuite(dxc.junit.opcodes.lcmp.Test_lcmp.class);
-        suite.addTestSuite(dxc.junit.opcodes.lconst_0.Test_lconst_0.class);
-        suite.addTestSuite(dxc.junit.opcodes.lconst_1.Test_lconst_1.class);
-        suite.addTestSuite(dxc.junit.opcodes.ldc.Test_ldc.class);
-        suite.addTestSuite(dxc.junit.opcodes.ldc_w.Test_ldc_w.class);
-        suite.addTestSuite(dxc.junit.opcodes.ldc2_w.Test_ldc2_w.class);
-        suite.addTestSuite(dxc.junit.opcodes.ldiv.Test_ldiv.class);
-        suite.addTestSuite(dxc.junit.opcodes.lload.Test_lload.class);
-        suite.addTestSuite(dxc.junit.opcodes.lload_0.Test_lload_0.class);
-        suite.addTestSuite(dxc.junit.opcodes.lload_1.Test_lload_1.class);
-        suite.addTestSuite(dxc.junit.opcodes.lload_2.Test_lload_2.class);
-        suite.addTestSuite(dxc.junit.opcodes.lload_3.Test_lload_3.class);
-        suite.addTestSuite(dxc.junit.opcodes.lmul.Test_lmul.class);
-        suite.addTestSuite(dxc.junit.opcodes.lneg.Test_lneg.class);
-        suite
-                .addTestSuite(dxc.junit.opcodes.lookupswitch.Test_lookupswitch.class);
-        suite.addTestSuite(dxc.junit.opcodes.lor.Test_lor.class);
-        suite.addTestSuite(dxc.junit.opcodes.lrem.Test_lrem.class);
-        suite.addTestSuite(dxc.junit.opcodes.lreturn.Test_lreturn.class);
-        suite.addTestSuite(dxc.junit.opcodes.lshl.Test_lshl.class);
-        suite.addTestSuite(dxc.junit.opcodes.lshr.Test_lshr.class);
-        suite.addTestSuite(dxc.junit.opcodes.lstore.Test_lstore.class);
-        suite.addTestSuite(dxc.junit.opcodes.lstore_0.Test_lstore_0.class);
-        suite.addTestSuite(dxc.junit.opcodes.lstore_1.Test_lstore_1.class);
-        suite.addTestSuite(dxc.junit.opcodes.lstore_2.Test_lstore_2.class);
-        suite.addTestSuite(dxc.junit.opcodes.lstore_3.Test_lstore_3.class);
-        suite.addTestSuite(dxc.junit.opcodes.lsub.Test_lsub.class);
-        suite.addTestSuite(dxc.junit.opcodes.lushr.Test_lushr.class);
-        suite.addTestSuite(dxc.junit.opcodes.lxor.Test_lxor.class);
-        suite
-                .addTestSuite(dxc.junit.opcodes.monitorenter.Test_monitorenter.class);
-        suite
-                .addTestSuite(dxc.junit.opcodes.monitorexit.Test_monitorexit.class);
-        suite
-                .addTestSuite(dxc.junit.opcodes.multianewarray.Test_multianewarray.class);
-        suite.addTestSuite(dxc.junit.opcodes.opc_new.Test_opc_new.class);
-        suite.addTestSuite(dxc.junit.opcodes.newarray.Test_newarray.class);
-        suite.addTestSuite(dxc.junit.opcodes.nop.Test_nop.class);
-        suite.addTestSuite(dxc.junit.opcodes.pop.Test_pop.class);
-        suite.addTestSuite(dxc.junit.opcodes.pop2.Test_pop2.class);
-        suite.addTestSuite(dxc.junit.opcodes.putfield.Test_putfield.class);
-        suite.addTestSuite(dxc.junit.opcodes.putstatic.Test_putstatic.class);
-        suite.addTestSuite(dxc.junit.opcodes.ret.Test_ret.class);
-        suite.addTestSuite(dxc.junit.opcodes.opc_return.Test_opc_return.class);
-        suite.addTestSuite(dxc.junit.opcodes.saload.Test_saload.class);
-        suite.addTestSuite(dxc.junit.opcodes.sastore.Test_sastore.class);
-        suite.addTestSuite(dxc.junit.opcodes.sipush.Test_sipush.class);
-        suite.addTestSuite(dxc.junit.opcodes.swap.Test_swap.class);
-        suite
-                .addTestSuite(dxc.junit.opcodes.tableswitch.Test_tableswitch.class);
-        suite.addTestSuite(dxc.junit.opcodes.wide.Test_wide.class);
-
-        return suite;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aaload/Test_aaload.java b/tools/dx-tests/src/dxc/junit/opcodes/aaload/Test_aaload.java
deleted file mode 100644
index eebfa92..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aaload/Test_aaload.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aaload;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.aaload.jm.T_aaload_1;
-
-public class Test_aaload extends DxTestCase {
-
-    /**
-     * @title Normal test. Trying different indexes 
-     */
-    public void testN1() {
-        T_aaload_1 t = new T_aaload_1();
-        String[] arr = new String[] {"a", "b"};
-        assertEquals("a", t.run(arr, 0));
-    }
-
-    /**
-     * @title Normal test. Trying different indexes
-     */
-    public void testN2() {
-        T_aaload_1 t = new T_aaload_1();
-        String[] arr = new String[] {"a", "b"};
-        assertEquals("b", t.run(arr, 1));
-    }
-
-    /**
-     * @title ArrayIndexOutOfBoundsException expected
-     */
-    public void testE1() {
-        T_aaload_1 t = new T_aaload_1();
-        String[] arr = new String[] {"a", "b"};
-        try {
-            t.run(arr, 2);
-            fail("expected ArrayIndexOutOfBoundsException");
-        } catch (ArrayIndexOutOfBoundsException aioobe) {
-            // expected
-        }
-    }
-
-    /**
-     * @title Negative index. ArrayIndexOutOfBoundsException expected
-     */
-    public void testE2() {
-        T_aaload_1 t = new T_aaload_1();
-        String[] arr = new String[] {"a", "b"};
-        try {
-            t.run(arr, -1);
-            fail("expected ArrayIndexOutOfBoundsException");
-        } catch (ArrayIndexOutOfBoundsException aioobe) {
-            // expected
-        }
-    }
-
-    /**
-     * @title NullPointerException expected
-     */
-    public void testE3() {
-        T_aaload_1 t = new T_aaload_1();
-        String[] arr = null;
-        try {
-            t.run(arr, 0);
-            fail("expected NullPointerException");
-        } catch (NullPointerException npe) {
-            // expected
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.aaload.jm.T_aaload_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.aaload.jm.T_aaload_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, double
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.aaload.jm.T_aaload_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, long
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.aaload.jm.T_aaload_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - Object, int
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.aaload.jm.T_aaload_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - float[], int
-     */
-    public void testVFE6() {
-        try { // opcodes.aastore.jm
-            Class.forName("dxc.junit.opcodes.aaload.jm.T_aaload_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long[], int
-     */
-    public void testVFE7() {
-        try {
-            Class.forName("dxc.junit.opcodes.aaload.jm.T_aaload_8");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, reference
-     */
-    public void testVFE8() {
-        try {
-            Class.forName("dxc.junit.opcodes.aaload.jm.T_aaload_9");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_1.j b/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_1.j
deleted file mode 100644
index 90ecad7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_1.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aaload_1.java
-.class public dxc/junit/opcodes/aaload/jm/T_aaload_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run([Ljava/lang/String;I)Ljava/lang/String;
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_2
-    aaload
-    areturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_1.java b/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_1.java
deleted file mode 100644
index 8cdd527..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aaload.jm;
-
-public class T_aaload_1 {
-    
-    public String run(String [] arr, int idx) {
-        return arr[idx];
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_2.j b/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_2.j
deleted file mode 100644
index 6f906b0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aaload_2.java
-.class public dxc/junit/opcodes/aaload/jm/T_aaload_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([Ljava/lang/String;I)Ljava/lang/String;
-    .limit stack 2
-    .limit locals 3
-
-;    aload_1
-    iload_2
-    aaload
-
-    areturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_2.java b/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_2.java
deleted file mode 100644
index 55c8238..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aaload.jm;
-
-public class T_aaload_2 {
-    
-    public String run(String [] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_3.j b/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_3.j
deleted file mode 100644
index 370de70..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_3.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aaload_3.java
-.class public dxc/junit/opcodes/aaload/jm/T_aaload_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([Ljava/lang/String;I)Ljava/lang/String;
-    .limit stack 2
-    .limit locals 3
-
-    aload_1
-;    iload_2
-    aaload
-
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_3.java b/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_3.java
deleted file mode 100644
index 0afdc21..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aaload.jm;
-
-public class T_aaload_3 {
-    
-    public String run(String [] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_4.j b/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_4.j
deleted file mode 100644
index 94d7275..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_4.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aaload_4.java
-.class public dxc/junit/opcodes/aaload/jm/T_aaload_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([Ljava/lang/String;D)Ljava/lang/String;
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    dload_2
-    aaload
-    areturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_4.java b/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_4.java
deleted file mode 100644
index 4505b73..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aaload.jm;
-
-public class T_aaload_4 {
-    
-    public String run(String [] arr, double idx) {
-        return arr[(int)idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_5.j b/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_5.j
deleted file mode 100644
index a34bcdc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_5.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aaload_5.java
-.class public dxc/junit/opcodes/aaload/jm/T_aaload_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([Ljava/lang/String;J)Ljava/lang/String;
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    lload_2
-    aaload
-    areturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_5.java b/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_5.java
deleted file mode 100644
index 33b3896..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aaload.jm;
-
-public class T_aaload_5 {
-    
-    public String run(String [] arr, long idx) {
-        return arr[(int)idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_6.j b/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_6.j
deleted file mode 100644
index e4dbc17..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_6.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aaload_6.java
-.class public dxc/junit/opcodes/aaload/jm/T_aaload_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/Object;[Ljava/lang/String;I)Ljava/lang/String;
-    .limit stack 2
-    .limit locals 4
-
-    aload_1
-    iload_3
-    aaload
-
-    areturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_6.java b/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_6.java
deleted file mode 100644
index 35c428f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aaload.jm;
-
-public class T_aaload_6 {
-    
-    public String run(Object a, String[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_7.j b/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_7.j
deleted file mode 100644
index 86a256d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_7.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aaload_7.java
-.class public dxc/junit/opcodes/aaload/jm/T_aaload_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([F[Ljava/lang/String;I)Ljava/lang/String;
-    .limit stack 2
-    .limit locals 4
-
-    aload_1
-    iload_3
-    aaload
-
-    areturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_7.java b/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_7.java
deleted file mode 100644
index 4456205..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aaload.jm;
-
-public class T_aaload_7 {
-    
-    public String run(float[] a, String[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_8.j b/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_8.j
deleted file mode 100644
index 5cd99ef..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_8.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aaload_8.java
-.class public dxc/junit/opcodes/aaload/jm/T_aaload_8
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([J[Ljava/lang/String;I)Ljava/lang/String;
-    .limit stack 2
-    .limit locals 4
-
-    aload_1
-    iload_3
-    aaload
-    areturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_8.java b/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_8.java
deleted file mode 100644
index 1888233..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aaload.jm;
-
-public class T_aaload_8 {
-    
-    public String run(long[] a, String[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_9.j b/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_9.j
deleted file mode 100644
index 27de7bc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_9.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aaload_9.java
-.class public dxc/junit/opcodes/aaload/jm/T_aaload_9
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([Ljava/lang/String;I)Ljava/lang/String;
-    .limit stack 2
-    .limit locals 3
-
-    aload_1
-    aload_0
-    aaload
-
-    areturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_9.java b/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_9.java
deleted file mode 100644
index 33c3824..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aaload/jm/T_aaload_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aaload.jm;
-
-public class T_aaload_9 {
-    
-    public String run(String [] arr, int idx) {
-        return arr[idx];
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aastore/Test_aastore.java b/tools/dx-tests/src/dxc/junit/opcodes/aastore/Test_aastore.java
deleted file mode 100644
index 419c7b0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aastore/Test_aastore.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aastore;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.aastore.jm.T_aastore_1;
-import dxc.junit.opcodes.aastore.jm.T_aastore_10;
-import dxc.junit.opcodes.aastore.jm.T_aastore_11;
-import dxc.junit.opcodes.aastore.jm.T_aastore_4;
-
-public class Test_aastore extends DxTestCase {
-
-    /**
-     * @title Normal test. Trying different indexes 
-     */
-    public void testN1() {
-        T_aastore_1 t = new T_aastore_1();
-        String[] arr = new String[2];
-        t.run(arr, 0, "hello");
-        assertEquals("hello", arr[0]);
-    }
-
-    /**
-     * @title Normal test. Trying different indexes 
-     */
-    public void testN2() {
-        T_aastore_1 t = new T_aastore_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 Normal test. Trying different indexes 
-     */
-    public void testN3() {
-        T_aastore_10 t = new T_aastore_10();
-        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() {
-        // @uses dxc.junit.opcodes.aastore.jm.SubClass
-        // @uses dxc.junit.opcodes.aastore.jm.SuperClass
-        // @uses dxc.junit.opcodes.aastore.jm.SuperInterface
-        // @uses dxc.junit.opcodes.aastore.jm.SuperInterface2
-        T_aastore_11 t = new T_aastore_11();
-        assertEquals(3, t.run());
-
-    }
-
-    /**
-     * @title ArrayIndexOutOfBoundsException expected
-     */
-    public void testE1() {
-        T_aastore_1 t = new T_aastore_1();
-        String[] arr = new String[2];
-        try {
-            t.run(arr, arr.length, "abc");
-            fail("expected ArrayIndexOutOfBoundsException");
-        } catch (ArrayIndexOutOfBoundsException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @title expected ArrayIndexOutOfBoundsException
-     */
-    public void testE2() {
-        T_aastore_1 t = new T_aastore_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_aastore_1 t = new T_aastore_1();
-        String[] arr = null;
-        try {
-            t.run(arr, 0, "abc");
-            fail("expected NullPointerException");
-        } catch (NullPointerException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @title expected ArrayStoreException
-     */
-    public void testE4() {
-        T_aastore_4 t = new T_aastore_4();
-        String[] arr = new String[2];
-        try {
-            t.run(arr, 0, this);
-            fail("expected ArrayStoreException");
-        } catch (ArrayStoreException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.aastore.jm.T_aastore_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.aastore.jm.T_aastore_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, double, String
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.aastore.jm.T_aastore_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, int, long
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.aastore.jm.T_aastore_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - object, int, String
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.aastore.jm.T_aastore_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - float[], int, String
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.aastore.jm.T_aastore_8");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long[], int, String
-     */
-    public void testVFE7() {
-        try {
-            Class.forName("dxc.junit.opcodes.aastore.jm.T_aastore_9");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, reference, String
-     */
-    public void testVFE8() {
-        try {
-            Class.forName("dxc.junit.opcodes.aastore.jm.T_aastore_12");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_1.j b/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_1.j
deleted file mode 100644
index abbd91c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aastore_1.java
-.class public dxc/junit/opcodes/aastore/jm/T_aastore_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([Ljava/lang/String;ILjava/lang/String;)V
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_2
-    aload_3
-    aastore
-
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_1.java b/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_1.java
deleted file mode 100644
index bea5c19..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aastore.jm;
-
-public class T_aastore_1 {
-
-    public void run(String[] arr, int idx, String value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_10.j b/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_10.j
deleted file mode 100644
index 1dbfb4b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_10.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aastore_10.java
-.class public dxc/junit/opcodes/aastore/jm/T_aastore_10
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([Ljava/lang/Integer;ILjava/lang/Integer;)V
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_2
-    aload_3
-    aastore
-
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_10.java b/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_10.java
deleted file mode 100644
index f94c166..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_10.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aastore.jm;
-
-public class T_aastore_10 {
-    
-    public void run(Integer[] arr, int idx, Integer value) {
-        arr[idx] = value;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_11.j b/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_11.j
deleted file mode 100644
index 278f7f0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_11.j
+++ /dev/null
@@ -1,132 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aastore_11.java
-.class public dxc/junit/opcodes/aastore/jm/T_aastore_11
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 20
-    .limit locals 10
-    
-    iconst_0
-    istore_1
-
-    iconst_1
-    anewarray dxc/junit/opcodes/aastore/jm/SubClass
-    astore_2    ; SubClass[]
-    
-    iconst_1
-    anewarray dxc/junit/opcodes/aastore/jm/SuperClass
-    astore_3    ; SuperClass[]
-    
-    new        dxc/junit/opcodes/aastore/jm/SubClass
-    dup
-    invokespecial dxc/junit/opcodes/aastore/jm/SubClass.<init>()V
-    astore 4    ; SubClass
-    
-    new        dxc/junit/opcodes/aastore/jm/SuperClass
-    dup
-    invokespecial dxc/junit/opcodes/aastore/jm/SuperClass.<init>()V
-    astore 5    ; SuperClass
-    
-    iconst_1
-    anewarray dxc/junit/opcodes/aastore/jm/SuperInterface
-    astore 6    ; SuperInterface[]
-    
-    iconst_1
-    anewarray java/lang/Object
-    astore 7    ; Object[]
-    
-    iconst_1
-    anewarray dxc/junit/opcodes/aastore/jm/SuperInterface2
-    astore 8    ; SuperInterface2[]    
-    
-; (SubClass -> SuperClass[])
-    aload 3
-    iconst_0
-    aload 4
-    aastore
-    
-; (SubClass -> SuperInterface[])
-    aload 6
-    iconst_0
-    aload 4
-    aastore
-    
-; (SubClass -> Object[])
-    aload 7
-    iconst_0
-    aload 4
-    aastore        
-        
-; !(SuperClass -> SubClass[])    
-Label1:
-    aload 2
-    iconst_0
-    aload 5
-Label10:        
-    nop
-    aastore
-Label11:    
-    goto Label2
-Label12:
-    pop
-    iinc 1 1
-    goto Label2
-        
-; !(SuperClass -> SuperInterface2[])    
-Label2:
-    aload 8
-    iconst_0
-    aload 5
-Label20:    
-    aastore
-Label21:    
-    goto Label3
-Label22:
-    pop
-    iinc 1 1
-    goto Label3
-
-; !(SubClass[] -> SuperInterface[])    
-Label3:
-    aload 6
-    iconst_0
-    aload 2
-Label30:    
-    aastore
-Label31:    
-    goto Label4
-Label32:    
-    pop
-    iinc 1 1
-    goto Label4
-
-Label4:
-Label6:        
-    iload_1
-    ireturn
-    
-.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/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_11.java b/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_11.java
deleted file mode 100644
index ad0c222..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aastore.jm;
-
-public class T_aastore_11 {
-    
-    public int run() {
-        return 3;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_12.j b/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_12.j
deleted file mode 100644
index ee00a4a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_12.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aastore_12.java
-.class public dxc/junit/opcodes/aastore/jm/T_aastore_12
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([Ljava/lang/String;ILjava/lang/String;)V
-    .limit stack 3
-    .limit locals 4
-    
-    aload_1
-    aload_0
-    aload_3
-    aastore
-
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_12.java b/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_12.java
deleted file mode 100644
index c2b1c75..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_12.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aastore.jm;
-
-public class T_aastore_12 {
-    
-    public void run(String[] arr, int idx, String value) {
-        arr[idx] = value;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_2.j b/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_2.j
deleted file mode 100644
index 2c9d227..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_2.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aastore_2.java
-.class public dxc/junit/opcodes/aastore/jm/T_aastore_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run([Ljava/lang/String;ILjava/lang/String;)V
-    .limit stack 3
-    .limit locals 4
-
-;    aload_1
-    iload_2
-    aload_3
-    aastore
-
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_2.java b/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_2.java
deleted file mode 100644
index 39b0b09..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aastore.jm;
-
-public class T_aastore_2 {
-
-    public void run(String[] arr, int idx, String value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_3.j b/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_3.j
deleted file mode 100644
index 531ab76..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_3.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aastore_3.java
-.class public dxc/junit/opcodes/aastore/jm/T_aastore_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run([Ljava/lang/String;ILjava/lang/String;)V
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_2
-;    aload_3
-    aastore
-
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_3.java b/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_3.java
deleted file mode 100644
index 2f77f61..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aastore.jm;
-
-public class T_aastore_3 {
-
-    public void run(String[] arr, int idx, String value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_4.j b/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_4.j
deleted file mode 100644
index 38b89e8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_4.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aastore_4.java
-.class public dxc/junit/opcodes/aastore/jm/T_aastore_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run([Ljava/lang/String;ILjava/lang/Object;)V
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_2
-    aload_3
-    aastore
-
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_4.java b/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_4.java
deleted file mode 100644
index 3c6f558..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_4.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aastore.jm;
-
-public class T_aastore_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/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_5.j b/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_5.j
deleted file mode 100644
index 89e70cc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_5.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aastore_5.java
-.class public dxc/junit/opcodes/aastore/jm/T_aastore_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run([Ljava/lang/String;DLjava/lang/String;)V
-    .limit stack 4
-    .limit locals 5
-
-    aload_1
-    dload_2
-    aload 4
-    aastore
-
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_5.java b/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_5.java
deleted file mode 100644
index d063623..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aastore.jm;
-
-public class T_aastore_5 {
-
-    public void run(String[] arr, double idx, String value) {
-        arr[(int)idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_6.j b/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_6.j
deleted file mode 100644
index 1e5e7ce..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_6.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aastore_6.java
-.class public dxc/junit/opcodes/aastore/jm/T_aastore_6
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run([Ljava/lang/String;IJ)V
-    .limit stack 4
-    .limit locals 5
-    
-    aload_1
-    iload_2
-    lload_3
-    aastore
-
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_6.java b/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_6.java
deleted file mode 100644
index 449f21c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aastore.jm;
-
-public class T_aastore_6 {
-
-    public void run(String[] arr, int idx, String value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_7.j b/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_7.j
deleted file mode 100644
index b89c42f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_7.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aastore_7.java
-.class public dxc/junit/opcodes/aastore/jm/T_aastore_7
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(Ljava/lang/Object;ILjava/lang/String;)V
-    .limit stack 3
-    .limit locals 5
-
-    aload_1
-    iload_2
-    aload 3
-    aastore
-
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_7.java b/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_7.java
deleted file mode 100644
index 082f5c2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aastore.jm;
-
-public class T_aastore_7 {
-    
-    public void run(Object a, String[] arr, int idx, String value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_8.j b/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_8.j
deleted file mode 100644
index d6fc147..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_8.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aastore_8.java
-.class public dxc/junit/opcodes/aastore/jm/T_aastore_8
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run([FILjava/lang/String;)V
-    .limit stack 3
-    .limit locals 5
-    
-    aload_1
-    iload_2
-    aload 3
-    aastore
-
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_8.java b/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_8.java
deleted file mode 100644
index ef57088..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aastore.jm;
-
-public class T_aastore_8 {
-    
-    public void run(String a[], float[] arr, int idx, String value) {
-        a[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_9.j b/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_9.j
deleted file mode 100644
index 83d163f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_9.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aastore_9.java
-.class public dxc/junit/opcodes/aastore/jm/T_aastore_9
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run([JILjava/lang/String;)V
-    .limit stack 3
-    .limit locals 5
-
-    aload_1
-    iload_2
-    aload 3
-    aastore
-
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_9.java b/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_9.java
deleted file mode 100644
index f5713a0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/T_aastore_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aastore.jm;
-
-public class T_aastore_9 {
-    
-    public void run(String a[], long[] arr, int idx, String value) {
-        a[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/TestStubs.java b/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/TestStubs.java
deleted file mode 100644
index 190220f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aastore/jm/TestStubs.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aastore.jm;
-
-
-interface SuperInterface{
-    
-}
-
-interface SuperInterface2{
-    
-}
-
-class SuperClass implements SuperInterface{
-    
-}
-
-class SubClass extends SuperClass{
-
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aconst_null/Test_aconst_null.java b/tools/dx-tests/src/dxc/junit/opcodes/aconst_null/Test_aconst_null.java
deleted file mode 100644
index 531e559..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aconst_null/Test_aconst_null.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aconst_null;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.aconst_null.jm.T_aconst_null_1;
-
-public class Test_aconst_null extends DxTestCase {
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        assertEquals(null, new T_aconst_null_1().run());
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.aconst_null.jm.T_aconst_null_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aconst_null/jm/T_aconst_null_1.j b/tools/dx-tests/src/dxc/junit/opcodes/aconst_null/jm/T_aconst_null_1.j
deleted file mode 100644
index fe997d2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aconst_null/jm/T_aconst_null_1.j
+++ /dev/null
@@ -1,30 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.class public dxc/junit/opcodes/aconst_null/jm/T_aconst_null_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Ljava/lang/Object;
-    .limit stack 1
-    .limit locals 1
-
-    aconst_null
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aconst_null/jm/T_aconst_null_1.java b/tools/dx-tests/src/dxc/junit/opcodes/aconst_null/jm/T_aconst_null_1.java
deleted file mode 100644
index 0cc8d33..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aconst_null/jm/T_aconst_null_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aconst_null.jm;
-
-public class T_aconst_null_1 {
-    public Object run() {
-        return null;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aconst_null/jm/T_aconst_null_2.j b/tools/dx-tests/src/dxc/junit/opcodes/aconst_null/jm/T_aconst_null_2.j
deleted file mode 100644
index 9993f2b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aconst_null/jm/T_aconst_null_2.j
+++ /dev/null
@@ -1,30 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.class public dxc/junit/opcodes/aconst_null/jm/T_aconst_null_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Ljava/lang/Object;
-    .limit stack 0
-    .limit locals 1
-
-    aconst_null
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload/Test_aload.java b/tools/dx-tests/src/dxc/junit/opcodes/aload/Test_aload.java
deleted file mode 100644
index cff192e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload/Test_aload.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.aload.jm.T_aload_1;
-import dxc.junit.opcodes.aload.jm.T_aload_1_w;
-import dxc.junit.opcodes.aload.jm.T_aload_2;
-import dxc.junit.opcodes.aload.jm.T_aload_2_w;
-
-/**
- * NORMAL aload VERSION
- */
-public class Test_aload extends DxTestCase {
-
-    /**
-     * @title  Test aload 1
-     */
-    public void testN1() {
-        T_aload_1 t = new T_aload_1();
-        assertEquals("hello", t.run());
-    }
-
-    /**
-     * @title  Test aload 255
-     */
-    public void testN2() {
-        T_aload_2 t = new T_aload_2();
-        assertEquals("hello", t.run());
-    }
-
-    /**
-     * @constraint 4.8.1.21
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload.jm.T_aload_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload.jm.T_aload_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload.jm.T_aload_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload.jm.T_aload_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.21
-     * @title returnAddress may not be loaded from
-     * local variable
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload.jm.T_aload_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /*
-     * WIDE aload VERSION
-     */
-
-    /**
-     * @title  Test aload 257
-     */
-    public void testN3() {
-        T_aload_1_w t = new T_aload_1_w();
-        assertEquals("hello", t.run());
-    }
-
-    /**
-     * @title  Test aload_w 1
-     */
-    public void testN4() {
-        T_aload_2_w t = new T_aload_2_w();
-        assertEquals("hello", t.run());
-    }
-
-    /**
-     * @constraint 4.8.1.25
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload.jm.T_aload_3_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - int
-     */
-    public void testVFE7() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload.jm.T_aload_4_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE8() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload.jm.T_aload_5_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE9() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload.jm.T_aload_6_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.21
-     * @title returnAddress may not be loaded from
-     * local variable
-     */
-    public void testVFE10() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload.jm.T_aload_7_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_1.j b/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_1.j
deleted file mode 100644
index 8563239..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_1.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_1.java
-.class public dxc/junit/opcodes/aload/jm/T_aload_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()Ljava/lang/String;
-    .limit stack 3
-    .limit locals 2
-
-    ldc "hello"
-    astore_1
-    ldc "hi"
-    aload_1
-    areturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_1.java b/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_1.java
deleted file mode 100644
index fb737be..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_1.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload.jm;
-
-public class T_aload_1 {
-
-    public String run() {
-        String a = new String("hello");
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_1_w.j b/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_1_w.j
deleted file mode 100644
index cb90bcb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_1_w.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_1_w.java
-.class public dxc/junit/opcodes/aload/jm/T_aload_1_w
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()Ljava/lang/String;
-    .limit stack 3
-    .limit locals 300
-
-    ldc "hello"
-    astore 257
-    ldc "hi"
-    aload 257
-
-    areturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_1_w.java b/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_1_w.java
deleted file mode 100644
index eee3830..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_1_w.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload.jm;
-
-public class T_aload_1_w {
-    
-    public String run() {
-        String a = new String("hello");
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_2.j b/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_2.j
deleted file mode 100644
index 2bd7bf4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_2.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_2.java
-.class public dxc/junit/opcodes/aload/jm/T_aload_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()Ljava/lang/String;
-    .limit stack 4
-    .limit locals 300
-
-    new java/lang/String
-    dup
-    ldc "hello"
-    astore 255
-    ldc "hi"
-    aload 255
-    areturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_2.java b/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_2.java
deleted file mode 100644
index 23b55e3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_2.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload.jm;
-
-public class T_aload_2 {
-
-    public String run() {
-        String a = new String("hello");
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_2_w.j b/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_2_w.j
deleted file mode 100644
index fb0bb5f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_2_w.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_2_w.java
-.class public dxc/junit/opcodes/aload/jm/T_aload_2_w
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()Ljava/lang/String;
-    .limit stack 3
-    .limit locals 2
-
-    ldc "hello"
-    astore_1
-    ldc "hi"
-    aload_w 1
-
-    areturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_2_w.java b/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_2_w.java
deleted file mode 100644
index 34ae0fd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_2_w.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload.jm;
-
-public class T_aload_2_w {
-    
-    public String run() {
-        String a = new String("hello");
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_3.j b/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_3.j
deleted file mode 100644
index 0c5d5f2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_3.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_3.java
-.class public dxc/junit/opcodes/aload/jm/T_aload_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 4
-    .limit locals 1
-
-    aload 1
-    
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_3.java b/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_3.java
deleted file mode 100644
index e09b3f3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload.jm;
-
-public class T_aload_3 {
-
-    public void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_3_w.j b/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_3_w.j
deleted file mode 100644
index 41696c1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_3_w.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_3_w.java
-.class public dxc/junit/opcodes/aload/jm/T_aload_3_w
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 4
-    .limit locals 300
-
-    aload 300
-    
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_3_w.java b/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_3_w.java
deleted file mode 100644
index 1bda5b3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_3_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload.jm;
-
-public class T_aload_3_w {
-    
-    public void run() {
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_4.j b/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_4.j
deleted file mode 100644
index d14e595..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_4.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_4.java
-.class public dxc/junit/opcodes/aload/jm/T_aload_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 4
-    .limit locals 4
-
-    fconst_1
-    fstore_1
-    fconst_1
-    fstore_2
-    
-    aload 1
-    
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_4.java b/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_4.java
deleted file mode 100644
index a293d13..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload.jm;
-
-public class T_aload_4 {
-
-    public void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_4_w.j b/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_4_w.j
deleted file mode 100644
index c611274..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_4_w.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_4_w.java
-.class public dxc/junit/opcodes/aload/jm/T_aload_4_w
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 4
-    .limit locals 300
-
-    iconst_1
-    istore 260
-    iconst_1
-    istore 261
-    
-    aload_w 260
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_4_w.java b/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_4_w.java
deleted file mode 100644
index 17ee8f6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_4_w.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload.jm;
-
-public class T_aload_4_w {
-    
-    public void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_5.j b/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_5.j
deleted file mode 100644
index c568f54..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_5.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_5.java
-.class public dxc/junit/opcodes/aload/jm/T_aload_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    lstore_1
-    
-    aload 1
-    
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_5.java b/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_5.java
deleted file mode 100644
index 21b90bd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload.jm;
-
-public class T_aload_5 {
-
-    public void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_5_w.j b/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_5_w.j
deleted file mode 100644
index 4c133fc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_5_w.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_5_w.java
-.class public dxc/junit/opcodes/aload/jm/T_aload_5_w
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 4
-    .limit locals 300
-
-    dconst_1
-    dstore 260
-    dconst_1
-    dstore 261
-    
-    aload_w 260
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_5_w.java b/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_5_w.java
deleted file mode 100644
index 8331d51..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_5_w.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload.jm;
-
-public class T_aload_5_w {
-
-    public void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_6.j b/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_6.j
deleted file mode 100644
index afbff18..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_6.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_6.java
-.class public dxc/junit/opcodes/aload/jm/T_aload_6
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 1
-    .limit locals 2
-
-    ldc "abc"
-    astore_1
-    
-    aload 1
-    aload 1
-    
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_6.java b/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_6.java
deleted file mode 100644
index 2a622c0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload.jm;
-
-public class T_aload_6 {
-
-    public void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_6_w.j b/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_6_w.j
deleted file mode 100644
index 0e62855..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_6_w.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_6_w.java
-.class public dxc/junit/opcodes/aload/jm/T_aload_6_w
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 1
-    .limit locals 300
-
-    ldc "hello"
-    astore 260
-    
-    aload_w 260
-    aload_w 260
-    
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_6_w.java b/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_6_w.java
deleted file mode 100644
index 38ec788..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_6_w.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload.jm;
-
-public class T_aload_6_w {
-
-    public void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_7.j b/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_7.j
deleted file mode 100644
index 8aacd2c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_7.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_7.java
-.class public dxc/junit/opcodes/aload/jm/T_aload_7
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 1
-    .limit locals 2
-
-    jsr Label1
-    return
-
-Label1:
-    astore_1
-    aload 1
-    ret 1
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_7.java b/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_7.java
deleted file mode 100644
index 2ff26f0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload.jm;
-
-public class T_aload_7 {
-
-    public void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_7_w.j b/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_7_w.j
deleted file mode 100644
index 9b7a8e9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_7_w.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_7_w.java
-.class public dxc/junit/opcodes/aload/jm/T_aload_7_w
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 1
-    .limit locals 2
-
-    jsr Label1
-    return
-
-Label1:
-    astore_1
-    aload_w 1
-    ret 1
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_7_w.java b/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_7_w.java
deleted file mode 100644
index 110edd8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload/jm/T_aload_7_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload.jm;
-
-public class T_aload_7_w {
-
-    public void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/Test_aload_0.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_0/Test_aload_0.java
deleted file mode 100644
index 457d2ab..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/Test_aload_0.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_0;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.aload_0.jm.T_aload_0_1;
-import dxc.junit.opcodes.aload_0.jm.T_aload_0_6;
-
-public class Test_aload_0 extends DxTestCase {
-
-    /**
-     * @title value is pushed onto the operand stack
-     */
-    public void testN1() {
-        assertEquals("hello", T_aload_0_1.run());
-    }
-
-    /**
-     * @title equality of aload_<n> and aload <n>
-     */
-    public void testN2() {
-        assertTrue(T_aload_0_6.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload_0.jm.T_aload_0_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload_0.jm.T_aload_0_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload_0.jm.T_aload_0_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - int
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload_0.jm.T_aload_0_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload_0.jm.T_aload_0_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.21
-     * @title returnAddress may not be loaded from
-     * local variable
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload_0.jm.T_aload_0_8");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_1.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_1.j
deleted file mode 100644
index 99a6407..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_1.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_0_1.java
-.class public dxc/junit/opcodes/aload_0/jm/T_aload_0_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()Ljava/lang/String;
-    .limit stack 3
-    .limit locals 2
-    
-    ldc "hello"
-    astore_0
-    ldc "hi"
-    aload_0
-    areturn
-    
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_1.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_1.java
deleted file mode 100644
index cc72d47..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_1.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_0.jm;
-
-public class T_aload_0_1 {
-
-    public static String run() {
-        String a = new String("hello");
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_2.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_2.j
deleted file mode 100644
index 0e2b130..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_0_2.java
-.class public dxc/junit/opcodes/aload_0/jm/T_aload_0_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 0
-
-    aload_0
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_2.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_2.java
deleted file mode 100644
index ede0a70..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_0.jm;
-
-public class T_aload_0_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_3.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_3.j
deleted file mode 100644
index 681f400..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_3.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_0_3.java
-.class public dxc/junit/opcodes/aload_0/jm/T_aload_0_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    fconst_1
-    fstore_0
-    fconst_1
-    fstore_1
-    
-    aload_0
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_3.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_3.java
deleted file mode 100644
index e9ee293..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_0.jm;
-
-public class T_aload_0_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_4.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_4.j
deleted file mode 100644
index ea898b3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_4.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_0_4.java
-.class public dxc/junit/opcodes/aload_0/jm/T_aload_0_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    lstore_0
-    
-    aload_0
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_4.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_4.java
deleted file mode 100644
index c6a30ad..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_0.jm;
-
-public class T_aload_0_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_5.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_5.j
deleted file mode 100644
index c30867e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_5.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_0_5.java
-.class public dxc/junit/opcodes/aload_0/jm/T_aload_0_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 2
-
-    iconst_1
-    istore_0
-    
-    aload_0
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_5.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_5.java
deleted file mode 100644
index c9a12a3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_5.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_0.jm;
-
-public class T_aload_0_5 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_6.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_6.j
deleted file mode 100644
index 1f823e5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_6.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_0_6.java
-.class public dxc/junit/opcodes/aload_0/jm/T_aload_0_6
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()Z
-    .limit stack 4
-    .limit locals 2
-
-    ldc "hello"
-    astore_0
-
-    aload_0
-    aload 0
-    if_acmpne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_6.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_6.java
deleted file mode 100644
index 350126f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_6.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_0.jm;
-
-public class T_aload_0_6 {
-
-    public static boolean run() {
-        String a = new String("hello");
-        return a == a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_7.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_7.j
deleted file mode 100644
index 8e0073c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_7.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_0_7.java
-.class public dxc/junit/opcodes/aload_0/jm/T_aload_0_7
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 2
-
-    ldc "hello"
-    astore_0
-    
-    aload_0
-    aload_0
-    
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_7.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_7.java
deleted file mode 100644
index 7d002ef..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_7.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_0.jm;
-
-public class T_aload_0_7 {
-    
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_8.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_8.j
deleted file mode 100644
index d2922cc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_8.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_0_8.java
-.class public dxc/junit/opcodes/aload_0/jm/T_aload_0_8
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 2
-
-    jsr Label1
-    return
-
-Label1:
-    astore_0
-    aload_0
-    ret 0
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_8.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_8.java
deleted file mode 100644
index 1e268b9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_0/jm/T_aload_0_8.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_0.jm;
-
-public class T_aload_0_8 {
-    
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/Test_aload_1.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_1/Test_aload_1.java
deleted file mode 100644
index 22a129e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/Test_aload_1.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_1;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.aload_1.jm.T_aload_1_1;
-import dxc.junit.opcodes.aload_1.jm.T_aload_1_6;
-
-public class Test_aload_1 extends DxTestCase {
-
-    /**
-     * @title value is pushed onto the operand stack
-     */
-    public void testN1() {
-        assertEquals("hello", T_aload_1_1.run());
-    }
-
-    /**
-     * @title equality of aload_<n> and aload <n>
-     */
-    public void testN2() {
-        assertTrue(T_aload_1_6.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload_1.jm.T_aload_1_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload_1.jm.T_aload_1_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload_1.jm.T_aload_1_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - int
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload_1.jm.T_aload_1_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload_1.jm.T_aload_1_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.21
-     * @title returnAddress may not be loaded from
-     * local variable
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload_1.jm.T_aload_1_8");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_1.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_1.j
deleted file mode 100644
index e2718f5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_1.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_1_1.java
-.class public dxc/junit/opcodes/aload_1/jm/T_aload_1_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()Ljava/lang/String;
-    .limit stack 3
-    .limit locals 2
-    
-    ldc "hello"
-    astore_1
-    ldc "hi"
-    aload_1
-    areturn
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_1.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_1.java
deleted file mode 100644
index e5e4fc6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_1.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_1.jm;
-
-public class T_aload_1_1 {
-
-    public static String run() {
-        String a = new String("hello");
-        return a;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_2.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_2.j
deleted file mode 100644
index 8089467..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_2.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_1_2.java
-.class public dxc/junit/opcodes/aload_1/jm/T_aload_1_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 0
-
-    aload_1
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_2.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_2.java
deleted file mode 100644
index d223d29..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_1.jm;
-
-public class T_aload_1_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_3.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_3.j
deleted file mode 100644
index 0d98b4c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_3.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_1_3.java
-.class public dxc/junit/opcodes/aload_1/jm/T_aload_1_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    fconst_1
-    fstore_0
-    fconst_1
-    fstore_1
-    
-    aload_1
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_3.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_3.java
deleted file mode 100644
index e639b3b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_1.jm;
-
-public class T_aload_1_3 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_4.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_4.j
deleted file mode 100644
index 037314b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_1_4.java
-.class public dxc/junit/opcodes/aload_1/jm/T_aload_1_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    lstore_1
-    
-    aload_1
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_4.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_4.java
deleted file mode 100644
index 4263064..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_1.jm;
-
-public class T_aload_1_4 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_5.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_5.j
deleted file mode 100644
index 9e84cc2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_5.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_1_5.java
-.class public dxc/junit/opcodes/aload_1/jm/T_aload_1_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 2
-
-    iconst_1
-    istore_1
-    
-    aload_1
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_5.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_5.java
deleted file mode 100644
index 88fb112..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_1.jm;
-
-public class T_aload_1_5 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_6.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_6.j
deleted file mode 100644
index 2a476d6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_6.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_1_6.java
-.class public dxc/junit/opcodes/aload_1/jm/T_aload_1_6
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()Z
-    .limit stack 4
-    .limit locals 2
-
-    ldc "hello"
-    astore_1
-
-    aload_1
-    aload 1
-    if_acmpne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_6.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_6.java
deleted file mode 100644
index a5b95c3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_6.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_1.jm;
-
-public class T_aload_1_6 {
-
-    public static boolean run() {
-        String a = new String("hello");
-        return a == a;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_7.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_7.j
deleted file mode 100644
index dcc158f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_7.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_1_7.java
-.class public dxc/junit/opcodes/aload_1/jm/T_aload_1_7
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 2
-
-    ldc "hello"
-    astore_1
-    
-    aload_1
-    aload_1
-    
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_7.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_7.java
deleted file mode 100644
index 08930a6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_7.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_1.jm;
-
-public class T_aload_1_7 {
-    
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_8.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_8.j
deleted file mode 100644
index a72e6f1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_8.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_1_8.java
-.class public dxc/junit/opcodes/aload_1/jm/T_aload_1_8
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 2
-
-    jsr Label1
-    return
-
-Label1:
-    astore_1
-    aload_1
-    ret 1
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_8.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_8.java
deleted file mode 100644
index 9fd86cc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_1/jm/T_aload_1_8.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_1.jm;
-
-public class T_aload_1_8 {
-    
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/Test_aload_2.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_2/Test_aload_2.java
deleted file mode 100644
index d01c00b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/Test_aload_2.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_2;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.aload_2.jm.T_aload_2_1;
-import dxc.junit.opcodes.aload_2.jm.T_aload_2_6;
-
-public class Test_aload_2 extends DxTestCase {
-
-    /**
-     * @title value is pushed onto the operand stack
-     */
-    public void testN1() {
-        assertEquals("hello", T_aload_2_1.run());
-    }
-
-    /**
-     * @title equality of aload_<n> and aload <n>
-     */
-    public void testN2() {
-        assertTrue(T_aload_2_6.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload_2.jm.T_aload_2_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload_2.jm.T_aload_2_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload_2.jm.T_aload_2_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - int
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload_2.jm.T_aload_2_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload_2.jm.T_aload_2_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.21
-     * @title returnAddress may not be loaded from
-     * local variable
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload_2.jm.T_aload_2_8");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_1.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_1.j
deleted file mode 100644
index cf7efe7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_1.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_2_1.java
-.class public dxc/junit/opcodes/aload_2/jm/T_aload_2_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()Ljava/lang/String;
-    .limit stack 3
-    .limit locals 3
-    
-    ldc "hello"
-    astore_2
-    ldc "hi"
-    aload_2
-    areturn
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_1.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_1.java
deleted file mode 100644
index a57be08..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_1.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_2.jm;
-
-public class T_aload_2_1 {
-
-    public static String run() {
-        String a = new String("hello");
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_2.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_2.j
deleted file mode 100644
index 12a73ff..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_2_2.java
-.class public dxc/junit/opcodes/aload_2/jm/T_aload_2_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    .limit stack 1
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 0
-
-    aload_2
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_2.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_2.java
deleted file mode 100644
index c2b074d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_2.jm;
-
-public class T_aload_2_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_3.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_3.j
deleted file mode 100644
index 829b23a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_3.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_2_3.java
-.class public dxc/junit/opcodes/aload_2/jm/T_aload_2_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    fconst_1
-    fstore_1
-    fconst_2
-    fstore_2
-    
-    aload_2
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_3.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_3.java
deleted file mode 100644
index 5fe9956..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_2.jm;
-
-public class T_aload_2_3 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_4.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_4.j
deleted file mode 100644
index 14565e7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_2_4.java
-.class public dxc/junit/opcodes/aload_2/jm/T_aload_2_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    lstore_2
-    
-    aload_2
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_4.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_4.java
deleted file mode 100644
index 604db5a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_2.jm;
-
-public class T_aload_2_4 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_5.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_5.j
deleted file mode 100644
index 8d3fd27..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_5.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_2_5.java
-.class public dxc/junit/opcodes/aload_2/jm/T_aload_2_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 4
-
-    iconst_2
-    istore_2
-    
-    aload_2
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_5.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_5.java
deleted file mode 100644
index 3a39ef9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_2.jm;
-
-public class T_aload_2_5 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_6.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_6.j
deleted file mode 100644
index aa81a91..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_6.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_2_6.java
-.class public dxc/junit/opcodes/aload_2/jm/T_aload_2_6
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()Z
-    .limit stack 4
-    .limit locals 3
-
-    ldc "hello"
-    astore_2
-
-    aload_2
-    aload 2
-    if_acmpne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_6.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_6.java
deleted file mode 100644
index a4e9ca0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_6.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_2.jm;
-
-public class T_aload_2_6 {
-
-    public static boolean run() {
-        String a = new String("hello");
-        return a == a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_7.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_7.j
deleted file mode 100644
index bf69c97..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_7.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_2_7.java
-.class public dxc/junit/opcodes/aload_2/jm/T_aload_2_7
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 3
-
-    ldc "hello"
-    astore_2
-    
-    aload_2
-    aload_2
-    
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_7.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_7.java
deleted file mode 100644
index e9e8773..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_7.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_2.jm;
-
-public class T_aload_2_7 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_8.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_8.j
deleted file mode 100644
index d03eedf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_8.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_2_8.java
-.class public dxc/junit/opcodes/aload_2/jm/T_aload_2_8
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 3
-
-    jsr Label1
-    return
-
-Label1:
-    astore_2
-    aload_2
-    ret 2
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_8.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_8.java
deleted file mode 100644
index 56e6e7a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_2/jm/T_aload_2_8.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_2.jm;
-
-public class T_aload_2_8 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/Test_aload_3.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_3/Test_aload_3.java
deleted file mode 100644
index ee67af0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/Test_aload_3.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_3;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.aload_3.jm.T_aload_3_1;
-import dxc.junit.opcodes.aload_3.jm.T_aload_3_6;
-
-public class Test_aload_3 extends DxTestCase {
-
-    /**
-     * @title value is pushed onto the operand stack
-     */
-    public void testN1() {
-        assertEquals("hello", T_aload_3_1.run());
-    }
-
-    /**
-     * @title equality of aload_<n> and aload <n>
-     */
-    public void testN2() {
-        assertTrue(T_aload_3_6.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload_3.jm.T_aload_3_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload_3.jm.T_aload_3_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload_3.jm.T_aload_3_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - int
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload_3.jm.T_aload_3_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload_3.jm.T_aload_3_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.21
-     * @title returnAddress may not be loaded from
-     * local variable
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.aload_3.jm.T_aload_3_8");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_1.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_1.j
deleted file mode 100644
index 2d79c90..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_1.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_3_1.java
-.class public dxc/junit/opcodes/aload_3/jm/T_aload_3_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()Ljava/lang/String;
-    .limit stack 3
-    .limit locals 4
-    
-    ldc "hello"
-    astore_3
-    ldc "hi"
-    aload_3
-    areturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_1.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_1.java
deleted file mode 100644
index 27b910f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_1.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_3.jm;
-
-public class T_aload_3_1 {
-
-    public static String run() {
-        String a = new String("hello");
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_2.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_2.j
deleted file mode 100644
index ed1f591..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_2.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_3_2.java
-.class public dxc/junit/opcodes/aload_3/jm/T_aload_3_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 0
-
-    aload_3
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_2.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_2.java
deleted file mode 100644
index 15743fd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_3.jm;
-
-public class T_aload_3_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_3.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_3.j
deleted file mode 100644
index 164dc3c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_3.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_3_3.java
-.class public dxc/junit/opcodes/aload_3/jm/T_aload_3_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    fconst_2
-    fstore_3
-    
-    aload_3
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_3.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_3.java
deleted file mode 100644
index 90ff938..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_3.jm;
-
-public class T_aload_3_3 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_4.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_4.j
deleted file mode 100644
index d83697a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_3_4.java
-.class public dxc/junit/opcodes/aload_3/jm/T_aload_3_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 5
-
-    lconst_1
-    lstore_3
-    
-    aload_3
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_4.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_4.java
deleted file mode 100644
index 51b8522..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_3.jm;
-
-public class T_aload_3_4 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_5.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_5.j
deleted file mode 100644
index 2acfe28..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_5.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_3_5.java
-.class public dxc/junit/opcodes/aload_3/jm/T_aload_3_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 4
-
-    iconst_3
-    istore_3
-    
-    aload_3
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_5.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_5.java
deleted file mode 100644
index a2cb2d9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_3.jm;
-
-public class T_aload_3_5 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_6.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_6.j
deleted file mode 100644
index 905342a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_6.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_3_6.java
-.class public dxc/junit/opcodes/aload_3/jm/T_aload_3_6
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()Z
-    .limit stack 4
-    .limit locals 4
-
-    ldc "hello"
-    astore_3
-
-    aload_3
-    aload 3
-    if_acmpne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_6.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_6.java
deleted file mode 100644
index ce9727b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_6.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_3.jm;
-
-public class T_aload_3_6 {
-
-    public static boolean run() {
-        String a = new String("hello");
-        return a == a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_7.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_7.j
deleted file mode 100644
index 1083e93..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_7.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_3_7.java
-.class public dxc/junit/opcodes/aload_3/jm/T_aload_3_7
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 4
-
-    ldc "hello"
-    astore_3
-    
-    aload_3
-    aload_3
-    
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_7.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_7.java
deleted file mode 100644
index d8f143f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_7.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_3.jm;
-
-public class T_aload_3_7 {
-    
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_8.j b/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_8.j
deleted file mode 100644
index 6699732..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_8.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_aload_3_8.java
-.class public dxc/junit/opcodes/aload_3/jm/T_aload_3_8
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 4
-
-    jsr Label1
-    return
-
-Label1:
-    astore_3
-    aload_3
-    ret 3
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_8.java b/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_8.java
deleted file mode 100644
index 12628ef..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/aload_3/jm/T_aload_3_8.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.aload_3.jm;
-
-public class T_aload_3_8 {
-    
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/TestStubs.java b/tools/dx-tests/src/dxc/junit/opcodes/anewarray/TestStubs.java
deleted file mode 100644
index 08a00cd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/TestStubs.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.anewarray;
-
-public class TestStubs {
-    
-private class TestStub{
-    // testE4
-}
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/Test_anewarray.java b/tools/dx-tests/src/dxc/junit/opcodes/anewarray/Test_anewarray.java
deleted file mode 100644
index ecc1ce2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/Test_anewarray.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.anewarray;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.anewarray.jm.T_anewarray_1;
-import dxc.junit.opcodes.anewarray.jm.T_anewarray_6;
-import dxc.junit.opcodes.anewarray.jm.T_anewarray_7;
-
-public class Test_anewarray extends DxTestCase {
-    
-    /**
-     * @title Test for Object
-     */
-    public void testN1() {
-        T_anewarray_1 t = new T_anewarray_1();
-
-        Object[] arr = t.run(10);
-        assertNotNull(arr);
-        assertEquals(10, arr.length);
-        for (int i = 0; i < 10; i++)
-            assertNull(arr[i]);
-    }
-
-    /**
-     * @title Test for String
-     */
-    public void testN2() {
-        T_anewarray_1 t = new T_anewarray_1();
-
-        String[] arr2 = t.run2(5);
-        assertNotNull(arr2);
-        assertEquals(5, arr2.length);
-        for (int i = 0; i < 5; i++)
-            assertNull(arr2[i]);
-    }
-
-    /**
-     * @title Test for Integer
-     */
-    public void testN3() {
-        T_anewarray_1 t = new T_anewarray_1();
-
-        Integer[] arr3 = t.run3(15);
-        assertNotNull(arr3);
-        assertEquals(15, arr3.length);
-        for (int i = 0; i < 15; i++)
-            assertNull(arr3[i]);
-    }
-
-    /**
-     * @title if count is zero, no subsequent dimensions allocated
-     */
-    public void testE1() {
-        T_anewarray_1 t = new T_anewarray_1();
-        Object[] res = t.run(0);
-        try {
-            Object s = res[0];
-            fail("expected ArrayIndexOutOfBoundsException");
-        } catch (ArrayIndexOutOfBoundsException ae) {
-            // expected
-        }
-    }
-
-    /**
-     * @title expected NegativeArraySizeException
-     */
-    public void testE2() {
-        T_anewarray_1 t = new T_anewarray_1();
-        try {
-            t.run(-2);
-            fail("expected NegativeArraySizeException");
-        } catch (NegativeArraySizeException nase) {
-            // expected
-        }
-    }
-
-    /**
-     * @title expected NoClassDefFoundError
-     */
-    public void testE3() {
-        try {
-            T_anewarray_6 t = new T_anewarray_6();
-            t.run();
-            fail("expected NoClassDefFoundError");
-        } catch (NoClassDefFoundError e) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; eagerly tries to load the array type
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title expected IllegalAccessError
-     * <pre>
-     * V(15469) +++ dvmAddClassToHash '[Ldxc/junit/opcodes/anewarray/jm/TestStubs$TestStub;' 0x973d7708 (isnew=1) --> 0x973e1f10  (dalvikvm)
-     * V(15469) Created array class '[Ldxc/junit/opcodes/anewarray/jm/TestStubs$TestStub;' 0x973d7708 (access=0x6000.0010)  (dalvikvm)
-     * </pre>
-     * TestStub class is private. no IllegalAccessError is thrown, but VerifyError
-     */
-    public void testE4() {
-        try {
-            T_anewarray_7 t = new T_anewarray_7();
-            t.run();
-            fail("expected IllegalAccessError");
-        } catch (IllegalAccessError e) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.19
-     * @title constant pool index
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.anewarray.jm.T_anewarray_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.anewarray.jm.T_anewarray_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - float
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.anewarray.jm.T_anewarray_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.17
-     * @title array of more than 255 dimensions
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.anewarray.jm.T_anewarray_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - reference
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.anewarray.jm.T_anewarray_8");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.19
-     * @title constant pool type
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.anewarray.jm.T_anewarray_9");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_1.j b/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_1.j
deleted file mode 100644
index 3fbf658..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_1.j
+++ /dev/null
@@ -1,55 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_anewarray_1.java
-.class public dxc/junit/opcodes/anewarray/jm/T_anewarray_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(I)[Ljava/lang/Object;
-    .limit stack 1
-    .limit locals 2
-
-    iload_1
-    anewarray java/lang/Object
-    areturn
-
-.end method
-
-.method public run2(I)[Ljava/lang/String;
-    .limit stack 1
-    .limit locals 2
-
-    iload_1
-    anewarray java/lang/String
-    areturn
-
-.end method
-
-.method public run3(I)[Ljava/lang/Integer;
-    .limit stack 1
-    .limit locals 2
-
-    iload_1
-    anewarray java/lang/Integer
-    areturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_1.java b/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_1.java
deleted file mode 100644
index 4358382..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_1.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.anewarray.jm;
-
-public class T_anewarray_1 {
-
-    public Object[] run(int idx) {
-        return new Object[idx];
-    }
-    
-    public String[] run2(int idx) {
-        return new String[idx];
-    }
-    
-    public Integer[] run3(int idx) {
-        return new Integer[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_2.cfh b/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_2.cfh
deleted file mode 100644
index d2fef44..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_2.cfh
+++ /dev/null
@@ -1,191 +0,0 @@
-//@class:dxc/junit/opcodes/anewarray/jm/T_anewarray_2
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0010
-// .  .  
-   00 10 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0f 00 08 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 3, h: 0003: type{java.lang.String}
-    // .  .  .  
-       07 00 0b 
-    // parsed:, offset 37, len 3, h: 0004: type{dxc.junit.opcodes.anewarray.jm.T_anewarray_2}
-    // .  .  .  
-       07 00 09 
-    // parsed:, offset 40, len 13, h: 0005: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 53, len 9, h: 0006: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 62, len 7, h: 0007: utf8{"run2"}
-    // .  .  .  r  u  n  2  
-       01 00 04 72 75 6e 32 
-    // parsed:, offset 69, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 06 00 0c 
-    // parsed:, offset 74, len 47, h: 0009: utf8{"dxc/junit/opcodes/anewarray/jm/T_anewarray_2"}
-    // .  .  ,  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  a  n  e  w  a  r  r  a  y  /  j  m  /  T  _  a  n  e  w  a  r  r  a  y  _  2  
-       01 00 2c 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 61 6e 65 77 61 72 72 61 79 2f 6a 6d 2f 54 5f 61 6e 65 77 61 72 72 61 79 5f 32 
-    // parsed:, offset 121, len 7, h: 000a: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 128, len 19, h: 000b: utf8{"java/lang/String"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  S  t  r  i  n  g  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 
-    // parsed:, offset 147, len 6, h: 000c: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 153, len 21, h: 000d: utf8{"T_anewarray_2.java"}
-    // .  .  .  T  _  a  n  e  w  a  r  r  a  y  _  2  .  j  a  v  a  
-       01 00 12 54 5f 61 6e 65 77 61 72 72 61 79 5f 32 2e 6a 61 76 61 
-    // parsed:, offset 174, len 25, h: 000e: utf8{"(I)[Ljava/lang/String;"}
-    // .  .  .  (  I  )  [  L  j  a  v  a  /  l  a  n  g  /  S  t  r  i  n  g  ;  
-       01 00 16 28 49 29 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 
-    // parsed:, offset 199, len 3, h: 000f: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 202, len 0, h: end constant_pool
-// parsed:, offset 202, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 204, len 2, h: this_class: type{dxc.junit.opcodes.anewarray.jm.T_anewarray_2}
-// .  .  
-   00 04 
-// parsed:, offset 206, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0f 
-// parsed:, offset 208, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 210, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 212, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 214, len:72,desc: ()V
-// parsed:, offset 214, len 0, h:  methods[0]: 
-    // parsed:, offset 214, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 216, len 2, h: name: <init>
-    // .  .  
-       00 06 
-    // parsed:, offset 218, len 2, h: descriptor: ()V
-    // .  .  
-       00 0c 
-    // parsed:, offset 220, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 222, len 0, h:  attributes[0]: 
-        // parsed:, offset 222, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 224, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 228, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 230, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 232, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 241, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 243, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 245, len 0, h: end attributes[0] 
-// parsed:, offset 245, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run2, offset 245, len:41,desc: (I)[Ljava/lang/String;
-// parsed:, offset 245, len 0, h:  methods[1]: 
-    // parsed:, offset 245, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 247, len 2, h: name: run2
-    // .  .  
-       00 07 
-    // parsed:, offset 249, len 2, h: descriptor: (I)[Ljava/lang/String;
-    // .  .  
-       00 0e 
-    // parsed:, offset 251, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 253, len 0, h:  attributes[0]: 
-        // parsed:, offset 253, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 255, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 259, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 261, len 2, h: max_locals: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 263, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 3, h: 0001: anewarray type{java.lang.String}
-        // .  .  .  
-//@mod           bd 00 03 
-           bd 01 03           
-        // parsed:, offset 4, len 1, h: 0004: areturn
-        // .  
-           b0 
-        // parsed:, offset 272, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 274, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 276, len 0, h: end attributes[0] 
-// parsed:, offset 276, len 0, h: end methods[1] 
-// ========== end-ParseMember:run2, desc: (I)[Ljava/lang/String;
-// parsed:, offset 276, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 278, len 0, h:  attributes[0]: 
-    // parsed:, offset 278, len 2, h: name: SourceFile
-    // .  .  
-       00 05 
-    // parsed:, offset 280, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 284, len 2, h: source: utf8{"T_anewarray_2.java"}
-    // .  .  
-       00 0d 
-// parsed:, offset 286, len 0, h: end attributes[0] 
-// parsed:, offset 286, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_2.j b/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_2.j
deleted file mode 100644
index 41c2fc2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_2.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_anewarray_2.java
-.class public dxc/junit/opcodes/anewarray/jm/T_anewarray_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run2(I)[Ljava/lang/String;
-    .limit stack 1
-    .limit locals 2
-
-    iload_1
-    anewarray java/lang/String
-    areturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_2.java b/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_2.java
deleted file mode 100644
index d58fa37..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.anewarray.jm;
-
-public class T_anewarray_2 {
-
-    public String[] run2(int idx) {
-        return new String[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_3.j b/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_3.j
deleted file mode 100644
index 6e6f638..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_3.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_anewarray_3.java
-.class public dxc/junit/opcodes/anewarray/jm/T_anewarray_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run2(I)[Ljava/lang/String;
-    .limit stack 1
-    .limit locals 2
-
-;    iload_1
-    anewarray java/lang/String
-    areturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_3.java b/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_3.java
deleted file mode 100644
index c5b8e54..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.anewarray.jm;
-
-public class T_anewarray_3 {
-
-    public String[] run2(int idx) {
-        return new String[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_4.j b/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_4.j
deleted file mode 100644
index 0ed6b0f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_4.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_anewarray_4.java
-.class public dxc/junit/opcodes/anewarray/jm/T_anewarray_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run2(F)[Ljava/lang/String;
-    .limit stack 1
-    .limit locals 2
-
-    fload_1
-    anewarray java/lang/String
-    areturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_4.java b/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_4.java
deleted file mode 100644
index 1256343..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.anewarray.jm;
-
-public class T_anewarray_4 {
-
-    public String[] run2(int idx) {
-        return new String[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_5.j b/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_5.j
deleted file mode 100644
index d5d1770..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_5.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_anewarray_5.java
-.class public dxc/junit/opcodes/anewarray/jm/T_anewarray_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(I)[Ljava/lang/String;
-    .limit stack 1
-    .limit locals 2
-
-    iload_1
-    anewarray [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[Ljava/lang/String;
-
-    areturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_5.java b/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_5.java
deleted file mode 100644
index c0f8763..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.anewarray.jm;
-
-public class T_anewarray_5 {
-
-    public String[] run(int idx) {
-        return new String[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_6.j b/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_6.j
deleted file mode 100644
index f2a5369..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_6.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_anewarray_6.java
-.class public dxc/junit/opcodes/anewarray/jm/T_anewarray_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Ljava/lang/Object;
-    .limit stack 1
-    .limit locals 1
-
-    iconst_1
-    anewarray dxc/junit/opcodes/anewarray/jm/T_anewarray_61
-    areturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_6.java b/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_6.java
deleted file mode 100644
index 23fe874..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.anewarray.jm;
-
-public class T_anewarray_6 {
-
-    public Object run() {
-        return new T_anewarray_6[1];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_7.j b/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_7.j
deleted file mode 100644
index 8915c0e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_7.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_anewarray_7.java
-.class public dxc/junit/opcodes/anewarray/jm/T_anewarray_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Ljava/lang/Object;
-    .limit stack 1
-    .limit locals 1
-
-    iconst_1
-    anewarray dxc/junit/opcodes/anewarray/TestStubs$TestStub
-    areturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_7.java b/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_7.java
deleted file mode 100644
index b8a9997..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.anewarray.jm;
-
-public class T_anewarray_7 {
-
-    public Object run() {
-        return new T_anewarray_7[1];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_8.j b/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_8.j
deleted file mode 100644
index 85e65ca..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_8.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_anewarray_8.java
-.class public dxc/junit/opcodes/anewarray/jm/T_anewarray_8
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run2(I)[Ljava/lang/String;
-    .limit stack 1
-    .limit locals 2
-
-    aload_0
-    anewarray java/lang/String
-
-    areturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_8.java b/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_8.java
deleted file mode 100644
index dc349ee..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.anewarray.jm;
-
-public class T_anewarray_8 {
-
-    public String[] run2(int idx) {
-        return new String[idx];
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_9.cfh b/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_9.cfh
deleted file mode 100644
index 7f763fb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_9.cfh
+++ /dev/null
@@ -1,200 +0,0 @@
-//@class:dxc/junit/opcodes/anewarray/jm/T_anewarray_9
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0011
-// .  .  
-   00 11 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0f 00 09 
-    // parsed:, offset 15, len 47, h: 0002: utf8{"dxc/junit/opcodes/anewarray/jm/T_anewarray_9"}
-    // .  .  ,  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  a  n  e  w  a  r  r  a  y  /  j  m  /  T  _  a  n  e  w  a  r  r  a  y  _  9  
-       01 00 2c 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 61 6e 65 77 61 72 72 61 79 2f 6a 6d 2f 54 5f 61 6e 65 77 61 72 72 61 79 5f 39 
-    // parsed:, offset 62, len 19, h: 0003: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 81, len 3, h: 0004: type{java.lang.String}
-    // .  .  .  
-       07 00 0b 
-    // parsed:, offset 84, len 13, h: 0005: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 97, len 5, h: 0006: int{0x0000007b / 123}
-    // .  .  .  .  {  
-       03 00 00 00 7b 
-    // parsed:, offset 102, len 9, h: 0007: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 111, len 7, h: 0008: utf8{"run2"}
-    // .  .  .  r  u  n  2  
-       01 00 04 72 75 6e 32 
-    // parsed:, offset 118, len 5, h: 0009: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 07 00 0c 
-    // parsed:, offset 123, len 7, h: 000a: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 130, len 19, h: 000b: utf8{"java/lang/String"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  S  t  r  i  n  g  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 
-    // parsed:, offset 149, len 6, h: 000c: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 155, len 3, h: 000d: type{dxc.junit.opcodes.anewarray.jm.T_anewarray_9}
-    // .  .  .  
-       07 00 02 
-    // parsed:, offset 158, len 25, h: 000e: utf8{"(I)[Ljava/lang/String;"}
-    // .  .  .  (  I  )  [  L  j  a  v  a  /  l  a  n  g  /  S  t  r  i  n  g  ;  
-       01 00 16 28 49 29 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 
-    // parsed:, offset 183, len 3, h: 000f: type{java.lang.Object}
-    // .  .  .  
-       07 00 03 
-    // parsed:, offset 186, len 21, h: 0010: utf8{"T_anewarray_9.java"}
-    // .  .  .  T  _  a  n  e  w  a  r  r  a  y  _  9  .  j  a  v  a  
-       01 00 12 54 5f 61 6e 65 77 61 72 72 61 79 5f 39 2e 6a 61 76 61 
-// parsed:, offset 207, len 0, h: end constant_pool
-// parsed:, offset 207, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 209, len 2, h: this_class: type{dxc.junit.opcodes.anewarray.jm.T_anewarray_9}
-// .  .  
-   00 0d 
-// parsed:, offset 211, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0f 
-// parsed:, offset 213, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 215, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 217, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 219, len:75,desc: ()V
-// parsed:, offset 219, len 0, h:  methods[0]: 
-    // parsed:, offset 219, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 221, len 2, h: name: <init>
-    // .  .  
-       00 07 
-    // parsed:, offset 223, len 2, h: descriptor: ()V
-    // .  .  
-       00 0c 
-    // parsed:, offset 225, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 227, len 0, h:  attributes[0]: 
-        // parsed:, offset 227, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 229, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 233, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 235, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 237, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 246, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 248, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 250, len 0, h: end attributes[0] 
-// parsed:, offset 250, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run2, offset 250, len:44,desc: (I)[Ljava/lang/String;
-// parsed:, offset 250, len 0, h:  methods[1]: 
-    // parsed:, offset 250, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 252, len 2, h: name: run2
-    // .  .  
-       00 08 
-    // parsed:, offset 254, len 2, h: descriptor: (I)[Ljava/lang/String;
-    // .  .  
-       00 0e 
-    // parsed:, offset 256, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 258, len 0, h:  attributes[0]: 
-        // parsed:, offset 258, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 260, len 4, h: length: 00000014
-        // .  .  .  .  
-           00 00 00 14 
-        // parsed:, offset 264, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 266, len 2, h: max_locals: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 268, len 4, h: code_length: 00000008
-        // .  .  .  .  
-           00 00 00 08 
-        // parsed:, offset 0, len 2, h: 0000: ldc #+0000007b
-        // .  .  
-           12 06 
-        // parsed:, offset 2, len 1, h: 0002: pop
-        // W  
-           57 
-        // parsed:, offset 3, len 1, h: 0003: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 4, len 3, h: 0004: anewarray type{java.lang.String}
-        // .  .  .  
-//@mod           bd 00 04 
-           bd 00 06 
-        // parsed:, offset 7, len 1, h: 0007: areturn
-        // .  
-           b0 
-        // parsed:, offset 280, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 282, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 284, len 0, h: end attributes[0] 
-// parsed:, offset 284, len 0, h: end methods[1] 
-// ========== end-ParseMember:run2, desc: (I)[Ljava/lang/String;
-// parsed:, offset 284, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 286, len 0, h:  attributes[0]: 
-    // parsed:, offset 286, len 2, h: name: SourceFile
-    // .  .  
-       00 05 
-    // parsed:, offset 288, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 292, len 2, h: source: utf8{"T_anewarray_9.java"}
-    // .  .  
-       00 10 
-// parsed:, offset 294, len 0, h: end attributes[0] 
-// parsed:, offset 294, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_9.j b/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_9.j
deleted file mode 100644
index d91f6f5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_9.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_anewarray_9.java
-.class public dxc/junit/opcodes/anewarray/jm/T_anewarray_9
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run2(I)[Ljava/lang/String;
-    .limit stack 1
-    .limit locals 2
-    
-    ldc 123
-    pop
-    
-    iload_1
-    anewarray java/lang/String
-    areturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_9.java b/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_9.java
deleted file mode 100644
index 30ab5f7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/T_anewarray_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.anewarray.jm;
-
-public class T_anewarray_9 {
-
-    public String[] run2(int idx) {
-        return new String[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/TestStubs.java b/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/TestStubs.java
deleted file mode 100644
index 73452fd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/anewarray/jm/TestStubs.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.anewarray.jm;
-
-public class TestStubs {
-    
-private class TestStub{
-    // testE4
-}
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/Runner.java b/tools/dx-tests/src/dxc/junit/opcodes/areturn/Runner.java
deleted file mode 100644
index 580812d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/Runner.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.areturn;
-
-public interface Runner {
-    public void doit();
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/RunnerGenerator.java b/tools/dx-tests/src/dxc/junit/opcodes/areturn/RunnerGenerator.java
deleted file mode 100644
index e9f34ec..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/RunnerGenerator.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.areturn;
-
-public interface RunnerGenerator {
-    public Runner run();
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/Test_areturn.java b/tools/dx-tests/src/dxc/junit/opcodes/areturn/Test_areturn.java
deleted file mode 100644
index 5485d03..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/Test_areturn.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.areturn;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.areturn.jm.T_areturn_1;
-import dxc.junit.opcodes.areturn.jm.T_areturn_12;
-import dxc.junit.opcodes.areturn.jm.T_areturn_13;
-import dxc.junit.opcodes.areturn.jm.T_areturn_2;
-import dxc.junit.opcodes.areturn.jm.T_areturn_6;
-import dxc.junit.opcodes.areturn.jm.T_areturn_7;
-import dxc.junit.opcodes.areturn.jm.T_areturn_8;
-import dxc.junit.opcodes.areturn.jm.T_areturn_9;
-
-public class Test_areturn extends DxTestCase {
-
-    /**
-     * @title  simple
-     */
-    public void testN1() {
-        T_areturn_1 t = new T_areturn_1();
-        assertEquals("hello", t.run());
-    }
-
-    /**
-     * @title  simple
-     */
-    public void testN2() {
-        T_areturn_1 t = new T_areturn_1();
-        assertEquals(t, t.run2());
-    }
-
-    /**
-     * @title  simple
-     */
-    public void testN3() {
-        T_areturn_1 t = new T_areturn_1();
-        Integer a = 12345;
-        assertEquals(a, t.run3());
-    }
-
-    /**
-     * @title test for null
-     */
-    public void testN4() {
-        T_areturn_2 t = new T_areturn_2();
-        assertNull(t.run());
-    }
-
-    /**
-     * @title  check that frames are discarded and reinstananted correctly
-     */
-    public void testN5() {
-        T_areturn_6 t = new T_areturn_6();
-        assertEquals("hello", t.run());
-    }
-
-    /**
-     * @title  check that monitor is released by areturn
-     */
-    public void testN6() {
-        assertTrue(T_areturn_7.execute());
-    }
-
-    /**
-     * @title  assignment compatibility (TChild returned as TSuper)
-     */
-    public void testN7() {
-        // @uses dxc.junit.opcodes.areturn.jm.TSuper
-        // @uses dxc.junit.opcodes.areturn.jm.TInterface
-        // @uses dxc.junit.opcodes.areturn.jm.TChild
-        T_areturn_12 t = new T_areturn_12();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @title  assignment compatibility (TChild returned as TInterface)
-     */
-    public void testN8() {
-        // @uses dxc.junit.opcodes.areturn.jm.TInterface
-        // @uses dxc.junit.opcodes.areturn.jm.TChild
-        // @uses dxc.junit.opcodes.areturn.jm.TSuper
-        T_areturn_13 t = new T_areturn_13();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @title  Method is synchronized but thread is not monitor owner
-     */
-    public void testE1() {
-        T_areturn_8 t = new T_areturn_8();
-        try {
-            assertTrue(t.run());
-            fail("expected IllegalMonitorStateException");
-        } catch (IllegalMonitorStateException imse) {
-            // expected
-        }
-    }
-
-    /**
-     * @title  Lock structural rule 1 is violated
-     */
-    public void testE2() {
-        T_areturn_9 t = new T_areturn_9();
-        try {
-            assertEquals("abc", t.run());
-            // the JVM spec says that it is optional to implement the structural
-            // lock rules, see JVM spec 8.13 and monitorenter/exit opcodes.
-            System.out.print("dvmvfe:");
-            //fail("expected IllegalMonitorStateException");
-        } catch (IllegalMonitorStateException imse) {
-            // expected
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.14
-     * @title method's return type - void
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.areturn.jm.T_areturn_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.14
-     * @title method's return type - float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.areturn.jm.T_areturn_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.areturn.jm.T_areturn_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - float
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.areturn.jm.T_areturn_10");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.areturn.jm.T_areturn_11");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.14
-     * @title assignment incompatible references
-     */
-    public void testVFE6() {
-        // @uses dxc.junit.opcodes.areturn.jm.TInterface
-        // @uses dxc.junit.opcodes.areturn.jm.TSuper
-        // @uses dxc.junit.opcodes.areturn.jm.TChild
-        try {
-            Class.forName("dxc.junit.opcodes.areturn.jm.T_areturn_14");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.14
-     * @title assignment incompatible references
-     */
-    @SuppressWarnings("cast")
-    public void testVFE7() {
-        // @uses dxc.junit.opcodes.areturn.jm.TSuper2
-        // @uses dxc.junit.opcodes.areturn.Runner
-        // @uses dxc.junit.opcodes.areturn.RunnerGenerator
-        try {
-            RunnerGenerator rg = (RunnerGenerator) Class.forName(
-                    "dxc.junit.opcodes.areturn.jm.T_areturn_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/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_1.j b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_1.j
deleted file mode 100644
index 900806d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_1.j
+++ /dev/null
@@ -1,59 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_areturn_1.java
-.class public dxc/junit/opcodes/areturn/jm/T_areturn_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()Ljava/lang/String;
-    .limit stack 1
-    .limit locals 1
-
-    ldc "hello"
-    areturn
-
-.end method
-
-.method public run2()Ljava/lang/Object;
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    areturn
-
-.end method
-
-.method public run3()Ljava/lang/Integer;
-    .limit stack 3
-    .limit locals 2
-
-    new java/lang/Integer
-    dup
-    sipush 12345
-    invokespecial java/lang/Integer/<init>(I)V
-    astore_1
-
-    aload_1
-
-    areturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_1.java b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_1.java
deleted file mode 100644
index a4a7719..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_1.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.areturn.jm;
-
-public class T_areturn_1 {
-
-    public String run() {
-        return "hello";
-    }
-    
-    public Object run2() {
-        return this;
-    }
-    
-    public Integer run3() {
-        Integer value = new Integer(12345);
-        return value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_10.j b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_10.j
deleted file mode 100644
index db962a6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_10.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_areturn_10.java
-.class public dxc/junit/opcodes/areturn/jm/T_areturn_10
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()Ljava/lang/String;
-    .limit stack 1
-    .limit locals 1
-
-;    ldc "abc"
-    fconst_0
-    areturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_10.java b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_10.java
deleted file mode 100644
index efe5c5e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_10.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.areturn.jm;
-
-public class T_areturn_10 {
-    
-    public String run() {
-        return "abc";
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_11.j b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_11.j
deleted file mode 100644
index 1a75aee..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_11.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_areturn_11.java
-.class public dxc/junit/opcodes/areturn/jm/T_areturn_11
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method private static test()Ljava/lang/String;
-    .limit stack 1
-    .limit locals 0
-
-    ldc "hello"
-    areturn
-
-.end method
-
-.method public run()Ljava/lang/String;
-    .limit stack 0
-    .limit locals 1
-
-    invokestatic dxc/junit/opcodes/areturn/jm/T_areturn_11/test()Ljava/lang/String;
-    areturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_11.java b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_11.java
deleted file mode 100644
index ea112ae..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_11.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.areturn.jm;
-
-public class T_areturn_11 {
-    
-    private static String test() {
-        return "hello";
-    }
-    
-    public String run() {
-        return test();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_12.j b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_12.j
deleted file mode 100644
index 76f51a8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_12.j
+++ /dev/null
@@ -1,50 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_areturn_12.java
-.class public dxc/junit/opcodes/areturn/jm/T_areturn_12
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method private test()Ldxc/junit/opcodes/areturn/jm/TSuper;
-    .limit stack 2
-    .limit locals 1
-
-    new dxc/junit/opcodes/areturn/jm/TChild
-    dup
-    invokespecial dxc/junit/opcodes/areturn/jm/TChild/<init>()V
-
-    areturn
-.end method
-
-
-
-.method public run()Z
-    .limit stack 1
-    .limit locals 2
-
-    aload_0
-    invokespecial dxc/junit/opcodes/areturn/jm/T_areturn_12/test()Ldxc/junit/opcodes/areturn/jm/TSuper;
-
-    instanceof dxc/junit/opcodes/areturn/jm/TChild
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_12.java b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_12.java
deleted file mode 100644
index 6aaa5f3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_12.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.areturn.jm;
-
-public class T_areturn_12 {
-    
-    private TSuper test() {
-        return new TChild();
-    }
-    
-    public boolean run() {
-        TSuper t = test();
-        return (t instanceof TChild);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_13.j b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_13.j
deleted file mode 100644
index c0a8156..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_13.j
+++ /dev/null
@@ -1,52 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_areturn_13.java
-.class public dxc/junit/opcodes/areturn/jm/T_areturn_13
-.super java/lang/Object
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method private test()Ldxc/junit/opcodes/areturn/jm/TInterface;
-    .limit stack 2
-    .limit locals 1
-
-    new dxc/junit/opcodes/areturn/jm/TChild
-    dup
-    invokespecial dxc/junit/opcodes/areturn/jm/TChild/<init>()V
-    areturn
-.end method
-
-
-
-.method public run()Z
-    .limit stack 1
-    .limit locals 2
-
-    aload_0
-    invokespecial dxc/junit/opcodes/areturn/jm/T_areturn_13/test()Ldxc/junit/opcodes/areturn/jm/TInterface;
-
-    instanceof dxc/junit/opcodes/areturn/jm/TChild
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_13.java b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_13.java
deleted file mode 100644
index e79f765..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_13.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.areturn.jm;
-
-
-public class T_areturn_13 {
-    
-    private TInterface test() {
-        return new TChild();
-    }
-    
-    public boolean run() {
-        TInterface t = test();
-        return (t instanceof TChild);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_14.j b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_14.j
deleted file mode 100644
index 221015e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_14.j
+++ /dev/null
@@ -1,55 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_areturn_14.java
-.class public dxc/junit/opcodes/areturn/jm/T_areturn_14
-.super java/lang/Object
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method private test()Ldxc/junit/opcodes/areturn/jm/TChild;
-    .limit stack 2
-    .limit locals 1
-
-    new dxc/junit/opcodes/areturn/jm/TSuper
-    dup
-    invokespecial dxc/junit/opcodes/areturn/jm/TSuper/<init>()V
-
-    areturn
-
-.end method
-
-
-
-.method public run()Z
-    .limit stack 1
-    .limit locals 2
-
-    aload_0
-    invokespecial dxc/junit/opcodes/areturn/jm/T_areturn_14/test()Ldxc/junit/opcodes/areturn/jm/TChild;
-
-    instanceof dxc/junit/opcodes/areturn/jm/TChild
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_14.java b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_14.java
deleted file mode 100644
index baa9963..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_14.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.areturn.jm;
-
-
-public class T_areturn_14 {
-    
-    private TChild test() {
-        //return new TSuper();
-        return new TChild();
-    }
-    
-    public boolean run() {
-        TChild t = test();
-        return (t instanceof TChild);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_15.j b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_15.j
deleted file mode 100644
index afa0940..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_15.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_areturn_15.java
-.class public dxc/junit/opcodes/areturn/jm/T_areturn_15
-.super java/lang/Object
-.implements dxc/junit/opcodes/areturn/RunnerGenerator
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Ldxc/junit/opcodes/areturn/Runner;
-    .limit stack 2
-
-    new dxc/junit/opcodes/areturn/jm/TSuper2
-    dup
-    invokespecial dxc/junit/opcodes/areturn/jm/TSuper2/<init>()V
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_15.java b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_15.java
deleted file mode 100644
index bec3561..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_15.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.areturn.jm;
-
-
-public class T_areturn_15 {
-    
-    private TInterface test() {
-        //return new TSuper2();
-        return new TSuper();
-    }
-    
-    public boolean run() {
-        TInterface t = test();
-        return (t instanceof TSuper);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_2.j b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_2.j
deleted file mode 100644
index 20064df..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_2.j
+++ /dev/null
@@ -1,29 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_areturn_2.java
-.class public dxc/junit/opcodes/areturn/jm/T_areturn_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Ljava/lang/Object;
-    .limit stack 2
-    aconst_null
-    areturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_2.java b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_2.java
deleted file mode 100644
index a8e0b9c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.areturn.jm;
-
-public class T_areturn_2 {
-
-    public Object run() {
-        return null;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_3.j b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_3.j
deleted file mode 100644
index d6e60f9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_3.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_areturn_3.java
-.class public dxc/junit/opcodes/areturn/jm/T_areturn_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 1
-    .limit locals 1
-
-    ldc "hello"
-    areturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_3.java b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_3.java
deleted file mode 100644
index 813fc95..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.areturn.jm;
-
-public class T_areturn_3 {
-
-    public String run() {
-        return "hello";
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_4.j b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_4.j
deleted file mode 100644
index a7d470b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_4.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_areturn_4.java
-.class public dxc/junit/opcodes/areturn/jm/T_areturn_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()F
-    .limit stack 1
-    .limit locals 1
-
-    ldc "hello"
-    areturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_4.java b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_4.java
deleted file mode 100644
index 0bc7d7c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.areturn.jm;
-
-public class T_areturn_4 {
-
-    public String run() {
-        return "hello";
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_5.j b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_5.j
deleted file mode 100644
index 753df23..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_5.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_areturn_5.java
-.class public dxc/junit/opcodes/areturn/jm/T_areturn_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()Ljava/lang/String;
-    .limit stack 1
-    .limit locals 1
-
-;    ldc "hello"
-    areturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_5.java b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_5.java
deleted file mode 100644
index 7463e46..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.areturn.jm;
-
-public class T_areturn_5 {
-
-    public String run() {
-        return "hello";
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_6.j b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_6.j
deleted file mode 100644
index 372e3e1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_6.j
+++ /dev/null
@@ -1,88 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_areturn_6.java
-.class public dxc/junit/opcodes/areturn/jm/T_areturn_6
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()Ljava/lang/String;
-    .limit locals 6
-    .limit stack 3
-    
-    ldc "a"
-    astore_1
-    ldc "b"
-    astore_2
-    ldc "c"
-    astore 3
-    
-    ldc "d"
-    
-    invokestatic dxc/junit/opcodes/areturn/jm/T_areturn_6/test()Ljava/lang/String;
-    
-    ldc "ddd"
-    if_acmpne Label1
-    
-    ldc "d"
-    if_acmpne Label0
-    
-    aload_1
-    ldc "a"
-    if_acmpne Label0
-    
-    aload_2
-    ldc "b"
-    if_acmpne Label0
-    
-    aload 3
-    ldc "c"
-    if_acmpne Label0    
-    
-    ldc "hello"
-    areturn
-    
-Label1:
-    pop
-Label0:
-    ldc "a"
-    areturn    
-    
-.end method
-
-.method private static test()Ljava/lang/String;
-    .limit stack 1
-    .limit locals 3
-
-    ldc "aaa"
-    astore_0
-
-    ldc "bbb"
-    astore_1
-
-    ldc "ccc"
-    astore_2
-
-    ldc "ddd"
-
-    areturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_6.java b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_6.java
deleted file mode 100644
index 685c106..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_6.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.areturn.jm;
-
-public class T_areturn_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/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_7.j b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_7.j
deleted file mode 100644
index c922898..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_7.j
+++ /dev/null
@@ -1,174 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_areturn_7.java
-.class public dxc/junit/opcodes/areturn/jm/T_areturn_7
-.super java/lang/Object
-.implements java/lang/Runnable
-
-.field  value Ljava/lang/Integer;
-.field  failed Z
-
-.method public <init>()V
-    .limit stack 4
-    .limit locals 1
-    
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    aload_0
-    new java/lang/Integer
-    dup
-    iconst_0
-    invokespecial java/lang/Integer/<init>(I)V
-    putfield dxc.junit.opcodes.areturn.jm.T_areturn_7.value Ljava/lang/Integer;
-
-    aload_0
-    iconst_0
-    putfield dxc.junit.opcodes.areturn.jm.T_areturn_7.failed Z
-
-    return
-
-.end method
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 2
-    
-    iconst_0
-    istore_1
-
-Label4:
-    goto Label0
-
-Label1:
-    aload_0
-    invokespecial dxc/junit/opcodes/areturn/jm/T_areturn_7/test()Ljava/lang/Integer;
-    pop
-
-    iinc 1 1
-
-Label0:
-    iload_1
-    sipush 1000
-    if_icmplt Label1
-
-    return
-.end method
-
-
-
-.method private synchronized test()Ljava/lang/Integer;
-    .limit stack 4
-    .limit locals 2
-    
-    new java/lang/Integer
-    dup
-    aload_0
-    getfield dxc.junit.opcodes.areturn.jm.T_areturn_7.value Ljava/lang/Integer;
-    invokevirtual java/lang/Integer/intValue()I
-    iconst_1
-    iadd
-    invokespecial java/lang/Integer/<init>(I)V
-    astore_1
-
-    aload_0
-    aload_1
-    putfield dxc.junit.opcodes.areturn.jm.T_areturn_7.value Ljava/lang/Integer;
-
-    invokestatic java/lang/Thread/yield()V
-
-    aload_1
-    aload_0
-    getfield dxc.junit.opcodes.areturn.jm.T_areturn_7.value Ljava/lang/Integer;
-    if_acmpeq Label0
-
-    aload_0
-    iconst_1
-    putfield dxc.junit.opcodes.areturn.jm.T_areturn_7.failed Z
-
-Label0:
-    aload_1
-    areturn
-.end method
-
-
-
-.method public static execute()Z
-    .limit stack 3
-    .limit locals 4
-
-    new dxc/junit/opcodes/areturn/jm/T_areturn_7
-    dup
-    invokespecial dxc/junit/opcodes/areturn/jm/T_areturn_7/<init>()V
-    astore_0
-
-    new java/lang/Thread
-    dup
-    aload_0
-    invokespecial java/lang/Thread/<init>(Ljava/lang/Runnable;)V
-    astore_1
-
-    new java/lang/Thread
-    dup
-    aload_0
-    invokespecial java/lang/Thread/<init>(Ljava/lang/Runnable;)V
-    astore_2
-
-    aload_1
-    invokevirtual java/lang/Thread/start()V
-
-    aload_2
-    invokevirtual java/lang/Thread/start()V
-
-Label12:
-    ldc2_w 5000
-    invokestatic java/lang/Thread/sleep(J)V
-
-Label13:
-    goto Label0
-
-Label14:
-    astore_3
-
-Label10:
-    iconst_0
-    ireturn
-
-Label0:
-    aload_0
-    getfield dxc.junit.opcodes.areturn.jm.T_areturn_7.value Ljava/lang/Integer;
-    invokevirtual java/lang/Integer/intValue()I
-    sipush 2000
-    if_icmpeq Label1
-
-    iconst_0
-    ireturn
-
-Label1:
-    aload_0
-    getfield dxc.junit.opcodes.areturn.jm.T_areturn_7.failed Z
-    ifeq Label2
-    iconst_0
-    goto Label3
-
-Label2:
-    iconst_1
-
-Label3:
-    ireturn
-
-.catch java/lang/InterruptedException from Label12 to Label13 using Label14
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_7.java b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_7.java
deleted file mode 100644
index f58eb51..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_7.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.areturn.jm;
-
-import dxc.junit.opcodes.areturn.jm.T_areturn_7;
-
-public class T_areturn_7 implements Runnable {
-    public final static int CNT = 1000;
-    Integer value = new Integer(0);
-    boolean failed = false;
-    
-    public void run() {
-        for(int i = 0; i < CNT; i++) {
-            test();
-        }
-    }
-    
-    private synchronized Integer test()  {
-        Integer c = new Integer(value.intValue() + 1);
-        
-        value = c;
-        Thread.yield();
-        if(c != value)
-            failed = true;
-        return c;
-    }
-    
-    public static boolean execute() {
-        T_areturn_7 test = new T_areturn_7();
-        Thread t1 = new Thread(test);
-        Thread t2 = new Thread(test);
-        
-        t1.start();
-        t2.start();
-        
-        try
-        {
-            Thread.sleep(5000);
-        }
-        catch(InterruptedException ie) {
-            return false;
-        }
-        
-        if(test.value.intValue() != CNT * 2)
-            return false;
-        return !test.failed;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_8.j b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_8.j
deleted file mode 100644
index 953e5eb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_8.j
+++ /dev/null
@@ -1,49 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_areturn_8.java
-.class public dxc/junit/opcodes/areturn/jm/T_areturn_8
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method private synchronized test()Ljava/lang/String;
-    .limit stack 1
-    .limit locals 1
- 
-    aload_0
-    monitorexit
-    ldc "abc"
-    areturn
-
-.end method
-
-.method public run()Z
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokespecial dxc/junit/opcodes/areturn/jm/T_areturn_8/test()Ljava/lang/String;
-    pop
-
-    iconst_1
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_8.java b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_8.java
deleted file mode 100644
index f12ed82..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_8.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.areturn.jm;
-
-public class T_areturn_8 {
-    
-    private synchronized String test() {
-        return "abc";
-    }
-    
-    public boolean run() {
-        test();
-        return true;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_9.j b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_9.j
deleted file mode 100644
index 75b7309..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_9.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_areturn_9.java
-.class public dxc/junit/opcodes/areturn/jm/T_areturn_9
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()Ljava/lang/String;
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    monitorenter
-    ldc "abc"
-    areturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_9.java b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_9.java
deleted file mode 100644
index df35df5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/T_areturn_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.areturn.jm;
-
-public class T_areturn_9 {
-    
-    public String run() {
-        return "abc";
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/TetsStubs.java b/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/TetsStubs.java
deleted file mode 100644
index 7b46a68..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/areturn/jm/TetsStubs.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.areturn.jm;
-
-
-interface TInterface{
-    
-}
-
-class TSuper implements TInterface {
-    
-}
-
-class TChild extends TSuper {
-    
-}
-
-class TSuper2 {
-    
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/arraylength/Test_arraylength.java b/tools/dx-tests/src/dxc/junit/opcodes/arraylength/Test_arraylength.java
deleted file mode 100644
index f5dfd91..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/arraylength/Test_arraylength.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.arraylength;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.arraylength.jm.T_arraylength_1;
-
-public class Test_arraylength extends DxTestCase {
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_arraylength_1 t = new T_arraylength_1();
-        String[] a = new String[5];
-        assertEquals(5, t.run(a));
-    }
-
-    /**
-     * @title NullPointerException expected
-     */
-    public void testNPE1() {
-        T_arraylength_1 t = new T_arraylength_1();
-        try {
-            t.run(null);
-            fail("NPE expected");
-        } catch (NullPointerException npe) {
-            // expected
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - Object
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.arraylength.jm.T_arraylength_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.arraylength.jm.T_arraylength_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/arraylength/jm/T_arraylength_1.j b/tools/dx-tests/src/dxc/junit/opcodes/arraylength/jm/T_arraylength_1.j
deleted file mode 100644
index 75cd6f5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/arraylength/jm/T_arraylength_1.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_arraylength_1.java
-.class public dxc/junit/opcodes/arraylength/jm/T_arraylength_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([Ljava/lang/Object;)I
-    .limit stack 1
-    .limit locals 2
-    aload_1
-    arraylength
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/arraylength/jm/T_arraylength_1.java b/tools/dx-tests/src/dxc/junit/opcodes/arraylength/jm/T_arraylength_1.java
deleted file mode 100644
index 7b20468..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/arraylength/jm/T_arraylength_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.arraylength.jm;
-
-public class T_arraylength_1 {
-
-    public int run(Object[] arr) {
-        return arr.length;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/arraylength/jm/T_arraylength_2.j b/tools/dx-tests/src/dxc/junit/opcodes/arraylength/jm/T_arraylength_2.j
deleted file mode 100644
index 469b364..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/arraylength/jm/T_arraylength_2.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.class public dxc/junit/opcodes/arraylength/jm/T_arraylength_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 1
-    .limit locals 2
-
-    aload_0            ; load "this" pointer
-    arraylength
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/arraylength/jm/T_arraylength_2.java b/tools/dx-tests/src/dxc/junit/opcodes/arraylength/jm/T_arraylength_2.java
deleted file mode 100644
index 4ec2183..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/arraylength/jm/T_arraylength_2.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.arraylength.jm;
-
-public class T_arraylength_2 {
-
-    public int run() {
-        byte[] ba = null;
-        return ba.length;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/arraylength/jm/T_arraylength_3.j b/tools/dx-tests/src/dxc/junit/opcodes/arraylength/jm/T_arraylength_3.j
deleted file mode 100644
index 30e8cd0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/arraylength/jm/T_arraylength_3.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.class public dxc/junit/opcodes/arraylength/jm/T_arraylength_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 1
-    .limit locals 2
-
-    iconst_1
-    arraylength
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/arraylength/jm/T_arraylength_3.java b/tools/dx-tests/src/dxc/junit/opcodes/arraylength/jm/T_arraylength_3.java
deleted file mode 100644
index 6723a27..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/arraylength/jm/T_arraylength_3.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.arraylength.jm;
-
-public class T_arraylength_3 {
-
-    public int run() {
-        byte[] ba = null;
-        return ba.length;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore/Test_astore.java b/tools/dx-tests/src/dxc/junit/opcodes/astore/Test_astore.java
deleted file mode 100644
index 6e99ace..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore/Test_astore.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.astore.jm.T_astore_1;
-import dxc.junit.opcodes.astore.jm.T_astore_1_w;
-import dxc.junit.opcodes.astore.jm.T_astore_5;
-import dxc.junit.opcodes.astore.jm.T_astore_5_w;
-
-public class Test_astore extends DxTestCase {
-
-    /*
-     * NORMAL astore VERSION
-     */
-
-    /**
-     * @title  astore 0
-     */
-    public void testN1() {
-        assertEquals("hello", T_astore_1.run());
-    }
-
-    /**
-     * @title  astore 255
-     */
-    public void testN2() {
-        assertEquals("world", T_astore_5.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.astore.jm.T_astore_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.astore.jm.T_astore_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.astore.jm.T_astore_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /*
-     * WIDE astore VERSION
-     */
-
-    /**
-     * @title  astore_w 0
-     */
-    public void testN3() {
-        assertEquals("hello", T_astore_1_w.run());
-    }
-
-    /**
-     * @title  astore 257
-     */
-    public void testN4() {
-        assertEquals("world", T_astore_5_w.run());
-    }
-
-    /**
-     * @constraint 4.8.1.25
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.astore.jm.T_astore_2_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.astore.jm.T_astore_3_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - int
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.astore.jm.T_astore_4_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_1.j b/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_1.j
deleted file mode 100644
index 8791368..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_1.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_astore_1.java
-.class public dxc/junit/opcodes/astore/jm/T_astore_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()Ljava/lang/String;
-    .limit stack 2
-    .limit locals 1
-    
-    ldc "hello"
-    astore 0
-    ldc "hi"
-    aload 0
-    areturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_1.java b/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_1.java
deleted file mode 100644
index cb6c942..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_1.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore.jm;
-
-public class T_astore_1 {
-
-    public static String run() {
-        String a = new String("hello");
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_1_w.j b/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_1_w.j
deleted file mode 100644
index fb6432e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_1_w.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_astore_1_w.java
-.class public dxc/junit/opcodes/astore/jm/T_astore_1_w
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()Ljava/lang/String;
-    .limit stack 4
-    .limit locals 2
-    
-    ldc "hello"
-    astore_w 0
-    ldc "hi"
-    aload 0
-    areturn
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_1_w.java b/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_1_w.java
deleted file mode 100644
index ee352e6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_1_w.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore.jm;
-
-public class T_astore_1_w {
-    
-    public static String run() {
-        String a = new String("hello");
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_2.j b/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_2.j
deleted file mode 100644
index 82d9f21..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_astore_2.java
-.class public dxc/junit/opcodes/astore/jm/T_astore_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 0
-
-    astore 0
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_2.java b/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_2.java
deleted file mode 100644
index d6a8eff..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore.jm;
-
-public class T_astore_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_2_w.j b/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_2_w.j
deleted file mode 100644
index 935d039..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_2_w.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_astore_2_w.java
-.class public dxc/junit/opcodes/astore/jm/T_astore_2_w
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 0
-
-    astore_w 0
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_2_w.java b/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_2_w.java
deleted file mode 100644
index 13ddd3b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_2_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore.jm;
-
-public class T_astore_2_w {
-    
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_3.j b/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_3.j
deleted file mode 100644
index 8c74ad3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_3.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_astore_3.java
-.class public dxc/junit/opcodes/astore/jm/T_astore_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 2
-
-    fconst_1
-    astore 0
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_3.java b/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_3.java
deleted file mode 100644
index a8887d0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore.jm;
-
-public class T_astore_3 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_3_w.j b/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_3_w.j
deleted file mode 100644
index 7988f8a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_3_w.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_astore_3_w.java
-.class public dxc/junit/opcodes/astore/jm/T_astore_3_w
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 3
-    .limit locals 2
-
-    fconst_1
-    astore_w 0
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_3_w.java b/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_3_w.java
deleted file mode 100644
index c4c8d3b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_3_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore.jm;
-
-public class T_astore_3_w {
-    
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_4.j b/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_4.j
deleted file mode 100644
index 5a3031a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_4.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_astore_4.java
-.class public dxc/junit/opcodes/astore/jm/T_astore_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 2
-
-    lconst_1
-    astore 0
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_4.java b/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_4.java
deleted file mode 100644
index 3a20228..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore.jm;
-
-public class T_astore_4 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_4_w.j b/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_4_w.j
deleted file mode 100644
index 29e8922..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_4_w.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_astore_4_w.java
-.class public dxc/junit/opcodes/astore/jm/T_astore_4_w
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 1
-
-    iconst_1
-    astore 0
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_4_w.java b/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_4_w.java
deleted file mode 100644
index 078beb6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_4_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore.jm;
-
-public class T_astore_4_w {
-    
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_5.j b/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_5.j
deleted file mode 100644
index 1d7c782..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_5.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_astore_5.java
-.class public dxc/junit/opcodes/astore/jm/T_astore_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()Ljava/lang/String;
-    .limit stack 2
-    .limit locals 300
-    
-    ldc "world"
-    astore 255
-    ldc "hi"
-    aload 255
-    areturn
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_5.java b/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_5.java
deleted file mode 100644
index c950130..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore.jm;
-
-public class T_astore_5 {
-
-    public static String run() {
-        return "world";
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_5_w.j b/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_5_w.j
deleted file mode 100644
index 690924f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_5_w.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_astore_5_w.java
-.class public dxc/junit/opcodes/astore/jm/T_astore_5_w
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()Ljava/lang/String;
-    .limit stack 2
-    .limit locals 300
-    
-    ldc "world"
-    astore_w 257
-    ldc "hi"
-    aload 257
-    areturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_5_w.java b/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_5_w.java
deleted file mode 100644
index c74bcd9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_5_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore.jm;
-
-public class T_astore_5_w {
-    
-    public static String run() {
-        return "world";
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_6.java b/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_6.java
deleted file mode 100644
index 6518de1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore/jm/T_astore_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore.jm;
-
-public class T_astore_6 {
-
-    public void run() {
-        // TODO
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_0/Test_astore_0.java b/tools/dx-tests/src/dxc/junit/opcodes/astore_0/Test_astore_0.java
deleted file mode 100644
index 179ae7b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_0/Test_astore_0.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore_0;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.astore_0.jm.T_astore_0_1;
-import dxc.junit.opcodes.astore_0.jm.T_astore_0_5;
-
-public class Test_astore_0 extends DxTestCase {
-
-    /**
-     * @title value is stored
-     */
-    public void testN1() {
-        assertEquals("hello", T_astore_0_1.run());
-    }
-
-    /**
-     * @title equality of astore_<n> and astore <n>
-     */
-    public void testN2() {
-        assertTrue(T_astore_0_5.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.astore_0.jm.T_astore_0_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.astore_0.jm.T_astore_0_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.astore_0.jm.T_astore_0_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_1.j b/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_1.j
deleted file mode 100644
index 50c2732..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_1.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_astore_0_1.java
-.class public dxc/junit/opcodes/astore_0/jm/T_astore_0_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()Ljava/lang/String;
-    .limit stack 2
-    .limit locals 1
-    
-    ldc "hello"
-    astore_0
-    ldc "hi"
-    aload_0
-    areturn
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_1.java b/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_1.java
deleted file mode 100644
index 022182d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_1.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore_0.jm;
-
-public class T_astore_0_1 {
-
-    public static String run() {
-        String a = new String("hello");
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_2.j b/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_2.j
deleted file mode 100644
index 1130fc4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_astore_0_2.java
-.class public dxc/junit/opcodes/astore_0/jm/T_astore_0_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 0
-
-    astore_0
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_2.java b/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_2.java
deleted file mode 100644
index 10af6e6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore_0.jm;
-
-public class T_astore_0_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_3.j b/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_3.j
deleted file mode 100644
index 737a6ab..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_3.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_astore_0_3.java
-.class public dxc/junit/opcodes/astore_0/jm/T_astore_0_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 1
-
-    fconst_1
-    astore_0
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_3.java b/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_3.java
deleted file mode 100644
index 0e4e1cb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore_0.jm;
-
-public class T_astore_0_3 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_4.j b/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_4.j
deleted file mode 100644
index c8e268b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_4.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_astore_0_4.java
-.class public dxc/junit/opcodes/astore_0/jm/T_astore_0_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 1
-
-    lconst_1
-    astore_0
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_4.java b/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_4.java
deleted file mode 100644
index 4b54fd7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore_0.jm;
-
-public class T_astore_0_4 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_5.j b/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_5.j
deleted file mode 100644
index f7a1082..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_5.j
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_astore_0_5.java
-.class public dxc/junit/opcodes/astore_0/jm/T_astore_0_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()Z
-    .limit stack 4
-    .limit locals 2
-
-    ldc "hello"
-    astore_0
-    aload_0
-    
-    ldc "hello"
-    astore 0
-    aload_0
-    
-    if_acmpne Label0
-    iconst_1
-    ireturn
-
-Label0:
-    iconst_0
-    ireturn
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_5.java b/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_5.java
deleted file mode 100644
index 90f895e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore_0.jm;
-
-public class T_astore_0_5 {
-
-    public static boolean run() {
-        String a = new String("hello");
-        return a == a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_6.java b/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_6.java
deleted file mode 100644
index 9b32ca6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_0/jm/T_astore_0_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore_0.jm;
-
-public class T_astore_0_6 {
-
-    public void run() {
-        // TODO
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_1/Test_astore_1.java b/tools/dx-tests/src/dxc/junit/opcodes/astore_1/Test_astore_1.java
deleted file mode 100644
index 48c46b3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_1/Test_astore_1.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore_1;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.astore_1.jm.T_astore_1_1;
-import dxc.junit.opcodes.astore_1.jm.T_astore_1_5;
-
-public class Test_astore_1 extends DxTestCase {
-
-    /**
-     * @title value is stored
-     */
-    public void testN1() {
-        assertEquals("hello", T_astore_1_1.run());
-    }
-
-    /**
-     * @title equality of astore_<n> and astore <n>
-     */
-    public void testN2() {
-        assertTrue(T_astore_1_5.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.astore_1.jm.T_astore_1_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.astore_1.jm.T_astore_1_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.astore_1.jm.T_astore_1_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_1.j b/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_1.j
deleted file mode 100644
index 0e3adb6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_1.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_astore_1_1.java
-.class public dxc/junit/opcodes/astore_1/jm/T_astore_1_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()Ljava/lang/String;
-    .limit stack 2
-    .limit locals 2
-    
-    ldc "hello"
-    astore_1
-    ldc "hi"
-    aload_1
-    areturn
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_1.java b/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_1.java
deleted file mode 100644
index 6ce3fcc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_1.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore_1.jm;
-
-public class T_astore_1_1 {
-
-    public static String run() {
-        String a = new String("hello");
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_2.j b/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_2.j
deleted file mode 100644
index 91110d9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_astore_1_2.java
-.class public dxc/junit/opcodes/astore_1/jm/T_astore_1_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 0
-
-    astore_1
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_2.java b/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_2.java
deleted file mode 100644
index 138f5cb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore_1.jm;
-
-public class T_astore_1_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_3.j b/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_3.j
deleted file mode 100644
index 2f86fe7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_3.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_astore_1_3.java
-.class public dxc/junit/opcodes/astore_1/jm/T_astore_1_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 2
-
-    fconst_1
-    astore_1
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_3.java b/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_3.java
deleted file mode 100644
index 73e0f14..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore_1.jm;
-
-public class T_astore_1_3 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_4.j b/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_4.j
deleted file mode 100644
index 6581c7c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_4.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_astore_1_4.java
-.class public dxc/junit/opcodes/astore_1/jm/T_astore_1_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 2
-
-    lconst_1
-    astore_1
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_4.java b/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_4.java
deleted file mode 100644
index 8f831cc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore_1.jm;
-
-public class T_astore_1_4 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_5.j b/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_5.j
deleted file mode 100644
index 4189fb3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_5.j
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_astore_1_5.java
-.class public dxc/junit/opcodes/astore_1/jm/T_astore_1_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()Z
-    .limit stack 4
-    .limit locals 2
-
-    ldc "hello"
-    astore_1
-    aload_1
-
-    ldc "hello"
-    astore 1
-    aload 1
-    
-    if_acmpne Label0
-    iconst_1
-    ireturn
-
-Label0:
-    iconst_0
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_5.java b/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_5.java
deleted file mode 100644
index a45382f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore_1.jm;
-
-public class T_astore_1_5 {
-
-    public static boolean run() {
-        String a = new String("hello");
-        return a == a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_6.java b/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_6.java
deleted file mode 100644
index d0e3916..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_1/jm/T_astore_1_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore_1.jm;
-
-public class T_astore_1_6 {
-
-    public void run() {
-        // TODO
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_2/Test_astore_2.java b/tools/dx-tests/src/dxc/junit/opcodes/astore_2/Test_astore_2.java
deleted file mode 100644
index 4d05fd2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_2/Test_astore_2.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore_2;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.astore_2.jm.T_astore_2_1;
-import dxc.junit.opcodes.astore_2.jm.T_astore_2_5;
-
-public class Test_astore_2 extends DxTestCase {
-
-    /**
-     * @title value is stored
-     */
-    public void testN1() {
-        assertEquals("hello", T_astore_2_1.run());
-    }
-
-    /**
-     * @title equality of astore_<n> and astore <n>
-     */
-    public void testN2() {
-        assertTrue(T_astore_2_5.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.astore_2.jm.T_astore_2_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.astore_2.jm.T_astore_2_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.astore_2.jm.T_astore_2_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_1.j b/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_1.j
deleted file mode 100644
index a974ce1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_1.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_astore_2_1.java
-.class public dxc/junit/opcodes/astore_2/jm/T_astore_2_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()Ljava/lang/String;
-    .limit stack 2
-    .limit locals 3
-    
-    ldc "hello"
-    astore_2
-    ldc "hi"
-    aload_2
-    areturn
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_1.java b/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_1.java
deleted file mode 100644
index e581790..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_1.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore_2.jm;
-
-public class T_astore_2_1 {
-
-    public static String run() {
-        String a = new String("hello");
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_2.j b/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_2.j
deleted file mode 100644
index 750b538..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_astore_2_2.java
-.class public dxc/junit/opcodes/astore_2/jm/T_astore_2_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 0
-
-    astore_2
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_2.java b/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_2.java
deleted file mode 100644
index ee9ffbd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore_2.jm;
-
-public class T_astore_2_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_3.j b/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_3.j
deleted file mode 100644
index 135abe7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_3.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_astore_2_3.java
-.class public dxc/junit/opcodes/astore_2/jm/T_astore_2_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 3
-
-    fconst_2
-    astore_2
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_3.java b/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_3.java
deleted file mode 100644
index 3c70ad7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore_2.jm;
-
-public class T_astore_2_3 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_4.j b/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_4.j
deleted file mode 100644
index 4708e55..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_4.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_astore_2_4.java
-.class public dxc/junit/opcodes/astore_2/jm/T_astore_2_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 3
-
-    lconst_1
-    astore_2
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_4.java b/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_4.java
deleted file mode 100644
index 46e882d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore_2.jm;
-
-public class T_astore_2_4 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_5.j b/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_5.j
deleted file mode 100644
index f7edded..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_5.j
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_astore_2_5.java
-.class public dxc/junit/opcodes/astore_2/jm/T_astore_2_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()Z
-    .limit stack 4
-    .limit locals 3
-
-    ldc "hello"
-    astore_2
-    aload_2
-
-    ldc "hello"
-    astore 2
-    aload_2
-    
-    if_acmpne Label0
-    iconst_1
-    ireturn
-
-Label0:
-    iconst_0
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_5.java b/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_5.java
deleted file mode 100644
index 1b31c7d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore_2.jm;
-
-public class T_astore_2_5 {
-
-    public static boolean run() {
-        String a = new String("hello");
-        return a == a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_6.java b/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_6.java
deleted file mode 100644
index f610892..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_2/jm/T_astore_2_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore_2.jm;
-
-public class T_astore_2_6 {
-
-    public void run() {
-        // TODO
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_3/Test_astore_3.java b/tools/dx-tests/src/dxc/junit/opcodes/astore_3/Test_astore_3.java
deleted file mode 100644
index f8ca21f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_3/Test_astore_3.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore_3;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.astore_3.jm.T_astore_3_1;
-import dxc.junit.opcodes.astore_3.jm.T_astore_3_5;
-
-public class Test_astore_3 extends DxTestCase {
-
-    /**
-     * @title value is stored
-     */
-    public void testN1() {
-        assertEquals("hello", T_astore_3_1.run());
-    }
-
-    /**
-     * @title equality of astore_<n> and astore <n>
-     */
-    public void testN2() {
-        assertTrue(T_astore_3_5.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.astore_3.jm.T_astore_3_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.astore_3.jm.T_astore_3_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.astore_3.jm.T_astore_3_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_1.j b/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_1.j
deleted file mode 100644
index 12cbc00..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_1.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_astore_3_1.java
-.class public dxc/junit/opcodes/astore_3/jm/T_astore_3_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()Ljava/lang/String;
-    .limit stack 2
-    .limit locals 4
-    
-    ldc "hello"
-    astore_3
-    ldc "hi"
-    aload_3
-    areturn
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_1.java b/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_1.java
deleted file mode 100644
index 5a118f5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_1.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore_3.jm;
-
-public class T_astore_3_1 {
-
-    public static String run() {
-        String a = new String("hello");
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_2.j b/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_2.j
deleted file mode 100644
index a9c6268..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_astore_3_2.java
-.class public dxc/junit/opcodes/astore_3/jm/T_astore_3_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 0
-
-    astore_3
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_2.java b/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_2.java
deleted file mode 100644
index d11fc80..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore_3.jm;
-
-public class T_astore_3_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_3.j b/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_3.j
deleted file mode 100644
index 52de374..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_3.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_astore_3_3.java
-.class public dxc/junit/opcodes/astore_3/jm/T_astore_3_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 4
-
-    fconst_2
-    astore_3
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_3.java b/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_3.java
deleted file mode 100644
index b2aef96..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore_3.jm;
-
-public class T_astore_3_3 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_4.j b/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_4.j
deleted file mode 100644
index c6623fd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_4.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_astore_3_4.java
-.class public dxc/junit/opcodes/astore_3/jm/T_astore_3_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 4
-
-    lconst_1
-    astore_3
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_4.java b/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_4.java
deleted file mode 100644
index ae42784..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore_3.jm;
-
-public class T_astore_3_4 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_5.j b/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_5.j
deleted file mode 100644
index c04ef0b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_5.j
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_astore_3_5.java
-.class public dxc/junit/opcodes/astore_3/jm/T_astore_3_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()Z
-    .limit stack 4
-    .limit locals 4
-
-    ldc "hello"
-    astore_3
-    aload_3
-
-    ldc "hello"
-    astore 3
-    aload_3
-    
-    if_acmpne Label0
-    iconst_1
-    ireturn
-
-Label0:
-    iconst_0
-    ireturn
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_5.java b/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_5.java
deleted file mode 100644
index c94d01a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore_3.jm;
-
-public class T_astore_3_5 {
-
-    public static boolean run() {
-        String a = new String("hello");
-        return a == a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_6.java b/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_6.java
deleted file mode 100644
index 3250a5f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/astore_3/jm/T_astore_3_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.astore_3.jm;
-
-public class T_astore_3_6 {
-
-    public void run() {
-        // TODO
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/athrow/Test_athrow.java b/tools/dx-tests/src/dxc/junit/opcodes/athrow/Test_athrow.java
deleted file mode 100644
index c8829e3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/athrow/Test_athrow.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.athrow;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.athrow.jm.T_athrow_1;
-import dxc.junit.opcodes.athrow.jm.T_athrow_11;
-import dxc.junit.opcodes.athrow.jm.T_athrow_12;
-import dxc.junit.opcodes.athrow.jm.T_athrow_2;
-import dxc.junit.opcodes.athrow.jm.T_athrow_4;
-import dxc.junit.opcodes.athrow.jm.T_athrow_5;
-import dxc.junit.opcodes.athrow.jm.T_athrow_8;
-
-public class Test_athrow extends DxTestCase {
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_athrow_1 t = new T_athrow_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_athrow_2 t = new T_athrow_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_athrow_8 t = new T_athrow_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_athrow_12 t = new T_athrow_12();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @title  NullPointerException If objectref is null, athrow throws
-     * a NullPointerException instead of objectref
-     */
-    public void testE1() {
-        T_athrow_4 t = new T_athrow_4();
-        try {
-            t.run();
-            fail("expected NullPointerException");
-        } catch (NullPointerException npe) {
-            // expected
-        }
-    }
-
-    /**
-     * @title  IllegalMonitorStateException expected
-     */
-    public void testE2() {
-        T_athrow_5 t = new T_athrow_5();
-        try {
-            t.run();
-            fail("expected IllegalMonitorStateException");
-        } catch (IllegalMonitorStateException imse) {
-            // expected
-        }
-    }
-
-    /**
-     * @title IllegalMonitorStateException if structural lock rule violated -
-     */
-    public void testE3() {
-        T_athrow_11 t = new T_athrow_11();
-        try {
-            t.run();
-            fail("expected IllegalMonitorStateException");
-        } catch (IllegalMonitorStateException imse) {
-            // expected
-        } catch (NullPointerException npe) {
-            // the JVM spec says that it is optional to implement the structural
-            // lock rules, see JVM spec 8.13 and monitorenter/exit opcodes.
-            System.out.print("dvmvfe:");
-            //fail ("expected IllegalMonitorStateException, but got NPE");
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.19
-     * @title constant pool index
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.athrow.jm.T_athrow_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.athrow.jm.T_athrow_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - float
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.athrow.jm.T_athrow_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1 
-     * @title type of argument - String
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.athrow.jm.T_athrow_10");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.19 
-     * @title Throwing of the objectref on the class which is not
-     *          the class Throwable or a subclass of Throwable.
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.athrow.jm.T_athrow_9");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_1.j b/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_1.j
deleted file mode 100644
index 6c0c1a8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_1.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_athrow_1.java
-.class public dxc/junit/opcodes/athrow/jm/T_athrow_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    .limit stack 2
-    .limit locals 1
-
-    new java/lang/RuntimeException
-    dup
-    invokespecial java/lang/RuntimeException/<init>()V
-    athrow
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_1.java b/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_1.java
deleted file mode 100644
index 657ed24..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.athrow.jm;
-
-public class T_athrow_1 {
-
-    public void run() {
-        throw new RuntimeException();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_10.j b/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_10.j
deleted file mode 100644
index 96562a9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_10.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_athrow_10.java
-.class public dxc/junit/opcodes/athrow/jm/T_athrow_10
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 1
-
-    new    java/lang/String
-    dup
-    invokespecial java/lang/String/<init>()V
-    athrow
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_10.java b/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_10.java
deleted file mode 100644
index e9aceca..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_10.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.athrow.jm;
-
-public class T_athrow_10 {
-    
-    public void run() {
-        throw new RuntimeException();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_11.j b/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_11.j
deleted file mode 100644
index 37429eb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_11.j
+++ /dev/null
@@ -1,50 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_athrow_11.java
-.class public dxc/junit/opcodes/athrow/jm/T_athrow_11
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method private test()V
-    .limit stack 2
-    .limit locals 1
-
-    aload_0
-    monitorenter
-
-    new java/lang/NullPointerException
-    dup
-    invokespecial java/lang/NullPointerException/<init>()V
-
-    athrow
-
-.end method
-
-
-.method public run()V
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokespecial dxc/junit/opcodes/athrow/jm/T_athrow_11/test()V
-
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_11.java b/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_11.java
deleted file mode 100644
index 43a0f0a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_11.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.athrow.jm;
-
-public class T_athrow_11 {
-
-    private void test() {
-        throw new NullPointerException();
-    }
-    
-    public void run() {
-        test();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_12.j b/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_12.j
deleted file mode 100644
index fc0ba94..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_12.j
+++ /dev/null
@@ -1,49 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_athrow_12.java
-.class public dxc/junit/opcodes/athrow/jm/T_athrow_12
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()Z
-    .limit stack 2
-    .limit locals 2
-
-Label0:
-    new java/lang/RuntimeException
-    dup
-    invokespecial java/lang/RuntimeException/<init>()V
-    athrow
-
-Label5:
-    astore_1
-Label2:
-    iconst_1
-    ireturn
-
-Label3:
-    astore_1
-    iconst_0
-    ireturn
-
-.catch java/lang/RuntimeException from Label0 to Label5 using Label5
-.catch java/lang/RuntimeException from Label0 to Label2 using Label3
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_12.java b/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_12.java
deleted file mode 100644
index b7aca69..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_12.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.athrow.jm;
-
-public class T_athrow_12 {
-
-    public boolean run() {
-        try{
-            try {
-                throw new RuntimeException();
-            }catch(RuntimeException e1) {
-                return true;
-            }
-        } catch(RuntimeException e2) {
-        }
-        return false;
-    }
-    
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_2.j b/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_2.j
deleted file mode 100644
index 7df7277..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_2.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_athrow_2.java
-.class public dxc/junit/opcodes/athrow/jm/T_athrow_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .throws java/lang/Throwable
-    .limit stack 2
-    .limit locals 1
-
-    new java/lang/Throwable
-    dup
-    invokespecial java/lang/Throwable/<init>()V
-    athrow
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_2.java b/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_2.java
deleted file mode 100644
index 13be1ee..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.athrow.jm;
-
-public class T_athrow_2 {
-
-    public void run() throws Throwable {
-        throw new Throwable();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_3.cfh b/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_3.cfh
deleted file mode 100644
index d95df9e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_3.cfh
+++ /dev/null
@@ -1,194 +0,0 @@
-//@class:dxc/junit/opcodes/athrow/jm/T_athrow_3
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0010
-// .  .  
-   00 10 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0f 00 07 
-    // parsed:, offset 15, len 5, h: 0002: method{java.lang.RuntimeException.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 07 
-    // parsed:, offset 20, len 19, h: 0003: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 39, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 52, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 61, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 67, len 5, h: 0007: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0c 
-    // parsed:, offset 72, len 7, h: 0008: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 79, len 18, h: 0009: utf8{"T_athrow_3.java"}
-    // .  .  .  T  _  a  t  h  r  o  w  _  3  .  j  a  v  a  
-       01 00 0f 54 5f 61 74 68 72 6f 77 5f 33 2e 6a 61 76 61 
-    // parsed:, offset 97, len 41, h: 000a: utf8{"dxc/junit/opcodes/athrow/jm/T_athrow_3"}
-    // .  .  &  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  a  t  h  r  o  w  /  j  m  /  T  _  a  t  h  r  o  w  _  3  
-       01 00 26 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 61 74 68 72 6f 77 2f 6a 6d 2f 54 5f 61 74 68 72 6f 77 5f 33 
-    // parsed:, offset 138, len 29, h: 000b: utf8{"java/lang/RuntimeException"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  R  u  n  t  i  m  e  E  x  c  e  p  t  i  o  n  
-       01 00 1a 6a 61 76 61 2f 6c 61 6e 67 2f 52 75 6e 74 69 6d 65 45 78 63 65 70 74 69 6f 6e 
-    // parsed:, offset 167, len 6, h: 000c: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 173, len 3, h: 000d: type{java.lang.RuntimeException}
-    // .  .  .  
-       07 00 0b 
-    // parsed:, offset 176, len 3, h: 000e: type{dxc.junit.opcodes.athrow.jm.T_athrow_3}
-    // .  .  .  
-       07 00 0a 
-    // parsed:, offset 179, len 3, h: 000f: type{java.lang.Object}
-    // .  .  .  
-       07 00 03 
-// parsed:, offset 182, len 0, h: end constant_pool
-// parsed:, offset 182, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 184, len 2, h: this_class: type{dxc.junit.opcodes.athrow.jm.T_athrow_3}
-// .  .  
-   00 0e 
-// parsed:, offset 186, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0f 
-// parsed:, offset 188, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 190, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 192, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 194, len:75,desc: ()V
-// parsed:, offset 194, len 0, h:  methods[0]: 
-    // parsed:, offset 194, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 196, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 198, len 2, h: descriptor: ()V
-    // .  .  
-       00 0c 
-    // parsed:, offset 200, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 202, len 0, h:  attributes[0]: 
-        // parsed:, offset 202, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 204, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 208, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 210, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 212, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 221, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 223, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 225, len 0, h: end attributes[0] 
-// parsed:, offset 225, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 225, len:44,desc: ()V
-// parsed:, offset 225, len 0, h:  methods[1]: 
-    // parsed:, offset 225, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 227, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 229, len 2, h: descriptor: ()V
-    // .  .  
-       00 0c 
-    // parsed:, offset 231, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 233, len 0, h:  attributes[0]: 
-        // parsed:, offset 233, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 235, len 4, h: length: 00000014
-        // .  .  .  .  
-           00 00 00 14 
-        // parsed:, offset 239, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 241, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 243, len 4, h: code_length: 00000008
-        // .  .  .  .  
-           00 00 00 08 
-        // parsed:, offset 0, len 3, h: 0000: new type{java.lang.RuntimeException}
-        // .  .  .  
-//@mod           bb 00 0d 
-           bb 01 0d           
-        // parsed:, offset 3, len 1, h: 0003: dup
-        // Y  
-           59 
-        // parsed:, offset 4, len 3, h: 0004: invokespecial method{java.lang.RuntimeException.<init>:()V}
-        // .  .  .  
-           b7 00 02 
-        // parsed:, offset 7, len 1, h: 0007: athrow
-        // .  
-           bf 
-        // parsed:, offset 255, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 257, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 259, len 0, h: end attributes[0] 
-// parsed:, offset 259, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()V
-// parsed:, offset 259, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 261, len 0, h:  attributes[0]: 
-    // parsed:, offset 261, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 263, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 267, len 2, h: source: utf8{"T_athrow_3.java"}
-    // .  .  
-       00 09 
-// parsed:, offset 269, len 0, h: end attributes[0] 
-// parsed:, offset 269, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_3.j b/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_3.j
deleted file mode 100644
index c4ea4ad..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_3.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_athrow_3.java
-.class public dxc/junit/opcodes/athrow/jm/T_athrow_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 1
-
-    new java/lang/RuntimeException
-    dup
-    invokespecial java/lang/RuntimeException/<init>()V
-    athrow
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_3.java b/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_3.java
deleted file mode 100644
index 8d985e1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.athrow.jm;
-
-public class T_athrow_3 {
-
-    public void run() {
-        throw new RuntimeException();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_4.j b/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_4.j
deleted file mode 100644
index 9f74fd7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_4.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_athrow_4.java
-.class public dxc/junit/opcodes/athrow/jm/T_athrow_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 1
-
-    aconst_null
-    athrow
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_4.java b/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_4.java
deleted file mode 100644
index a50d5cd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.athrow.jm;
-
-public class T_athrow_4 {
-
-    public void run() {
-        throw new RuntimeException();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_5.j b/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_5.j
deleted file mode 100644
index 887180b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_5.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_athrow_5.java
-.class public dxc/junit/opcodes/athrow/jm/T_athrow_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public synchronized run()V
-    .limit stack 2
-    .limit locals 1
-    
-    aload_0
-    monitorexit
-    
-    new java/lang/NullPointerException
-    dup
-    invokespecial java/lang/NullPointerException/<init>()V
-
-    athrow
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_5.java b/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_5.java
deleted file mode 100644
index 3296cda..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.athrow.jm;
-
-public class T_athrow_5 {
-
-    public synchronized void run() {
-            throw new NullPointerException();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_6.j b/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_6.j
deleted file mode 100644
index 754f150..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_6.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_athrow_6.java
-.class public dxc/junit/opcodes/athrow/jm/T_athrow_6
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    .limit stack 2
-    .limit locals 1
-
-    athrow
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_6.java b/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_6.java
deleted file mode 100644
index 0ec671c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.athrow.jm;
-
-public class T_athrow_6 {
-
-    public void run() {
-        throw new RuntimeException();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_7.j b/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_7.j
deleted file mode 100644
index 7ef0094..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_7.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_athrow_7.java
-.class public dxc/junit/opcodes/athrow/jm/T_athrow_7
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 1
-
-    fconst_0
-    athrow
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_7.java b/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_7.java
deleted file mode 100644
index 8b4146c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.athrow.jm;
-
-public class T_athrow_7 {
-    
-    public void run() {
-        throw new RuntimeException();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_8.j b/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_8.j
deleted file mode 100644
index 6a3a04a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_8.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_athrow_8.java
-.class public dxc/junit/opcodes/athrow/jm/T_athrow_8
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .throws java/lang/Error
-    .limit stack 2
-    .limit locals 1
-
-    new java/lang/Error
-    dup
-    invokespecial java/lang/Error/<init>()V
-    athrow
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_8.java b/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_8.java
deleted file mode 100644
index 0ee1856..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.athrow.jm;
-
-public class T_athrow_8 {
-
-    public void run() throws Error {
-        throw new Error();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_9.j b/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_9.j
deleted file mode 100644
index 6bcef31..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_9.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_athrow_9.java
-.class public dxc/junit/opcodes/athrow/jm/T_athrow_9
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 1
-
-    new java/lang/Object
-    dup
-    invokespecial java/lang/RuntimeException/<init>()V
-    athrow
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_9.java b/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_9.java
deleted file mode 100644
index 9dea3b5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/athrow/jm/T_athrow_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.athrow.jm;
-
-public class T_athrow_9 {
-    
-    public void run() {
-        throw new RuntimeException();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/baload/Test_baload.java b/tools/dx-tests/src/dxc/junit/opcodes/baload/Test_baload.java
deleted file mode 100644
index 8cd4511..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/baload/Test_baload.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.baload;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.baload.jm.T_baload_1;
-
-public class Test_baload extends DxTestCase {
-
-    /**
-     * @title normal test. Trying different indexes
-     */
-    public void testN1() {
-        T_baload_1 t = new T_baload_1();
-        byte[] arr = new byte[2];
-        arr[1] = 100;
-        assertEquals(100, t.run(arr, 1));
-    }
-
-    /**
-     * @title normal test. Trying different indexes
-     */
-    public void testN2() {
-        T_baload_1 t = new T_baload_1();
-        byte[] arr = new byte[2];
-        arr[0] = 100;
-        assertEquals(100, t.run(arr, 0));
-    }
-
-    /**
-     * @title expected ArrayIndexOutOfBoundsException
-     */
-    public void testE1() {
-        T_baload_1 t = new T_baload_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_baload_1 t = new T_baload_1();
-        try {
-            t.run(null, 2);
-            fail("expected NullPointerException");
-        } catch (NullPointerException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @title expected ArrayIndexOutOfBoundsException
-     */
-    public void testE3() {
-        T_baload_1 t = new T_baload_1();
-        byte[] arr = new byte[2];
-        try {
-            t.run(arr, -1);
-            fail("expected ArrayIndexOutOfBoundsException");
-        } catch (ArrayIndexOutOfBoundsException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.baload.jm.T_baload_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.baload.jm.T_baload_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, double
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.baload.jm.T_baload_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, long
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.baload.jm.T_baload_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - Object, short
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.baload.jm.T_baload_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double[], short
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.baload.jm.T_baload_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int[], int
-     */
-    public void testVFE7() {
-        try {
-            Class.forName("dxc.junit.opcodes.baload.jm.T_baload_8");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, reference
-     */
-    public void testVFE8() {
-        try {
-            Class.forName("dxc.junit.opcodes.baload.jm.T_baload_9");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_1.j b/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_1.j
deleted file mode 100644
index 1d028c0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_1.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_baload_1.java
-.class public dxc/junit/opcodes/baload/jm/T_baload_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([BI)B
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_2
-
-    baload
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_1.java b/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_1.java
deleted file mode 100644
index bfb95ad..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.baload.jm;
-
-public class T_baload_1 {
-    public byte run(byte[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_2.j b/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_2.j
deleted file mode 100644
index d21f2e7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_2.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_baload_2.java
-.class public dxc/junit/opcodes/baload/jm/T_baload_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([BI)B
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-;    iload_2
-
-    baload
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_2.java b/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_2.java
deleted file mode 100644
index 74f6686..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_2.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.baload.jm;
-
-public class T_baload_2 {
-
-    public byte run(byte[] arr, int idx) {
-        return arr[idx];
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_3.j b/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_3.j
deleted file mode 100644
index 7f20dfb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_3.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_baload_3.java
-.class public dxc/junit/opcodes/baload/jm/T_baload_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([BI)B
-    .limit stack 3
-    .limit locals 4
-
-    ;aload_1
-    iload_2
-    baload
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_3.java b/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_3.java
deleted file mode 100644
index f9ffedd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_3.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.baload.jm;
-
-public class T_baload_3 {
-
-    public byte run(byte[] arr, int idx) {
-        return arr[idx];
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_4.j b/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_4.j
deleted file mode 100644
index 26e2c63..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_4.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_baload_4.java
-.class public dxc/junit/opcodes/baload/jm/T_baload_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run([BD)B
-    .limit stack 4
-    .limit locals 5
-
-    aload_1
-    dload_2
-;    d2i
-    baload
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_4.java b/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_4.java
deleted file mode 100644
index 17b9452..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_4.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.baload.jm;
-
-public class T_baload_4 {
-
-    public byte run(byte[] arr, double idx) {
-        return arr[(int)idx];
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_5.j b/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_5.j
deleted file mode 100644
index 821f3d6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_5.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_baload_5.java
-.class public dxc/junit/opcodes/baload/jm/T_baload_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run([BJ)B
-    .limit stack 4
-    .limit locals 5
-
-    aload_1
-    lload_2
-;    l2i
-    baload
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_5.java b/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_5.java
deleted file mode 100644
index 0e033dc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.baload.jm;
-
-public class T_baload_5 {
-
-    public byte run(byte[] arr, long idx) {
-        return arr[(int)idx];
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_6.j b/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_6.j
deleted file mode 100644
index b02bf0d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_6.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_baload_6.java
-.class public dxc/junit/opcodes/baload/jm/T_baload_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/Object;[BI)B
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_3
-
-    baload
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_6.java b/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_6.java
deleted file mode 100644
index 819ec21..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.baload.jm;
-
-public class T_baload_6 {
-
-    public byte run(Object a, byte[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_7.j b/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_7.j
deleted file mode 100644
index 32607e2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_7.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_baload_7.java
-.class public dxc/junit/opcodes/baload/jm/T_baload_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run([D[BI)B
-    .limit stack 2
-    .limit locals 4
-    aload_1
-    iload_3
-    baload
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_7.java b/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_7.java
deleted file mode 100644
index af1d1af..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.baload.jm;
-
-public class T_baload_7 {
-
-    public byte run(double[] a, byte[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_8.j b/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_8.j
deleted file mode 100644
index b7dd523..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_8.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_baload_8.java
-.class public dxc/junit/opcodes/baload/jm/T_baload_8
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run([I[BI)B
-    .limit stack 2
-    .limit locals 4
-    aload_1
-    iload_3
-    baload
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_8.java b/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_8.java
deleted file mode 100644
index eeb6197..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.baload.jm;
-
-public class T_baload_8 {
-
-    public byte run(int[] a, byte[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_9.j b/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_9.j
deleted file mode 100644
index f47a328..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_9.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_baload_9.java
-.class public dxc/junit/opcodes/baload/jm/T_baload_9
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([BI)B
-    .limit stack 2
-    .limit locals 3
-
-    aload_1
-    aload_0
-    baload
-
-    ireturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_9.java b/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_9.java
deleted file mode 100644
index 9471c7a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/baload/jm/T_baload_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.baload.jm;
-
-public class T_baload_9 {
-    
-    public byte run(byte[] arr, int idx) {
-        return arr[idx];
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/bastore/Test_bastore.java b/tools/dx-tests/src/dxc/junit/opcodes/bastore/Test_bastore.java
deleted file mode 100644
index e183f0d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/bastore/Test_bastore.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.bastore;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.bastore.jm.T_bastore_1;
-
-public class Test_bastore extends DxTestCase {
-
-    /**
-     * @title normal test. Trying different indexes
-     */
-    public void testN1() {
-        T_bastore_1 t = new T_bastore_1();
-        byte[] arr = new byte[2];
-        t.run(arr, 1, (byte) 100);
-        assertEquals(100, arr[1]);
-    }
-
-    /**
-     * @title normal test. Trying different indexes
-     */
-    public void testN2() {
-        T_bastore_1 t = new T_bastore_1();
-        byte[] arr = new byte[2];
-        t.run(arr, 0, (byte) 100);
-        assertEquals(100, arr[0]);
-    }
-
-    /**
-     * @title expected ArrayIndexOutOfBoundsException
-     */
-    public void testE1() {
-        T_bastore_1 t = new T_bastore_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_bastore_1 t = new T_bastore_1();
-        try {
-            t.run(null, 2, (byte) 100);
-            fail("expected NullPointerException");
-        } catch (NullPointerException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @title expected ArrayIndexOutOfBoundsException
-     */
-    public void testE3() {
-        T_bastore_1 t = new T_bastore_1();
-        byte[] arr = new byte[2];
-        try {
-            t.run(arr, -1, (byte) 100);
-            fail("expected ArrayIndexOutOfBoundsException");
-        } catch (ArrayIndexOutOfBoundsException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.bastore.jm.T_bastore_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.bastore.jm.T_bastore_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, double,
-     * short
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.bastore.jm.T_bastore_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, int, long
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.bastore.jm.T_bastore_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - object, int,
-     * short
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.bastore.jm.T_bastore_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double[], int,
-     * short
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.bastore.jm.T_bastore_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long[], int,
-     * short
-     */
-    public void testVFE7() {
-        try {
-            Class.forName("dxc.junit.opcodes.bastore.jm.T_bastore_8");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, reference,
-     * short
-     */
-    public void testVFE8() {
-        try {
-            Class.forName("dxc.junit.opcodes.bastore.jm.T_bastore_9");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_1.j b/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_1.j
deleted file mode 100644
index 49c11df..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_1.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_bastore_1.java
-.class public dxc/junit/opcodes/bastore/jm/T_bastore_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([BIB)V
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_2
-    iload_3
-    bastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_1.java b/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_1.java
deleted file mode 100644
index 82c22a5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.bastore.jm;
-
-public class T_bastore_1 {
-    public void run(byte[] arr, int idx, byte value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_2.j b/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_2.j
deleted file mode 100644
index d67c623..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_2.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_bastore_2.java
-.class public dxc/junit/opcodes/bastore/jm/T_bastore_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([BIB)V
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_2
-    ;iload_3
-    bastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_2.java b/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_2.java
deleted file mode 100644
index a34acf8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.bastore.jm;
-
-public class T_bastore_2 {
-
-    public void run(byte[] arr, int idx, byte value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_3.j b/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_3.j
deleted file mode 100644
index 68920fb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_3.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_bastore_3.java
-.class public dxc/junit/opcodes/bastore/jm/T_bastore_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([BIB)V
-    .limit stack 3
-    .limit locals 4
-
-    ;aload_1
-    iload_2
-    iload_3
-    bastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_3.java b/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_3.java
deleted file mode 100644
index 533b440..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.bastore.jm;
-
-public class T_bastore_3 {
-
-    public void run(byte[] arr, int idx, byte value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_4.j b/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_4.j
deleted file mode 100644
index a4f8aaa..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_4.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_bastore_4.java
-.class public dxc/junit/opcodes/bastore/jm/T_bastore_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run([BDI)V
-    .limit stack 4
-    .limit locals 5
-
-    aload_1
-    dload_2
-;    d2i
-    iload 4
-    bastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_4.java b/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_4.java
deleted file mode 100644
index 6dbb401..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.bastore.jm;
-
-public class T_bastore_4 {
-
-    public void run(byte[] arr, double idx, byte value) {
-        arr[(int)idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_5.j b/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_5.j
deleted file mode 100644
index 49c1303..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_5.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_bastore_5.java
-.class public dxc/junit/opcodes/bastore/jm/T_bastore_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run([BIJ)V
-    .limit stack 4
-    .limit locals 5
-
-    aload_1
-    iload_2
-    lload 3
-;   l2i
-;    i2s    
-    bastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_5.java b/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_5.java
deleted file mode 100644
index af3fe81..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.bastore.jm;
-
-public class T_bastore_5 {
-
-    public void run(byte[] arr, int idx, long value) {
-        arr[idx] = (byte)value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_6.j b/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_6.j
deleted file mode 100644
index e6ce2e0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_6.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_bastore_6.java
-.class public dxc/junit/opcodes/bastore/jm/T_bastore_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/Object;IB)V
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_2
-    iload_3
-    bastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_6.java b/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_6.java
deleted file mode 100644
index 4db5a94..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.bastore.jm;
-
-public class T_bastore_6 {
-
-    public void run(Object a, byte[] arr, int idx, byte value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_7.j b/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_7.j
deleted file mode 100644
index 4470df9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_7.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_bastore_7.java
-.class public dxc/junit/opcodes/bastore/jm/T_bastore_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([D[BIB)V
-    .limit stack 3
-    .limit locals 5
-    
-    aload_1
-    iload_3
-    iload 4
-    bastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_7.java b/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_7.java
deleted file mode 100644
index d97dd1d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.bastore.jm;
-
-public class T_bastore_7 {
-
-    public void run(double a[], byte[] arr, int idx, byte value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_8.j b/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_8.j
deleted file mode 100644
index 54feab5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_8.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_bastore_8.java
-.class public dxc/junit/opcodes/bastore/jm/T_bastore_8
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([J[BIB)V
-    .limit stack 3
-    .limit locals 5
-    
-    aload_1
-    iload_3
-    iload 4
-    bastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_8.java b/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_8.java
deleted file mode 100644
index 77b58c0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.bastore.jm;
-
-public class T_bastore_8 {
-
-    public void run(long a[], byte[] arr, int idx, byte value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_9.j b/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_9.j
deleted file mode 100644
index f2f3ec3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_9.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_bastore_9.java
-.class public dxc/junit/opcodes/bastore/jm/T_bastore_9
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([BIB)V
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    aload_0
-    iload_3
-    bastore
-
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_9.java b/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_9.java
deleted file mode 100644
index 9b62a2c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/bastore/jm/T_bastore_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.bastore.jm;
-
-public class T_bastore_9 {
-    
-    public void run(byte[] arr, int idx, byte value) {
-        arr[idx] = value;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/bipush/Test_bipush.java b/tools/dx-tests/src/dxc/junit/opcodes/bipush/Test_bipush.java
deleted file mode 100644
index 2eb5bce..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/bipush/Test_bipush.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.bipush;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.bipush.jm.T_bipush_1;
-import dxc.junit.opcodes.bipush.jm.T_bipush_2;
-import dxc.junit.opcodes.bipush.jm.T_bipush_3;
-
-public class Test_bipush extends DxTestCase {
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_bipush_1 t = new T_bipush_1();
-        assertEquals(100, t.run());
-    }
-
-    /**
-     * @title normal test
-     */
-    public void testB1() {
-        T_bipush_2 t = new T_bipush_2();
-        assertEquals(0, t.run());
-    }
-
-    /**
-     * @title normal test
-     */
-    public void testB2() {
-        T_bipush_3 t = new T_bipush_3();
-        assertEquals(-1, t.run());
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.bipush.jm.T_bipush_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/bipush/jm/T_bipush_1.j b/tools/dx-tests/src/dxc/junit/opcodes/bipush/jm/T_bipush_1.j
deleted file mode 100644
index 40d0a80..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/bipush/jm/T_bipush_1.j
+++ /dev/null
@@ -1,28 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_bipush_1.java
-.class public dxc/junit/opcodes/bipush/jm/T_bipush_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()B
-    bipush 100
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/bipush/jm/T_bipush_1.java b/tools/dx-tests/src/dxc/junit/opcodes/bipush/jm/T_bipush_1.java
deleted file mode 100644
index 5c2667d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/bipush/jm/T_bipush_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.bipush.jm;
-
-public class T_bipush_1 {
-
-    public byte run() {
-        return (byte)100;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/bipush/jm/T_bipush_2.j b/tools/dx-tests/src/dxc/junit/opcodes/bipush/jm/T_bipush_2.j
deleted file mode 100644
index 17b6e3a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/bipush/jm/T_bipush_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_bipush_2.java
-.class public dxc/junit/opcodes/bipush/jm/T_bipush_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()B
-    .limit stack 1
-    .limit locals 1
-
-    bipush 0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/bipush/jm/T_bipush_2.java b/tools/dx-tests/src/dxc/junit/opcodes/bipush/jm/T_bipush_2.java
deleted file mode 100644
index 9b04e4d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/bipush/jm/T_bipush_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.bipush.jm;
-
-public class T_bipush_2 {
-
-    public byte run() {
-        return 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/bipush/jm/T_bipush_3.j b/tools/dx-tests/src/dxc/junit/opcodes/bipush/jm/T_bipush_3.j
deleted file mode 100644
index 7e93411..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/bipush/jm/T_bipush_3.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_bipush_3.java
-.class public dxc/junit/opcodes/bipush/jm/T_bipush_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()B
-    .limit stack 1
-    .limit locals 1
-
-    bipush -1
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/bipush/jm/T_bipush_3.java b/tools/dx-tests/src/dxc/junit/opcodes/bipush/jm/T_bipush_3.java
deleted file mode 100644
index 0fad6c7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/bipush/jm/T_bipush_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.bipush.jm;
-
-public class T_bipush_3 {
-
-    public byte run() {
-        return -1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/bipush/jm/T_bipush_4.j b/tools/dx-tests/src/dxc/junit/opcodes/bipush/jm/T_bipush_4.j
deleted file mode 100644
index 0d9b7d9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/bipush/jm/T_bipush_4.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_bipush_4.java
-.class public dxc/junit/opcodes/bipush/jm/T_bipush_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()B
-    .limit stack 1
-;    .limit locals 1
-
-    bipush 1
-    bipush 1
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/bipush/jm/T_bipush_4.java b/tools/dx-tests/src/dxc/junit/opcodes/bipush/jm/T_bipush_4.java
deleted file mode 100644
index 4740577..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/bipush/jm/T_bipush_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.bipush.jm;
-
-public class T_bipush_4 {
-
-    public byte run() {
-        return 1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/caload/Test_caload.java b/tools/dx-tests/src/dxc/junit/opcodes/caload/Test_caload.java
deleted file mode 100644
index 3db3080..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/caload/Test_caload.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.caload;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.caload.jm.T_caload_1;
-
-public class Test_caload extends DxTestCase {
-
-    /**
-     * @title normal test. Trying different indexes
-     */
-    public void testN1() {
-        T_caload_1 t = new T_caload_1();
-        char[] arr = new char[2];
-        arr[1] = 'g';
-        assertEquals('g', t.run(arr, 1));
-    }
-
-    /**
-     * @title normal test. Trying different indexes
-     */
-    public void testN2() {
-        T_caload_1 t = new T_caload_1();
-        char[] arr = new char[2];
-        arr[0] = 'g';
-        assertEquals('g', t.run(arr, 0));
-    }
-
-    /**
-     * @title expected ArrayIndexOutOfBoundsException
-     */
-    public void testE1() {
-        T_caload_1 t = new T_caload_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_caload_1 t = new T_caload_1();
-        try {
-            t.run(null, 2);
-            fail("expected NullPointerException");
-        } catch (NullPointerException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @title expected ArrayIndexOutOfBoundsException
-     */
-    public void testE3() {
-        T_caload_1 t = new T_caload_1();
-        char[] arr = new char[2];
-        try {
-            t.run(arr, -1);
-            fail("expected ArrayIndexOutOfBoundsException");
-        } catch (ArrayIndexOutOfBoundsException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.caload.jm.T_caload_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.caload.jm.T_caload_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, double
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.caload.jm.T_caload_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, long
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.caload.jm.T_caload_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - Object, char
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.caload.jm.T_caload_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double[], char
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.caload.jm.T_caload_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int[], int
-     */
-    public void testVFE7() {
-        try {
-            Class.forName("dxc.junit.opcodes.caload.jm.T_caload_8");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, reference
-     */
-    public void testVFE8() {
-        try {
-            Class.forName("dxc.junit.opcodes.caload.jm.T_caload_9");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_1.j b/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_1.j
deleted file mode 100644
index 3d541a8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_1.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_caload_1.java
-.class public dxc/junit/opcodes/caload/jm/T_caload_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([CI)C
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_2
-
-    caload
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_1.java b/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_1.java
deleted file mode 100644
index beb189c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.caload.jm;
-
-public class T_caload_1 {
-    public char run(char[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_2.j b/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_2.j
deleted file mode 100644
index 9df1729..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_2.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_caload_2.java
-.class public dxc/junit/opcodes/caload/jm/T_caload_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([CI)C
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-;    iload_2
-
-    caload
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_2.java b/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_2.java
deleted file mode 100644
index fffa0bf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_2.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.caload.jm;
-
-public class T_caload_2 {
-
-    public char run(char[] arr, int idx) {
-        return arr[idx];
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_3.j b/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_3.j
deleted file mode 100644
index 28233b4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_3.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_caload_3.java
-.class public dxc/junit/opcodes/caload/jm/T_caload_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([CI)C
-    .limit stack 3
-    .limit locals 4
-
-    ;aload_1
-    iload_2
-    caload
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_3.java b/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_3.java
deleted file mode 100644
index 4d12ec7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_3.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.caload.jm;
-
-public class T_caload_3 {
-
-    public char run(char[] arr, int idx) {
-        return arr[idx];
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_4.j b/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_4.j
deleted file mode 100644
index 8d67495..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_4.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_caload_4.java
-.class public dxc/junit/opcodes/caload/jm/T_caload_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run([CD)C
-    .limit stack 4
-    .limit locals 5
-
-    aload_1
-    dload_2
-;    d2i
-    caload
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_4.java b/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_4.java
deleted file mode 100644
index 2e9c3e1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_4.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.caload.jm;
-
-public class T_caload_4 {
-
-    public char run(char[] arr, double idx) {
-        return arr[(int)idx];
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_5.j b/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_5.j
deleted file mode 100644
index 9a3eb23..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_5.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_caload_5.java
-.class public dxc/junit/opcodes/caload/jm/T_caload_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run([CJ)C
-    .limit stack 4
-    .limit locals 5
-
-    aload_1
-    lload_2
-;    l2i
-    caload
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_5.java b/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_5.java
deleted file mode 100644
index 2fde894..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.caload.jm;
-
-public class T_caload_5 {
-
-    public char run(char[] arr, long idx) {
-        return arr[(int)idx];
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_6.j b/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_6.j
deleted file mode 100644
index 549c5fc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_6.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_caload_6.java
-.class public dxc/junit/opcodes/caload/jm/T_caload_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/Object;[CI)C
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_3
-
-    caload
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_6.java b/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_6.java
deleted file mode 100644
index c4b5fb1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.caload.jm;
-
-public class T_caload_6 {
-
-    public char run(Object a, char[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_7.j b/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_7.j
deleted file mode 100644
index 9c7513a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_7.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_caload_7.java
-.class public dxc/junit/opcodes/caload/jm/T_caload_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run([D[CI)C
-    .limit stack 2
-    .limit locals 4
-    aload_1
-    iload_3
-    caload
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_7.java b/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_7.java
deleted file mode 100644
index 0b93a7d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.caload.jm;
-
-public class T_caload_7 {
-
-    public char run(double[] a, char[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_8.j b/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_8.j
deleted file mode 100644
index 34f05f1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_8.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_caload_8.java
-.class public dxc/junit/opcodes/caload/jm/T_caload_8
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run([I[CI)C
-    .limit stack 2
-    .limit locals 4
-    aload_1
-    iload_3
-    caload
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_8.java b/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_8.java
deleted file mode 100644
index 41c435d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.caload.jm;
-
-public class T_caload_8 {
-
-    public char run(int[] a, char[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_9.j b/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_9.j
deleted file mode 100644
index d0489ae..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_9.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_caload_9.java
-.class public dxc/junit/opcodes/caload/jm/T_caload_9
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([CI)C
-    .limit stack 2
-    .limit locals 3
-
-    aload_1
-    aload_0
-    caload
-
-    ireturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_9.java b/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_9.java
deleted file mode 100644
index c5c29e6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/caload/jm/T_caload_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.caload.jm;
-
-public class T_caload_9 {
-    
-    public char run(char[] arr, int idx) {
-        return arr[idx];
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/castore/Test_castore.java b/tools/dx-tests/src/dxc/junit/opcodes/castore/Test_castore.java
deleted file mode 100644
index c427cd6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/castore/Test_castore.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.castore;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.castore.jm.T_castore_1;
-
-public class Test_castore extends DxTestCase {
-
-    /**
-     * @title normal test. Trying different indexes
-     */
-    public void testN1() {
-        T_castore_1 t = new T_castore_1();
-        char[] arr = new char[2];
-        t.run(arr, 1, 'g');
-        assertEquals('g', arr[1]);
-    }
-
-    /**
-     * @title normal test. Trying different indexes
-     */
-    public void testN2() {
-        T_castore_1 t = new T_castore_1();
-        char[] arr = new char[2];
-        t.run(arr, 0, 'g');
-        assertEquals('g', arr[0]);
-    }
-
-    /**
-     * @title expected ArrayIndexOutOfBoundsException
-     */
-    public void testE1() {
-        T_castore_1 t = new T_castore_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_castore_1 t = new T_castore_1();
-        try {
-            t.run(null, 2, 'g');
-            fail("expected NullPointerException");
-        } catch (NullPointerException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @title expected ArrayIndexOutOfBoundsException
-     */
-    public void testE3() {
-        T_castore_1 t = new T_castore_1();
-        char[] arr = new char[2];
-        try {
-            t.run(arr, -1, 'g');
-            fail("expected ArrayIndexOutOfBoundsException");
-        } catch (ArrayIndexOutOfBoundsException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.castore.jm.T_castore_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.castore.jm.T_castore_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, double,
-     * char
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.castore.jm.T_castore_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, int, long
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.castore.jm.T_castore_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - object, int, char
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.castore.jm.T_castore_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double[], int,
-     * char
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.castore.jm.T_castore_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long[], int, char
-     */
-    public void testVFE7() {
-        try {
-            Class.forName("dxc.junit.opcodes.castore.jm.T_castore_8");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, reference,
-     * char
-     */
-    public void testVFE8() {
-        try {
-            Class.forName("dxc.junit.opcodes.castore.jm.T_castore_9");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_1.j b/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_1.j
deleted file mode 100644
index 5936fc5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_1.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_castore_1.java
-.class public dxc/junit/opcodes/castore/jm/T_castore_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([CIC)V
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_2
-    iload_3
-    castore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_1.java b/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_1.java
deleted file mode 100644
index 011ac3b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.castore.jm;
-
-public class T_castore_1 {
-    public void run(char[] arr, int idx, char value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_2.j b/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_2.j
deleted file mode 100644
index 6589661..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_2.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_castore_2.java
-.class public dxc/junit/opcodes/castore/jm/T_castore_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([CIC)V
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_2
-    ;iload_3
-    castore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_2.java b/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_2.java
deleted file mode 100644
index b04e352..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.castore.jm;
-
-public class T_castore_2 {
-
-    public void run(char[] arr, int idx, char value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_3.j b/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_3.j
deleted file mode 100644
index 2253cc7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_3.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_castore_3.java
-.class public dxc/junit/opcodes/castore/jm/T_castore_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([CIC)V
-    .limit stack 3
-    .limit locals 4
-
-    ;aload_1
-    iload_2
-    iload_3
-    castore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_3.java b/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_3.java
deleted file mode 100644
index 55be405..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.castore.jm;
-
-public class T_castore_3 {
-
-    public void run(char[] arr, int idx, char value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_4.j b/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_4.j
deleted file mode 100644
index 11c390f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_4.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_castore_4.java
-.class public dxc/junit/opcodes/castore/jm/T_castore_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run([CDC)V
-    .limit stack 4
-    .limit locals 5
-
-    aload_1
-    dload_2
-;    d2i
-    iload 4
-    castore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_4.java b/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_4.java
deleted file mode 100644
index 3666fa1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.castore.jm;
-
-public class T_castore_4 {
-
-    public void run(char[] arr, double idx, char value) {
-        arr[(int)idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_5.j b/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_5.j
deleted file mode 100644
index 3cfa149..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_5.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_castore_5.java
-.class public dxc/junit/opcodes/castore/jm/T_castore_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run([CIJ)V
-    .limit stack 4
-    .limit locals 5
-
-    aload_1
-    iload_2
-    lload 3
-;   l2i
-;    i2s    
-    castore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_5.java b/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_5.java
deleted file mode 100644
index 1d43a3d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.castore.jm;
-
-public class T_castore_5 {
-
-    public void run(char[] arr, int idx, long value) {
-        arr[idx] = (char)value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_6.j b/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_6.j
deleted file mode 100644
index f5caba3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_6.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_castore_6.java
-.class public dxc/junit/opcodes/castore/jm/T_castore_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/Object;IC)V
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_2
-    iload_3
-    castore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_6.java b/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_6.java
deleted file mode 100644
index 57ad883..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.castore.jm;
-
-public class T_castore_6 {
-
-    public void run(Object a, char[] arr, int idx, char value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_7.j b/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_7.j
deleted file mode 100644
index 81a790e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_7.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_castore_7.java
-.class public dxc/junit/opcodes/castore/jm/T_castore_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([D[CIC)V
-    .limit stack 3
-    .limit locals 5
-    
-    aload_1
-    iload_3
-    iload 4
-    castore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_7.java b/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_7.java
deleted file mode 100644
index 62418ca..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.castore.jm;
-
-public class T_castore_7 {
-
-    public void run(double a[], char[] arr, int idx, char value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_8.j b/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_8.j
deleted file mode 100644
index 8e33f1f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_8.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_castore_8.java
-.class public dxc/junit/opcodes/castore/jm/T_castore_8
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([J[CIC)V
-    .limit stack 3
-    .limit locals 5
-    
-    aload_1
-    iload_3
-    iload 4
-    castore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_8.java b/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_8.java
deleted file mode 100644
index d5bfaba..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.castore.jm;
-
-public class T_castore_8 {
-
-    public void run(long a[], char[] arr, int idx, char value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_9.j b/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_9.j
deleted file mode 100644
index 955dc0e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_9.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_castore_9.java
-.class public dxc/junit/opcodes/castore/jm/T_castore_9
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([CIC)V
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    aload_0
-    iload_3
-    castore
-
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_9.java b/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_9.java
deleted file mode 100644
index 097fcfc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/castore/jm/T_castore_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.castore.jm;
-
-public class T_castore_9 {
-    
-    public void run(char[] arr, int idx, char value) {
-        arr[idx] = value;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/Test_checkcast.java b/tools/dx-tests/src/dxc/junit/opcodes/checkcast/Test_checkcast.java
deleted file mode 100644
index a6f2350..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/Test_checkcast.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.checkcast;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.checkcast.jm.T_checkcast_1;
-import dxc.junit.opcodes.checkcast.jm.T_checkcast_2;
-import dxc.junit.opcodes.checkcast.jm.T_checkcast_3;
-import dxc.junit.opcodes.checkcast.jm.T_checkcast_7;
-
-public class Test_checkcast extends DxTestCase {
-    
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_checkcast_1 t = new T_checkcast_1();
-        String s = "";
-        assertEquals(s, t.run(s));
-    }
-
-    /**
-     * @title check null value
-     */
-    public void testN2() {
-        T_checkcast_1 t = new T_checkcast_1();
-        assertNull(t.run(null));
-    }
-
-    /**
-     * @title normal class
-     */
-    public void testN4() {
-        // @uses dxc.junit.opcodes.checkcast.jm.SubClass
-        // @uses dxc.junit.opcodes.checkcast.jm.SuperClass
-        // @uses dxc.junit.opcodes.checkcast.jm.SuperInterface
-        // @uses dxc.junit.opcodes.checkcast.jm.SuperInterface2
-        
-        T_checkcast_2 t = new T_checkcast_2();
-        assertEquals(5, t.run());
-    }
-
-    /**
-     * @title expected ClassCastException
-     */
-    public void testE1() {
-        T_checkcast_1 t = new T_checkcast_1();
-        try {
-            t.run(this);
-            fail("expected ClassCastException");
-        } catch (ClassCastException iae) {
-            // expected
-        }
-    }
-
-    /**
-     * @title expected ClassCastException. checkcast [[[Ldxc/junit/opcodes/checkcast/jm/TestStubs$TestStub;
-     * dalvikvm throws ClassCastException as demanded by checkcast, but
-     * does not claim a IllegalAccessError to a private class - ok, 
-     * since checkcast does what the spec says it should do.
-     */
-    public void testE2() {
-        // @uses dxc.junit.opcodes.checkcast.jm.TestStubs$TestStub
-        try {
-            T_checkcast_3 t = new T_checkcast_3();
-            t.run();
-            fail("expected ClassCastException");
-        } catch (ClassCastException cce) {
-            // expected
-        }
-    }
-
-    /**
-     * @title expected NoClassDefFoundError
-     */
-    public void testE3() {
-        try {
-            T_checkcast_7 t = new T_checkcast_7();
-            t.run();
-            fail("expected NoClassDefFoundError");
-        } catch (NoClassDefFoundError iae) {
-            // expected
-        } catch (VerifyError vfe) {
-            // ok for dalvikvm; early resolution
-            System.out.print("dvmvfe:");
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.16
-     * @title constant pool index
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.checkcast.jm.T_checkcast_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.checkcast.jm.T_checkcast_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.checkcast.jm.T_checkcast_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.16
-     * @title constant pool type
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.checkcast.jm.T_checkcast_8");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_1.j b/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_1.j
deleted file mode 100644
index 2efe0d6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_1.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_checkcast_1.java
-.class public dxc/junit/opcodes/checkcast/jm/T_checkcast_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/Object;)Ljava/lang/String;
-    .limit stack 1
-    .limit locals 2
-    aload_1
-    checkcast java/lang/String
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_1.java b/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_1.java
deleted file mode 100644
index c416457..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.checkcast.jm;
-
-public class T_checkcast_1 {
-
-    public String run(Object o) {
-        return (String)o;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_2.j b/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_2.j
deleted file mode 100644
index 01d2e59..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_2.j
+++ /dev/null
@@ -1,139 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_checkcast_2.java
-.class public dxc/junit/opcodes/checkcast/jm/T_checkcast_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 20
-    .limit locals 2
-    
-    iconst_0
-    istore_1
-    
-; (SubClass instanceof SuperClass)    
-    new        dxc/junit/opcodes/checkcast/jm/SubClass
-    dup
-    invokespecial dxc/junit/opcodes/checkcast/jm/SubClass.<init>()V
-    checkcast dxc/junit/opcodes/checkcast/jm/SuperClass
-    pop
-    
-; (SubClass[] instanceof SuperClass[])    
-    iconst_1
-    anewarray dxc/junit/opcodes/checkcast/jm/SubClass
-    checkcast [Ldxc/junit/opcodes/checkcast/jm/SuperClass;
-    pop    
-    
-; (SubClass[] instanceof Object)    
-    iconst_1
-    anewarray dxc/junit/opcodes/checkcast/jm/SubClass
-    checkcast java/lang/Object
-    pop
-    
-; (SubClass instanceof SuperInterface)    
-    new dxc/junit/opcodes/checkcast/jm/SubClass
-    dup
-    invokespecial dxc/junit/opcodes/checkcast/jm/SubClass.<init>()V    
-    checkcast dxc/junit/opcodes/checkcast/jm/SuperInterface
-    pop
-        
-
-; !(SuperClass instanceof SubClass)    
-Label1:
-    new dxc/junit/opcodes/checkcast/jm/SuperClass
-    dup
-    invokespecial dxc/junit/opcodes/checkcast/jm/SuperClass.<init>()V
-Label10:    
-    checkcast dxc/junit/opcodes/checkcast/jm/SubClass
-    pop
-Label11:    
-    goto Label2
-Label12:
-    pop
-    iinc 1 1
-    goto Label2
-        
-; !(SubClass instanceof SuperInterface2)    
-Label2:
-    new dxc/junit/opcodes/checkcast/jm/SubClass
-    dup
-    invokespecial dxc/junit/opcodes/checkcast/jm/SubClass.<init>()V    
-Label20:    
-    checkcast dxc/junit/opcodes/checkcast/jm/SuperInterface2
-    pop
-Label21:    
-    goto Label3
-Label22:
-    pop
-    iinc 1 1
-    goto Label3
-
-; !(SubClass[] instanceof SuperInterface)    
-Label3:
-    iconst_1
-    anewarray dxc/junit/opcodes/checkcast/jm/SubClass
-Label30:    
-    checkcast dxc/junit/opcodes/checkcast/jm/SuperInterface
-    pop
-Label31:    
-    goto Label4
-Label32:    
-    pop
-    iinc 1 1
-    goto Label4
-
-; !(SubClass[] instanceof SubClass)    
-Label4:
-    iconst_1
-    anewarray dxc/junit/opcodes/checkcast/jm/SubClass
-Label40:    
-    checkcast dxc/junit/opcodes/checkcast/jm/SubClass
-    pop
-Label41:    
-    goto Label5
-Label42:
-    pop
-    iinc 1 1
-    goto Label5    
-    
-; !(SuperClass[] instanceof SubClass[])    
-Label5:
-    iconst_1
-    anewarray dxc/junit/opcodes/checkcast/jm/SuperClass
-Label50:    
-    checkcast [Ldxc/junit/opcodes/checkcast/jm/SubClass;
-    pop
-Label51:    
-    goto Label6
-Label52:
-    pop
-    iinc 1 1
-    
-Label6:        
-    iload_1
-    ireturn
-    
-.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/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_2.java b/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_2.java
deleted file mode 100644
index 08b8ec8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.checkcast.jm;
-
-public class T_checkcast_2 {
-
-    public int run() {
-        return 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_3.j b/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_3.j
deleted file mode 100644
index 84ec459..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_3.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_checkcast_3.java
-.class public dxc/junit/opcodes/checkcast/jm/T_checkcast_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    .limit stack 3
-    .limit locals 4
-    aload_0
-    checkcast [[[Ldxc/junit/opcodes/checkcast/jm/TestStubs$TestStub;
-    pop
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_3.java b/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_3.java
deleted file mode 100644
index c9c5652..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.checkcast.jm;
-
-public class T_checkcast_3 {
-
-    public void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_4.cfh b/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_4.cfh
deleted file mode 100644
index 27a40ce..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_4.cfh
+++ /dev/null
@@ -1,191 +0,0 @@
-//@class:dxc/junit/opcodes/checkcast/jm/T_checkcast_4
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0010
-// .  .  
-   00 10 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0f 00 08 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 19, h: 0004: utf8{"java/lang/String"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  S  t  r  i  n  g  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 
-    // parsed:, offset 66, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 75, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 81, len 47, h: 0007: utf8{"dxc/junit/opcodes/checkcast/jm/T_checkcast_4"}
-    // .  .  ,  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  c  h  e  c  k  c  a  s  t  /  j  m  /  T  _  c  h  e  c  k  c  a  s  t  _  4  
-       01 00 2c 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 63 68 65 63 6b 63 61 73 74 2f 6a 6d 2f 54 5f 63 68 65 63 6b 63 61 73 74 5f 34 
-    // parsed:, offset 128, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0d 
-    // parsed:, offset 133, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 140, len 21, h: 000a: utf8{"T_checkcast_4.java"}
-    // .  .  .  T  _  c  h  e  c  k  c  a  s  t  _  4  .  j  a  v  a  
-       01 00 12 54 5f 63 68 65 63 6b 63 61 73 74 5f 34 2e 6a 61 76 61 
-    // parsed:, offset 161, len 3, h: 000b: type{java.lang.String}
-    // .  .  .  
-       07 00 04 
-    // parsed:, offset 164, len 41, h: 000c: utf8{"(Ljava/lang/Object;)Ljava/lang/String;"}
-    // .  .  &  (  L  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  ;  )  L  j  a  v  a  /  l  a  n  g  /  S  t  r  i  n  g  ;  
-       01 00 26 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 3b 29 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 
-    // parsed:, offset 205, len 6, h: 000d: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 211, len 3, h: 000e: type{dxc.junit.opcodes.checkcast.jm.T_checkcast_4}
-    // .  .  .  
-       07 00 07 
-    // parsed:, offset 214, len 3, h: 000f: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 217, len 0, h: end constant_pool
-// parsed:, offset 217, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 219, len 2, h: this_class: type{dxc.junit.opcodes.checkcast.jm.T_checkcast_4}
-// .  .  
-   00 0e 
-// parsed:, offset 221, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0f 
-// parsed:, offset 223, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 225, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 227, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 229, len:72,desc: ()V
-// parsed:, offset 229, len 0, h:  methods[0]: 
-    // parsed:, offset 229, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 231, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 233, len 2, h: descriptor: ()V
-    // .  .  
-       00 0d 
-    // parsed:, offset 235, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 237, len 0, h:  attributes[0]: 
-        // parsed:, offset 237, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 239, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 243, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 245, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 247, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 256, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 258, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 260, len 0, h: end attributes[0] 
-// parsed:, offset 260, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 260, len:41,desc: (Ljava/lang/Object;)Ljava/lang/String;
-// parsed:, offset 260, len 0, h:  methods[1]: 
-    // parsed:, offset 260, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 262, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 264, len 2, h: descriptor: (Ljava/lang/Object;)Ljava/lang/String;
-    // .  .  
-       00 0c 
-    // parsed:, offset 266, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 268, len 0, h:  attributes[0]: 
-        // parsed:, offset 268, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 270, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 274, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 276, len 2, h: max_locals: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 278, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_1 // 01
-        // +  
-           2b 
-        // parsed:, offset 1, len 3, h: 0001: checkcast type{java.lang.String}
-        // .  .  .  
-//@mod           c0 00 0b 
-           c0 01 0b 
-        // parsed:, offset 4, len 1, h: 0004: areturn
-        // .  
-           b0 
-        // parsed:, offset 287, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 289, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 291, len 0, h: end attributes[0] 
-// parsed:, offset 291, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (Ljava/lang/Object;)Ljava/lang/String;
-// parsed:, offset 291, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 293, len 0, h:  attributes[0]: 
-    // parsed:, offset 293, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 295, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 299, len 2, h: source: utf8{"T_checkcast_4.java"}
-    // .  .  
-       00 0a 
-// parsed:, offset 301, len 0, h: end attributes[0] 
-// parsed:, offset 301, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_4.j b/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_4.j
deleted file mode 100644
index 9066302..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_4.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_checkcast_4.java
-.class public dxc/junit/opcodes/checkcast/jm/T_checkcast_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/Object;)Ljava/lang/String;
-    .limit stack 1
-    .limit locals 2
-    aload_1
-    checkcast java/lang/String
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_4.java b/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_4.java
deleted file mode 100644
index e5d5fbc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.checkcast.jm;
-
-public class T_checkcast_4 {
-
-    public String run(Object o) {
-        return (String)o;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_5.j b/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_5.j
deleted file mode 100644
index b4e645b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_5.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_checkcast_5.java
-.class public dxc/junit/opcodes/checkcast/jm/T_checkcast_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/Object;)Ljava/lang/String;
-    .limit stack 1
-    .limit locals 2
-    fconst_1
-    checkcast java/lang/String
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_5.java b/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_5.java
deleted file mode 100644
index afb4ba2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.checkcast.jm;
-
-public class T_checkcast_5 {
-
-    public String run(Object o) {
-        return (String)o;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_6.j b/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_6.j
deleted file mode 100644
index 7ae206c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_6.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_checkcast_6.java
-.class public dxc/junit/opcodes/checkcast/jm/T_checkcast_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/Object;)Ljava/lang/String;
-    .limit stack 1
-    .limit locals 2
-;    aload_1
-    checkcast java/lang/String
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_6.java b/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_6.java
deleted file mode 100644
index 6389d85..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.checkcast.jm;
-
-public class T_checkcast_6 {
-
-    public String run(Object o) {
-        return (String)o;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_7.j b/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_7.j
deleted file mode 100644
index b3ad568..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_7.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_checkcast_7.java
-.class public dxc/junit/opcodes/checkcast/jm/T_checkcast_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    .limit stack 3
-    .limit locals 4
-    aload_0
-    checkcast [[[Ldxc/junit/opcodes/checkcast/jm/foobar1;
-    pop
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_7.java b/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_7.java
deleted file mode 100644
index 98167f1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.checkcast.jm;
-
-public class T_checkcast_7 {
-
-    public void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_8.cfh b/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_8.cfh
deleted file mode 100644
index fa33a5f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_8.cfh
+++ /dev/null
@@ -1,200 +0,0 @@
-//@class:dxc/junit/opcodes/checkcast/jm/T_checkcast_8
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0011
-// .  .  
-   00 11 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 10 00 09 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 3, h: 0003: type{java.lang.String}
-    // .  .  .  
-       07 00 0c 
-    // parsed:, offset 37, len 47, h: 0004: utf8{"dxc/junit/opcodes/checkcast/jm/T_checkcast_8"}
-    // .  .  ,  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  c  h  e  c  k  c  a  s  t  /  j  m  /  T  _  c  h  e  c  k  c  a  s  t  _  8  
-       01 00 2c 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 63 68 65 63 6b 63 61 73 74 2f 6a 6d 2f 54 5f 63 68 65 63 6b 63 61 73 74 5f 38 
-    // parsed:, offset 84, len 13, h: 0005: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 97, len 5, h: 0006: int{0x0000007b / 123}
-    // .  .  .  .  {  
-       03 00 00 00 7b 
-    // parsed:, offset 102, len 9, h: 0007: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 111, len 6, h: 0008: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 117, len 5, h: 0009: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 07 00 0e 
-    // parsed:, offset 122, len 21, h: 000a: utf8{"T_checkcast_8.java"}
-    // .  .  .  T  _  c  h  e  c  k  c  a  s  t  _  8  .  j  a  v  a  
-       01 00 12 54 5f 63 68 65 63 6b 63 61 73 74 5f 38 2e 6a 61 76 61 
-    // parsed:, offset 143, len 7, h: 000b: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 150, len 19, h: 000c: utf8{"java/lang/String"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  S  t  r  i  n  g  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 
-    // parsed:, offset 169, len 41, h: 000d: utf8{"(Ljava/lang/Object;)Ljava/lang/String;"}
-    // .  .  &  (  L  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  ;  )  L  j  a  v  a  /  l  a  n  g  /  S  t  r  i  n  g  ;  
-       01 00 26 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 3b 29 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 
-    // parsed:, offset 210, len 6, h: 000e: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 216, len 3, h: 000f: type{dxc.junit.opcodes.checkcast.jm.T_checkcast_8}
-    // .  .  .  
-       07 00 04 
-    // parsed:, offset 219, len 3, h: 0010: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 222, len 0, h: end constant_pool
-// parsed:, offset 222, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 224, len 2, h: this_class: type{dxc.junit.opcodes.checkcast.jm.T_checkcast_8}
-// .  .  
-   00 0f 
-// parsed:, offset 226, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 10 
-// parsed:, offset 228, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 230, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 232, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 234, len:75,desc: ()V
-// parsed:, offset 234, len 0, h:  methods[0]: 
-    // parsed:, offset 234, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 236, len 2, h: name: <init>
-    // .  .  
-       00 07 
-    // parsed:, offset 238, len 2, h: descriptor: ()V
-    // .  .  
-       00 0e 
-    // parsed:, offset 240, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 242, len 0, h:  attributes[0]: 
-        // parsed:, offset 242, len 2, h: name: Code
-        // .  .  
-           00 0b 
-        // parsed:, offset 244, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 248, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 250, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 252, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 261, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 263, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 265, len 0, h: end attributes[0] 
-// parsed:, offset 265, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 265, len:44,desc: (Ljava/lang/Object;)Ljava/lang/String;
-// parsed:, offset 265, len 0, h:  methods[1]: 
-    // parsed:, offset 265, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 267, len 2, h: name: run
-    // .  .  
-       00 08 
-    // parsed:, offset 269, len 2, h: descriptor: (Ljava/lang/Object;)Ljava/lang/String;
-    // .  .  
-       00 0d 
-    // parsed:, offset 271, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 273, len 0, h:  attributes[0]: 
-        // parsed:, offset 273, len 2, h: name: Code
-        // .  .  
-           00 0b 
-        // parsed:, offset 275, len 4, h: length: 00000014
-        // .  .  .  .  
-           00 00 00 14 
-        // parsed:, offset 279, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 281, len 2, h: max_locals: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 283, len 4, h: code_length: 00000008
-        // .  .  .  .  
-           00 00 00 08 
-        // parsed:, offset 0, len 2, h: 0000: ldc #+0000007b
-        // .  .  
-           12 06 
-        // parsed:, offset 2, len 1, h: 0002: pop
-        // W  
-           57 
-        // parsed:, offset 3, len 1, h: 0003: aload_1 // 01
-        // +  
-           2b 
-        // parsed:, offset 4, len 3, h: 0004: checkcast type{java.lang.String}
-        // .  .  .  
-//@mod           c0 00 03 
-           c0 00 06 
-        // parsed:, offset 7, len 1, h: 0007: areturn
-        // .  
-           b0 
-        // parsed:, offset 295, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 297, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 299, len 0, h: end attributes[0] 
-// parsed:, offset 299, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (Ljava/lang/Object;)Ljava/lang/String;
-// parsed:, offset 299, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 301, len 0, h:  attributes[0]: 
-    // parsed:, offset 301, len 2, h: name: SourceFile
-    // .  .  
-       00 05 
-    // parsed:, offset 303, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 307, len 2, h: source: utf8{"T_checkcast_8.java"}
-    // .  .  
-       00 0a 
-// parsed:, offset 309, len 0, h: end attributes[0] 
-// parsed:, offset 309, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_8.j b/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_8.j
deleted file mode 100644
index bf537de..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_8.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_checkcast_8.java
-.class public dxc/junit/opcodes/checkcast/jm/T_checkcast_8
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/Object;)Ljava/lang/String;
-    .limit stack 1
-    .limit locals 2
-    
-    ldc 123
-    pop
-    
-    aload_1
-    checkcast java/lang/String
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_8.java b/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_8.java
deleted file mode 100644
index cce0c88..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/T_checkcast_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.checkcast.jm;
-
-public class T_checkcast_8 {
-
-    public String run(Object o) {
-        return (String)o;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/TestStubs.java b/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/TestStubs.java
deleted file mode 100644
index 97476a7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/checkcast/jm/TestStubs.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.checkcast.jm;
-
-
-public class TestStubs {
-    @SuppressWarnings("unused")
-    private class TestStub {
-        // testE2
-    }
-}
-
-interface SuperInterface{
-    
-}
-
-interface SuperInterface2{
-    
-}
-
-class SuperClass implements SuperInterface{
-    
-}
-
-class SubClass extends SuperClass{
-
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2f/Test_d2f.java b/tools/dx-tests/src/dxc/junit/opcodes/d2f/Test_d2f.java
deleted file mode 100644
index 3571b8a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2f/Test_d2f.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.d2f;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.d2f.jm.T_d2f_1;
-
-public class Test_d2f extends DxTestCase {
-
-    /**
-     * @title  Argument = 2.71
-     */
-    public void testN1() {
-        T_d2f_1 t = new T_d2f_1();
-        assertEquals(2.71f, t.run(2.71d));
-    }
-
-    /**
-     * @title  Argument = 1
-     */
-    public void testN2() {
-        T_d2f_1 t = new T_d2f_1();
-        assertEquals(1f, t.run(1d));
-    }
-
-    /**
-     * @title  Argument = -1
-     */
-    public void testN3() {
-        T_d2f_1 t = new T_d2f_1();
-        assertEquals(-1f, t.run(-1d));
-    }
-
-    /**
-     * @title  Argument = Double.MAX_VALUE
-     */
-    public void testB1() {
-        T_d2f_1 t = new T_d2f_1();
-        assertEquals(Float.POSITIVE_INFINITY, t.run(Double.MAX_VALUE));
-    }
-
-    /**
-     * @title  Argument = Double.MIN_VALUE
-     */
-    public void testB2() {
-        T_d2f_1 t = new T_d2f_1();
-        assertEquals(0f, t.run(Double.MIN_VALUE));
-    }
-
-    /**
-     * @title  Argument = -0
-     */
-    public void testB3() {
-        T_d2f_1 t = new T_d2f_1();
-        assertEquals(-0f, t.run(-0d));
-    }
-
-    /**
-     * @title  Argument = NaN
-     */
-    public void testB4() {
-        T_d2f_1 t = new T_d2f_1();
-        assertTrue(Float.isNaN(t.run(Double.NaN)));
-    }
-
-    /**
-     * @title  Argument = POSITIVE_INFINITY
-     */
-    public void testB5() {
-        T_d2f_1 t = new T_d2f_1();
-        assertTrue(Float.isInfinite(t.run(Double.POSITIVE_INFINITY)));
-    }
-
-    /**
-     * @title  Argument = NEGATIVE_INFINITY
-     */
-    public void testB6() {
-        T_d2f_1 t = new T_d2f_1();
-        assertTrue(Float.isInfinite(t.run(Double.NEGATIVE_INFINITY)));
-    }
-
-
-    /**
-     * @title  Argument = -Double.MIN_VALUE
-     */
-    public void testB7() {
-        T_d2f_1 t = new T_d2f_1();
-        assertEquals(-0f, t.run(-4.9E-324d));
-    }
-
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.d2f.jm.T_d2f_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.d2f.jm.T_d2f_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.d2f.jm.T_d2f_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - reference
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.d2f.jm.T_d2f_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2f/jm/T_d2f_1.j b/tools/dx-tests/src/dxc/junit/opcodes/d2f/jm/T_d2f_1.j
deleted file mode 100644
index 461f86a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2f/jm/T_d2f_1.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_d2f_1.java
-.class public dxc/junit/opcodes/d2f/jm/T_d2f_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(D)F
-    .limit stack 3
-    .limit locals 3
-    dload_1
-    d2f
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2f/jm/T_d2f_1.java b/tools/dx-tests/src/dxc/junit/opcodes/d2f/jm/T_d2f_1.java
deleted file mode 100644
index e63f2c4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2f/jm/T_d2f_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.d2f.jm;
-
-public class T_d2f_1 {
-
-    public float run(double a) {
-        return (float)a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2f/jm/T_d2f_2.j b/tools/dx-tests/src/dxc/junit/opcodes/d2f/jm/T_d2f_2.j
deleted file mode 100644
index a65c7ce..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2f/jm/T_d2f_2.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_d2f_2.java
-.class public dxc/junit/opcodes/d2f/jm/T_d2f_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(D)F
-    .limit stack 3
-    .limit locals 3
-
-;    dload_1
-    d2f
-
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2f/jm/T_d2f_2.java b/tools/dx-tests/src/dxc/junit/opcodes/d2f/jm/T_d2f_2.java
deleted file mode 100644
index 5dca9a2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2f/jm/T_d2f_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.d2f.jm;
-
-public class T_d2f_2 {
-
-    public float run(double a) {
-        return (float)a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2f/jm/T_d2f_3.j b/tools/dx-tests/src/dxc/junit/opcodes/d2f/jm/T_d2f_3.j
deleted file mode 100644
index 4c02168..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2f/jm/T_d2f_3.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_d2f_3.java
-.class public dxc/junit/opcodes/d2f/jm/T_d2f_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(F)F
-    .limit stack 2
-    .limit locals 3
-
-    fload_1
-    d2f
-
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2f/jm/T_d2f_3.java b/tools/dx-tests/src/dxc/junit/opcodes/d2f/jm/T_d2f_3.java
deleted file mode 100644
index 6be1325..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2f/jm/T_d2f_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.d2f.jm;
-
-public class T_d2f_3 {
-
-    public float run(float a) {
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2f/jm/T_d2f_4.j b/tools/dx-tests/src/dxc/junit/opcodes/d2f/jm/T_d2f_4.j
deleted file mode 100644
index dc79276..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2f/jm/T_d2f_4.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_d2f_4.java
-.class public dxc/junit/opcodes/d2f/jm/T_d2f_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(J)D
-    .limit stack 2
-    .limit locals 3
-
-    lload_1
-    d2f
-
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2f/jm/T_d2f_4.java b/tools/dx-tests/src/dxc/junit/opcodes/d2f/jm/T_d2f_4.java
deleted file mode 100644
index 240dfea..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2f/jm/T_d2f_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.d2f.jm;
-
-public class T_d2f_4 {
-
-    public float run(long a) {
-        return (float) a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2f/jm/T_d2f_5.j b/tools/dx-tests/src/dxc/junit/opcodes/d2f/jm/T_d2f_5.j
deleted file mode 100644
index c743637..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2f/jm/T_d2f_5.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_d2f_5.java
-.class public dxc/junit/opcodes/d2f/jm/T_d2f_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(D)F
-    .limit stack 2
-    .limit locals 3
-
-    aload_0
-    d2f
-    freturn
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2f/jm/T_d2f_5.java b/tools/dx-tests/src/dxc/junit/opcodes/d2f/jm/T_d2f_5.java
deleted file mode 100644
index b9a986b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2f/jm/T_d2f_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.d2f.jm;
-
-public class T_d2f_5 {
-    
-    public float run(double a) {
-        return (float)a;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2i/Test_d2i.java b/tools/dx-tests/src/dxc/junit/opcodes/d2i/Test_d2i.java
deleted file mode 100644
index a316201..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2i/Test_d2i.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.d2i;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.d2i.jm.T_d2i_1;
-
-public class Test_d2i extends DxTestCase {
-
-    /**
-     * @title  Argument = 2.9999999d
-     */
-    public void testN1() {
-        T_d2i_1 t = new T_d2i_1();
-        assertEquals(2, t.run(2.9999999d));
-    }
-
-    /**
-     * @title  Argument = 1
-     */
-    public void testN2() {
-        T_d2i_1 t = new T_d2i_1();
-        assertEquals(1, t.run(1d));
-    }
-
-    /**
-     * @title  Argument = -1
-     */
-    public void testN3() {
-        T_d2i_1 t = new T_d2i_1();
-        assertEquals(-1, t.run(-1d));
-    }
-
-    /**
-     * @title  Argument = -0
-     */
-    public void testB1() {
-        T_d2i_1 t = new T_d2i_1();
-        assertEquals(0, t.run(-0d));
-    }
-
-    /**
-     * @title  Argument = Double.MAX_VALUE
-     */
-    public void testB2() {
-        T_d2i_1 t = new T_d2i_1();
-        assertEquals(Integer.MAX_VALUE, t.run(Double.MAX_VALUE));
-    }
-
-    /**
-     * @title  Argument = Double.MIN_VALUE
-     */
-    public void testB3() {
-        T_d2i_1 t = new T_d2i_1();
-        assertEquals(0, t.run(Double.MIN_VALUE));
-    }
-
-    /**
-     * @title  Argument = NaN
-     */
-    public void testB4() {
-        T_d2i_1 t = new T_d2i_1();
-        assertEquals(0, t.run(Double.NaN));
-    }
-
-    /**
-     * @title  Argument = POSITIVE_INFINITY
-     */
-    public void testB5() {
-        T_d2i_1 t = new T_d2i_1();
-        assertEquals(Integer.MAX_VALUE, t.run(Double.POSITIVE_INFINITY));
-    }
-
-    /**
-     * @title  Argument = NEGATIVE_INFINITY
-     */
-    public void testB6() {
-        T_d2i_1 t = new T_d2i_1();
-        assertEquals(Integer.MIN_VALUE, t.run(Double.NEGATIVE_INFINITY));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.d2i.jm.T_d2i_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.d2i.jm.T_d2i_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.d2i.jm.T_d2i_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - reference
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.d2i.jm.T_d2i_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2i/jm/T_d2i_1.j b/tools/dx-tests/src/dxc/junit/opcodes/d2i/jm/T_d2i_1.j
deleted file mode 100644
index d14f823..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2i/jm/T_d2i_1.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_d2i_1.java
-.class public dxc/junit/opcodes/d2i/jm/T_d2i_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(D)I
-    .limit stack 3
-    .limit locals 3
-    dload_1
-    d2i
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2i/jm/T_d2i_1.java b/tools/dx-tests/src/dxc/junit/opcodes/d2i/jm/T_d2i_1.java
deleted file mode 100644
index 5d55cac..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2i/jm/T_d2i_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.d2i.jm;
-
-public class T_d2i_1 {
-
-    public int run(double a) {
-        return (int)a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2i/jm/T_d2i_2.j b/tools/dx-tests/src/dxc/junit/opcodes/d2i/jm/T_d2i_2.j
deleted file mode 100644
index f0bd798..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2i/jm/T_d2i_2.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_d2i_2.java
-.class public dxc/junit/opcodes/d2i/jm/T_d2i_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(D)I
-    .limit stack 3
-    .limit locals 3
-
-;    dload_1
-    d2i
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2i/jm/T_d2i_2.java b/tools/dx-tests/src/dxc/junit/opcodes/d2i/jm/T_d2i_2.java
deleted file mode 100644
index 6228cc3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2i/jm/T_d2i_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.d2i.jm;
-
-public class T_d2i_2 {
-
-    public int run(double a) {
-        return (int)a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2i/jm/T_d2i_3.j b/tools/dx-tests/src/dxc/junit/opcodes/d2i/jm/T_d2i_3.j
deleted file mode 100644
index d9be73a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2i/jm/T_d2i_3.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_d2i_3.java
-.class public dxc/junit/opcodes/d2i/jm/T_d2i_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-
-.method public run(F)I
-    .limit stack 2
-    .limit locals 3
- 
-    fload_1
- ;   d2f
-     d2i
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2i/jm/T_d2i_3.java b/tools/dx-tests/src/dxc/junit/opcodes/d2i/jm/T_d2i_3.java
deleted file mode 100644
index a83ae18..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2i/jm/T_d2i_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.d2i.jm;
-
-public class T_d2i_3 {
-
-    public int run(float a) {
-        return (int)a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2i/jm/T_d2i_4.j b/tools/dx-tests/src/dxc/junit/opcodes/d2i/jm/T_d2i_4.j
deleted file mode 100644
index beb0d2f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2i/jm/T_d2i_4.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_d2i_4.java
-.class public dxc/junit/opcodes/d2i/jm/T_d2i_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(J)I
-    .limit stack 2
-    .limit locals 3
-
-    lload_1
-
-    ;l2f
-    d2i
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2i/jm/T_d2i_4.java b/tools/dx-tests/src/dxc/junit/opcodes/d2i/jm/T_d2i_4.java
deleted file mode 100644
index 78aba37..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2i/jm/T_d2i_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.d2i.jm;
-
-public class T_d2i_4 {
-
-    public int run(long a) {
-        return (int)a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2i/jm/T_d2i_5.j b/tools/dx-tests/src/dxc/junit/opcodes/d2i/jm/T_d2i_5.j
deleted file mode 100644
index 9816ceb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2i/jm/T_d2i_5.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_d2i_5.java
-.class public dxc/junit/opcodes/d2i/jm/T_d2i_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(D)I
-    .limit stack 2
-    .limit locals 3
-
-    aload_0
-    d2i
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2i/jm/T_d2i_5.java b/tools/dx-tests/src/dxc/junit/opcodes/d2i/jm/T_d2i_5.java
deleted file mode 100644
index cf5b3ec..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2i/jm/T_d2i_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.d2i.jm;
-
-public class T_d2i_5 {
-    
-    public int run(double a) {
-        return (int)a;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2l/Test_d2l.java b/tools/dx-tests/src/dxc/junit/opcodes/d2l/Test_d2l.java
deleted file mode 100644
index d1bbd05..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2l/Test_d2l.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.d2l;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.d2l.jm.T_d2l_1;
-
-public class Test_d2l extends DxTestCase {
-
-    /**
-     * @title  Argument = 2.9999999
-     */
-    public void testN1() {
-        T_d2l_1 t = new T_d2l_1();
-        assertEquals(2l, t.run(2.9999999d));
-    }
-
-    /**
-     * @title  Argument = 1
-     */
-    public void testN2() {
-        T_d2l_1 t = new T_d2l_1();
-        assertEquals(1l, t.run(1d));
-    }
-
-    /**
-     * @title  Argument = -1
-     */
-    public void testN3() {
-        T_d2l_1 t = new T_d2l_1();
-        assertEquals(-1l, t.run(-1d));
-    }
-
-    /**
-     * @title  Argument = Double.MAX_VALUE
-     */
-    public void testB1() {
-        T_d2l_1 t = new T_d2l_1();
-        assertEquals(Long.MAX_VALUE, t.run(Double.MAX_VALUE));
-    }
-
-    /**
-     * @title  Argument = Double.MIN_VALUE
-     */
-    public void testB2() {
-        T_d2l_1 t = new T_d2l_1();
-        assertEquals(0, t.run(Double.MIN_VALUE));
-    }
-
-    /**
-     * @title  Argument = -0
-     */
-    public void testB3() {
-        T_d2l_1 t = new T_d2l_1();
-        assertEquals(0l, t.run(-0));
-    }
-
-    /**
-     * @title  Argument = NaN
-     */
-    public void testB4() {
-        T_d2l_1 t = new T_d2l_1();
-        assertEquals(0l, t.run(Double.NaN));
-    }
-
-    /**
-     * @title  Argument = POSITIVE_INFINITY
-     */
-    public void testB5() {
-        T_d2l_1 t = new T_d2l_1();
-        assertEquals(Long.MAX_VALUE, t.run(Double.POSITIVE_INFINITY));
-    }
-
-    /**
-     * @title  Argument = NEGATIVE_INFINITY
-     */
-    public void testB6() {
-        T_d2l_1 t = new T_d2l_1();
-        assertEquals(Long.MIN_VALUE, t.run(Double.NEGATIVE_INFINITY));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.d2l.jm.T_d2l_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.d2l.jm.T_d2l_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.d2l.jm.T_d2l_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - reference
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.d2l.jm.T_d2l_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2l/jm/T_d2l_1.j b/tools/dx-tests/src/dxc/junit/opcodes/d2l/jm/T_d2l_1.j
deleted file mode 100644
index 10de4b2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2l/jm/T_d2l_1.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_d2l_1.java
-.class public dxc/junit/opcodes/d2l/jm/T_d2l_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(D)J
-    .limit stack 3
-    .limit locals 3
-    dload_1
-    d2l
-    lreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2l/jm/T_d2l_1.java b/tools/dx-tests/src/dxc/junit/opcodes/d2l/jm/T_d2l_1.java
deleted file mode 100644
index b40863a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2l/jm/T_d2l_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.d2l.jm;
-
-public class T_d2l_1 {
-
-    public long run(double a) {
-        return (long)a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2l/jm/T_d2l_2.j b/tools/dx-tests/src/dxc/junit/opcodes/d2l/jm/T_d2l_2.j
deleted file mode 100644
index 37831f7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2l/jm/T_d2l_2.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_d2l_2.java
-.class public dxc/junit/opcodes/d2l/jm/T_d2l_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(D)J
-    .limit stack 3
-    .limit locals 3
-
-;    dload_1
-    d2l
-
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2l/jm/T_d2l_2.java b/tools/dx-tests/src/dxc/junit/opcodes/d2l/jm/T_d2l_2.java
deleted file mode 100644
index 9985d3e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2l/jm/T_d2l_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.d2l.jm;
-
-public class T_d2l_2 {
-
-    public long run(double a) {
-        return (long)a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2l/jm/T_d2l_3.j b/tools/dx-tests/src/dxc/junit/opcodes/d2l/jm/T_d2l_3.j
deleted file mode 100644
index 0476a8b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2l/jm/T_d2l_3.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_d2l_3.java
-.class public dxc/junit/opcodes/d2l/jm/T_d2l_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(F)J
-    .limit stack 2
-    .limit locals 3
-
-    fload_1
-    d2l
-
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2l/jm/T_d2l_3.java b/tools/dx-tests/src/dxc/junit/opcodes/d2l/jm/T_d2l_3.java
deleted file mode 100644
index 96d73bb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2l/jm/T_d2l_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.d2l.jm;
-
-public class T_d2l_3 {
-
-    public long run(float a) {
-        return (long)a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2l/jm/T_d2l_4.j b/tools/dx-tests/src/dxc/junit/opcodes/d2l/jm/T_d2l_4.j
deleted file mode 100644
index c0551c2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2l/jm/T_d2l_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_d2l_4.java
-.class public dxc/junit/opcodes/d2l/jm/T_d2l_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(J)J
-    .limit stack 3
-    .limit locals 3
-
-    lload_1
-;    l2d
-    d2l
-
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2l/jm/T_d2l_4.java b/tools/dx-tests/src/dxc/junit/opcodes/d2l/jm/T_d2l_4.java
deleted file mode 100644
index 0bb55a3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2l/jm/T_d2l_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.d2l.jm;
-
-public class T_d2l_4 {
-
-    public long run(long a) {
-        return (long)(double)a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2l/jm/T_d2l_5.j b/tools/dx-tests/src/dxc/junit/opcodes/d2l/jm/T_d2l_5.j
deleted file mode 100644
index 262b187..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2l/jm/T_d2l_5.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_d2l_5.java
-.class public dxc/junit/opcodes/d2l/jm/T_d2l_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(D)J
-    .limit stack 2
-    .limit locals 3
-
-    aload_0
-    d2l
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/d2l/jm/T_d2l_5.java b/tools/dx-tests/src/dxc/junit/opcodes/d2l/jm/T_d2l_5.java
deleted file mode 100644
index 049e587..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/d2l/jm/T_d2l_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.d2l.jm;
-
-public class T_d2l_5 {
-    
-    public long run(double a) {
-        return (long)a;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dadd/Test_dadd.java b/tools/dx-tests/src/dxc/junit/opcodes/dadd/Test_dadd.java
deleted file mode 100644
index 891f6ac..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dadd/Test_dadd.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dadd;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.dadd.jm.T_dadd_1;
-
-public class Test_dadd extends DxTestCase {
-
-    /**
-     * @title  Arguments = 2.7d, 3.14d
-     */
-    public void testN1() {
-        T_dadd_1 t = new T_dadd_1();
-        assertEquals(5.84d, t.run(2.7d, 3.14d));
-    }
-
-    /**
-     * @title  Arguments = 0, -3.14d
-     */
-    public void testN2() {
-        T_dadd_1 t = new T_dadd_1();
-        assertEquals(-3.14d, t.run(0, -3.14d));
-    }
-
-    /**
-     * @title Arguments = -3.14d, -2.7d
-     */
-    public void testN3() {
-        T_dadd_1 t = new T_dadd_1();
-        assertEquals(-5.84d, t.run(-3.14d, -2.7d));
-    }
-
-    /**
-     * @title  Arguments = Double.MAX_VALUE, Double.NaN
-     */
-    public void testB1() {
-        T_dadd_1 t = new T_dadd_1();
-        assertEquals(Double.NaN, t.run(Double.MAX_VALUE, Double.NaN));
-    }
-
-    /**
-     * @title  Arguments = Double.POSITIVE_INFINITY,
-     * Double.NEGATIVE_INFINITY
-     */
-    public void testB2() {
-        T_dadd_1 t = new T_dadd_1();
-        assertEquals(Double.NaN, t.run(Double.POSITIVE_INFINITY,
-                Double.NEGATIVE_INFINITY));
-    }
-
-    /**
-     * @title  Arguments = Double.POSITIVE_INFINITY,
-     * Double.POSITIVE_INFINITY
-     */
-    public void testB3() {
-        T_dadd_1 t = new T_dadd_1();
-        assertEquals(Double.POSITIVE_INFINITY, t.run(Double.POSITIVE_INFINITY,
-                Double.POSITIVE_INFINITY));
-    }
-
-    /**
-     * @title  Arguments = Double.POSITIVE_INFINITY, -2.7d
-     */
-    public void testB4() {
-        T_dadd_1 t = new T_dadd_1();
-        assertEquals(Double.POSITIVE_INFINITY, t.run(Double.POSITIVE_INFINITY,
-                -2.7d));
-    }
-
-    /**
-     * @title  Arguments = +0, -0
-     */
-    public void testB5() {
-        T_dadd_1 t = new T_dadd_1();
-        assertEquals(+0d, t.run(+0d, -0d));
-    }
-
-    /**
-     * @title  Arguments = -0d, -0d
-     */
-    public void testB6() {
-        T_dadd_1 t = new T_dadd_1();
-        assertEquals(-0d, t.run(-0d, -0d));
-    }
-
-    /**
-     * @title  Arguments = -2.7d, 2.7d
-     */
-    public void testB7() {
-        T_dadd_1 t = new T_dadd_1();
-        assertEquals(+0d, t.run(-2.7d, 2.7d));
-    }
-
-    /**
-     * @title  Arguments = Double.MAX_VALUE, Double.MAX_VALUE
-     */
-    public void testB8() {
-        T_dadd_1 t = new T_dadd_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_dadd_1 t = new T_dadd_1();
-        assertEquals(0d, t.run(Double.MIN_VALUE, -4.9E-324));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.dadd.jm.T_dadd_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - float, double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.dadd.jm.T_dadd_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long, double
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.dadd.jm.T_dadd_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double, reference
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.dadd.jm.T_dadd_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dadd/jm/T_dadd_1.j b/tools/dx-tests/src/dxc/junit/opcodes/dadd/jm/T_dadd_1.j
deleted file mode 100644
index 34c23af..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dadd/jm/T_dadd_1.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dadd_1.java
-.class public dxc/junit/opcodes/dadd/jm/T_dadd_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(DD)D
-    .limit stack 4
-    .limit locals 5
-    dload_1
-    dload_3
-    dadd
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dadd/jm/T_dadd_1.java b/tools/dx-tests/src/dxc/junit/opcodes/dadd/jm/T_dadd_1.java
deleted file mode 100644
index 5edfe5c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dadd/jm/T_dadd_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dadd.jm;
-
-public class T_dadd_1 {
-
-    public double run(double a, double b) {
-        return a+b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dadd/jm/T_dadd_2.j b/tools/dx-tests/src/dxc/junit/opcodes/dadd/jm/T_dadd_2.j
deleted file mode 100644
index bcfa2a9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dadd/jm/T_dadd_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dadd_2.java
-.class public dxc/junit/opcodes/dadd/jm/T_dadd_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(DD)D
-    .limit stack 4
-    .limit locals 5
-    dload_1
-    ; dload_3    
-    dadd
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dadd/jm/T_dadd_2.java b/tools/dx-tests/src/dxc/junit/opcodes/dadd/jm/T_dadd_2.java
deleted file mode 100644
index bc97e0d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dadd/jm/T_dadd_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dadd.jm;
-
-public class T_dadd_2 {
-
-    public double run(double a, double b) {
-        return a+b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dadd/jm/T_dadd_3.j b/tools/dx-tests/src/dxc/junit/opcodes/dadd/jm/T_dadd_3.j
deleted file mode 100644
index 1318e2d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dadd/jm/T_dadd_3.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dadd_3.java
-.class public dxc/junit/opcodes/dadd/jm/T_dadd_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(FD)D
-    .limit stack 3
-    .limit locals 5
-    fload_1
-    dload_2    
-    dadd
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dadd/jm/T_dadd_3.java b/tools/dx-tests/src/dxc/junit/opcodes/dadd/jm/T_dadd_3.java
deleted file mode 100644
index 640d826..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dadd/jm/T_dadd_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dadd.jm;
-
-public class T_dadd_3 {
-
-    public double run(double a, double b) {
-        return a+(double)b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dadd/jm/T_dadd_4.j b/tools/dx-tests/src/dxc/junit/opcodes/dadd/jm/T_dadd_4.j
deleted file mode 100644
index da1c93f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dadd/jm/T_dadd_4.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dadd_4.java
-.class public dxc/junit/opcodes/dadd/jm/T_dadd_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(JD)D
-    .limit stack 4
-    .limit locals 5
-
-    lload_1
-    dload_3
-    dadd
-
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dadd/jm/T_dadd_4.java b/tools/dx-tests/src/dxc/junit/opcodes/dadd/jm/T_dadd_4.java
deleted file mode 100644
index 8e0f36d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dadd/jm/T_dadd_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dadd.jm;
-
-public class T_dadd_4 {
-
-    public double run(double a, double b) {
-        return (double)a+b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dadd/jm/T_dadd_5.j b/tools/dx-tests/src/dxc/junit/opcodes/dadd/jm/T_dadd_5.j
deleted file mode 100644
index dfea131..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dadd/jm/T_dadd_5.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dadd_5.java
-.class public dxc/junit/opcodes/dadd/jm/T_dadd_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(DD)D
-    .limit stack 4
-    .limit locals 5
-
-    dload_1
-    aload_0
-    dadd
-    dreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dadd/jm/T_dadd_5.java b/tools/dx-tests/src/dxc/junit/opcodes/dadd/jm/T_dadd_5.java
deleted file mode 100644
index fadd2ea..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dadd/jm/T_dadd_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dadd.jm;
-
-public class T_dadd_5 {
-    
-    public double run(double a, double b) {
-        return a+b;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/daload/Test_daload.java b/tools/dx-tests/src/dxc/junit/opcodes/daload/Test_daload.java
deleted file mode 100644
index 9fd9893..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/daload/Test_daload.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.daload;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.daload.jm.T_daload_1;
-
-public class Test_daload extends DxTestCase {
-
-    /**
-     * @title normal test. Trying different indexes
-     */
-    public void testN1() {
-        T_daload_1 t = new T_daload_1();
-        double[] arr = new double[2];
-        arr[1] = 3.1415d;
-        assertEquals(3.1415d, t.run(arr, 1));
-    }
-
-    /**
-     * @title normal test. Trying different indexes
-     */
-    public void testN2() {
-        T_daload_1 t = new T_daload_1();
-        double[] arr = new double[2];
-        arr[0] = 3.1415d;
-        assertEquals(3.1415d, t.run(arr, 0));
-    }
-
-    /**
-     * @title expected ArrayIndexOutOfBoundsException
-     */
-    public void testE1() {
-        T_daload_1 t = new T_daload_1();
-        double[] arr = new double[2];
-        try {
-            t.run(arr, 2);
-            fail("expected ArrayIndexOutOfBoundsException");
-        } catch (ArrayIndexOutOfBoundsException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @title expected NullPointerException
-     */
-    public void testE2() {
-        T_daload_1 t = new T_daload_1();
-        try {
-            t.run(null, 2);
-            fail("expected NullPointerException");
-        } catch (NullPointerException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @title expected ArrayIndexOutOfBoundsException
-     */
-    public void testE3() {
-        T_daload_1 t = new T_daload_1();
-        double[] arr = new double[2];
-        try {
-            t.run(arr, -1);
-            fail("expected ArrayIndexOutOfBoundsException");
-        } catch (ArrayIndexOutOfBoundsException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.daload.jm.T_daload_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.daload.jm.T_daload_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, double
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.daload.jm.T_daload_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, long
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.daload.jm.T_daload_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - Object, int
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.daload.jm.T_daload_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - float[], int
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.daload.jm.T_daload_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long[], int
-     */
-    public void testVFE7() {
-        try {
-            Class.forName("dxc.junit.opcodes.daload.jm.T_daload_8");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, reference
-     */
-    public void testVFE8() {
-        try {
-            Class.forName("dxc.junit.opcodes.daload.jm.T_daload_9");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_1.j b/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_1.j
deleted file mode 100644
index 51f291f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_1.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_daload_1.java
-.class public dxc/junit/opcodes/daload/jm/T_daload_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([DI)D
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_2
-
-    daload
-
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_1.java b/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_1.java
deleted file mode 100644
index 652138a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.daload.jm;
-
-public class T_daload_1 {
-    public double run(double[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_2.j b/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_2.j
deleted file mode 100644
index 21d2c6d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_2.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_daload_2.java
-.class public dxc/junit/opcodes/daload/jm/T_daload_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([DI)D
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-;    iload_2
-
-    daload
-
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_2.java b/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_2.java
deleted file mode 100644
index 666682d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_2.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.daload.jm;
-
-public class T_daload_2 {
-
-    public double run(double[] arr, int idx) {
-        return arr[idx];
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_3.j b/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_3.j
deleted file mode 100644
index 5a695a6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_3.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_daload_3.java
-.class public dxc/junit/opcodes/daload/jm/T_daload_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([DI)D
-    .limit stack 3
-    .limit locals 4
-
-    ;aload_1
-    iload_2
-    daload
-
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_3.java b/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_3.java
deleted file mode 100644
index 2f8da59..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_3.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.daload.jm;
-
-public class T_daload_3 {
-
-    public double run(double[] arr, int idx) {
-        return arr[idx];
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_4.j b/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_4.j
deleted file mode 100644
index d7bd17e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_4.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_daload_4.java
-.class public dxc/junit/opcodes/daload/jm/T_daload_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run([DD)D
-    .limit stack 4
-    .limit locals 5
-
-    aload_1
-    dload_2
-;    d2i
-    daload
-
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_4.java b/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_4.java
deleted file mode 100644
index 9572731..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_4.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.daload.jm;
-
-public class T_daload_4 {
-
-    public double run(double[] arr, double idx) {
-        return arr[(int)idx];
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_5.j b/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_5.j
deleted file mode 100644
index f2025aa..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_5.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_daload_5.java
-.class public dxc/junit/opcodes/daload/jm/T_daload_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run([DJ)D
-    .limit stack 4
-    .limit locals 5
-
-    aload_1
-    lload_2
-;    l2f
-    daload
-
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_5.java b/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_5.java
deleted file mode 100644
index 5dd8ee1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.daload.jm;
-
-public class T_daload_5 {
-
-    public double run(double[] arr, long idx) {
-        return arr[(int)idx];
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_6.j b/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_6.j
deleted file mode 100644
index 52caafd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_6.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_daload_6.java
-.class public dxc/junit/opcodes/daload/jm/T_daload_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/Object;[DI)D
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_3
-
-    daload
-
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_6.java b/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_6.java
deleted file mode 100644
index 3632e5b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.daload.jm;
-
-public class T_daload_6 {
-
-    public double run(Object a, double[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_7.j b/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_7.j
deleted file mode 100644
index 694971e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_7.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_daload_7.java
-.class public dxc/junit/opcodes/daload/jm/T_daload_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run([D[FI)D
-    .limit stack 2
-    .limit locals 4
-    aload_2
-    iload_3
-    daload
-
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_7.java b/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_7.java
deleted file mode 100644
index eac7cd2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.daload.jm;
-
-public class T_daload_7 {
-
-    public double run(double[] a, double[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_8.j b/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_8.j
deleted file mode 100644
index ef9a1a3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_8.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_daload_8.java
-.class public dxc/junit/opcodes/daload/jm/T_daload_8
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run([J[DI)D
-    .limit stack 2
-    .limit locals 4
-    aload_1
-    iload_3
-    daload
-
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_8.java b/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_8.java
deleted file mode 100644
index 994a158..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.daload.jm;
-
-public class T_daload_8 {
-
-    public double run(long[] a, double[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_9.j b/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_9.j
deleted file mode 100644
index fa0ef03..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_9.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_daload_9.java
-.class public dxc/junit/opcodes/daload/jm/T_daload_9
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([DI)D
-    .limit stack 2
-    .limit locals 3
-
-    aload_1
-    aload_0
-    daload
-    dreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_9.java b/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_9.java
deleted file mode 100644
index 440e7a2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/daload/jm/T_daload_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.daload.jm;
-
-public class T_daload_9 {
-    
-    public double run(double[] arr, int idx) {
-        return arr[idx];
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dastore/Test_dastore.java b/tools/dx-tests/src/dxc/junit/opcodes/dastore/Test_dastore.java
deleted file mode 100644
index 223d812..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dastore/Test_dastore.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dastore;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.dastore.jm.T_dastore_1;
-
-public class Test_dastore extends DxTestCase {
-
-    /**
-     * @title normal test. Trying different indexes
-     */
-    public void testN1() {
-        T_dastore_1 t = new T_dastore_1();
-        double[] arr = new double[2];
-        t.run(arr, 1, 2.7d);
-        assertEquals(2.7d, arr[1]);
-    }
-
-    /**
-     * @title normal test. Trying different indexes
-     */
-    public void testN2() {
-        T_dastore_1 t = new T_dastore_1();
-        double[] arr = new double[2];
-        t.run(arr, 0, 2.7d);
-        assertEquals(2.7d, arr[0]);
-    }
-
-    /**
-     * @title expected ArrayIndexOutOfBoundsException
-     */
-    public void testE1() {
-        T_dastore_1 t = new T_dastore_1();
-        double[] arr = new double[2];
-        try {
-            t.run(arr, 2, 2.7d);
-            fail("expected ArrayIndexOutOfBoundsException");
-        } catch (ArrayIndexOutOfBoundsException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @title expected NullPointerException
-     */
-    public void testE2() {
-        T_dastore_1 t = new T_dastore_1();
-        try {
-            t.run(null, 2, 2.7d);
-            fail("expected NullPointerException");
-        } catch (NullPointerException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @title expected ArrayIndexOutOfBoundsException
-     */
-    public void testE3() {
-        T_dastore_1 t = new T_dastore_1();
-        double[] arr = new double[2];
-        try {
-            t.run(arr, -1, 2.7d);
-            fail("expected ArrayIndexOutOfBoundsException");
-        } catch (ArrayIndexOutOfBoundsException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.dastore.jm.T_dastore_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.dastore.jm.T_dastore_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, double,
-     * double
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.dastore.jm.T_dastore_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, int, long
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.dastore.jm.T_dastore_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - object, int,
-     * double
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.dastore.jm.T_dastore_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - float[], int,
-     * double
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.dastore.jm.T_dastore_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long[], int,
-     * double
-     */
-    public void testVFE7() {
-        try {
-            Class.forName("dxc.junit.opcodes.dastore.jm.T_dastore_8");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, reference,
-     * double
-     */
-    public void testVFE8() {
-        try {
-            Class.forName("dxc.junit.opcodes.dastore.jm.T_dastore_9");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_1.j b/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_1.j
deleted file mode 100644
index 5088f55..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_1.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dastore_1.java
-.class public dxc/junit/opcodes/dastore/jm/T_dastore_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([DID)V
-    .limit stack 4
-    .limit locals 5
-
-    aload_1
-    iload_2
-    dload_3
-    dastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_1.java b/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_1.java
deleted file mode 100644
index 927890e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dastore.jm;
-
-public class T_dastore_1 {
-    public void run(double[] arr, int idx, double value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_2.j b/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_2.j
deleted file mode 100644
index 2e663f6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_2.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dastore_2.java
-.class public dxc/junit/opcodes/dastore/jm/T_dastore_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([DID)V
-    .limit stack 3
-    .limit locals 5
-
-    aload_1
-    iload_2
-    ;dload_3
-    dastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_2.java b/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_2.java
deleted file mode 100644
index fac0a98..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dastore.jm;
-
-public class T_dastore_2 {
-
-    public void run(double[] arr, int idx, double value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_3.j b/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_3.j
deleted file mode 100644
index a2a2b00..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_3.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dastore_3.java
-.class public dxc/junit/opcodes/dastore/jm/T_dastore_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([DID)V
-    .limit stack 3
-    .limit locals 5
-
-    ;aload_1
-    iload_2
-    dload_3
-    dastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_3.java b/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_3.java
deleted file mode 100644
index c6fc58c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dastore.jm;
-
-public class T_dastore_3 {
-
-    public void run(double[] arr, int idx, double value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_4.j b/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_4.j
deleted file mode 100644
index 38e7bab..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_4.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dastore_4.java
-.class public dxc/junit/opcodes/dastore/jm/T_dastore_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run([DDD)V
-    .limit stack 6
-    .limit locals 6
-
-    aload_1
-    dload_2
-;    d2i
-    dload 4
-
-    dastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_4.java b/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_4.java
deleted file mode 100644
index 4d368a2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dastore.jm;
-
-public class T_dastore_4 {
-
-    public void run(double[] arr, double idx, double value) {
-        arr[(int)idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_5.j b/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_5.j
deleted file mode 100644
index cf5f55e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_5.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dastore_5.java
-.class public dxc/junit/opcodes/dastore/jm/T_dastore_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run([DIJ)V
-    .limit stack 4
-    .limit locals 5
-
-    aload_1
-    iload_2
-    lload_3
-;    l2f
-    dastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_5.java b/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_5.java
deleted file mode 100644
index c5b7ff8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dastore.jm;
-
-public class T_dastore_5 {
-
-    public void run(double[] arr, int idx, double value) {
-        arr[idx] = (double)value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_6.j b/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_6.j
deleted file mode 100644
index f3eace3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_6.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dastore_6.java
-.class public dxc/junit/opcodes/dastore/jm/T_dastore_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/Object;ID)V
-    .limit stack 4
-    .limit locals 6
-
-    aload_1
-    iload_2
-    dload_3
-    dastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_6.java b/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_6.java
deleted file mode 100644
index cbbf398..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dastore.jm;
-
-public class T_dastore_6 {
-
-    public void run(Object a, double[] arr, int idx, double value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_7.j b/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_7.j
deleted file mode 100644
index 0ad9369..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_7.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dastore_7.java
-.class public dxc/junit/opcodes/dastore/jm/T_dastore_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([D[FID)V
-    .limit stack 4
-    .limit locals 6
-    
-    aload_2
-    iload_3
-    dload 4
-    dastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_7.java b/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_7.java
deleted file mode 100644
index f6225df..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dastore.jm;
-
-public class T_dastore_7 {
-
-    public void run(double a[], float[] arr, int idx, double value) {
-        a[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_8.j b/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_8.j
deleted file mode 100644
index c04e9a1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_8.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dastore_8.java
-.class public dxc/junit/opcodes/dastore/jm/T_dastore_8
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([J[DID)V
-    .limit stack 4
-    .limit locals 6
-    
-    aload_1
-    iload_3
-    dload 4
-    dastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_8.java b/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_8.java
deleted file mode 100644
index 705e711..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dastore.jm;
-
-public class T_dastore_8 {
-
-    public void run(long a[], double[] arr, int idx, double value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_9.j b/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_9.j
deleted file mode 100644
index b8ef436..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_9.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dastore_9.java
-.class public dxc/junit/opcodes/dastore/jm/T_dastore_9
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([DID)V
-    .limit stack 4
-    .limit locals 5
-
-    aload_1
-    aload_0
-    dload_3
-    dastore
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_9.java b/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_9.java
deleted file mode 100644
index af682a1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dastore/jm/T_dastore_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dastore.jm;
-
-public class T_dastore_9 {
-    
-    public void run(double[] arr, int idx, double value) {
-        arr[idx] = value;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/Test_dcmpg.java b/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/Test_dcmpg.java
deleted file mode 100644
index bb99cd7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/Test_dcmpg.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dcmpg;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.dcmpg.jm.T_dcmpg_1;
-
-public class Test_dcmpg extends DxTestCase {
-
-    /**
-     * @title  Arguments = 3.14d, 2.7d
-     */
-    public void testN1() {
-        T_dcmpg_1 t = new T_dcmpg_1();
-        assertEquals(1, t.run(3.14d, 2.7d));
-    }
-
-    /**
-     * @title  Arguments = -3.14d, 2.7d
-     */
-    public void testN2() {
-        T_dcmpg_1 t = new T_dcmpg_1();
-        assertEquals(-1, t.run(-3.14d, 2.7d));
-    }
-
-    /**
-     * @title  Arguments = 3.14, 3.14
-     */
-    public void testN3() {
-        T_dcmpg_1 t = new T_dcmpg_1();
-        assertEquals(0, t.run(3.14d, 3.14d));
-    }
-
-    /**
-     * @title  Arguments = Double.NaN, Double.MAX_VALUE
-     */
-    public void testB1() {
-        T_dcmpg_1 t = new T_dcmpg_1();
-        assertEquals(1, t.run(Double.NaN, Double.MAX_VALUE));
-    }
-
-    /**
-     * @title  Arguments = +0, -0
-     */
-    public void testB2() {
-        T_dcmpg_1 t = new T_dcmpg_1();
-        assertEquals(0, t.run(+0f, -0f));
-    }
-
-    /**
-     * @title  Arguments = Double.NEGATIVE_INFINITY, Double.MIN_VALUE
-     */
-    public void testB3() {
-        T_dcmpg_1 t = new T_dcmpg_1();
-        assertEquals(-1, t.run(Double.NEGATIVE_INFINITY, Double.MIN_VALUE));
-    }
-
-    /**
-     * @title  Arguments = Double.POSITIVE_INFINITY, Double.MAX_VALUE
-     */
-    public void testB4() {
-        T_dcmpg_1 t = new T_dcmpg_1();
-        assertEquals(1, t.run(Double.POSITIVE_INFINITY, Double.MAX_VALUE));
-    }
-
-    /**
-     * @title  Arguments = Double.POSITIVE_INFINITY,
-     * Double.NEGATIVE_INFINITY
-     */
-    public void testB5() {
-        T_dcmpg_1 t = new T_dcmpg_1();
-        assertEquals(1, t.run(Double.POSITIVE_INFINITY,
-                Double.NEGATIVE_INFINITY));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.dcmpg.jm.T_dcmpg_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double, float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.dcmpg.jm.T_dcmpg_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long, double
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.dcmpg.jm.T_dcmpg_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double, reference
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.dcmpg.jm.T_dcmpg_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/jm/T_dcmpg_1.j b/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/jm/T_dcmpg_1.j
deleted file mode 100644
index 788ed13..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/jm/T_dcmpg_1.j
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dcmpg_1.java
-.class public dxc/junit/opcodes/dcmpg/jm/T_dcmpg_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(DD)I
-    .limit stack 4
-    .limit locals 6
-    
-    dload_1
-    dload_3
-    
-    dcmpg 
-    dup
-    ifeq Label0
-    ifgt Label1
-    
-    iconst_m1
-    ireturn
-    
-    Label0:
-    iconst_0
-    ireturn
-
-    Label1:
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/jm/T_dcmpg_1.java b/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/jm/T_dcmpg_1.java
deleted file mode 100644
index 4b9e6c1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/jm/T_dcmpg_1.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dcmpg.jm;
-
-public class T_dcmpg_1 {
-
-    public int run(double a, double b) {
-        if(a > b)
-            return 1;
-        if(a == b)
-            return 0;
-        return -1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/jm/T_dcmpg_2.j b/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/jm/T_dcmpg_2.j
deleted file mode 100644
index e8d237d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/jm/T_dcmpg_2.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dcmpg_2.java
-.class public dxc/junit/opcodes/dcmpg/jm/T_dcmpg_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(DD)Z
-    .limit stack 4
-    .limit locals 6
-
-    dload_1
-;    fload_3
-    dcmpg
-    ifne Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/jm/T_dcmpg_2.java b/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/jm/T_dcmpg_2.java
deleted file mode 100644
index 6ff5dff..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/jm/T_dcmpg_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dcmpg.jm;
-
-public class T_dcmpg_2 {
-
-    public boolean run(double a, double b) {
-        return a > b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/jm/T_dcmpg_3.j b/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/jm/T_dcmpg_3.j
deleted file mode 100644
index fb5f6d7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/jm/T_dcmpg_3.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dcmpg_3.java
-.class public dxc/junit/opcodes/dcmpg/jm/T_dcmpg_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(DD)Z
-    .limit stack 4
-    .limit locals 6
-
-    dload_1
-    fconst_1
-    dcmpg 
-    ifne Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/jm/T_dcmpg_3.java b/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/jm/T_dcmpg_3.java
deleted file mode 100644
index 1101f00..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/jm/T_dcmpg_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dcmpg.jm;
-
-public class T_dcmpg_3 {
-
-    public boolean run(double a, double b) {
-        return a > b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/jm/T_dcmpg_4.j b/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/jm/T_dcmpg_4.j
deleted file mode 100644
index 8e23715..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/jm/T_dcmpg_4.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dcmpg_4.java
-.class public dxc/junit/opcodes/dcmpg/jm/T_dcmpg_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(DD)Z
-    .limit stack 4
-    .limit locals 6
-
-    lconst_1    
-    dload_1
-
-    dcmpg 
-    ifne Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/jm/T_dcmpg_4.java b/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/jm/T_dcmpg_4.java
deleted file mode 100644
index ae2d937..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/jm/T_dcmpg_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dcmpg.jm;
-
-public class T_dcmpg_4 {
-
-    public boolean run(double a, double b) {
-        return a > b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/jm/T_dcmpg_5.j b/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/jm/T_dcmpg_5.j
deleted file mode 100644
index 9f9d92f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/jm/T_dcmpg_5.j
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dcmpg_5.java
-.class public dxc/junit/opcodes/dcmpg/jm/T_dcmpg_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(DD)Z
-    .limit stack 4
-    .limit locals 5
-
-    dload_1
-    aload_0
-    dcmpl
-    ifle Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-
-    Label2:
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/jm/T_dcmpg_5.java b/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/jm/T_dcmpg_5.java
deleted file mode 100644
index 45663f8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dcmpg/jm/T_dcmpg_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dcmpg.jm;
-
-public class T_dcmpg_5 {
-    
-    public boolean run(double a, double b) {
-        return a > b;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/Test_dcmpl.java b/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/Test_dcmpl.java
deleted file mode 100644
index 045c181..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/Test_dcmpl.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dcmpl;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.dcmpl.jm.T_dcmpl_1;
-
-public class Test_dcmpl extends DxTestCase {
-
-    /**
-     * @title  Arguments = 3.14d, 2.7d
-     */
-    public void testN1() {
-        T_dcmpl_1 t = new T_dcmpl_1();
-        assertEquals(1, t.run(3.14d, 2.7d));
-    }
-
-    /**
-     * @title  Arguments = -3.14d, 2.7d
-     */
-    public void testN2() {
-        T_dcmpl_1 t = new T_dcmpl_1();
-        assertEquals(-1, t.run(-3.14d, 2.7d));
-    }
-
-    /**
-     * @title  Arguments = 3.14, 3.14
-     */
-    public void testN3() {
-        T_dcmpl_1 t = new T_dcmpl_1();
-        assertEquals(0, t.run(3.14d, 3.14d));
-    }
-
-    /**
-     * @title  Arguments = Double.NaN, Double.MAX_VALUE
-     */
-    public void testB1() {
-        T_dcmpl_1 t = new T_dcmpl_1();
-        assertEquals(-1, t.run(Double.NaN, Double.MAX_VALUE));
-    }
-
-    /**
-     * @title  Arguments = +0, -0
-     */
-    public void testB2() {
-        T_dcmpl_1 t = new T_dcmpl_1();
-        assertEquals(0, t.run(+0f, -0f));
-    }
-
-    /**
-     * @title  Arguments = Double.NEGATIVE_INFINITY, Double.MIN_VALUE
-     */
-    public void testB3() {
-        T_dcmpl_1 t = new T_dcmpl_1();
-        assertEquals(-1, t.run(Double.NEGATIVE_INFINITY, Double.MIN_VALUE));
-    }
-
-    /**
-     * @title  Arguments = Double.POSITIVE_INFINITY, Double.MAX_VALUE
-     */
-    public void testB4() {
-        T_dcmpl_1 t = new T_dcmpl_1();
-        assertEquals(1, t.run(Double.POSITIVE_INFINITY, Double.MAX_VALUE));
-    }
-
-    /**
-     * @title  Arguments = Double.POSITIVE_INFINITY,
-     * Double.NEGATIVE_INFINITY
-     */
-    public void testB5() {
-        T_dcmpl_1 t = new T_dcmpl_1();
-        assertEquals(1, t.run(Double.POSITIVE_INFINITY,
-                Double.NEGATIVE_INFINITY));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.dcmpl.jm.T_dcmpl_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double, float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.dcmpl.jm.T_dcmpl_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long, double
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.dcmpl.jm.T_dcmpl_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double, reference
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.dcmpl.jm.T_dcmpl_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/jm/T_dcmpl_1.j b/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/jm/T_dcmpl_1.j
deleted file mode 100644
index 35b12a4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/jm/T_dcmpl_1.j
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dcmpl_1.java
-.class public dxc/junit/opcodes/dcmpl/jm/T_dcmpl_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(DD)I
-    .limit stack 4
-    .limit locals 6
-    
-    dload_1
-    dload_3
-    
-    dcmpl 
-    dup
-    ifeq Label0
-    ifgt Label1
-    
-    iconst_m1
-    ireturn
-    
-    Label0:
-    iconst_0
-    ireturn
-
-    Label1:
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/jm/T_dcmpl_1.java b/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/jm/T_dcmpl_1.java
deleted file mode 100644
index 7effb95..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/jm/T_dcmpl_1.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dcmpl.jm;
-
-public class T_dcmpl_1 {
-
-    public int run(double a, double b) {
-        if(a > b)
-            return 1;
-        if(a == b)
-            return 0;
-        return -1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/jm/T_dcmpl_2.j b/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/jm/T_dcmpl_2.j
deleted file mode 100644
index d4fa52c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/jm/T_dcmpl_2.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dcmpl_2.java
-.class public dxc/junit/opcodes/dcmpl/jm/T_dcmpl_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(DD)Z
-    .limit stack 4
-    .limit locals 6
-
-    dload_1
-;    fload_3
-    dcmpl
-    ifne Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/jm/T_dcmpl_2.java b/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/jm/T_dcmpl_2.java
deleted file mode 100644
index 583256a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/jm/T_dcmpl_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dcmpl.jm;
-
-public class T_dcmpl_2 {
-
-    public boolean run(double a, double b) {
-        return a > b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/jm/T_dcmpl_3.j b/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/jm/T_dcmpl_3.j
deleted file mode 100644
index 4db6e33..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/jm/T_dcmpl_3.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dcmpl_3.java
-.class public dxc/junit/opcodes/dcmpl/jm/T_dcmpl_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(DD)Z
-    .limit stack 4
-    .limit locals 6
-
-    dload_1
-    fconst_1
-    dcmpl 
-    ifne Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/jm/T_dcmpl_3.java b/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/jm/T_dcmpl_3.java
deleted file mode 100644
index fdb3329..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/jm/T_dcmpl_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dcmpl.jm;
-
-public class T_dcmpl_3 {
-
-    public boolean run(double a, double b) {
-        return a > b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/jm/T_dcmpl_4.j b/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/jm/T_dcmpl_4.j
deleted file mode 100644
index 7b18e83..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/jm/T_dcmpl_4.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dcmpl_4.java
-.class public dxc/junit/opcodes/dcmpl/jm/T_dcmpl_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(DD)Z
-    .limit stack 4
-    .limit locals 6
-
-    lconst_1    
-    dload_1
-
-    dcmpl 
-    ifne Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/jm/T_dcmpl_4.java b/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/jm/T_dcmpl_4.java
deleted file mode 100644
index f2a8b24..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/jm/T_dcmpl_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dcmpl.jm;
-
-public class T_dcmpl_4 {
-
-    public boolean run(double a, double b) {
-        return a > b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/jm/T_dcmpl_5.j b/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/jm/T_dcmpl_5.j
deleted file mode 100644
index 56d80b9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/jm/T_dcmpl_5.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dcmpl_5.java
-.class public dxc/junit/opcodes/dcmpl/jm/T_dcmpl_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(DD)Z
-    .limit stack 4
-    .limit locals 5
-
-    dload_1
-    aload_0
-    dcmpl
-    ifle Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-
-    Label2:
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/jm/T_dcmpl_5.java b/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/jm/T_dcmpl_5.java
deleted file mode 100644
index 79d1bf8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dcmpl/jm/T_dcmpl_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dcmpl.jm;
-
-public class T_dcmpl_5 {
-    
-    public boolean run(double a, double b) {
-        return a > b;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dconst_0/Test_dconst_0.java b/tools/dx-tests/src/dxc/junit/opcodes/dconst_0/Test_dconst_0.java
deleted file mode 100644
index 1dc0718..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dconst_0/Test_dconst_0.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dconst_0;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.dconst_0.jm.T_dconst_0_1;
-
-public class Test_dconst_0 extends DxTestCase {
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_dconst_0_1 t = new T_dconst_0_1();
-        double b = 1234d;
-        double c = 1234d;
-        double d = b - c;
-        assertEquals(d, t.run());
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.dconst_0.jm.T_dconst_0_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dconst_0/jm/T_dconst_0_1.j b/tools/dx-tests/src/dxc/junit/opcodes/dconst_0/jm/T_dconst_0_1.j
deleted file mode 100644
index c6b15b8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dconst_0/jm/T_dconst_0_1.j
+++ /dev/null
@@ -1,29 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dconst_0_1.java
-.class public dxc/junit/opcodes/dconst_0/jm/T_dconst_0_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()D
-    .limit stack 2
-    dconst_0
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dconst_0/jm/T_dconst_0_1.java b/tools/dx-tests/src/dxc/junit/opcodes/dconst_0/jm/T_dconst_0_1.java
deleted file mode 100644
index bb40485..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dconst_0/jm/T_dconst_0_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dconst_0.jm;
-
-public class T_dconst_0_1 {
-
-    public double run() {
-        return 0d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dconst_0/jm/T_dconst_0_2.j b/tools/dx-tests/src/dxc/junit/opcodes/dconst_0/jm/T_dconst_0_2.j
deleted file mode 100644
index 163d026..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dconst_0/jm/T_dconst_0_2.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dconst_0_2.java
-.class public dxc/junit/opcodes/dconst_0/jm/T_dconst_0_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()D
-    .limit stack 1
-;    .limit locals 1
-
-    dconst_0
-    dconst_0
-
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dconst_0/jm/T_dconst_0_2.java b/tools/dx-tests/src/dxc/junit/opcodes/dconst_0/jm/T_dconst_0_2.java
deleted file mode 100644
index 47856ed..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dconst_0/jm/T_dconst_0_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dconst_0.jm;
-
-public class T_dconst_0_2 {
-
-    public double run() {
-        return 0d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dconst_1/Test_dconst_1.java b/tools/dx-tests/src/dxc/junit/opcodes/dconst_1/Test_dconst_1.java
deleted file mode 100644
index 2b15a2d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dconst_1/Test_dconst_1.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dconst_1;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.dconst_1.jm.T_dconst_1_1;
-
-public class Test_dconst_1 extends DxTestCase {
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_dconst_1_1 t = new T_dconst_1_1();
-        double b = 1235d;
-        double c = 1234d;
-        double d = b - c;
-        assertEquals(d, t.run());
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.dconst_1.jm.T_dconst_1_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dconst_1/jm/T_dconst_1_1.j b/tools/dx-tests/src/dxc/junit/opcodes/dconst_1/jm/T_dconst_1_1.j
deleted file mode 100644
index 2636b26..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dconst_1/jm/T_dconst_1_1.j
+++ /dev/null
@@ -1,29 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dconst_1_1.java
-.class public dxc/junit/opcodes/dconst_1/jm/T_dconst_1_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()D
-    .limit stack 2
-    dconst_1
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dconst_1/jm/T_dconst_1_1.java b/tools/dx-tests/src/dxc/junit/opcodes/dconst_1/jm/T_dconst_1_1.java
deleted file mode 100644
index a332a75..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dconst_1/jm/T_dconst_1_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dconst_1.jm;
-
-public class T_dconst_1_1 {
-
-    public double run() {
-        return 0d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dconst_1/jm/T_dconst_1_2.j b/tools/dx-tests/src/dxc/junit/opcodes/dconst_1/jm/T_dconst_1_2.j
deleted file mode 100644
index 9a17a14..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dconst_1/jm/T_dconst_1_2.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dconst_1_2.java
-.class public dxc/junit/opcodes/dconst_1/jm/T_dconst_1_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()D
-    .limit stack 1
-;    .limit locals 1
-
-    dconst_1
-    dconst_1
-
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dconst_1/jm/T_dconst_1_2.java b/tools/dx-tests/src/dxc/junit/opcodes/dconst_1/jm/T_dconst_1_2.java
deleted file mode 100644
index 88726ac..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dconst_1/jm/T_dconst_1_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dconst_1.jm;
-
-public class T_dconst_1_2 {
-
-    public double run() {
-        return 0d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ddiv/Test_ddiv.java b/tools/dx-tests/src/dxc/junit/opcodes/ddiv/Test_ddiv.java
deleted file mode 100644
index e97558a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ddiv/Test_ddiv.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ddiv;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.ddiv.jm.T_ddiv_1;
-
-public class Test_ddiv extends DxTestCase {
-
-    /**
-     * @title Arguments = 2.7d, 3.14d
-     */
-    public void testN1() {
-
-        T_ddiv_1 t = new T_ddiv_1();
-        assertEquals(0.8598726114649682d, t.run(2.7d, 3.14d));
-    }
-
-    /**
-     * @title  Dividend = 0
-     */
-    public void testN2() {
-        T_ddiv_1 t = new T_ddiv_1();
-        assertEquals(0d, t.run(0, 3.14d));
-    }
-
-    /**
-     * @title  Dividend is negative
-     */
-    public void testN3() {
-
-        T_ddiv_1 t = new T_ddiv_1();
-        assertEquals(-1.162962962962963d, t.run(-3.14d, 2.7d));
-    }
-
-    /**
-     * @title  Dividend is negative
-     */
-    public void testN4() {
-
-        T_ddiv_1 t = new T_ddiv_1();
-        assertEquals(-1.162962962962963d, t.run(-3.14d, 2.7d));
-    }
-
-    /**
-     * @title  Arguments = Double.POSITIVE_INFINITY,
-     * Double.NEGATIVE_INFINITY
-     */
-    public void testB2() {
-        T_ddiv_1 t = new T_ddiv_1();
-        assertEquals(Double.NaN, t.run(Double.POSITIVE_INFINITY,
-                Double.NEGATIVE_INFINITY));
-    }
-
-    /**
-     * @title  Arguments = Double.POSITIVE_INFINITY, -2.7d
-     */
-    public void testB3() {
-        T_ddiv_1 t = new T_ddiv_1();
-        assertEquals(Double.NEGATIVE_INFINITY, t.run(Double.POSITIVE_INFINITY,
-                -2.7d));
-    }
-
-    /**
-     * @title  Arguments = -2.7d, Double.NEGATIVE_INFINITY
-     */
-    public void testB4() {
-        T_ddiv_1 t = new T_ddiv_1();
-        assertEquals(0d, t.run(-2.7d, Double.NEGATIVE_INFINITY));
-    }
-
-    /**
-     * @title  Arguments = 0, 0
-     */
-    public void testB5() {
-        T_ddiv_1 t = new T_ddiv_1();
-        assertEquals(Double.NaN, t.run(0, 0));
-    }
-
-    /**
-     * @title  Arguments = 0, -2.7
-     */
-    public void testB6() {
-        T_ddiv_1 t = new T_ddiv_1();
-        assertEquals(-0d, t.run(0, -2.7d));
-    }
-
-    /**
-     * @title  Arguments = -2.7, 0
-     */
-    public void testB7() {
-        T_ddiv_1 t = new T_ddiv_1();
-        assertEquals(Double.NEGATIVE_INFINITY, t.run(-2.7d, 0));
-    }
-
-    /**
-     * @title  Arguments = 1, Double.MAX_VALUE
-     */
-    public void testB8() {
-        T_ddiv_1 t = new T_ddiv_1();
-        assertEquals(Double.POSITIVE_INFINITY, t.run(1, Double.MIN_VALUE));
-    }
-
-    /**
-     * @title  Arguments = Double.MAX_VALUE, -1E-9f
-     */
-    public void testB9() {
-        T_ddiv_1 t = new T_ddiv_1();
-        assertEquals(Double.NEGATIVE_INFINITY, t.run(Double.MAX_VALUE, -1E-9f));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.ddiv.jm.T_ddiv_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - float / double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.ddiv.jm.T_ddiv_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long / double
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.ddiv.jm.T_ddiv_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double /
-     * reference
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.ddiv.jm.T_ddiv_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ddiv/jm/T_ddiv_1.j b/tools/dx-tests/src/dxc/junit/opcodes/ddiv/jm/T_ddiv_1.j
deleted file mode 100644
index 97285f5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ddiv/jm/T_ddiv_1.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ddiv_1.java
-.class public dxc/junit/opcodes/ddiv/jm/T_ddiv_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(DD)D
-    .limit stack 4
-    .limit locals 5
-    dload_1
-    dload_3
-    ddiv
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ddiv/jm/T_ddiv_1.java b/tools/dx-tests/src/dxc/junit/opcodes/ddiv/jm/T_ddiv_1.java
deleted file mode 100644
index bb7e5d5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ddiv/jm/T_ddiv_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ddiv.jm;
-
-public class T_ddiv_1 {
-
-    public double run(double a, double b) {
-        return a/b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ddiv/jm/T_ddiv_2.j b/tools/dx-tests/src/dxc/junit/opcodes/ddiv/jm/T_ddiv_2.j
deleted file mode 100644
index fd03c32..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ddiv/jm/T_ddiv_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ddiv_2.java
-.class public dxc/junit/opcodes/ddiv/jm/T_ddiv_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(DD)D
-    .limit stack 4
-    .limit locals 5
-    dload_1
-    ; dload_3
-    ddiv
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ddiv/jm/T_ddiv_2.java b/tools/dx-tests/src/dxc/junit/opcodes/ddiv/jm/T_ddiv_2.java
deleted file mode 100644
index a3c1b12..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ddiv/jm/T_ddiv_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ddiv.jm;
-
-public class T_ddiv_2 {
-
-    public double run(double a, double b) {
-        return a/b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ddiv/jm/T_ddiv_3.j b/tools/dx-tests/src/dxc/junit/opcodes/ddiv/jm/T_ddiv_3.j
deleted file mode 100644
index 1d5da57..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ddiv/jm/T_ddiv_3.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ddiv_3.java
-.class public dxc/junit/opcodes/ddiv/jm/T_ddiv_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(FD)D
-    .limit stack 3
-    .limit locals 5
-    fload_1
-    dload_2    
-    ddiv
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ddiv/jm/T_ddiv_3.java b/tools/dx-tests/src/dxc/junit/opcodes/ddiv/jm/T_ddiv_3.java
deleted file mode 100644
index 8fc4917..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ddiv/jm/T_ddiv_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ddiv.jm;
-
-public class T_ddiv_3 {
-
-    public double run(float a, double b) {
-        return (double)a/b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ddiv/jm/T_ddiv_4.j b/tools/dx-tests/src/dxc/junit/opcodes/ddiv/jm/T_ddiv_4.j
deleted file mode 100644
index 037c781..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ddiv/jm/T_ddiv_4.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ddiv_4.java
-.class public dxc/junit/opcodes/ddiv/jm/T_ddiv_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(JD)D
-    .limit stack 4
-    .limit locals 5
-
-    lload_1
-    dload_3
-    ddiv
-
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ddiv/jm/T_ddiv_4.java b/tools/dx-tests/src/dxc/junit/opcodes/ddiv/jm/T_ddiv_4.java
deleted file mode 100644
index 3861a04..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ddiv/jm/T_ddiv_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ddiv.jm;
-
-public class T_ddiv_4 {
-
-    public double run(long a, double b) {
-        return (double)a/b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ddiv/jm/T_ddiv_5.j b/tools/dx-tests/src/dxc/junit/opcodes/ddiv/jm/T_ddiv_5.j
deleted file mode 100644
index f7d28aa..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ddiv/jm/T_ddiv_5.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ddiv_5.java
-.class public dxc/junit/opcodes/ddiv/jm/T_ddiv_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(DD)D
-    .limit stack 4
-    .limit locals 5
-
-    dload_1
-    aload_0
-    ddiv
-    dreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ddiv/jm/T_ddiv_5.java b/tools/dx-tests/src/dxc/junit/opcodes/ddiv/jm/T_ddiv_5.java
deleted file mode 100644
index 51f30d3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ddiv/jm/T_ddiv_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ddiv.jm;
-
-public class T_ddiv_5 {
-    
-    public double run(double a, double b) {
-        return a/b;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload/Test_dload.java b/tools/dx-tests/src/dxc/junit/opcodes/dload/Test_dload.java
deleted file mode 100644
index 87607ca..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload/Test_dload.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.dload.jm.T_dload_1;
-import dxc.junit.opcodes.dload.jm.T_dload_1_w;
-import dxc.junit.opcodes.dload.jm.T_dload_2;
-import dxc.junit.opcodes.dload.jm.T_dload_2_w;
-
-public class Test_dload extends DxTestCase {
-
-    /*
-     * NORMAL dload VERSION
-     */
-
-    /**
-     * @title  Test dload 1
-     */
-    public void testN1() {
-        T_dload_1 t = new T_dload_1();
-        assertEquals(1d, t.run());
-    }
-
-    /**
-     * @title  Test dload 255
-     */
-    public void testN2() {
-        T_dload_2 t = new T_dload_2();
-        assertEquals(1d, t.run());
-    }
-
-    /**
-     * @constraint 4.8.1.21
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.dload.jm.T_dload_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.dload.jm.T_dload_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.dload.jm.T_dload_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.dload.jm.T_dload_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /*
-     * WIDE dload VERSION
-     */
-
-    /**
-     * @title  Test dload 257
-     */
-    public void testN3() {
-        T_dload_1_w t = new T_dload_1_w();
-        assertEquals(1d, t.run());
-    }
-
-    /**
-     * @title  Test dload_w 1
-     */
-    public void testN4() {
-        T_dload_2_w t = new T_dload_2_w();
-        assertEquals(1d, t.run());
-    }
-
-    /**
-     * @constraint 4.8.1.25
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.dload.jm.T_dload_3_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.dload.jm.T_dload_4_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE7() {
-        try {
-            Class.forName("dxc.junit.opcodes.dload.jm.T_dload_5_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE8() {
-        try {
-            Class.forName("dxc.junit.opcodes.dload.jm.T_dload_6_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_1.j b/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_1.j
deleted file mode 100644
index ea6f194..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_1.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_1.java
-.class public dxc/junit/opcodes/dload/jm/T_dload_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()D
-    .limit stack 4
-    .limit locals 6
-    
-    dconst_1
-    dstore 4
-    dconst_0
-    dload 4
-    
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_1.java b/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_1.java
deleted file mode 100644
index 7775049..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload.jm;
-
-public class T_dload_1 {
-
-    public double run() {
-        return 1d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_1_w.j b/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_1_w.j
deleted file mode 100644
index c6c9056..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_1_w.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_1_w.java
-.class public dxc/junit/opcodes/dload/jm/T_dload_1_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()D
-    .limit stack 4
-    .limit locals 300
-    
-    dconst_1
-    dstore 257
-    dconst_0
-    dload 257
-    
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_1_w.java b/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_1_w.java
deleted file mode 100644
index 337b02d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_1_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload.jm;
-
-public class T_dload_1_w {
-
-    public double run() {
-        return 1d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_2.j b/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_2.j
deleted file mode 100644
index dd97744..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_2.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_2.java
-.class public dxc/junit/opcodes/dload/jm/T_dload_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()D
-    .limit stack 4
-    .limit locals 300
-    
-    dconst_1
-    dstore 255
-    dconst_0
-    dload 255
-    
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_2.java b/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_2.java
deleted file mode 100644
index 002071f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload.jm;
-
-public class T_dload_2 {
-
-      public double run() {
-          return 1d;
-      }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_2_w.j b/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_2_w.j
deleted file mode 100644
index 0874c3e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_2_w.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_2_w.java
-.class public dxc/junit/opcodes/dload/jm/T_dload_2_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()D
-    .limit stack 4
-    .limit locals 4
-    
-    dconst_1
-    dstore 1
-    dconst_0
-    dload_w 1
-    
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_2_w.java b/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_2_w.java
deleted file mode 100644
index c5140b5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_2_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload.jm;
-
-public class T_dload_2_w {
-
-      public double run() {
-          return 1d;
-      }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_3.j b/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_3.j
deleted file mode 100644
index bed08c5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_3.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_3.java
-.class public dxc/junit/opcodes/dload/jm/T_dload_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 0
-
-    dload 0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_3.java b/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_3.java
deleted file mode 100644
index eefa007..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload.jm;
-
-public class T_dload_3 {
-
-    public void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_3_w.j b/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_3_w.j
deleted file mode 100644
index 7618f0d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_3_w.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_3_w.java
-.class public dxc/junit/opcodes/dload/jm/T_dload_3_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 300
-
-    dload 300
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_3_w.java b/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_3_w.java
deleted file mode 100644
index 01eb395..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_3_w.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload.jm;
-
-public class T_dload_3_w {
-
-    public void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_4.j b/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_4.j
deleted file mode 100644
index a1731d0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_4.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_4.java
-.class public dxc/junit/opcodes/dload/jm/T_dload_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    fconst_1
-    fstore_0
-    fconst_1
-    fstore_1
-    
-    dload 0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_4.java b/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_4.java
deleted file mode 100644
index 13c99db..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload.jm;
-
-public class T_dload_4 {
-
-    public void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_4_w.j b/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_4_w.j
deleted file mode 100644
index 855d01e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_4_w.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_4_w.java
-.class public dxc/junit/opcodes/dload/jm/T_dload_4_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 300
-
-    fconst_1
-    fstore 260
-    fconst_1
-    fstore 261
-    
-    dload_w 260
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_4_w.java b/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_4_w.java
deleted file mode 100644
index 6810298..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_4_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload.jm;
-
-public class T_dload_4_w {
-
-    public void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_5.j b/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_5.j
deleted file mode 100644
index d363cab..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_5.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_5.java
-.class public dxc/junit/opcodes/dload/jm/T_dload_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    lstore_0
-    
-    dload 0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_5.java b/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_5.java
deleted file mode 100644
index 1428a19..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload.jm;
-
-public class T_dload_5 {
-
-    public void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_5_w.j b/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_5_w.j
deleted file mode 100644
index bf96314..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_5_w.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_5_w.java
-.class public dxc/junit/opcodes/dload/jm/T_dload_5_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 300
-
-    lconst_1
-    lstore 260
-    
-    dload_w 260
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_5_w.java b/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_5_w.java
deleted file mode 100644
index 8010dc0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_5_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload.jm;
-
-public class T_dload_5_w {
-
-    public void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_6.j b/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_6.j
deleted file mode 100644
index 07b4434..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_6.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_6.java
-.class public dxc/junit/opcodes/dload/jm/T_dload_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 2
-
-    dconst_1
-    dstore_0
-    
-    dload 0
-    dload 0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_6.java b/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_6.java
deleted file mode 100644
index 41b6572..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload.jm;
-
-public class T_dload_6 {
-
-    public void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_6_w.j b/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_6_w.j
deleted file mode 100644
index 4a92f33..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_6_w.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_6_w.java
-.class public dxc/junit/opcodes/dload/jm/T_dload_6_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 300
-
-    dconst_1
-    dstore 260
-    
-    dload_w 260
-    dload_w 260
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_6_w.java b/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_6_w.java
deleted file mode 100644
index d2d54e3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload/jm/T_dload_6_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload.jm;
-
-public class T_dload_6_w {
-
-    public void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_0/Test_dload_0.java b/tools/dx-tests/src/dxc/junit/opcodes/dload_0/Test_dload_0.java
deleted file mode 100644
index 3386d70..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_0/Test_dload_0.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload_0;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.dload_0.jm.T_dload_0_1;
-import dxc.junit.opcodes.dload_0.jm.T_dload_0_6;
-
-public class Test_dload_0 extends DxTestCase {
-
-    /**
-     * @title value is pushed onto the operand stack
-     */
-    public void testN1() {
-        assertEquals(1d, T_dload_0_1.run());
-    }
-
-    /**
-     * @title equality of dload_<n> and dload <n>
-     */
-    public void testN2() {
-        assertTrue(T_dload_0_6.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.dload_0.jm.T_dload_0_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.dload_0.jm.T_dload_0_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.dload_0.jm.T_dload_0_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.dload_0.jm.T_dload_0_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_1.j b/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_1.j
deleted file mode 100644
index efadce3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_0_1.java
-.class public dxc/junit/opcodes/dload_0/jm/T_dload_0_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()D
-    .limit stack 4
-    .limit locals 4
-    
-    dconst_1
-    dstore_0
-    dconst_0
-    dload_0
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_1.java b/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_1.java
deleted file mode 100644
index b6c0a13..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload_0.jm;
-
-public class T_dload_0_1 {
-
-    public static double run() {
-        return 1d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_2.j b/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_2.j
deleted file mode 100644
index 7da999c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_0_2.java
-.class public dxc/junit/opcodes/dload_0/jm/T_dload_0_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    dload_0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_2.java b/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_2.java
deleted file mode 100644
index 05fe279..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload_0.jm;
-
-public class T_dload_0_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_3.j b/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_3.j
deleted file mode 100644
index 07fa8f4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_3.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_0_3.java
-.class public dxc/junit/opcodes/dload_0/jm/T_dload_0_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    fconst_1
-    fstore_0
-    fconst_1
-    fstore_1
-    
-    dload_0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_3.java b/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_3.java
deleted file mode 100644
index 86dcec7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload_0.jm;
-
-public class T_dload_0_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_4.j b/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_4.j
deleted file mode 100644
index 6254ac4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_0_4.java
-.class public dxc/junit/opcodes/dload_0/jm/T_dload_0_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    lstore_0
-    
-    dload_0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_4.java b/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_4.java
deleted file mode 100644
index ffcfe2b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload_0.jm;
-
-public class T_dload_0_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_5.j b/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_5.j
deleted file mode 100644
index 6c7c879..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_5.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_0_5.java
-.class public dxc/junit/opcodes/dload_0/jm/T_dload_0_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 4
-
-    dconst_1
-    dstore_0
-    
-    dload_0
-    dload_0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_5.java b/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_5.java
deleted file mode 100644
index 1cdadbc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_5.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload_0.jm;
-
-public class T_dload_0_5 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_6.j b/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_6.j
deleted file mode 100644
index 43843a8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_6.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_0_6.java
-.class public dxc/junit/opcodes/dload_0/jm/T_dload_0_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()Z
-    .limit stack 4
-    .limit locals 2
-
-    dconst_1
-    dstore_0
-
-    dload_0
-    dload 0
-    dcmpl 
-    
-    ifne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_6.java b/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_6.java
deleted file mode 100644
index 03e3a47..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_0/jm/T_dload_0_6.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload_0.jm;
-
-public class T_dload_0_6 {
-
-    public static boolean run() {
-        double i = 1d;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_1/Test_dload_1.java b/tools/dx-tests/src/dxc/junit/opcodes/dload_1/Test_dload_1.java
deleted file mode 100644
index 78e1d63..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_1/Test_dload_1.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload_1;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.dload_1.jm.T_dload_1_1;
-import dxc.junit.opcodes.dload_1.jm.T_dload_1_6;
-
-public class Test_dload_1 extends DxTestCase {
-
-    /**
-     * @title value is pushed onto the operand stack
-     */
-    public void testN1() {
-        assertEquals(1d, T_dload_1_1.run());
-    }
-
-    /**
-     * @title equality of dload_<n> and dload <n>
-     */
-    public void testN2() {
-        assertTrue(T_dload_1_6.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.dload_1.jm.T_dload_1_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.dload_1.jm.T_dload_1_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.dload_1.jm.T_dload_1_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.dload_1.jm.T_dload_1_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_1.j b/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_1.j
deleted file mode 100644
index f0b8614..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_1_1.java
-.class public dxc/junit/opcodes/dload_1/jm/T_dload_1_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()D
-    .limit stack 4
-    .limit locals 4
-    
-    dconst_1
-    dstore_1
-    dconst_0
-    dload_1
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_1.java b/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_1.java
deleted file mode 100644
index 08c6c4c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload_1.jm;
-
-public class T_dload_1_1 {
-
-    public static double run() {
-        return 1d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_2.j b/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_2.j
deleted file mode 100644
index c3c537b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_1_2.java
-.class public dxc/junit/opcodes/dload_1/jm/T_dload_1_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 1
-
-    dload_1
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_2.java b/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_2.java
deleted file mode 100644
index e9d012a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload_1.jm;
-
-public class T_dload_1_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_3.j b/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_3.j
deleted file mode 100644
index 23521db..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_3.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_1_3.java
-.class public dxc/junit/opcodes/dload_1/jm/T_dload_1_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    fconst_1
-    fstore_1
-    fconst_1
-    fstore_2
-    
-    dload_1
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_3.java b/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_3.java
deleted file mode 100644
index ce229e6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload_1.jm;
-
-public class T_dload_1_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_4.j b/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_4.j
deleted file mode 100644
index ae50746..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_1_4.java
-.class public dxc/junit/opcodes/dload_1/jm/T_dload_1_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    lstore_1
-    
-    dload_1
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_4.java b/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_4.java
deleted file mode 100644
index 3e6eadb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload_1.jm;
-
-public class T_dload_1_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_5.j b/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_5.j
deleted file mode 100644
index 247a0ea..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_5.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_1_5.java
-.class public dxc/junit/opcodes/dload_1/jm/T_dload_1_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 4
-
-    dconst_1
-    dstore_1
-    
-    dload_1
-    dload_1
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_5.java b/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_5.java
deleted file mode 100644
index 569b8be..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_5.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload_1.jm;
-
-public class T_dload_1_5 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_6.j b/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_6.j
deleted file mode 100644
index 6a3adfe..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_6.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_1_6.java
-.class public dxc/junit/opcodes/dload_1/jm/T_dload_1_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()Z
-    .limit stack 4
-    .limit locals 4
-
-    dconst_1
-    dstore_1
-
-    dload_1
-    dload 1
-    dcmpl 
-    
-    ifne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_6.java b/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_6.java
deleted file mode 100644
index fda7e3a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_1/jm/T_dload_1_6.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload_1.jm;
-
-public class T_dload_1_6 {
-
-    public static boolean run() {
-        double i = 1d;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_2/Test_dload_2.java b/tools/dx-tests/src/dxc/junit/opcodes/dload_2/Test_dload_2.java
deleted file mode 100644
index b0d5ede..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_2/Test_dload_2.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload_2;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.dload_2.jm.T_dload_2_1;
-import dxc.junit.opcodes.dload_2.jm.T_dload_2_6;
-
-public class Test_dload_2 extends DxTestCase {
-
-    /**
-     * @title value is pushed onto the operand stack
-     */
-    public void testN1() {
-        assertEquals(1d, T_dload_2_1.run());
-    }
-
-    /**
-     * @title equality of dload_<n> and dload <n>
-     */
-    public void testN2() {
-        assertTrue(T_dload_2_6.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.dload_2.jm.T_dload_2_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.dload_2.jm.T_dload_2_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.dload_2.jm.T_dload_2_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.dload_2.jm.T_dload_2_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_1.j b/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_1.j
deleted file mode 100644
index 5dbb5f1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_2_1.java
-.class public dxc/junit/opcodes/dload_2/jm/T_dload_2_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()D
-    .limit stack 4
-    .limit locals 4
-    
-    dconst_1
-    dstore_2
-    dconst_0
-    dload_2
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_1.java b/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_1.java
deleted file mode 100644
index bd20ce7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload_2.jm;
-
-public class T_dload_2_1 {
-
-    public static double run() {
-        return 1d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_2.j b/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_2.j
deleted file mode 100644
index 998877e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_2_2.java
-.class public dxc/junit/opcodes/dload_2/jm/T_dload_2_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    dload_2
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_2.java b/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_2.java
deleted file mode 100644
index eeab9cc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload_2.jm;
-
-public class T_dload_2_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_3.j b/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_3.j
deleted file mode 100644
index d907737..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_3.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_2_3.java
-.class public dxc/junit/opcodes/dload_2/jm/T_dload_2_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    fconst_1
-    fstore_2
-    fconst_1
-    fstore_3
-    
-    dload_2
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_3.java b/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_3.java
deleted file mode 100644
index 7c20960..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload_2.jm;
-
-public class T_dload_2_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_4.j b/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_4.j
deleted file mode 100644
index 2330dd2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_2_4.java
-.class public dxc/junit/opcodes/dload_2/jm/T_dload_2_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    lstore_2
-    
-    dload_2
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_4.java b/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_4.java
deleted file mode 100644
index d01ef76..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload_2.jm;
-
-public class T_dload_2_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_5.j b/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_5.j
deleted file mode 100644
index 1680575..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_5.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_2_5.java
-.class public dxc/junit/opcodes/dload_2/jm/T_dload_2_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 4
-
-    dconst_1
-    dstore_2
-    
-    dload_2
-    dload_2
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_5.java b/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_5.java
deleted file mode 100644
index 96be034..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_5.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload_2.jm;
-
-public class T_dload_2_5 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_6.j b/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_6.j
deleted file mode 100644
index 64411be..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_6.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_2_6.java
-.class public dxc/junit/opcodes/dload_2/jm/T_dload_2_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()Z
-    .limit stack 4
-    .limit locals 4
-
-    dconst_1
-    dstore_2
-
-    dload_2
-    dload 2
-    dcmpl 
-    
-    ifne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_6.java b/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_6.java
deleted file mode 100644
index e98944a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_2/jm/T_dload_2_6.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload_2.jm;
-
-public class T_dload_2_6 {
-
-    public static boolean run() {
-        double i = 1d;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_3/Test_dload_3.java b/tools/dx-tests/src/dxc/junit/opcodes/dload_3/Test_dload_3.java
deleted file mode 100644
index 8d88d4e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_3/Test_dload_3.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload_3;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.dload_3.jm.T_dload_3_1;
-import dxc.junit.opcodes.dload_3.jm.T_dload_3_6;
-
-public class Test_dload_3 extends DxTestCase {
-
-    /**
-     * @title value is pushed onto the operand stack
-     */
-    public void testN1() {
-        assertEquals(1d, T_dload_3_1.run());
-    }
-
-    /**
-     * @title equality of dload_<n> and dload <n>
-     */
-    public void testN2() {
-        assertTrue(T_dload_3_6.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.dload_3.jm.T_dload_3_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.dload_3.jm.T_dload_3_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.dload_3.jm.T_dload_3_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.dload_3.jm.T_dload_3_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_1.j b/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_1.j
deleted file mode 100644
index 3e4ec5d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_3_1.java
-.class public dxc/junit/opcodes/dload_3/jm/T_dload_3_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()D
-    .limit stack 4
-    .limit locals 5
-    
-    dconst_1
-    dstore_3
-    dconst_0
-    dload_3
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_1.java b/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_1.java
deleted file mode 100644
index a5cb748..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload_3.jm;
-
-public class T_dload_3_1 {
-
-    public static double run() {
-        return 1d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_2.j b/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_2.j
deleted file mode 100644
index 5d3d072..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_3_2.java
-.class public dxc/junit/opcodes/dload_3/jm/T_dload_3_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    dload_3
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_2.java b/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_2.java
deleted file mode 100644
index da11e14..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload_3.jm;
-
-public class T_dload_3_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_3.j b/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_3.j
deleted file mode 100644
index 8558fa9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_3.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_3_3.java
-.class public dxc/junit/opcodes/dload_3/jm/T_dload_3_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 5
-
-    fconst_1
-    fstore_3
-    fconst_1
-    fstore 4
-    
-    dload_3
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_3.java b/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_3.java
deleted file mode 100644
index 1534e50..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload_3.jm;
-
-public class T_dload_3_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_4.j b/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_4.j
deleted file mode 100644
index 28fce45..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_3_4.java
-.class public dxc/junit/opcodes/dload_3/jm/T_dload_3_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 5
-
-    lconst_1
-    lstore_3
-    
-    dload_3
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_4.java b/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_4.java
deleted file mode 100644
index 6b22af4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload_3.jm;
-
-public class T_dload_3_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_5.j b/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_5.j
deleted file mode 100644
index b9ceac4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_5.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_3_5.java
-.class public dxc/junit/opcodes/dload_3/jm/T_dload_3_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 5
-
-    dconst_1
-    dstore_3
-    
-    dload_3
-    dload_3
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_5.java b/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_5.java
deleted file mode 100644
index 48b7cfe..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_5.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload_3.jm;
-
-public class T_dload_3_5 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_6.j b/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_6.j
deleted file mode 100644
index eecc7a2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_6.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dload_3_6.java
-.class public dxc/junit/opcodes/dload_3/jm/T_dload_3_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()Z
-    .limit stack 4
-    .limit locals 5
-
-    dconst_1
-    dstore_3
-
-    dload_3
-    dload 3
-    dcmpl 
-    
-    ifne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_6.java b/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_6.java
deleted file mode 100644
index 4be5f77..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dload_3/jm/T_dload_3_6.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dload_3.jm;
-
-public class T_dload_3_6 {
-
-    public static boolean run() {
-        double i = 1d;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dmul/Test_dmul.java b/tools/dx-tests/src/dxc/junit/opcodes/dmul/Test_dmul.java
deleted file mode 100644
index 4f0c55b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dmul/Test_dmul.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dmul;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.dmul.jm.T_dmul_1;
-
-public class Test_dmul extends DxTestCase {
-
-    /**
-     * @title  Arguments = 2.7d, 3.14d
-     */
-
-    public void testN1() {
-        T_dmul_1 t = new T_dmul_1();
-        assertEquals(8.478000000000002d, t.run(2.7d, 3.14d));
-    }
-
-    /**
-     * @title  Arguments = 0, -3.14d
-     */
-    public void testN2() {
-        T_dmul_1 t = new T_dmul_1();
-        assertEquals(-0d, t.run(0, -3.14d));
-    }
-
-    /**
-     * @title  Arguments = -2.7d, -3.14d
-     */
-    public void testN3() {
-        T_dmul_1 t = new T_dmul_1();
-        assertEquals(8.478000000000002d, t.run(-3.14d, -2.7d));
-    }
-
-    /**
-     * @title  Arguments = Double.MAX_VALUE, Double.NaN
-     */
-    public void testB1() {
-        T_dmul_1 t = new T_dmul_1();
-        assertEquals(Double.NaN, t.run(Double.MAX_VALUE, Double.NaN));
-    }
-
-    /**
-     * @title  Arguments = Double.POSITIVE_INFINITY, 0
-     */
-    public void testB2() {
-        T_dmul_1 t = new T_dmul_1();
-        assertEquals(Double.NaN, t.run(Double.POSITIVE_INFINITY, 0));
-    }
-
-    /**
-     * @title  Arguments = Double.POSITIVE_INFINITY, -2.7d
-     */
-    public void testB3() {
-        T_dmul_1 t = new T_dmul_1();
-        assertEquals(Double.NEGATIVE_INFINITY, t.run(Double.POSITIVE_INFINITY,
-                -2.7d));
-    }
-
-    /**
-     * @title  Arguments = Double.POSITIVE_INFINITY,
-     * Double.NEGATIVE_INFINITY
-     */
-    public void testB4() {
-        T_dmul_1 t = new T_dmul_1();
-        assertEquals(Double.NEGATIVE_INFINITY, t.run(Double.POSITIVE_INFINITY,
-                Double.NEGATIVE_INFINITY));
-    }
-
-    /**
-     * @title  Arguments = +0, -0d
-     */
-    public void testB5() {
-        T_dmul_1 t = new T_dmul_1();
-        assertEquals(-0d, t.run(+0d, -0d));
-    }
-
-    /**
-     * @title  Arguments = -0d, -0d
-     */
-    public void testB6() {
-        T_dmul_1 t = new T_dmul_1();
-        assertEquals(+0d, t.run(-0d, -0d));
-    }
-
-    /**
-     * @title  Arguments = Double.MAX_VALUE, Double.MAX_VALUE
-     */
-    public void testB7() {
-        T_dmul_1 t = new T_dmul_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_dmul_1 t = new T_dmul_1();
-        assertEquals(-0d, t.run(Double.MIN_VALUE, -1.4E-45f));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.dmul.jm.T_dmul_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - float, double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.dmul.jm.T_dmul_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long, double
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.dmul.jm.T_dmul_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double, reference
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.dmul.jm.T_dmul_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dmul/jm/T_dmul_1.j b/tools/dx-tests/src/dxc/junit/opcodes/dmul/jm/T_dmul_1.j
deleted file mode 100644
index 4bd9247..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dmul/jm/T_dmul_1.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dmul_1.java
-.class public dxc/junit/opcodes/dmul/jm/T_dmul_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(DD)D
-    .limit stack 4
-    .limit locals 5
-    dload_1
-    dload_3
-    dmul
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dmul/jm/T_dmul_1.java b/tools/dx-tests/src/dxc/junit/opcodes/dmul/jm/T_dmul_1.java
deleted file mode 100644
index c4ad6fb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dmul/jm/T_dmul_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dmul.jm;
-
-public class T_dmul_1 {
-
-    public double run(double a, double b) {
-        return a*b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dmul/jm/T_dmul_2.j b/tools/dx-tests/src/dxc/junit/opcodes/dmul/jm/T_dmul_2.j
deleted file mode 100644
index 744f9ae..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dmul/jm/T_dmul_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dmul_2.java
-.class public dxc/junit/opcodes/dmul/jm/T_dmul_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(DD)D
-    .limit stack 4
-    .limit locals 5
-    dload_1
-    ; dload_3   
-    dmul
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dmul/jm/T_dmul_2.java b/tools/dx-tests/src/dxc/junit/opcodes/dmul/jm/T_dmul_2.java
deleted file mode 100644
index 7616c9e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dmul/jm/T_dmul_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dmul.jm;
-
-public class T_dmul_2 {
-
-    public double run(double a, double b) {
-        return a*b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dmul/jm/T_dmul_3.j b/tools/dx-tests/src/dxc/junit/opcodes/dmul/jm/T_dmul_3.j
deleted file mode 100644
index 222294b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dmul/jm/T_dmul_3.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dmul_3.java
-.class public dxc/junit/opcodes/dmul/jm/T_dmul_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(FD)F
-    .limit stack 4
-    .limit locals 5
-    fload_1
-    dload_2    
-    dmul
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dmul/jm/T_dmul_3.java b/tools/dx-tests/src/dxc/junit/opcodes/dmul/jm/T_dmul_3.java
deleted file mode 100644
index 7732dbd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dmul/jm/T_dmul_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dmul.jm;
-
-public class T_dmul_3 {
-
-    public double run(float a, double b) {
-        return (double)a*b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dmul/jm/T_dmul_4.j b/tools/dx-tests/src/dxc/junit/opcodes/dmul/jm/T_dmul_4.j
deleted file mode 100644
index 376b985..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dmul/jm/T_dmul_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dmul_4.java
-.class public dxc/junit/opcodes/dmul/jm/T_dmul_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(JD)D
-    .limit stack 4
-    .limit locals 5
-
-    lload_1
-;    l2d
-    dload_3
-    dmul
-
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dmul/jm/T_dmul_4.java b/tools/dx-tests/src/dxc/junit/opcodes/dmul/jm/T_dmul_4.java
deleted file mode 100644
index 7fe4ff0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dmul/jm/T_dmul_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dmul.jm;
-
-public class T_dmul_4 {
-
-    public double run(long a, double b) {
-        return (double)a*b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dmul/jm/T_dmul_5.j b/tools/dx-tests/src/dxc/junit/opcodes/dmul/jm/T_dmul_5.j
deleted file mode 100644
index c6783ca..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dmul/jm/T_dmul_5.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dmul_5.java
-.class public dxc/junit/opcodes/dmul/jm/T_dmul_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(DD)D
-    .limit stack 4
-    .limit locals 5
-
-    dload_1
-    aload_0
-    dmul
-    dreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dmul/jm/T_dmul_5.java b/tools/dx-tests/src/dxc/junit/opcodes/dmul/jm/T_dmul_5.java
deleted file mode 100644
index d4c5811..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dmul/jm/T_dmul_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dmul.jm;
-
-public class T_dmul_5 {
-    
-    public double run(double a, double b) {
-        return a*b;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dneg/Test_dneg.java b/tools/dx-tests/src/dxc/junit/opcodes/dneg/Test_dneg.java
deleted file mode 100644
index 6f17737..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dneg/Test_dneg.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dneg;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.dneg.jm.T_dneg_1;
-
-public class Test_dneg extends DxTestCase {
-
-    /**
-     * @title  Argument = 1
-     */
-    public void testN1() {
-        T_dneg_1 t = new T_dneg_1();
-        assertEquals(-1d, t.run(1d));
-    }
-
-    /**
-     * @title  Argument = -1
-     */
-    public void testN2() {
-        T_dneg_1 t = new T_dneg_1();
-        assertEquals(1d, t.run(-1d));
-    }
-
-    /**
-     * @title  Argument = +0
-     */
-    public void testN3() {
-        T_dneg_1 t = new T_dneg_1();
-        assertEquals(-0d, t.run(+0d));
-    }
-
-    /**
-     * @title  Argument = -2.7
-     */
-    public void testN4() {
-        T_dneg_1 t = new T_dneg_1();
-        assertEquals(2.7d, t.run(-2.7d));
-    }
-
-
-    /**
-     * @title  Argument = Double.NaN
-     */
-    public void testB1() {
-        T_dneg_1 t = new T_dneg_1();
-        assertEquals(Double.NaN, t.run(Double.NaN));
-    }
-
-    /**
-     * @title  Argument = Double.NEGATIVE_INFINITY
-     */
-    public void testB2() {
-        T_dneg_1 t = new T_dneg_1();
-        assertEquals(Double.POSITIVE_INFINITY, t.run(Double.NEGATIVE_INFINITY));
-    }
-
-    /**
-     * @title  Argument = Double.POSITIVE_INFINITY
-     */
-    public void testB3() {
-        T_dneg_1 t = new T_dneg_1();
-        assertEquals(Double.NEGATIVE_INFINITY, t.run(Double.POSITIVE_INFINITY));
-    }
-
-    /**
-     * @title  Argument = Double.MAX_VALUE
-     */
-    public void testB4() {
-        T_dneg_1 t = new T_dneg_1();
-        assertEquals(-1.7976931348623157E308d, t.run(Double.MAX_VALUE));
-    }
-
-    /**
-     * @title  Argument = Double.MIN
-     */
-    public void testB5() {
-        T_dneg_1 t = new T_dneg_1();
-        assertEquals(-4.9E-324d, t.run(Double.MIN_VALUE));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.dneg.jm.T_dneg_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.dneg.jm.T_dneg_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.dneg.jm.T_dneg_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - reference
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.dneg.jm.T_dneg_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dneg/jm/T_dneg_1.j b/tools/dx-tests/src/dxc/junit/opcodes/dneg/jm/T_dneg_1.j
deleted file mode 100644
index 17acbbb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dneg/jm/T_dneg_1.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ineg_1.java
-.class public dxc/junit/opcodes/dneg/jm/T_dneg_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(D)D
-    .limit stack 2
-    .limit locals 3
-    dload_1
-    dneg
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dneg/jm/T_dneg_1.java b/tools/dx-tests/src/dxc/junit/opcodes/dneg/jm/T_dneg_1.java
deleted file mode 100644
index 9b33e9b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dneg/jm/T_dneg_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dneg.jm;
-
-public class T_dneg_1 {
-
-    public double run(double d) {
-        return -d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dneg/jm/T_dneg_2.j b/tools/dx-tests/src/dxc/junit/opcodes/dneg/jm/T_dneg_2.j
deleted file mode 100644
index 7f8266c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dneg/jm/T_dneg_2.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dneg_2.java
-.class public dxc/junit/opcodes/dneg/jm/T_dneg_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(D)D
-    .limit stack 2
-    .limit locals 2
-    ;dload_1
-    dneg
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dneg/jm/T_dneg_2.java b/tools/dx-tests/src/dxc/junit/opcodes/dneg/jm/T_dneg_2.java
deleted file mode 100644
index 27ec6ab..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dneg/jm/T_dneg_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dneg.jm;
-
-public class T_dneg_2 {
-
-    public double run(double d) {
-        return -d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dneg/jm/T_dneg_3.j b/tools/dx-tests/src/dxc/junit/opcodes/dneg/jm/T_dneg_3.j
deleted file mode 100644
index 98aa60e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dneg/jm/T_dneg_3.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dneg_3.java
-.class public dxc/junit/opcodes/dneg/jm/T_dneg_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(D)D
-    .limit stack 2
-    .limit locals 3
-
-    fconst_1
-    dneg
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dneg/jm/T_dneg_3.java b/tools/dx-tests/src/dxc/junit/opcodes/dneg/jm/T_dneg_3.java
deleted file mode 100644
index c7a68a3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dneg/jm/T_dneg_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dneg.jm;
-
-public class T_dneg_3 {
-
-    public double run(double d) {
-        return -d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dneg/jm/T_dneg_4.j b/tools/dx-tests/src/dxc/junit/opcodes/dneg/jm/T_dneg_4.j
deleted file mode 100644
index fbbac9e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dneg/jm/T_dneg_4.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dneg_4.java
-.class public dxc/junit/opcodes/dneg/jm/T_dneg_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(D)D
-    .limit stack 2
-    .limit locals 3
-
-    lconst_1
-    dneg
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dneg/jm/T_dneg_4.java b/tools/dx-tests/src/dxc/junit/opcodes/dneg/jm/T_dneg_4.java
deleted file mode 100644
index ee85927..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dneg/jm/T_dneg_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dneg.jm;
-
-public class T_dneg_4 {
-
-    public double run(double d) {
-        return -d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dneg/jm/T_dneg_5.j b/tools/dx-tests/src/dxc/junit/opcodes/dneg/jm/T_dneg_5.j
deleted file mode 100644
index 6e7874d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dneg/jm/T_dneg_5.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dneg_5.java
-.class public dxc/junit/opcodes/dneg/jm/T_dneg_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(D)D
-    .limit stack 2
-    .limit locals 3
-
-    aload_0
-    dneg
-    dreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dneg/jm/T_dneg_5.java b/tools/dx-tests/src/dxc/junit/opcodes/dneg/jm/T_dneg_5.java
deleted file mode 100644
index 1fb3c3d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dneg/jm/T_dneg_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dneg.jm;
-
-public class T_dneg_5 {
-    
-    public double run(double d) {
-        return -d;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/drem/Test_drem.java b/tools/dx-tests/src/dxc/junit/opcodes/drem/Test_drem.java
deleted file mode 100644
index f8a9de5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/drem/Test_drem.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.drem;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.drem.jm.T_drem_1;
-
-public class Test_drem extends DxTestCase {
-
-    /**
-     * @title Arguments = 2.7d, 3.14d
-     */
-    public void testN1() {
-        T_drem_1 t = new T_drem_1();
-        assertEquals(2.7d, t.run(2.7d, 3.14d));
-    }
-
-    /**
-     * @title  Dividend = 0
-     */
-    public void testN2() {
-        T_drem_1 t = new T_drem_1();
-        assertEquals(0d, t.run(0, 3.14d));
-    }
-
-    /**
-     * @title  Dividend is negative
-     */
-    public void testN3() {
-        T_drem_1 t = new T_drem_1();
-        assertEquals(-0.43999999999999995d, t.run(-3.14d, 2.7d));
-    }
-
-    /**
-     * @title  Arguments = Double.MAX_VALUE, Double.NaN
-     */
-    public void testB1() {
-        T_drem_1 t = new T_drem_1();
-        assertEquals(Double.NaN, t.run(Double.MAX_VALUE, Double.NaN));
-    }
-
-    /**
-     * @title  Arguments = Double.POSITIVE_INFINITY,
-     * Double.NEGATIVE_INFINITY
-     */
-    public void testB2() {
-        T_drem_1 t = new T_drem_1();
-        assertEquals(Double.NaN, t.run(Double.POSITIVE_INFINITY,
-                Double.NEGATIVE_INFINITY));
-    }
-
-    /**
-     * @title  Arguments = Double.POSITIVE_INFINITY, -2.7d
-     */
-    public void testB3() {
-        T_drem_1 t = new T_drem_1();
-        assertEquals(Double.NaN, t.run(Double.POSITIVE_INFINITY, -2.7d));
-    }
-
-    /**
-     * @title  Arguments = -2.7d, Double.NEGATIVE_INFINITY
-     */
-    public void testB4() {
-        T_drem_1 t = new T_drem_1();
-        assertEquals(-2.7d, t.run(-2.7d, Double.NEGATIVE_INFINITY));
-    }
-
-    /**
-     * @title  Arguments = 0, 0
-     */
-    public void testB5() {
-        T_drem_1 t = new T_drem_1();
-        assertEquals(Double.NaN, t.run(0, 0));
-    }
-
-    /**
-     * @title  Arguments = 0, -2.7
-     */
-    public void testB6() {
-        T_drem_1 t = new T_drem_1();
-        assertEquals(0d, t.run(0, -2.7d));
-    }
-
-    /**
-     * @title  Arguments = -2.7, 0
-     */
-    public void testB7() {
-        T_drem_1 t = new T_drem_1();
-        assertEquals(Double.NaN, t.run(-2.7d, 0));
-    }
-
-    /**
-     * @title  Arguments = 1, Double.MAX_VALUE
-     */
-    public void testB8() {
-        T_drem_1 t = new T_drem_1();
-        assertEquals(0d, t.run(1, Double.MIN_VALUE));
-    }
-
-    /**
-     * @title  Arguments = Double.MAX_VALUE, -1E-9d
-     */
-    public void testB9() {
-        T_drem_1 t = new T_drem_1();
-
-        assertEquals(1.543905285031139E-10d, t.run(Double.MAX_VALUE, -1E-9d));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.drem.jm.T_drem_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - float, double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.drem.jm.T_drem_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long, double
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.drem.jm.T_drem_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double, reference
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.drem.jm.T_drem_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/drem/jm/T_drem_1.j b/tools/dx-tests/src/dxc/junit/opcodes/drem/jm/T_drem_1.j
deleted file mode 100644
index 15501a1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/drem/jm/T_drem_1.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_drem_1.java
-.class public dxc/junit/opcodes/drem/jm/T_drem_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(DD)D
-    .limit stack 4
-    .limit locals 5
-    dload_1
-    dload_3
-    drem
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/drem/jm/T_drem_1.java b/tools/dx-tests/src/dxc/junit/opcodes/drem/jm/T_drem_1.java
deleted file mode 100644
index 36f7787..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/drem/jm/T_drem_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.drem.jm;
-
-public class T_drem_1 {
-
-    public double run(double a, double b) {
-        return a%b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/drem/jm/T_drem_2.j b/tools/dx-tests/src/dxc/junit/opcodes/drem/jm/T_drem_2.j
deleted file mode 100644
index 1c256c2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/drem/jm/T_drem_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_drem_2.java
-.class public dxc/junit/opcodes/drem/jm/T_drem_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(DD)D
-    .limit stack 4
-    .limit locals 5
-    dload_1
-    ; dload_3    
-    drem
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/drem/jm/T_drem_2.java b/tools/dx-tests/src/dxc/junit/opcodes/drem/jm/T_drem_2.java
deleted file mode 100644
index 5268322..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/drem/jm/T_drem_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.drem.jm;
-
-public class T_drem_2 {
-
-    public double run(double a, double b) {
-        return a%b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/drem/jm/T_drem_3.j b/tools/dx-tests/src/dxc/junit/opcodes/drem/jm/T_drem_3.j
deleted file mode 100644
index f0cc966..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/drem/jm/T_drem_3.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_drem_3.java
-.class public dxc/junit/opcodes/drem/jm/T_drem_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(FD)D
-    .limit stack 3
-    .limit locals 5
-    fload_1
-    dload_2    
-    drem
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/drem/jm/T_drem_3.java b/tools/dx-tests/src/dxc/junit/opcodes/drem/jm/T_drem_3.java
deleted file mode 100644
index 2687fec..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/drem/jm/T_drem_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.drem.jm;
-
-public class T_drem_3 {
-
-    public double run(double a, float b) {
-        return a%(double)b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/drem/jm/T_drem_4.j b/tools/dx-tests/src/dxc/junit/opcodes/drem/jm/T_drem_4.j
deleted file mode 100644
index 8b9dc80..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/drem/jm/T_drem_4.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_drem_4.java
-.class public dxc/junit/opcodes/drem/jm/T_drem_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(JD)D
-    .limit stack 4
-    .limit locals 5
-
-    lload_1
-;    l2d
-    dload_3
-    drem
-
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/drem/jm/T_drem_4.java b/tools/dx-tests/src/dxc/junit/opcodes/drem/jm/T_drem_4.java
deleted file mode 100644
index bf104e9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/drem/jm/T_drem_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.drem.jm;
-
-public class T_drem_4 {
-
-    public double run(long a, double b) {
-        return (double)a%b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/drem/jm/T_drem_5.j b/tools/dx-tests/src/dxc/junit/opcodes/drem/jm/T_drem_5.j
deleted file mode 100644
index 75dc941..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/drem/jm/T_drem_5.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_drem_5.java
-.class public dxc/junit/opcodes/drem/jm/T_drem_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(DD)D
-    .limit stack 4
-    .limit locals 5
-
-    dload_1
-    aload_0
-    drem
-    dreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/drem/jm/T_drem_5.java b/tools/dx-tests/src/dxc/junit/opcodes/drem/jm/T_drem_5.java
deleted file mode 100644
index 2d3f76b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/drem/jm/T_drem_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.drem.jm;
-
-public class T_drem_5 {
-    
-    public double run(double a, double b) {
-        return a%b;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/Test_dreturn.java b/tools/dx-tests/src/dxc/junit/opcodes/dreturn/Test_dreturn.java
deleted file mode 100644
index 90e9e7a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/Test_dreturn.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dreturn;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.dreturn.jm.T_dreturn_1;
-import dxc.junit.opcodes.dreturn.jm.T_dreturn_6;
-import dxc.junit.opcodes.dreturn.jm.T_dreturn_7;
-import dxc.junit.opcodes.dreturn.jm.T_dreturn_8;
-import dxc.junit.opcodes.dreturn.jm.T_dreturn_9;
-
-public class Test_dreturn extends DxTestCase {
-
-    /**
-     * @title  simple
-     */
-    public void testN1() {
-        T_dreturn_1 t = new T_dreturn_1();
-        assertEquals(123456d, t.run());
-    }
-
-    /**
-     * @title  check that frames are discarded and reinstananted correctly
-     */
-    public void testN2() {
-        T_dreturn_6 t = new T_dreturn_6();
-        assertEquals(123456d, t.run());
-    }
-
-    /**
-     * @title  check that monitor is released by dreturn
-     */
-    public void testN3() {
-        assertTrue(T_dreturn_7.execute());
-    }
-
-
-    /**
-     * @title  Method is synchronized but thread is not monitor owner
-     */
-    public void testE1() {
-        T_dreturn_8 t = new T_dreturn_8();
-        try {
-            assertTrue(t.run());
-            fail("expected IllegalMonitorStateException");
-        } catch (IllegalMonitorStateException imse) {
-            // expected
-        }
-    }
-
-    /**
-     * @title  Lock structural rule 1 is violated
-     */
-    public void testE2() {
-        T_dreturn_9 t = new T_dreturn_9();
-        try {
-            assertEquals(1d, t.run());
-            // the JVM spec says that it is optional to implement the structural
-            // lock rules, see JVM spec 8.13 and monitorenter/exit opcodes.
-            System.out.print("dvmvfe:");
-            //fail("expected IllegalMonitorStateException");
-        } catch (IllegalMonitorStateException imse) {
-            // expected
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.14
-     * @title method's return type - void
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.dreturn.jm.T_dreturn_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.14
-     * @title method's return type - float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.dreturn.jm.T_dreturn_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.dreturn.jm.T_dreturn_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - float
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.dreturn.jm.T_dreturn_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.dreturn.jm.T_dreturn_10");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - reference
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.dreturn.jm.T_dreturn_11");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_1.j b/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_1.j
deleted file mode 100644
index b4c8d87..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_1.j
+++ /dev/null
@@ -1,29 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dreturn_1.java
-.class public dxc/junit/opcodes/dreturn/jm/T_dreturn_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()D
-    .limit stack 2
-    ldc2_w 123456.0
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_1.java b/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_1.java
deleted file mode 100644
index 2f6e798..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dreturn.jm;
-
-public class T_dreturn_1 {
-
-    public double run() {
-        return 123456d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_10.j b/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_10.j
deleted file mode 100644
index fbfd76a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_10.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dreturn_10.java
-.class public dxc/junit/opcodes/dreturn/jm/T_dreturn_10
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method private static test()D
-    .limit stack 2
-    .limit locals 0
-    dconst_1
-    dreturn
-.end method
-
-
-
-.method public run()D
-    .limit stack 0
-    .limit locals 1
-
-    invokestatic dxc/junit/opcodes/dreturn/jm/T_dreturn_10/test()D
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_10.java b/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_10.java
deleted file mode 100644
index 49208c7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_10.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dreturn.jm;
-
-public class T_dreturn_10 {
-    
-    private static double test() {
-        return 1d;
-    }
-    
-    public double run() {
-        return test();
-    }
-    
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_11.j b/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_11.j
deleted file mode 100644
index ed2f42a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_11.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dreturn_11.java
-.class public dxc/junit/opcodes/dreturn/jm/T_dreturn_11
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()D
-    .limit stack 2
-    .limit locals 1
-
-    aload_0
-    dreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_11.java b/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_11.java
deleted file mode 100644
index ed86640..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dreturn.jm;
-
-public class T_dreturn_11 {
-    
-    public double run() {
-        return 0d;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_2.j b/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_2.j
deleted file mode 100644
index 19a7298..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_2.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dreturn_2.java
-.class public dxc/junit/opcodes/dreturn/jm/T_dreturn_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 1
-
-    dconst_0
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_2.java b/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_2.java
deleted file mode 100644
index 3d2bc88..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dreturn.jm;
-
-public class T_dreturn_2 {
-
-    public double run() {
-        return 0d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_3.j b/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_3.j
deleted file mode 100644
index 0a80e55..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_3.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dreturn_3.java
-.class public dxc/junit/opcodes/dreturn/jm/T_dreturn_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()F
-    .limit stack 2
-    .limit locals 1
-
-    dconst_0
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_3.java b/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_3.java
deleted file mode 100644
index dac5e4e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dreturn.jm;
-
-public class T_dreturn_3 {
-
-    public double run() {
-        return 0d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_4.j b/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_4.j
deleted file mode 100644
index 811f72c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_4.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dreturn_4.java
-.class public dxc/junit/opcodes/dreturn/jm/T_dreturn_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()D
-    .limit stack 2
-    .limit locals 1
-
-    ;dconst_0
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_4.java b/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_4.java
deleted file mode 100644
index 8e3b4ab..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dreturn.jm;
-
-public class T_dreturn_4 {
-
-    public double run() {
-        return 0d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_5.j b/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_5.j
deleted file mode 100644
index 3a666f5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_5.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dreturn_5.java
-.class public dxc/junit/opcodes/dreturn/jm/T_dreturn_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()D
-    .limit stack 2
-    .limit locals 1
-
-    fconst_0
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_5.java b/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_5.java
deleted file mode 100644
index 62063b1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dreturn.jm;
-
-public class T_dreturn_5 {
-
-    public double run() {
-        return 0d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_6.j b/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_6.j
deleted file mode 100644
index 4f72ff5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_6.j
+++ /dev/null
@@ -1,90 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dreturn_6.java
-.class public dxc/junit/opcodes/dreturn/jm/T_dreturn_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()D
-    .limit locals 12
-    .limit stack 6
-    
-    dconst_1
-    dstore_1
-    ldc2_w 2.0
-    dstore_3
-    ldc2_w 3.0
-    dstore 5
-    
-    ldc2_w 4.0
-    
-    invokestatic dxc/junit/opcodes/dreturn/jm/T_dreturn_6/test()D
-    
-    ldc2_w 4444.0
-    dcmpl
-    ifne Label1
-    
-    ldc2_w 4.0
-    dcmpl
-    ifne Label0
-    
-    dload_1
-    dconst_1
-    dcmpl
-    ifne Label0
-    
-    dload_3
-    ldc2_w 2.0
-    dcmpl
-    ifne Label0
-    
-    dload 5
-    ldc2_w 3.0
-    dcmpl
-    ifne Label0    
-    
-    ldc2_w 123456.0
-    dreturn
-
-Label1:
-    pop2
-Label0:
-    dconst_0
-    dreturn
-
-.end method
-
-.method private static test()D
-    .limit locals 8
-    .limit stack 4
-    
-    ldc2_w 1111.0
-    dstore_1
-    ldc2_w 2222.0
-    dstore_3
-    ldc2_w 3333.0
-    dstore 5
-    
-    ldc2_w 5555.0
-    
-    ldc2_w 4444.0
-    dreturn
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_6.java b/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_6.java
deleted file mode 100644
index e3c2681..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_6.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dreturn.jm;
-
-public class T_dreturn_6 {
-
-    public double run() {
-        return 123456d;
-    }
-    
-    private static double test() {
-        double a = 1111d;
-        double b = 2222d;
-        double c = 3333d;
-        return 4444d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_7.j b/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_7.j
deleted file mode 100644
index 2297b9f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_7.j
+++ /dev/null
@@ -1,166 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dreturn_7.java
-.class public dxc/junit/opcodes/dreturn/jm/T_dreturn_7
-.super java/lang/Object
-.implements java/lang/Runnable
-
-.field  value D
-.field  failed Z
-
-.method public <init>()V
-    .limit stack 3
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    aload_0
-    dconst_0
-    putfield dxc.junit.opcodes.dreturn.jm.T_dreturn_7.value D
-
-    aload_0
-    iconst_0
-    putfield dxc.junit.opcodes.dreturn.jm.T_dreturn_7.failed Z
-
-    return
-
-.end method
-
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 2
-   
-    iconst_0
-    istore_1
-
-Label4:
-    iload_1
-    sipush 1000
-    if_icmpge Label3
-
-    aload_0
-    invokespecial dxc/junit/opcodes/dreturn/jm/T_dreturn_7/test()D
-    pop2
-
-    iinc 1 1
-
-    goto Label4
-
-
-Label3:
-    return
-
-.end method
-
-
-
-.method private synchronized test()D
-    .limit stack 5
-    .limit locals 3
-    
-.line 16
-    aload_0
-    dup
-    getfield dxc.junit.opcodes.dreturn.jm.T_dreturn_7.value D
-    dup2
-    dstore_1
-
-    dconst_1
-    dadd
-    putfield dxc.junit.opcodes.dreturn.jm.T_dreturn_7.value D
-
-    dload_1
-    dconst_1
-    dadd
-    dstore_1
-
-    invokestatic java/lang/Thread/yield()V
-
-    dload_1
-    aload_0
-    getfield dxc.junit.opcodes.dreturn.jm.T_dreturn_7.value D
-    dcmpl
-    ifeq Label0
-
-    aload_0
-    iconst_1
-    putfield dxc.junit.opcodes.dreturn.jm.T_dreturn_7.failed Z
-
-Label0:
-    dload_1
-    dreturn
-.end method
-
-
-
-.method public static execute()Z
-    .limit stack 5
-    .limit locals 4
-
-    new dxc/junit/opcodes/dreturn/jm/T_dreturn_7
-    dup
-    invokespecial dxc/junit/opcodes/dreturn/jm/T_dreturn_7/<init>()V
-    astore_0
-
-    new java/lang/Thread
-    dup
-    aload_0
-    invokespecial java/lang/Thread/<init>(Ljava/lang/Runnable;)V
-    astore_1
-
-    new java/lang/Thread
-    dup
-    aload_0
-    invokespecial java/lang/Thread/<init>(Ljava/lang/Runnable;)V
-    astore_2
-
-    aload_1
-    invokevirtual java/lang/Thread/start()V
-
-    aload_2
-    invokevirtual java/lang/Thread/start()V
-
-Label12:
-    ldc2_w 5000
-    invokestatic java/lang/Thread/sleep(J)V
-
-Label13:
-    goto Label0
-
-Label14:            ; exception handler
-    astore_3
-    goto Label3
-
-Label0:
-    aload_0
-    getfield dxc.junit.opcodes.dreturn.jm.T_dreturn_7.value D
-    ldc2_w 2000.0
-    dcmpl
-    ifne Label3
-
-    aload_0
-    getfield dxc.junit.opcodes.dreturn.jm.T_dreturn_7.failed Z
-    ifne Label3
-
-    iconst_1
-    ireturn
-
-Label3:
-    iconst_0
-    ireturn
-
-.catch java/lang/InterruptedException from Label12 to Label13 using Label14
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_7.java b/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_7.java
deleted file mode 100644
index d02da66..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_7.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dreturn.jm;
-
-public class T_dreturn_7 implements Runnable {
-    public final static int CNT = 1000;
-    double value = 0;
-    boolean failed = false;
-    
-    public void run() {
-        for(int i = 0; i < CNT; i++) {
-            test();
-        }
-    }
-    
-    private synchronized double test()    {
-        value++;
-        double c = value;
-        Thread.yield();
-        if(c != value)
-            failed = true;
-        return c;
-    }
-    
-    public static boolean execute() {
-        T_dreturn_7 test = new T_dreturn_7();
-        Thread t1 = new Thread(test);
-        Thread t2 = new Thread(test);
-        
-        t1.start();
-        t2.start();
-        
-        try
-        {
-            Thread.sleep(5000);
-        }
-        catch(InterruptedException ie) {
-            return false;
-        }
-        
-        if(test.value != CNT * 2)
-            return false;
-        return !test.failed;
-    }
-    
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_8.j b/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_8.j
deleted file mode 100644
index 9b8b0b9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_8.j
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dreturn_8.java
-.class public dxc/junit/opcodes/dreturn/jm/T_dreturn_8
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method private synchronized test()D
-    .limit stack 2
-    aload_0
-    monitorexit
-       dconst_0
-    dreturn
-.end method
-
-
-
-.method public run()Z
-    .limit stack 2
-    .limit locals 1
-
-    aload_0
-    invokespecial dxc/junit/opcodes/dreturn/jm/T_dreturn_8/test()D
-    pop2
-
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_8.java b/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_8.java
deleted file mode 100644
index 27aa409..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_8.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dreturn.jm;
-
-public class T_dreturn_8 {
-    
-    private synchronized double test() {
-        return 0d;
-    }
-    
-    public boolean run() {
-        test();
-        return true;
-    }
-    
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_9.j b/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_9.j
deleted file mode 100644
index 2895b44..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_9.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dreturn_9.java
-.class public dxc/junit/opcodes/dreturn/jm/T_dreturn_9
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()D
-    .limit stack 2
-    .limit locals 1
-
-    aload_0
-    monitorenter
-
-    dconst_1
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_9.java b/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_9.java
deleted file mode 100644
index 9d9c41d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dreturn/jm/T_dreturn_9.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dreturn.jm;
-
-public class T_dreturn_9 {
-    
-    public double run() {
-        return 1d;
-    }
-    
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore/Test_dstore.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore/Test_dstore.java
deleted file mode 100644
index 3288dd7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore/Test_dstore.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.dstore.jm.T_dstore_1;
-import dxc.junit.opcodes.dstore.jm.T_dstore_1_w;
-import dxc.junit.opcodes.dstore.jm.T_dstore_5;
-import dxc.junit.opcodes.dstore.jm.T_dstore_5_w;
-
-public class Test_dstore extends DxTestCase {
-
-    /*
-     * NORMAL dstore VERSION
-     */
-
-    /**
-     * @title  dstore 0
-     */
-    public void testN1() {
-        assertEquals(1d, T_dstore_1.run());
-    }
-
-    /**
-     * @title  dstore 255
-     */
-    public void testN2() {
-        assertEquals(1d, T_dstore_5.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.dstore.jm.T_dstore_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.dstore.jm.T_dstore_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.dstore.jm.T_dstore_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /*
-     * WIDE dstore VERSION
-     */
-
-    /**
-     * @title  dstore_w 0
-     */
-    public void testN3() {
-        assertEquals(1d, T_dstore_1_w.run());
-    }
-
-    /**
-     * @title  dstore 257
-     */
-    public void testN4() {
-        assertEquals(1d, T_dstore_5_w.run());
-    }
-
-    /**
-     * @constraint 4.8.1.25
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.dstore.jm.T_dstore_2_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - float
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.dstore.jm.T_dstore_3_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.dstore.jm.T_dstore_4_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_1.j b/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_1.j
deleted file mode 100644
index dfc1a4e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dstore_1.java
-.class public dxc/junit/opcodes/dstore/jm/T_dstore_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()D
-    .limit stack 4
-    .limit locals 2
-    
-    dconst_1
-    dstore 0
-    dconst_0
-    dload 0
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_1.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_1.java
deleted file mode 100644
index 211bf9e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore.jm;
-
-public class T_dstore_1 {
-
-    public static double run() {
-        return 1d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_1_w.j b/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_1_w.j
deleted file mode 100644
index 3bd52da..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_1_w.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dstore_1_w.java
-.class public dxc/junit/opcodes/dstore/jm/T_dstore_1_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()D
-    .limit stack 4
-    .limit locals 2
-    
-    dconst_1
-    dstore_w 0
-    dconst_0
-    dload 0
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_1_w.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_1_w.java
deleted file mode 100644
index c855bb4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_1_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore.jm;
-
-public class T_dstore_1_w {
-
-    public static double run() {
-        return 1d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_2.j b/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_2.j
deleted file mode 100644
index 1e7e045..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dstore_2.java
-.class public dxc/junit/opcodes/dstore/jm/T_dstore_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    dstore 0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_2.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_2.java
deleted file mode 100644
index 1a3e865..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore.jm;
-
-public class T_dstore_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_2_w.j b/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_2_w.j
deleted file mode 100644
index 95c3b6c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_2_w.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dstore_2_w.java
-.class public dxc/junit/opcodes/dstore/jm/T_dstore_2_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    dstore_w 0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_2_w.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_2_w.java
deleted file mode 100644
index 9db43ff..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_2_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore.jm;
-
-public class T_dstore_2_w {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_3.j b/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_3.j
deleted file mode 100644
index ca8d79f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_3.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dstore_3.java
-.class public dxc/junit/opcodes/dstore/jm/T_dstore_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    fconst_1
-    dstore 0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_3.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_3.java
deleted file mode 100644
index f858789..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore.jm;
-
-public class T_dstore_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_3_w.j b/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_3_w.j
deleted file mode 100644
index 9f90254..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_3_w.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dstore_3_w.java
-.class public dxc/junit/opcodes/dstore/jm/T_dstore_3_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    fconst_1
-    dstore_w 0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_3_w.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_3_w.java
deleted file mode 100644
index e0d3e8f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_3_w.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore.jm;
-
-public class T_dstore_3_w {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_4.j b/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_4.j
deleted file mode 100644
index 45912a8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_4.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dstore_4.java
-.class public dxc/junit/opcodes/dstore/jm/T_dstore_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    dstore 0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_4.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_4.java
deleted file mode 100644
index 8aef1df..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore.jm;
-
-public class T_dstore_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_4_w.j b/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_4_w.j
deleted file mode 100644
index 95fc6f6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_4_w.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dstore_4_w.java
-.class public dxc/junit/opcodes/dstore/jm/T_dstore_4_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    dstore_w 0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_4_w.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_4_w.java
deleted file mode 100644
index 0e34bdd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_4_w.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore.jm;
-
-public class T_dstore_4_w {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_5.j b/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_5.j
deleted file mode 100644
index b92bac5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_5.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dstore_5.java
-.class public dxc/junit/opcodes/dstore/jm/T_dstore_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()D
-    .limit stack 4
-    .limit locals 300
-    
-    dconst_1
-    dstore 255
-    dconst_0
-    dload 255
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_5.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_5.java
deleted file mode 100644
index 5bfd48b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore.jm;
-
-public class T_dstore_5 {
-
-    public static double run() {
-        return 1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_5_w.j b/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_5_w.j
deleted file mode 100644
index 3efeed0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_5_w.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dstore_5_w.java
-.class public dxc/junit/opcodes/dstore/jm/T_dstore_5_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()D
-    .limit stack 4
-    .limit locals 300
-    
-    dconst_1
-    dstore_w 257
-    dconst_0
-    dload 257
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_5_w.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_5_w.java
deleted file mode 100644
index 6a5bf97..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore/jm/T_dstore_5_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore.jm;
-
-public class T_dstore_5_w {
-
-    public static double run() {
-        return 1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/Test_dstore_0.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/Test_dstore_0.java
deleted file mode 100644
index c365e69..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/Test_dstore_0.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore_0;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.dstore_0.jm.T_dstore_0_1;
-import dxc.junit.opcodes.dstore_0.jm.T_dstore_0_5;
-
-public class Test_dstore_0 extends DxTestCase {
-
-    /**
-     * @title value is stored
-     */
-    public void testN1() {
-        assertEquals(1d, T_dstore_0_1.run());
-    }
-
-    /**
-     * @title equality of dstore_<n> and dstore <n>
-     */
-    public void testN2() {
-        assertTrue(T_dstore_0_5.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.dstore_0.jm.T_dstore_0_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.dstore_0.jm.T_dstore_0_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.dstore_0.jm.T_dstore_0_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/jm/T_dstore_0_1.j b/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/jm/T_dstore_0_1.j
deleted file mode 100644
index c145f7f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/jm/T_dstore_0_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dstore_0_1.java
-.class public dxc/junit/opcodes/dstore_0/jm/T_dstore_0_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()D
-    .limit stack 4
-    .limit locals 2
-    
-    dconst_1
-    dstore_0
-    dconst_0
-    dload_0
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/jm/T_dstore_0_1.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/jm/T_dstore_0_1.java
deleted file mode 100644
index 225c851..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/jm/T_dstore_0_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore_0.jm;
-
-public class T_dstore_0_1 {
-
-    public static double run() {
-        return 1d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/jm/T_dstore_0_2.j b/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/jm/T_dstore_0_2.j
deleted file mode 100644
index 2fc0cf3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/jm/T_dstore_0_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dstore_0_2.java
-.class public dxc/junit/opcodes/dstore_0/jm/T_dstore_0_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    dstore_0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/jm/T_dstore_0_2.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/jm/T_dstore_0_2.java
deleted file mode 100644
index 468a023..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/jm/T_dstore_0_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore_0.jm;
-
-public class T_dstore_0_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/jm/T_dstore_0_3.j b/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/jm/T_dstore_0_3.j
deleted file mode 100644
index a401b73..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/jm/T_dstore_0_3.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dstore_0_3.java
-.class public dxc/junit/opcodes/dstore_0/jm/T_dstore_0_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    fconst_1
-    dstore_0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/jm/T_dstore_0_3.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/jm/T_dstore_0_3.java
deleted file mode 100644
index d22bee4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/jm/T_dstore_0_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore_0.jm;
-
-public class T_dstore_0_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/jm/T_dstore_0_4.j b/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/jm/T_dstore_0_4.j
deleted file mode 100644
index c3ad00d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/jm/T_dstore_0_4.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dstore_0_4.java
-.class public dxc/junit/opcodes/dstore_0/jm/T_dstore_0_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    dstore_0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/jm/T_dstore_0_4.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/jm/T_dstore_0_4.java
deleted file mode 100644
index 80fd08e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/jm/T_dstore_0_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore_0.jm;
-
-public class T_dstore_0_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/jm/T_dstore_0_5.j b/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/jm/T_dstore_0_5.j
deleted file mode 100644
index 6a7124b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/jm/T_dstore_0_5.j
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dstore_0_5.java
-.class public dxc/junit/opcodes/dstore_0/jm/T_dstore_0_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()Z
-    .limit stack 4
-    .limit locals 2
-
-    dconst_1
-    dstore_0
-    dload_0
-
-    dconst_1
-    dstore 0
-    dload_0
-    
-    dcmpl
-    ifne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/jm/T_dstore_0_5.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/jm/T_dstore_0_5.java
deleted file mode 100644
index e0596d4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_0/jm/T_dstore_0_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore_0.jm;
-
-public class T_dstore_0_5 {
-
-    public static boolean run() {
-        double i = 2d;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/Test_dstore_1.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/Test_dstore_1.java
deleted file mode 100644
index 54dda38..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/Test_dstore_1.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore_1;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.dstore_1.jm.T_dstore_1_1;
-import dxc.junit.opcodes.dstore_1.jm.T_dstore_1_5;
-
-public class Test_dstore_1 extends DxTestCase {
-
-    /**
-     * @title value is stored
-     */
-    public void testN1() {
-        assertEquals(1d, T_dstore_1_1.run());
-    }
-
-    /**
-     * @title equality of dstore_<n> and dstore <n>
-     */
-    public void testN2() {
-        assertTrue(T_dstore_1_5.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.dstore_1.jm.T_dstore_1_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.dstore_1.jm.T_dstore_1_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.dstore_1.jm.T_dstore_1_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/jm/T_dstore_1_1.j b/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/jm/T_dstore_1_1.j
deleted file mode 100644
index 99f316a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/jm/T_dstore_1_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dstore_1_1.java
-.class public dxc/junit/opcodes/dstore_1/jm/T_dstore_1_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()D
-    .limit stack 4
-    .limit locals 3
-    
-    dconst_1
-    dstore_1
-    dconst_0
-    dload_1
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/jm/T_dstore_1_1.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/jm/T_dstore_1_1.java
deleted file mode 100644
index f57c81b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/jm/T_dstore_1_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore_1.jm;
-
-public class T_dstore_1_1 {
-
-    public static double run() {
-        return 1d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/jm/T_dstore_1_2.j b/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/jm/T_dstore_1_2.j
deleted file mode 100644
index 32d1a60..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/jm/T_dstore_1_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dstore_1_2.java
-.class public dxc/junit/opcodes/dstore_1/jm/T_dstore_1_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    dstore_1
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/jm/T_dstore_1_2.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/jm/T_dstore_1_2.java
deleted file mode 100644
index 292b860..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/jm/T_dstore_1_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore_1.jm;
-
-public class T_dstore_1_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/jm/T_dstore_1_3.j b/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/jm/T_dstore_1_3.j
deleted file mode 100644
index 6dd7feb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/jm/T_dstore_1_3.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dstore_1_3.java
-.class public dxc/junit/opcodes/dstore_1/jm/T_dstore_1_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    fconst_1
-    dstore_1
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/jm/T_dstore_1_3.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/jm/T_dstore_1_3.java
deleted file mode 100644
index 3f55d47..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/jm/T_dstore_1_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore_1.jm;
-
-public class T_dstore_1_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/jm/T_dstore_1_4.j b/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/jm/T_dstore_1_4.j
deleted file mode 100644
index bfce7ba..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/jm/T_dstore_1_4.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dstore_1_4.java
-.class public dxc/junit/opcodes/dstore_1/jm/T_dstore_1_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    dstore_1
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/jm/T_dstore_1_4.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/jm/T_dstore_1_4.java
deleted file mode 100644
index 242e0a5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/jm/T_dstore_1_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore_1.jm;
-
-public class T_dstore_1_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/jm/T_dstore_1_5.j b/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/jm/T_dstore_1_5.j
deleted file mode 100644
index 12dd5a6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/jm/T_dstore_1_5.j
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dstore_1_5.java
-.class public dxc/junit/opcodes/dstore_1/jm/T_dstore_1_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()Z
-    .limit stack 4
-    .limit locals 3
-
-    dconst_1
-    dstore_1
-    dload_1
-
-    dconst_1
-    dstore 1
-    dload_1
-    
-    dcmpl
-    ifne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/jm/T_dstore_1_5.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/jm/T_dstore_1_5.java
deleted file mode 100644
index 492506a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_1/jm/T_dstore_1_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore_1.jm;
-
-public class T_dstore_1_5 {
-
-    public static boolean run() {
-        double i = 2d;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/Test_dstore_2.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/Test_dstore_2.java
deleted file mode 100644
index c00b007..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/Test_dstore_2.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore_2;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.dstore_2.jm.T_dstore_2_1;
-import dxc.junit.opcodes.dstore_2.jm.T_dstore_2_5;
-
-public class Test_dstore_2 extends DxTestCase {
-
-    /**
-     * @title value is stored
-     */
-    public void testN1() {
-        assertEquals(1d, T_dstore_2_1.run());
-    }
-
-    /**
-     * @title equality of dstore_<n> and dstore <n>
-     */
-    public void testN2() {
-        assertTrue(T_dstore_2_5.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.dstore_2.jm.T_dstore_2_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.dstore_2.jm.T_dstore_2_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.dstore_2.jm.T_dstore_2_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/jm/T_dstore_2_1.j b/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/jm/T_dstore_2_1.j
deleted file mode 100644
index c2a76bb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/jm/T_dstore_2_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dstore_2_1.java
-.class public dxc/junit/opcodes/dstore_2/jm/T_dstore_2_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()D
-    .limit stack 4
-    .limit locals 4
-    
-    dconst_1
-    dstore_2
-    dconst_0
-    dload_2
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/jm/T_dstore_2_1.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/jm/T_dstore_2_1.java
deleted file mode 100644
index ab0b839..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/jm/T_dstore_2_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore_2.jm;
-
-public class T_dstore_2_1 {
-
-    public static double run() {
-        return 1d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/jm/T_dstore_2_2.j b/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/jm/T_dstore_2_2.j
deleted file mode 100644
index 4f07c20..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/jm/T_dstore_2_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dstore_2_2.java
-.class public dxc/junit/opcodes/dstore_2/jm/T_dstore_2_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    dstore_2
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/jm/T_dstore_2_2.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/jm/T_dstore_2_2.java
deleted file mode 100644
index 3fc3729..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/jm/T_dstore_2_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore_2.jm;
-
-public class T_dstore_2_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/jm/T_dstore_2_3.j b/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/jm/T_dstore_2_3.j
deleted file mode 100644
index 07f8d4d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/jm/T_dstore_2_3.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dstore_2_3.java
-.class public dxc/junit/opcodes/dstore_2/jm/T_dstore_2_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    fconst_1
-    dstore_2
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/jm/T_dstore_2_3.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/jm/T_dstore_2_3.java
deleted file mode 100644
index 3e29214..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/jm/T_dstore_2_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore_2.jm;
-
-public class T_dstore_2_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/jm/T_dstore_2_4.j b/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/jm/T_dstore_2_4.j
deleted file mode 100644
index eba9a71..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/jm/T_dstore_2_4.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dstore_2_4.java
-.class public dxc/junit/opcodes/dstore_2/jm/T_dstore_2_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    dstore_2
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/jm/T_dstore_2_4.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/jm/T_dstore_2_4.java
deleted file mode 100644
index 3b9bb03..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/jm/T_dstore_2_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore_2.jm;
-
-public class T_dstore_2_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/jm/T_dstore_2_5.j b/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/jm/T_dstore_2_5.j
deleted file mode 100644
index 1b9a614..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/jm/T_dstore_2_5.j
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dstore_2_5.java
-.class public dxc/junit/opcodes/dstore_2/jm/T_dstore_2_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()Z
-    .limit stack 4
-    .limit locals 4
-
-    dconst_1
-    dstore_2
-    dload_2
-
-    dconst_1
-    dstore 2
-    dload_2
-    
-    dcmpl
-    ifne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/jm/T_dstore_2_5.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/jm/T_dstore_2_5.java
deleted file mode 100644
index 556be2c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_2/jm/T_dstore_2_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore_2.jm;
-
-public class T_dstore_2_5 {
-
-    public static boolean run() {
-        double i = 2d;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/Test_dstore_3.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/Test_dstore_3.java
deleted file mode 100644
index 860a614..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/Test_dstore_3.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore_3;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.dstore_3.jm.T_dstore_3_1;
-import dxc.junit.opcodes.dstore_3.jm.T_dstore_3_5;
-
-public class Test_dstore_3 extends DxTestCase {
-
-    /**
-     * @title value is stored
-     */
-    public void testN1() {
-        assertEquals(1d, T_dstore_3_1.run());
-    }
-
-    /**
-     * @title equality of dstore_<n> and dstore <n>
-     */
-    public void testN2() {
-        assertTrue(T_dstore_3_5.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.dstore_3.jm.T_dstore_3_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.dstore_3.jm.T_dstore_3_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.dstore_3.jm.T_dstore_3_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/jm/T_dstore_3_1.j b/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/jm/T_dstore_3_1.j
deleted file mode 100644
index 3738af3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/jm/T_dstore_3_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dstore_3_1.java
-.class public dxc/junit/opcodes/dstore_3/jm/T_dstore_3_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()D
-    .limit stack 4
-    .limit locals 5
-    
-    dconst_1
-    dstore_3
-    dconst_0
-    dload_3
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/jm/T_dstore_3_1.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/jm/T_dstore_3_1.java
deleted file mode 100644
index 847e07a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/jm/T_dstore_3_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore_3.jm;
-
-public class T_dstore_3_1 {
-
-    public static double run() {
-        return 1d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/jm/T_dstore_3_2.j b/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/jm/T_dstore_3_2.j
deleted file mode 100644
index 626d1e4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/jm/T_dstore_3_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dstore_3_2.java
-.class public dxc/junit/opcodes/dstore_3/jm/T_dstore_3_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    dstore_3
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/jm/T_dstore_3_2.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/jm/T_dstore_3_2.java
deleted file mode 100644
index 21293d2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/jm/T_dstore_3_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore_3.jm;
-
-public class T_dstore_3_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/jm/T_dstore_3_3.j b/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/jm/T_dstore_3_3.j
deleted file mode 100644
index 9d232e7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/jm/T_dstore_3_3.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dstore_3_3.java
-.class public dxc/junit/opcodes/dstore_3/jm/T_dstore_3_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 5
-
-    fconst_1
-    dstore_3
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/jm/T_dstore_3_3.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/jm/T_dstore_3_3.java
deleted file mode 100644
index b0ac2a0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/jm/T_dstore_3_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore_3.jm;
-
-public class T_dstore_3_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/jm/T_dstore_3_4.j b/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/jm/T_dstore_3_4.j
deleted file mode 100644
index 2250519..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/jm/T_dstore_3_4.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dstore_3_4.java
-.class public dxc/junit/opcodes/dstore_3/jm/T_dstore_3_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 5
-
-    lconst_1
-    dstore_3
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/jm/T_dstore_3_4.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/jm/T_dstore_3_4.java
deleted file mode 100644
index 7f1a8d4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/jm/T_dstore_3_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore_3.jm;
-
-public class T_dstore_3_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/jm/T_dstore_3_5.j b/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/jm/T_dstore_3_5.j
deleted file mode 100644
index 4808894..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/jm/T_dstore_3_5.j
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dstore_3_5.java
-.class public dxc/junit/opcodes/dstore_3/jm/T_dstore_3_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()Z
-    .limit stack 4
-    .limit locals 5
-
-    dconst_1
-    dstore_3
-    dload_3
-
-    dconst_1
-    dstore 3
-    dload_3
-    
-    dcmpl
-    ifne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/jm/T_dstore_3_5.java b/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/jm/T_dstore_3_5.java
deleted file mode 100644
index f1b6ce4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dstore_3/jm/T_dstore_3_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dstore_3.jm;
-
-public class T_dstore_3_5 {
-
-    public static boolean run() {
-        double i = 2d;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dsub/Test_dsub.java b/tools/dx-tests/src/dxc/junit/opcodes/dsub/Test_dsub.java
deleted file mode 100644
index 25ae6eb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dsub/Test_dsub.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dsub;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.dsub.jm.T_dsub_1;
-
-public class Test_dsub extends DxTestCase {
-
-    /**
-     * @title  Arguments = 2.7d, 3.14d
-     */
-    public void testN1() {
-        T_dsub_1 t = new T_dsub_1();
-        assertEquals(-0.43999999999999995d, t.run(2.7d, 3.14d));
-    }
-
-    /**
-     * @title  Arguments = 0, -3.14d
-     */
-    public void testN2() {
-        T_dsub_1 t = new T_dsub_1();
-        assertEquals(3.14d, t.run(0, -3.14d));
-    }
-
-    /**
-     * @title Arguments = -3.14d, -2.7d
-     */
-    public void testN3() {
-        T_dsub_1 t = new T_dsub_1();
-        assertEquals(-0.43999999999999995d, t.run(-3.14d, -2.7d));
-    }
-
-    /**
-     * @title  Arguments = Double.MAX_VALUE, Double.NaN
-     */
-    public void testB1() {
-        T_dsub_1 t = new T_dsub_1();
-        assertEquals(Double.NaN, t.run(Double.MAX_VALUE, Double.NaN));
-    }
-
-    /**
-     * @title  Arguments = Double.POSITIVE_INFINITY,
-     * Double.NEGATIVE_INFINITY
-     */
-    public void testB2() {
-        T_dsub_1 t = new T_dsub_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_dsub_1 t = new T_dsub_1();
-        assertEquals(Double.NaN, t.run(Double.POSITIVE_INFINITY,
-                Double.POSITIVE_INFINITY));
-    }
-
-    /**
-     * @title  Arguments = Double.POSITIVE_INFINITY, -2.7d
-     */
-    public void testB4() {
-        T_dsub_1 t = new T_dsub_1();
-        assertEquals(Double.POSITIVE_INFINITY, t.run(Double.POSITIVE_INFINITY,
-                -2.7d));
-    }
-
-    /**
-     * @title  Arguments = +0, -0d
-     */
-    public void testB5() {
-        T_dsub_1 t = new T_dsub_1();
-        assertEquals(+0d, t.run(+0d, -0d));
-    }
-
-    /**
-     * @title  Arguments = -0d, -0d
-     */
-    public void testB6() {
-        T_dsub_1 t = new T_dsub_1();
-        assertEquals(0d, t.run(-0d, -0d));
-    }
-
-    /**
-     * @title  Arguments = +0d, +0d
-     */
-    public void testB7() {
-        T_dsub_1 t = new T_dsub_1();
-        assertEquals(+0d, t.run(+0d, +0d));
-    }
-
-    /**
-     * @title  Arguments = 2.7d, 2.7d
-     */
-    public void testB8() {
-        T_dsub_1 t = new T_dsub_1();
-        assertEquals(0d, t.run(2.7d, 2.7d));
-    }
-
-    /**
-     * @title  Arguments = Double.MAX_VALUE, Double.MAX_VALUE
-     */
-    public void testB9() {
-        T_dsub_1 t = new T_dsub_1();
-        assertEquals(0d, t.run(Double.MAX_VALUE, Double.MAX_VALUE));
-    }
-
-    /**
-     * @title  Arguments = Double.MIN_VALUE, 4.9E-324
-     */
-    public void testB10() {
-        T_dsub_1 t = new T_dsub_1();
-        assertEquals(0d, t.run(Double.MIN_VALUE, 4.9E-324));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.dsub.jm.T_dsub_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - float, double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.dsub.jm.T_dsub_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long, double
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.dsub.jm.T_dsub_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double, reference
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.dsub.jm.T_dsub_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dsub/jm/T_dsub_1.j b/tools/dx-tests/src/dxc/junit/opcodes/dsub/jm/T_dsub_1.j
deleted file mode 100644
index 62af343..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dsub/jm/T_dsub_1.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dsub_1.java
-.class public dxc/junit/opcodes/dsub/jm/T_dsub_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(DD)D
-    .limit stack 4
-    .limit locals 5
-    dload_1
-    dload_3
-    dsub
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dsub/jm/T_dsub_1.java b/tools/dx-tests/src/dxc/junit/opcodes/dsub/jm/T_dsub_1.java
deleted file mode 100644
index ab16ff8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dsub/jm/T_dsub_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dsub.jm;
-
-public class T_dsub_1 {
-
-    public double run(double a, double b) {
-        return a-b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dsub/jm/T_dsub_2.j b/tools/dx-tests/src/dxc/junit/opcodes/dsub/jm/T_dsub_2.j
deleted file mode 100644
index 988f027..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dsub/jm/T_dsub_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dsub_2.java
-.class public dxc/junit/opcodes/dsub/jm/T_dsub_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(DD)D
-    .limit stack 4
-    .limit locals 5
-    dload_1
-    ; dload_3    
-    dsub
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dsub/jm/T_dsub_2.java b/tools/dx-tests/src/dxc/junit/opcodes/dsub/jm/T_dsub_2.java
deleted file mode 100644
index f85699e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dsub/jm/T_dsub_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dsub.jm;
-
-public class T_dsub_2 {
-
-    public double run(double a, double b) {
-        return a-b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dsub/jm/T_dsub_3.j b/tools/dx-tests/src/dxc/junit/opcodes/dsub/jm/T_dsub_3.j
deleted file mode 100644
index 0e6e7db..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dsub/jm/T_dsub_3.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dsub_3.java
-.class public dxc/junit/opcodes/dsub/jm/T_dsub_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(FD)D
-    .limit stack 4
-    .limit locals 5
-    fload_1
-    dload_2    
-    dsub
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dsub/jm/T_dsub_3.java b/tools/dx-tests/src/dxc/junit/opcodes/dsub/jm/T_dsub_3.java
deleted file mode 100644
index e57d3c1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dsub/jm/T_dsub_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dsub.jm;
-
-public class T_dsub_3 {
-
-    public double run(float a, double b) {
-        return (double)a-b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dsub/jm/T_dsub_4.j b/tools/dx-tests/src/dxc/junit/opcodes/dsub/jm/T_dsub_4.j
deleted file mode 100644
index e592dc3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dsub/jm/T_dsub_4.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dsub_4.java
-.class public dxc/junit/opcodes/dsub/jm/T_dsub_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(JD)D
-    .limit stack 4
-    .limit locals 5
-
-    lload_1
-    dload_3
-    dsub
-
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dsub/jm/T_dsub_4.java b/tools/dx-tests/src/dxc/junit/opcodes/dsub/jm/T_dsub_4.java
deleted file mode 100644
index 3dcd8c8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dsub/jm/T_dsub_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dsub.jm;
-
-public class T_dsub_4 {
-
-    public double run(long a, double b) {
-        return (double)a-b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dsub/jm/T_dsub_5.j b/tools/dx-tests/src/dxc/junit/opcodes/dsub/jm/T_dsub_5.j
deleted file mode 100644
index b83d875..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dsub/jm/T_dsub_5.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dsub_5.java
-.class public dxc/junit/opcodes/dsub/jm/T_dsub_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(DD)D
-    .limit stack 4
-    .limit locals 5
-
-    dload_1
-    aload_0
-    dsub
-    dreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dsub/jm/T_dsub_5.java b/tools/dx-tests/src/dxc/junit/opcodes/dsub/jm/T_dsub_5.java
deleted file mode 100644
index 47ee270..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dsub/jm/T_dsub_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dsub.jm;
-
-public class T_dsub_5 {
-    
-    public double run(double a, double b) {
-        return a-b;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup/Test_dup.java b/tools/dx-tests/src/dxc/junit/opcodes/dup/Test_dup.java
deleted file mode 100644
index 5e84815..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup/Test_dup.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.dup.jm.T_dup_1;
-import dxc.junit.opcodes.dup.jm.T_dup_6;
-import dxc.junit.opcodes.dup.jm.T_dup_7;
-
-
-public class Test_dup extends DxTestCase {
-
-    /**
-     * @title  type of argument - int
-     */
-    public void testN1() {
-        T_dup_1 t = new T_dup_1();
-        assertTrue(t.run());
-    }
-    
-    /**
-     * @title  type of argument - float
-     */
-    public void testN2() {
-        T_dup_6 t = new T_dup_6();
-        assertTrue(t.run());
-    }
-    
-    /**
-     * @title  type of argument - reference
-     */
-    public void testN3() {
-        T_dup_7 t = new T_dup_7();
-        assertTrue(t.run());
-    }
-    
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments 
-     */
-    public void testVFE1() {
-        try
-        {
-            Class.forName("dxc.junit.opcodes.dup.jm.T_dup_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-    
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - double 
-     */
-    public void testVFE2() {
-        try
-        {
-            Class.forName("dxc.junit.opcodes.dup.jm.T_dup_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-    
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - long 
-     */
-    public void testVFE3() {
-        try
-        {
-            Class.forName("dxc.junit.opcodes.dup.jm.T_dup_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try
-        {
-            Class.forName("dxc.junit.opcodes.dup.jm.T_dup_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_1.j b/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_1.j
deleted file mode 100644
index c1b71e5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_1.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup_1.java
-.class public dxc/junit/opcodes/dup/jm/T_dup_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 2
-    .limit locals 2
-    
-    iconst_4
-    dup
-    if_icmpeq Label1
-    
-    iconst_0
-    ireturn
-    
-Label1:
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_1.java b/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_1.java
deleted file mode 100644
index c1d2de7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup.jm;
-
-public class T_dup_1 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_2.j b/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_2.j
deleted file mode 100644
index fc18b59..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup_2.java
-.class public dxc/junit/opcodes/dup/jm/T_dup_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()Z
-    .limit stack 2
-    .limit locals 2
-    ; iconst_4
-    dup
-    iconst_0
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_2.java b/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_2.java
deleted file mode 100644
index a9729cf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup.jm;
-
-public class T_dup_2 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_3.j b/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_3.j
deleted file mode 100644
index 4414dc2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_3.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup_3.java
-.class public dxc/junit/opcodes/dup/jm/T_dup_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 3
-    .limit locals 3
-    dconst_1
-    dup
-    iconst_0
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_3.java b/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_3.java
deleted file mode 100644
index 07c156d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup.jm;
-
-public class T_dup_3 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_4.j b/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_4.j
deleted file mode 100644
index a200e95..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_4.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup_4.java
-.class public dxc/junit/opcodes/dup/jm/T_dup_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 3
-    .limit locals 3
-
-    lconst_1
-    dup
-
-    iconst_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_4.java b/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_4.java
deleted file mode 100644
index f5a1819..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup.jm;
-
-public class T_dup_4 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_5.j b/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_5.j
deleted file mode 100644
index a346cd4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_5.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup_5.java
-.class public dxc/junit/opcodes/dup/jm/T_dup_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 1
-    .limit locals 1
-    
-    iconst_4
-    dup
-
-    if_icmpeq Label1
-    
-    iconst_0
-    ireturn
-    
-Label1:
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_5.java b/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_5.java
deleted file mode 100644
index 28e1688..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup.jm;
-
-public class T_dup_5 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_6.j b/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_6.j
deleted file mode 100644
index 46c002a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_6.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup_6.java
-.class public dxc/junit/opcodes/dup/jm/T_dup_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 2
-    .limit locals 2
-    
-    fconst_2
-    dup
-    fcmpl
-    ifeq Label1
-    
-    iconst_0
-    ireturn
-    
-Label1:
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_6.java b/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_6.java
deleted file mode 100644
index 1ff2719..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup.jm;
-
-public class T_dup_6 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_7.j b/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_7.j
deleted file mode 100644
index 2e31bb8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_7.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup_7.java
-.class public dxc/junit/opcodes/dup/jm/T_dup_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 2
-    .limit locals 2
-    
-    aload_0
-    dup
-    if_acmpeq Label1
-    
-    iconst_0
-    ireturn
-    
-Label1:
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_7.java b/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_7.java
deleted file mode 100644
index 17d9abe..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup/jm/T_dup_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup.jm;
-
-public class T_dup_7 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2/Test_dup2.java b/tools/dx-tests/src/dxc/junit/opcodes/dup2/Test_dup2.java
deleted file mode 100644
index c73ef3b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2/Test_dup2.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup2;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.dup2.jm.T_dup2_1;
-import dxc.junit.opcodes.dup2.jm.T_dup2_3;
-import dxc.junit.opcodes.dup2.jm.T_dup2_4;
-import dxc.junit.opcodes.dup2.jm.T_dup2_6;
-
-public class Test_dup2 extends DxTestCase {
-
-    /**
-     * @title  type of argument - int, int
-     */
-    public void testN1() {
-        T_dup2_1 t = new T_dup2_1();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @title  type of argument - float, float
-     */
-    public void testN2() {
-        T_dup2_6 t = new T_dup2_6();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @title  type of argument - double, int
-     */
-    public void testN3() {
-        T_dup2_3 t = new T_dup2_3();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @title  type of argument - long, int
-     */
-    public void testN4() {
-        T_dup2_4 t = new T_dup2_4();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.dup2.jm.T_dup2_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.dup2.jm.T_dup2_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_1.j b/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_1.j
deleted file mode 100644
index 07a81b8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_1.j
+++ /dev/null
@@ -1,57 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup2_1.java
-.class public dxc/junit/opcodes/dup2/jm/T_dup2_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 5
-    .limit locals 2
-    
-    iconst_3
-    iconst_4
-    dup2            
-    
-    iconst_4
-    if_icmpne Label3
-    
-    iconst_3
-    if_icmpne Label2
-    
-    iconst_4
-    if_icmpne Label1
-    
-    iconst_3
-    if_icmpne Label0
-    
-    iconst_1
-    ireturn
-
-Label3:
-    pop
-Label2:
-    pop
-Label1:
-    pop
-Label0:
-    iconst_0
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_1.java b/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_1.java
deleted file mode 100644
index b72b82d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup2.jm;
-
-public class T_dup2_1 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_2.j b/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_2.j
deleted file mode 100644
index e7ad7f2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup2_2.java
-.class public dxc/junit/opcodes/dup2/jm/T_dup2_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()Z
-    .limit stack 5
-    .limit locals 2
-    iconst_4
-    dup2
-    iconst_0
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_2.java b/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_2.java
deleted file mode 100644
index c2d0e43..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup2.jm;
-
-public class T_dup2_2 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_3.j b/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_3.j
deleted file mode 100644
index 5f526d4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_3.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup2_3.java
-.class public dxc/junit/opcodes/dup2/jm/T_dup2_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 6
-    .limit locals 3
-    dconst_1
-    dup2
-    
-    dcmpl
-    ifne Label0
-    
-    iconst_1
-    ireturn
-    
-Label0:
-    iconst_0
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_3.java b/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_3.java
deleted file mode 100644
index aa2ac10..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup2.jm;
-
-public class T_dup2_3 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_4.j b/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_4.j
deleted file mode 100644
index 9424ac6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_4.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup2_4.java
-.class public dxc/junit/opcodes/dup2/jm/T_dup2_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 6
-    .limit locals 3
-    lconst_1
-    dup2
-    
-    lcmp
-    ifne Label0
-    
-    iconst_1
-    ireturn
-    
-Label0:
-    iconst_0
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_4.java b/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_4.java
deleted file mode 100644
index f451f5a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup2.jm;
-
-public class T_dup2_4 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_5.j b/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_5.j
deleted file mode 100644
index 757caaa..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_5.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup2_5.java
-.class public dxc/junit/opcodes/dup2/jm/T_dup2_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 2
-    .limit locals 1
-    
-    iconst_3
-    iconst_4
-    dup2
-
-    if_icmpeq Label1
-    
-    iconst_0
-    ireturn
-    
-Label1:
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_5.java b/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_5.java
deleted file mode 100644
index 2af55a2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup2.jm;
-
-public class T_dup2_5 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_6.j b/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_6.j
deleted file mode 100644
index d68f7b0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_6.j
+++ /dev/null
@@ -1,61 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup2_6.java
-.class public dxc/junit/opcodes/dup2/jm/T_dup2_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 5
-    .limit locals 2
-    
-    fconst_0
-    fconst_1
-    dup2
-    
-    fconst_1
-    fcmpl
-    ifne Label3
-    
-    fconst_0
-    fcmpl
-    ifne Label2
-    
-    fconst_1
-    fcmpl
-    ifne Label1
-    
-    fconst_0
-    fcmpl
-    ifne Label0
-    
-    iconst_1
-    ireturn
-
-Label3:
-    pop
-Label2:
-    pop    
-Label1:
-    pop
-Label0:
-    iconst_0
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_6.java b/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_6.java
deleted file mode 100644
index 9fa9ff1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2/jm/T_dup2_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup2.jm;
-
-public class T_dup2_6 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/Test_dup2_x1.java b/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/Test_dup2_x1.java
deleted file mode 100644
index 2ba5c11..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/Test_dup2_x1.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup2_x1;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.dup2_x1.jm.T_dup2_x1_1;
-import dxc.junit.opcodes.dup2_x1.jm.T_dup2_x1_3;
-import dxc.junit.opcodes.dup2_x1.jm.T_dup2_x1_4;
-import dxc.junit.opcodes.dup2_x1.jm.T_dup2_x1_6;
-
-public class Test_dup2_x1 extends DxTestCase {
-
-    /**
-     * @title  type of argument - int, int, int
-     */
-    public void testN1() {
-        T_dup2_x1_1 t = new T_dup2_x1_1();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @title  type of argument - float, float, float
-     */
-    public void testN2() {
-        T_dup2_x1_6 t = new T_dup2_x1_6();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @title  type of argument - double, int
-     */
-    public void testN3() {
-        T_dup2_x1_3 t = new T_dup2_x1_3();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @title type of argument - long, int
-     */
-    public void testN4() {
-        T_dup2_x1_4 t = new T_dup2_x1_4();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.dup2_x1.jm.T_dup2_x1_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.dup2_x1.jm.T_dup2_x1_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_1.j b/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_1.j
deleted file mode 100644
index 6d2c106..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_1.j
+++ /dev/null
@@ -1,59 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup2_x1_1.java
-.class public dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 8
-    .limit locals 2
-    
-    iconst_3
-    iconst_4
-    iconst_5    ; 3 4 5
-    dup2_x1        ; 4 5 3 4 5
-    iconst_5
-    if_icmpne Label4    ; 4 5 3 4
-    iconst_4
-    if_icmpne Label3    ; 4 5 3 
-    iconst_3
-    if_icmpne Label2    ; 4 5 
-    iconst_5
-    if_icmpne Label1    ; 4
-    iconst_4
-    if_icmpne Label0    ; 
-
-    iconst_1
-    ireturn
-    
-Label4:
-    pop
-Label3:
-    pop
-Label2:
-    pop
-Label1:
-    pop
-Label0:    
-    iconst_0
-    ireturn
-        
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_1.java b/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_1.java
deleted file mode 100644
index 471e097..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup2_x1.jm;
-
-public class T_dup2_x1_1 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_2.j b/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_2.j
deleted file mode 100644
index fbdd36b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_2.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup2_x1_2.java
-.class public dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()Z
-    .limit stack 4
-    .limit locals 2
-    iconst_3
-    iconst_4
-    ;iconst_5
-    dup2_x1
-    iconst_0
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_2.java b/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_2.java
deleted file mode 100644
index afa7a67..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup2_x1.jm;
-
-public class T_dup2_x1_2 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_3.j b/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_3.j
deleted file mode 100644
index 23c3cf8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_3.j
+++ /dev/null
@@ -1,52 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup2_x1_3.java
-.class public dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 8
-    .limit locals 3
-    
-    iconst_5
-    dconst_1
-    dup2_x1        ; [1] 5 [1]
-    
-    dconst_1    ; [1] 5 [1] [1]
-    dcmpl        ; [1] 5
-    ifne Label2
-    iconst_5    ; [1] 5 5
-    if_icmpne Label1
-       dconst_1    ; [1][1]
-    dcmpl        ; 
-    ifne Label0
-    
-    iconst_1
-    ireturn
-    
- Label2:
-     pop
- Label1:
-     pop2
- Label0:
-    iconst_0
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_3.java b/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_3.java
deleted file mode 100644
index fdd9b7b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup2_x1.jm;
-
-public class T_dup2_x1_3 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_4.j b/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_4.j
deleted file mode 100644
index c719ab6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_4.j
+++ /dev/null
@@ -1,52 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup2_x1_4.java
-.class public dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 8
-    .limit locals 3
-    
-    iconst_5
-    lconst_1
-    dup2_x1        ; [1] 5 [1]
-    
-    lconst_1    ; [1] 5 [1] [1]
-    lcmp        ; [1] 5
-    ifne Label2
-    iconst_5    ; [1] 5 5
-    if_icmpne Label1
-       lconst_1    ; [1][1]
-    lcmp        ; 
-    ifne Label0
-    
-    iconst_1
-    ireturn
-    
- Label2:
-     pop
- Label1:
-     pop2
- Label0:
-    iconst_0
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_4.java b/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_4.java
deleted file mode 100644
index 92e6cd2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup2_x1.jm;
-
-public class T_dup2_x1_4 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_5.j b/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_5.j
deleted file mode 100644
index 81a5836..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_5.j
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup2_x1_5.java
-.class public dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 4
-    .limit locals 1
-    
-    iconst_3
-    iconst_4
-    iconst_5
-    dup2_x1
-
-    if_icmpeq Label1
-    
-    iconst_0
-    ireturn
-    
-Label1:
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_5.java b/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_5.java
deleted file mode 100644
index 46036a8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup2_x1.jm;
-
-public class T_dup2_x1_5 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_6.j b/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_6.j
deleted file mode 100644
index 45cd2b2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_6.j
+++ /dev/null
@@ -1,64 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup2_x1_6.java
-.class public dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 8
-    .limit locals 2
-    
-    fconst_0
-    fconst_1
-    fconst_2    ; 0 1 2
-    dup2_x1        ; 1 2 0 1 2
-    fconst_2
-    fcmpl         ; 1 2 0 1
-    ifne Label4    
-    fconst_1
-    fcmpl         ; 1 2 0 
-    ifne Label3    
-    fconst_0
-    fcmpl         ; 1 2 
-    ifne Label2    
-    fconst_2
-    fcmpl         ; 1
-    ifne Label1    
-    fconst_1
-    fcmpl         ;
-    ifne Label0     
-
-    iconst_1
-    ireturn
-    
-Label4:
-    pop
-Label3:
-    pop
-Label2:
-    pop
-Label1:
-    pop
-Label0:    
-    iconst_0
-    ireturn
-        
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_6.java b/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_6.java
deleted file mode 100644
index 050d49c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x1/jm/T_dup2_x1_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup2_x1.jm;
-
-public class T_dup2_x1_6 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/Test_dup2_x2.java b/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/Test_dup2_x2.java
deleted file mode 100644
index e211f3e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/Test_dup2_x2.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup2_x2;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.dup2_x2.jm.T_dup2_x2_1;
-import dxc.junit.opcodes.dup2_x2.jm.T_dup2_x2_2;
-import dxc.junit.opcodes.dup2_x2.jm.T_dup2_x2_3;
-import dxc.junit.opcodes.dup2_x2.jm.T_dup2_x2_4;
-import dxc.junit.opcodes.dup2_x2.jm.T_dup2_x2_5;
-
-public class Test_dup2_x2 extends DxTestCase {
-
-    /**
-     * @title  type of argument - int, int, int, int
-     */
-    public void testN1() {
-        T_dup2_x2_1 t = new T_dup2_x2_1();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @title  type of argument - float, float, float, float
-     */
-    public void testN2() {
-        T_dup2_x2_2 t = new T_dup2_x2_2();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @title  type of argument - double, float, int
-     */
-    public void testN3() {
-        T_dup2_x2_3 t = new T_dup2_x2_3();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @title type of argument - int, float, long
-     */
-    public void testN4() {
-        T_dup2_x2_4 t = new T_dup2_x2_4();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @title type of argument - double, long
-     */
-    public void testN5() {
-        T_dup2_x2_5 t = new T_dup2_x2_5();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.dup2_x2.jm.T_dup2_x2_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.dup2_x2.jm.T_dup2_x2_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_1.j b/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_1.j
deleted file mode 100644
index b7be303..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_1.j
+++ /dev/null
@@ -1,64 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup2_x2_1.java
-.class public dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 8
-    .limit locals 2
-    
-    iconst_2
-    iconst_3
-    iconst_4
-    iconst_5    ; 2 3 4 5
-    dup2_x2        ; 4 5 2 3 4 5
-    iconst_5
-    if_icmpne Label5    ; 4 5 2 3 4 
-    iconst_4
-    if_icmpne Label4    ; 4 5 2 3 
-    iconst_3
-    if_icmpne Label3    ; 4 5 2 
-    iconst_2
-    if_icmpne Label2    ; 4 5
-    iconst_5
-    if_icmpne Label1    ; 4
-    iconst_4
-    if_icmpne Label0    ; 4
-
-    iconst_1
-    ireturn
-   
-Label5:
-    pop 
-Label4:
-    pop
-Label3:
-    pop
-Label2:
-    pop
-Label1:
-    pop
-Label0:    
-    iconst_0
-    ireturn
-        
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_1.java b/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_1.java
deleted file mode 100644
index 3d02ff3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup2_x2.jm;
-
-public class T_dup2_x2_1 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_2.j b/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_2.j
deleted file mode 100644
index aa231cf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_2.j
+++ /dev/null
@@ -1,75 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup2_x2_2.java
-.class public dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 8
-    .limit locals 2
-    
-    fconst_2
-    ldc 3.0f
-    ldc 4.0f
-    ldc 5.0f    ; 2 3 4 5
-    dup2_x2        ; 4 5 2 3 4 5
-    
-    ldc 5.0f
-    fcmpl        ; 4 5 2 3 4
-    ifne Label5
-
-    ldc 4.0f
-    fcmpl        ; 4 5 2 3
-    ifne Label4
-         
-    ldc 3.0f
-    fcmpl        ; 4 5 2
-    ifne Label3
-
-    fconst_2
-    fcmpl        ; 4 5
-    ifne Label2
-    
-    ldc 5.0f
-    fcmpl        ; 4
-    ifne Label1
-    
-    ldc 4.0f
-    fcmpl        ;
-    ifne Label0
-
-    iconst_1
-    ireturn
-   
-Label5:
-    pop 
-Label4:
-    pop
-Label3:
-    pop
-Label2:
-    pop
-Label1:
-    pop
-Label0:    
-    iconst_0
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_2.java b/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_2.java
deleted file mode 100644
index 12f6dbd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup2_x2.jm;
-
-public class T_dup2_x2_2 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_3.j b/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_3.j
deleted file mode 100644
index 6c42a29..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_3.j
+++ /dev/null
@@ -1,66 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup2_x2_3.java
-.class public dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 8
-    .limit locals 2
-    
-    ldc2_w 3.0d
-    ldc 4.0f
-    iconst_5    ; [3] 4.0 5
-    dup2_x2        ; 4.0 5 [3] 4.0 5
-    
-    iconst_5
-    if_icmpne Label4    ; 4.0 5 [3] 4.0
-
-    ldc 4.0f
-    fcmpl        ; 4.0 5 [3]
-    ifne Label3
-         
-    ldc2_w 3.0d
-    dcmpl        ; 4.0 5
-    ifne Label2
-
-    iconst_5
-    if_icmpne Label1 ; 4.0
-    
-    ldc 4.0f
-    fcmpl        ;
-    ifne Label0
-
-    iconst_1
-    ireturn
-   
-Label4:
-    pop
-Label3:
-    pop2
-Label2:
-    pop
-Label1:
-    pop
-Label0:    
-    iconst_0
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_3.java b/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_3.java
deleted file mode 100644
index e714059..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup2_x2.jm;
-
-public class T_dup2_x2_3 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_4.j b/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_4.j
deleted file mode 100644
index 61533bf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_4.j
+++ /dev/null
@@ -1,61 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup2_x2_4.java
-.class public dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 8
-    .limit locals 2
-    
-    iconst_3
-    ldc 4.0f
-    ldc2_w 5    ; 3 4.0 [5]
-    dup2_x2        ; [5] 3 4.0 [5]
-    
-    ldc2_w 5
-    lcmp
-    ifne Label3    ; [5] 3 4.0
-
-    ldc 4.0f
-    fcmpl        ; [5] 3
-    ifne Label2
-         
-    iconst_3
-    if_icmpne Label1 ; [5]
-
-    ldc2_w 5
-    lcmp        ;
-    ifne Label0
-
-    iconst_1
-    ireturn
-   
-Label3:
-    pop
-Label2:
-    pop
-Label1:
-    pop2
-Label0:    
-    iconst_0
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_4.java b/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_4.java
deleted file mode 100644
index 64f1368..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup2_x2.jm;
-
-public class T_dup2_x2_4 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_5.j b/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_5.j
deleted file mode 100644
index 58b4209..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_5.j
+++ /dev/null
@@ -1,55 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup2_x2_5.java
-.class public dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 8
-    .limit locals 2
-    
-    ldc2_w 4.0d
-    ldc2_w 5    ; [4.] [5]
-    dup2_x2        ; [5] [4.] [5]
-    
-    ldc2_w 5
-    lcmp
-    ifne Label2    ; [5] [4.]
-
-    ldc2_w 4.0d
-    dcmpl        ; [5]
-    ifne Label1
-         
-    ldc2_w 5
-    lcmp        ;
-    ifne Label0
-
-    iconst_1
-    ireturn
-   
-Label2:
-    pop2
-Label1:
-    pop2
-Label0:    
-    iconst_0
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_5.java b/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_5.java
deleted file mode 100644
index e3ba641..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup2_x2.jm;
-
-public class T_dup2_x2_5 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_6.j b/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_6.j
deleted file mode 100644
index 1912e5e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_6.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup2_x2_6.java
-.class public dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()Z
-    .limit stack 8
-    .limit locals 2
-    iconst_2
-    iconst_3
-    iconst_4
-    ;iconst_5
-    dup2_x2
-    iconst_0
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_6.java b/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_6.java
deleted file mode 100644
index a38100d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup2_x2.jm;
-
-public class T_dup2_x2_6 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_7.j b/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_7.j
deleted file mode 100644
index d4a70f2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_7.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup2_x2_7.java
-.class public dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 5
-    .limit locals 1
-    
-    iconst_2
-    iconst_3
-    iconst_4
-    iconst_5
-    dup2_x2
-
-    if_icmpeq Label1
-    
-    iconst_0
-    ireturn
-    
-Label1:
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_7.java b/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_7.java
deleted file mode 100644
index cf71ad1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup2_x2/jm/T_dup2_x2_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup2_x2.jm;
-
-public class T_dup2_x2_7 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/Test_dup_x1.java b/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/Test_dup_x1.java
deleted file mode 100644
index 6e3f57e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/Test_dup_x1.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup_x1;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.dup_x1.jm.T_dup_x1_1;
-import dxc.junit.opcodes.dup_x1.jm.T_dup_x1_6;
-import dxc.junit.opcodes.dup_x1.jm.T_dup_x1_7;
-import dxc.junit.opcodes.dup_x1.jm.T_dup_x1_8;
-
-public class Test_dup_x1 extends DxTestCase {
-
-    /**
-     * @title  type of argument - int, int
-     */
-    public void testN1() {
-        T_dup_x1_1 t = new T_dup_x1_1();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @title  type of argument - float, float
-     */
-    public void testN2() {
-        T_dup_x1_6 t = new T_dup_x1_6();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @title  type of argument - float, int
-     */
-    public void testN3() {
-        T_dup_x1_7 t = new T_dup_x1_7();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @title  type of argument - reference
-     */
-    public void testN4() {
-        T_dup_x1_8 t = new T_dup_x1_8();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.dup_x1.jm.T_dup_x1_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.dup_x1.jm.T_dup_x1_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.dup_x1.jm.T_dup_x1_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.dup_x1.jm.T_dup_x1_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_1.j b/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_1.j
deleted file mode 100644
index 4dc02d2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_1.j
+++ /dev/null
@@ -1,53 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup_x1_1.java
-.class public dxc/junit/opcodes/dup_x1/jm/T_dup_x1_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 4
-    .limit locals 2
-    
-    iconst_4
-    iconst_5
-    dup_x1
-    
-    iconst_5
-    if_icmpne Label2
-
-    iconst_4
-    if_icmpne Label1
-
-    iconst_5
-    if_icmpne Label0
-
-    iconst_1
-    ireturn
-
-Label2:
-    pop
-Label1:
-    pop
-Label0:    
-    iconst_0
-    ireturn
-        
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_1.java b/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_1.java
deleted file mode 100644
index 01af921..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup_x1.jm;
-
-public class T_dup_x1_1 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_2.j b/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_2.j
deleted file mode 100644
index fd6f37b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_2.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup_x1_2.java
-.class public dxc/junit/opcodes/dup_x1/jm/T_dup_x1_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()Z
-    .limit stack 4
-    .limit locals 2
-    iconst_4
-    ;iconst_5
-    dup_x1
-    iconst_0
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_2.java b/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_2.java
deleted file mode 100644
index 8a21b44..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup_x1.jm;
-
-public class T_dup_x1_2 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_3.j b/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_3.j
deleted file mode 100644
index f009a81..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_3.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup_x1_3.java
-.class public dxc/junit/opcodes/dup_x1/jm/T_dup_x1_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 3
-    .limit locals 3
-    dconst_1
-    dup_x1
-    iconst_0
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_3.java b/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_3.java
deleted file mode 100644
index 58ab4cf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup_x1.jm;
-
-public class T_dup_x1_3 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_4.j b/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_4.j
deleted file mode 100644
index e6eaece..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_4.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup_x1_4.java
-.class public dxc/junit/opcodes/dup_x1/jm/T_dup_x1_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 3
-    .limit locals 3
-
-    lconst_1
-    dup_x1
-
-    iconst_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_4.java b/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_4.java
deleted file mode 100644
index db5cbc3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup_x1.jm;
-
-public class T_dup_x1_4 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_5.j b/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_5.j
deleted file mode 100644
index 79c3d8c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_5.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup_x1_5.java
-.class public dxc/junit/opcodes/dup_x1/jm/T_dup_x1_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 2
-    .limit locals 1
-    
-    iconst_4
-    iconst_5
-    dup_x1
-
-    if_icmpeq Label1
-    
-    iconst_0
-    ireturn
-    
-Label1:
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_5.java b/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_5.java
deleted file mode 100644
index b1cc14a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup_x1.jm;
-
-public class T_dup_x1_5 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_6.j b/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_6.j
deleted file mode 100644
index 32d43ff..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_6.j
+++ /dev/null
@@ -1,55 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup_x1_6.java
-.class public dxc/junit/opcodes/dup_x1/jm/T_dup_x1_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 4
-    .limit locals 2
-    
-    fconst_2
-    fconst_1
-    dup_x1
-    
-    fconst_1
-    fcmpl
-    ifne Label2
-    
-    fconst_2
-    fcmpl
-    ifne Label1
-
-    fconst_1
-    fcmpl
-    ifne Label0
-
-    iconst_1
-    ireturn
-    
-Label2:
-    pop
-Label1:
-    pop
-Label0:
-    iconst_0
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_6.java b/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_6.java
deleted file mode 100644
index 63d7511..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup_x1.jm;
-
-public class T_dup_x1_6 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_7.j b/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_7.j
deleted file mode 100644
index 6f28a6c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_7.j
+++ /dev/null
@@ -1,54 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup_x1_7.java
-.class public dxc/junit/opcodes/dup_x1/jm/T_dup_x1_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 4
-    .limit locals 2
-    
-    fconst_2
-    iconst_1
-    dup_x1
-
-    iconst_1
-    if_icmpne Label2
-        
-    fconst_2
-    fcmpl
-    ifne Label1
-    
-    iconst_1
-    if_icmpne Label0
-
-    iconst_1
-    ireturn
-    
-Label2:
-    pop    
-Label1:
-    pop
-Label0:
-    iconst_0
-    ireturn
-.end method
-
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_7.java b/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_7.java
deleted file mode 100644
index ce0579d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup_x1.jm;
-
-public class T_dup_x1_7 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_8.j b/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_8.j
deleted file mode 100644
index 726cc7c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_8.j
+++ /dev/null
@@ -1,53 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup_x1_8.java
-.class public dxc/junit/opcodes/dup_x1/jm/T_dup_x1_8
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 4
-    .limit locals 2
-    
-    aload_0
-    aconst_null
-    dup_x1
-
-    aconst_null
-    if_acmpne Label2
-        
-    aload_0
-    if_acmpne Label1
-    
-    aconst_null
-    if_acmpne Label0
-
-    iconst_1
-    ireturn
-    
-Label2:
-    pop    
-Label1:
-    pop
-Label0:
-    iconst_0
-    ireturn
-.end method
-
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_8.java b/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_8.java
deleted file mode 100644
index ed52228..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x1/jm/T_dup_x1_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup_x1.jm;
-
-public class T_dup_x1_8 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/Test_dup_x2.java b/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/Test_dup_x2.java
deleted file mode 100644
index 38f1650..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/Test_dup_x2.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup_x2;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.dup_x2.jm.T_dup_x2_1;
-import dxc.junit.opcodes.dup_x2.jm.T_dup_x2_6;
-import dxc.junit.opcodes.dup_x2.jm.T_dup_x2_7;
-
-public class Test_dup_x2 extends DxTestCase {
-
-    /**
-     * @title  type of argument - int, int, int
-     */
-    public void testN1() {
-        T_dup_x2_1 t = new T_dup_x2_1();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @title  type of argument - float, float, float
-     */
-    public void testN2() {
-        T_dup_x2_6 t = new T_dup_x2_6();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @title  type of argument - double, int
-     */
-    public void testN3() {
-        T_dup_x2_7 t = new T_dup_x2_7();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.dup_x2.jm.T_dup_x2_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.dup_x2.jm.T_dup_x2_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.dup_x2.jm.T_dup_x2_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.dup_x2.jm.T_dup_x2_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_1.j b/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_1.j
deleted file mode 100644
index 5c24e22..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_1.j
+++ /dev/null
@@ -1,60 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup_x2_1.java
-.class public dxc/junit/opcodes/dup_x2/jm/T_dup_x2_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 5
-    .limit locals 2
-    
-    iconst_3
-    iconst_4            
-    iconst_5            ; 3 4 5
-    dup_x2                ; 5 3 4 5
-    
-    iconst_5            ; 5 3 4 5 5
-    if_icmpne Label3    ; 5 3 4
-    
-    iconst_4            ; 5 3 4 4
-    if_icmpne Label2    ; 5 3
-    
-    iconst_3            ; 5 3 3
-    if_icmpne Label1    ; 5
-    
-    iconst_5            ; 5 5 
-    if_icmpne Label0    ; 
-
-    iconst_1
-    ireturn
-    
-Label3:
-    pop
-Label2:
-    pop
-Label1:
-    pop 
-    
-Label0:    
-    iconst_0
-    ireturn
-        
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_1.java b/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_1.java
deleted file mode 100644
index abeff61..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup_x2.jm;
-
-public class T_dup_x2_1 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_2.j b/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_2.j
deleted file mode 100644
index 6bf6328..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_2.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup_x2_2.java
-.class public dxc/junit/opcodes/dup_x2/jm/T_dup_x2_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()Z
-    .limit stack 4
-    .limit locals 2
-    iconst_4
-    ;iconst_5
-    dup_x2
-    iconst_0
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_2.java b/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_2.java
deleted file mode 100644
index b085559..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup_x2.jm;
-
-public class T_dup_x2_2 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_3.j b/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_3.j
deleted file mode 100644
index 10a2800..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_3.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup_x2_3.java
-.class public dxc/junit/opcodes/dup_x2/jm/T_dup_x2_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 4
-    .limit locals 3
-    dconst_1
-    dup_x2
-    iconst_0
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_3.java b/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_3.java
deleted file mode 100644
index ff5cd9d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup_x2.jm;
-
-public class T_dup_x2_3 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_4.j b/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_4.j
deleted file mode 100644
index db1f32b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_4.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup_x2_4.java
-.class public dxc/junit/opcodes/dup_x2/jm/T_dup_x2_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 4
-    .limit locals 3
-
-    lconst_1
-    dup_x2
-
-    iconst_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_4.java b/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_4.java
deleted file mode 100644
index 8a66e42..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup_x2.jm;
-
-public class T_dup_x2_4 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_5.j b/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_5.j
deleted file mode 100644
index e952b56..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_5.j
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup_x2_5.java
-.class public dxc/junit/opcodes/dup_x2/jm/T_dup_x2_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 3
-    .limit locals 1
-    
-    iconst_3
-    iconst_4
-    iconst_5
-    dup_x2
-
-    if_icmpeq Label1
-    
-    iconst_0
-    ireturn
-    
-Label1:
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_5.java b/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_5.java
deleted file mode 100644
index c685f59..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup_x2.jm;
-
-public class T_dup_x2_5 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_6.j b/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_6.j
deleted file mode 100644
index f67f224..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_6.j
+++ /dev/null
@@ -1,64 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup_x2_6.java
-.class public dxc/junit/opcodes/dup_x2/jm/T_dup_x2_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 5
-    .limit locals 2
-    
-    fconst_0
-    fconst_1            
-    fconst_2            ; 0 1 2
-    dup_x2                ; 2 0 1 2
-    
-    fconst_2            ; 2 0 1 2 2
-    fcmpl                ; 2 0 1
-    ifne Label3    
-    
-    fconst_1            ; 2 0 1 1
-    fcmpl                ; 2 0
-    ifne Label2            
-    
-    fconst_0            ; 2 0 0
-    fcmpl                ; 2
-    ifne Label1    
-    
-    fconst_2            ; 2 2
-    fcmpl                ; 
-    ifne Label0    
-
-    iconst_1
-    ireturn
-    
-Label3:
-    pop
-Label2:
-    pop
-Label1:
-    pop 
-    
-Label0:    
-    iconst_0
-    ireturn
-        
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_6.java b/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_6.java
deleted file mode 100644
index 352f746..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup_x2.jm;
-
-public class T_dup_x2_6 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_7.j b/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_7.j
deleted file mode 100644
index 497fbca..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_7.j
+++ /dev/null
@@ -1,54 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_dup_x2_7.java
-.class public dxc/junit/opcodes/dup_x2/jm/T_dup_x2_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 5
-    .limit locals 2
-    
-    dconst_1
-    iconst_3              ; [1] 3
-    dup_x2                ; 3 [1] 3
-    
-    iconst_3            ; 3 [1] 3 3
-    if_icmpne Label2    ; 3 [1]    
-    
-    dconst_1            ; 3 [1] [1]
-    dcmpl                ; 3
-    ifne Label1            
-    
-    iconst_3            ; 0
-    if_icmpne Label0    ;    
-    
-    iconst_1
-    ireturn
-    
-Label2:
-    pop2
-Label1:
-    pop 
-Label0:    
-    iconst_0
-    ireturn
-        
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_7.java b/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_7.java
deleted file mode 100644
index 3427222..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/dup_x2/jm/T_dup_x2_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.dup_x2.jm;
-
-public class T_dup_x2_7 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2d/Test_f2d.java b/tools/dx-tests/src/dxc/junit/opcodes/f2d/Test_f2d.java
deleted file mode 100644
index af2a661..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2d/Test_f2d.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.f2d;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.f2d.jm.T_f2d_1;
-
-public class Test_f2d extends DxTestCase {
-
-    /**
-     * @title  Argument = 0.5
-     */
-    public void testN1() {
-        T_f2d_1 t = new T_f2d_1();
-        assertEquals(0.5d, t.run(0.5f), 0d);
-    }
-
-    /**
-     * @title  Argument = 1
-     */
-    public void testN2() {
-        T_f2d_1 t = new T_f2d_1();
-        assertEquals(1d, t.run(1), 0d);
-    }
-
-    /**
-     * @title  Argument = -1
-     */
-    public void testN3() {
-        T_f2d_1 t = new T_f2d_1();
-        assertEquals(-1d, t.run(-1), 0d);
-    }
-
-    /**
-     * @title  Argument = Float.MAX_VALUE
-     */
-    public void testB1() {
-        T_f2d_1 t = new T_f2d_1();
-        double r = 0x1.fffffeP+127d;
-        assertEquals(r, t.run(Float.MAX_VALUE), 0d);
-    }
-
-    /**
-     * @title  Argument = Float.MIN_VALUE
-     */
-    public void testB2() {
-        T_f2d_1 t = new T_f2d_1();
-        double r = 0x0.000002P-126d;
-        assertEquals(r, t.run(Float.MIN_VALUE), 0d);
-    }
-
-    /**
-     * @title  Argument = -0
-     */
-    public void testB3() {
-        T_f2d_1 t = new T_f2d_1();
-        assertEquals(-0d, t.run(-0), 0d);
-    }
-
-    /**
-     * @title  Argument = NaN
-     */
-    public void testB4() {
-        T_f2d_1 t = new T_f2d_1();
-        assertTrue(Double.isNaN(t.run(Float.NaN)));
-    }
-
-    /**
-     * @title  Argument = POSITIVE_INFINITY
-     */
-    public void testB5() {
-        T_f2d_1 t = new T_f2d_1();
-        assertTrue(Double.isInfinite(t.run(Float.POSITIVE_INFINITY)));
-    }
-
-    /**
-     * @title  Argument = NEGATIVE_INFINITY
-     */
-    public void testB6() {
-        T_f2d_1 t = new T_f2d_1();
-        assertTrue(Double.isInfinite(t.run(Float.NEGATIVE_INFINITY)));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.f2d.jm.T_f2d_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.f2d.jm.T_f2d_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.f2d.jm.T_f2d_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.f2d.jm.T_f2d_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - reference
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.f2d.jm.T_f2d_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_1.j b/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_1.j
deleted file mode 100644
index 7c39854..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_1.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_f2d_1.java
-.class public dxc/junit/opcodes/f2d/jm/T_f2d_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(F)D
-    .limit stack 2
-    .limit locals 2
-    fload_1
-    f2d
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_1.java b/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_1.java
deleted file mode 100644
index 86f6024..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.f2d.jm;
-
-public class T_f2d_1 {
-
-    public double run(float a) {
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_2.j b/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_2.j
deleted file mode 100644
index 27d5ce9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_2.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_f2d_2.java
-.class public dxc/junit/opcodes/f2d/jm/T_f2d_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(F)D
-    .limit stack 2
-    .limit locals 2
-
-;    fload_1
-    f2d
-
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_2.java b/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_2.java
deleted file mode 100644
index 92464dd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.f2d.jm;
-
-public class T_f2d_2 {
-
-    public double run(float a) {
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_3.j b/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_3.j
deleted file mode 100644
index 8bd52a7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_3.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_f2d_3.java
-.class public dxc/junit/opcodes/f2d/jm/T_f2d_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(D)D
-    .limit stack 2
-    .limit locals 3
-
-    dload_1
-    f2d
-
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_3.java b/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_3.java
deleted file mode 100644
index 7668c19..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.f2d.jm;
-
-public class T_f2d_3 {
-
-    public double run(double a) {
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_4.j b/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_4.j
deleted file mode 100644
index 0535199..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_f2d_4.java
-.class public dxc/junit/opcodes/f2d/jm/T_f2d_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(J)D
-    .limit stack 2
-    .limit locals 3
-
-    lload_1
-;    l2f
-    f2d
-
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_4.java b/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_4.java
deleted file mode 100644
index 21cfd1a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.f2d.jm;
-
-public class T_f2d_4 {
-
-    public double run(long a) {
-        return (float) a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_5.j b/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_5.j
deleted file mode 100644
index 4a25d44..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_5.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_f2d_5.java
-.class public dxc/junit/opcodes/f2d/jm/T_f2d_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(F)D
-    .limit stack 1
-    .limit locals 2
-
-    fload_1
-    f2d
-    
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_5.java b/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_5.java
deleted file mode 100644
index b01c814..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.f2d.jm;
-
-public class T_f2d_5 {
-
-    public double run(float a) {
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_6.j b/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_6.j
deleted file mode 100644
index 2f90d81..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_6.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_f2d_6.java
-.class public dxc/junit/opcodes/f2d/jm/T_f2d_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(F)D
-    .limit stack 2
-    .limit locals 2
-
-    aload_0
-    f2d
-    dreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_6.java b/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_6.java
deleted file mode 100644
index 8ac2102..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2d/jm/T_f2d_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.f2d.jm;
-
-public class T_f2d_6 {
-    
-    public double run(float a) {
-        return a;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2i/Test_f2i.java b/tools/dx-tests/src/dxc/junit/opcodes/f2i/Test_f2i.java
deleted file mode 100644
index 0968e96..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2i/Test_f2i.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.f2i;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.f2i.jm.T_f2i_1;
-
-public class Test_f2i extends DxTestCase {
-
-    /**
-     * @title  Argument = 2.999999f
-     */
-    public void testN1() {
-        T_f2i_1 t = new T_f2i_1();
-        assertEquals(2, t.run(2.999999f));
-    }
-
-    /**
-     * @title  Argument = 1
-     */
-    public void testN2() {
-        T_f2i_1 t = new T_f2i_1();
-        assertEquals(1, t.run(1f));
-    }
-
-    /**
-     * @title  Argument = -1
-     */
-    public void testN3() {
-        T_f2i_1 t = new T_f2i_1();
-        assertEquals(-1, t.run(-1f));
-    }
-
-    /**
-     * @title  Argument = -0f
-     */
-    public void testB1() {
-        T_f2i_1 t = new T_f2i_1();
-        assertEquals(0, t.run(-0f));
-    }
-
-    /**
-     * @title  Argument = Float.MAX_VALUE
-     */
-    public void testB2() {
-        T_f2i_1 t = new T_f2i_1();
-        assertEquals(Integer.MAX_VALUE, t.run(Float.MAX_VALUE));
-    }
-
-    /**
-     * @title  Argument = Float.MIN_VALUE
-     */
-    public void testB3() {
-        T_f2i_1 t = new T_f2i_1();
-        assertEquals(0, t.run(Float.MIN_VALUE));
-    }
-
-    /**
-     * @title  Argument = NaN
-     */
-    public void testB4() {
-        T_f2i_1 t = new T_f2i_1();
-        assertEquals(0, t.run(Float.NaN));
-    }
-
-    /**
-     * @title  Argument = POSITIVE_INFINITY
-     */
-    public void testB5() {
-        T_f2i_1 t = new T_f2i_1();
-        assertEquals(Integer.MAX_VALUE, t.run(Float.POSITIVE_INFINITY));
-    }
-
-    /**
-     * @title  Argument = NEGATIVE_INFINITY
-     */
-    public void testB6() {
-        T_f2i_1 t = new T_f2i_1();
-        assertEquals(Integer.MIN_VALUE, t.run(Float.NEGATIVE_INFINITY));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.f2i.jm.T_f2i_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.f2i.jm.T_f2i_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.f2i.jm.T_f2i_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - reference
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.f2i.jm.T_f2i_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2i/jm/T_f2i_1.j b/tools/dx-tests/src/dxc/junit/opcodes/f2i/jm/T_f2i_1.j
deleted file mode 100644
index ddc0dc0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2i/jm/T_f2i_1.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_f2i_1.java
-.class public dxc/junit/opcodes/f2i/jm/T_f2i_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(F)I
-    .limit stack 2
-    .limit locals 2
-    fload_1
-    f2i
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2i/jm/T_f2i_1.java b/tools/dx-tests/src/dxc/junit/opcodes/f2i/jm/T_f2i_1.java
deleted file mode 100644
index b8ae3e2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2i/jm/T_f2i_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.f2i.jm;
-
-public class T_f2i_1 {
-
-    public int run(float a) {
-        return (int)a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2i/jm/T_f2i_2.j b/tools/dx-tests/src/dxc/junit/opcodes/f2i/jm/T_f2i_2.j
deleted file mode 100644
index 2676a82..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2i/jm/T_f2i_2.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_f2i_2.java
-.class public dxc/junit/opcodes/f2i/jm/T_f2i_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(F)I
-    .limit stack 2
-    .limit locals 2
-
-;    fload_1
-    f2i
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2i/jm/T_f2i_2.java b/tools/dx-tests/src/dxc/junit/opcodes/f2i/jm/T_f2i_2.java
deleted file mode 100644
index 888f9a9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2i/jm/T_f2i_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.f2i.jm;
-
-public class T_f2i_2 {
-
-    public int run(float a) {
-        return (int)a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2i/jm/T_f2i_3.j b/tools/dx-tests/src/dxc/junit/opcodes/f2i/jm/T_f2i_3.j
deleted file mode 100644
index 8a819ae..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2i/jm/T_f2i_3.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_f2i_3.java
-.class public dxc/junit/opcodes/f2i/jm/T_f2i_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-
-.method public run(D)I
-    .limit stack 2
-    .limit locals 3
- 
-    dload_1
- ;   d2f
-     f2i
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2i/jm/T_f2i_3.java b/tools/dx-tests/src/dxc/junit/opcodes/f2i/jm/T_f2i_3.java
deleted file mode 100644
index fb68cc8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2i/jm/T_f2i_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.f2i.jm;
-
-public class T_f2i_3 {
-
-    public int run(double a) {
-        return (int)a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2i/jm/T_f2i_4.j b/tools/dx-tests/src/dxc/junit/opcodes/f2i/jm/T_f2i_4.j
deleted file mode 100644
index 9df3571..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2i/jm/T_f2i_4.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_f2i_4.java
-.class public dxc/junit/opcodes/f2i/jm/T_f2i_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(J)I
-    .limit stack 2
-    .limit locals 3
-
-    lload_1
-
-    ;l2f
-    f2i
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2i/jm/T_f2i_4.java b/tools/dx-tests/src/dxc/junit/opcodes/f2i/jm/T_f2i_4.java
deleted file mode 100644
index 7f487a5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2i/jm/T_f2i_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.f2i.jm;
-
-public class T_f2i_4 {
-
-    public int run(long a) {
-        return (int)a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2i/jm/T_f2i_5.j b/tools/dx-tests/src/dxc/junit/opcodes/f2i/jm/T_f2i_5.j
deleted file mode 100644
index a18e695..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2i/jm/T_f2i_5.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_f2i_5.java
-.class public dxc/junit/opcodes/f2i/jm/T_f2i_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(F)I
-    .limit stack 1
-    .limit locals 2
-
-    aload_0
-    f2i
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2i/jm/T_f2i_5.java b/tools/dx-tests/src/dxc/junit/opcodes/f2i/jm/T_f2i_5.java
deleted file mode 100644
index d09408c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2i/jm/T_f2i_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.f2i.jm;
-
-public class T_f2i_5 {
-    
-    public int run(float a) {
-        return (int)a;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2l/Test_f2l.java b/tools/dx-tests/src/dxc/junit/opcodes/f2l/Test_f2l.java
deleted file mode 100644
index ae6f98f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2l/Test_f2l.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.f2l;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.f2l.jm.T_f2l_1;
-
-public class Test_f2l extends DxTestCase {
-
-    /**
-     * @title  Argument = 2.999999f
-     */
-    public void testN1() {
-        T_f2l_1 t = new T_f2l_1();
-        assertEquals(2l, t.run(2.999999f));
-    }
-
-    /**
-     * @title  Argument = 1
-     */
-    public void testN2() {
-         T_f2l_1 t = new T_f2l_1();
-         assertEquals(1l, t.run(1));
-    }
-    
-    /**
-     * @title  Argument = -1
-     */
-    public void testN3() {
-         T_f2l_1 t = new T_f2l_1();
-         assertEquals(-1l, t.run(-1));
-    }
-
-    /**
-     * @title  Argument = Float.MAX_VALUE
-     */
-    public void testB1() {
-        T_f2l_1 t = new T_f2l_1();
-        assertEquals(Long.MAX_VALUE, t.run(Float.MAX_VALUE));
-    }
-
-    /**
-     * @title  Argument = Float.MIN_VALUE
-     */
-    public void testB2() {
-        T_f2l_1 t = new T_f2l_1();
-        assertEquals(0, t.run(Float.MIN_VALUE));
-    }
-    
-    /**
-     * @title  Argument = 0
-     */
-    public void testB3() {
-        T_f2l_1 t = new T_f2l_1();
-        assertEquals(0l, t.run(0));
-    }
-    
-    /**
-     * @title  Argument = NaN
-     */
-    public void testB4() {
-        T_f2l_1 t = new T_f2l_1();
-        assertEquals(0l, t.run(Float.NaN));
-    }
-    
-    /**
-     * @title  Argument = POSITIVE_INFINITY
-     */
-    public void testB5() {
-        T_f2l_1 t = new T_f2l_1();
-        assertEquals(Long.MAX_VALUE, t.run(Float.POSITIVE_INFINITY));
-    }
-    
-    /**
-     * @title  Argument = NEGATIVE_INFINITY
-     */
-    public void testB6() {
-        T_f2l_1 t = new T_f2l_1();
-        assertEquals(Long.MIN_VALUE, t.run(Float.NEGATIVE_INFINITY));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments 
-     */
-    public void testVFE1() {
-        try
-        {
-            Class.forName("dxc.junit.opcodes.f2l.jm.T_f2l_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-    
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - double 
-     */
-    public void testVFE2() {
-        try
-        {
-            Class.forName("dxc.junit.opcodes.f2l.jm.T_f2l_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-    
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - long 
-     */
-    public void testVFE3() {
-        try
-        {
-            Class.forName("dxc.junit.opcodes.f2l.jm.T_f2l_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-    
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try
-        {
-            Class.forName("dxc.junit.opcodes.f2l.jm.T_f2l_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-    
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - reference 
-     */
-    public void testVFE5() {
-        try
-        {
-            Class.forName("dxc.junit.opcodes.f2l.jm.T_f2l_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_1.j b/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_1.j
deleted file mode 100644
index 0416969..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_1.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_f2l_1.java
-.class public dxc/junit/opcodes/f2l/jm/T_f2l_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(F)J
-    .limit stack 2
-    .limit locals 2
-    fload_1
-    f2l
-    lreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_1.java b/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_1.java
deleted file mode 100644
index 1aa20c1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.f2l.jm;
-
-public class T_f2l_1 {
-
-    public long run(float a) {
-        return (long)a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_2.j b/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_2.j
deleted file mode 100644
index df4d9e0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_2.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_f2l_2.java
-.class public dxc/junit/opcodes/f2l/jm/T_f2l_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(F)J
-    .limit stack 2
-    .limit locals 2
-
-;    fload_1
-    f2l
-
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_2.java b/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_2.java
deleted file mode 100644
index 61a830d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.f2l.jm;
-
-public class T_f2l_2 {
-
-    public long run(float a) {
-        return (long)a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_3.j b/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_3.j
deleted file mode 100644
index 72ff8f1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_3.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_f2l_3.java
-.class public dxc/junit/opcodes/f2l/jm/T_f2l_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(D)J
-    .limit stack 2
-    .limit locals 3
-
-    dload_1
-    f2l
-
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_3.java b/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_3.java
deleted file mode 100644
index c755d86..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.f2l.jm;
-
-public class T_f2l_3 {
-
-    public long run(double a) {
-        return (long)a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_4.j b/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_4.j
deleted file mode 100644
index 293a938..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_f2l_4.java
-.class public dxc/junit/opcodes/f2l/jm/T_f2l_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(J)J
-    .limit stack 2
-    .limit locals 3
-
-    lload_1
-;    l2f
-    f2l
-
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_4.java b/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_4.java
deleted file mode 100644
index 1a82262..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.f2l.jm;
-
-public class T_f2l_4 {
-
-    public long run(long a) {
-        return (long)(float)a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_5.j b/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_5.j
deleted file mode 100644
index 534ec84..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_5.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_f2l_5.java
-.class public dxc/junit/opcodes/f2l/jm/T_f2l_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(F)J
-    .limit stack 1
-    .limit locals 2
-
-    fload_1
-    f2l
-    
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_5.java b/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_5.java
deleted file mode 100644
index ecc44b7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.f2l.jm;
-
-public class T_f2l_5 {
-
-    public long run(float a) {
-        return (long)a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_6.j b/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_6.j
deleted file mode 100644
index 55af8b4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_6.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_f2l_6.java
-.class public dxc/junit/opcodes/f2l/jm/T_f2l_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(F)J
-    .limit stack 2
-    .limit locals 2
-
-    aload_0
-    f2l
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_6.java b/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_6.java
deleted file mode 100644
index 9984255..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/f2l/jm/T_f2l_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.f2l.jm;
-
-public class T_f2l_6 {
-    
-    public long run(float a) {
-        return (long)a;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fadd/Test_fadd.java b/tools/dx-tests/src/dxc/junit/opcodes/fadd/Test_fadd.java
deleted file mode 100644
index a2fef55..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fadd/Test_fadd.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fadd;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.fadd.jm.T_fadd_1;
-
-public class Test_fadd extends DxTestCase {
-
-    /**
-     * @title  Arguments = 2.7f, 3.14f
-     */
-    public void testN1() {
-        T_fadd_1 t = new T_fadd_1();
-        assertEquals(5.84f, t.run(2.7f, 3.14f));
-    }
-
-    /**
-     * @title  Arguments = 0, -3.14f
-     */
-    public void testN2() {
-        T_fadd_1 t = new T_fadd_1();
-        assertEquals(-3.14f, t.run(0, -3.14f));
-    }
-
-    /**
-     * @title Arguments = -3.14f, -2.7f
-     */
-    public void testN3() {
-        T_fadd_1 t = new T_fadd_1();
-        assertEquals(-5.84f, t.run(-3.14f, -2.7f));
-    }
-
-
-    /**
-     * @title  Arguments = Float.MAX_VALUE, Float.NaN
-     */
-    public void testB1() {
-        T_fadd_1 t = new T_fadd_1();
-        assertEquals(Float.POSITIVE_INFINITY, t.run(3.3028235E38f, 0.11E38f));
-    }
-
-    /**
-     * @title  Arguments = Float.POSITIVE_INFINITY,
-     * Float.NEGATIVE_INFINITY
-     */
-    public void testB2() {
-        T_fadd_1 t = new T_fadd_1();
-        assertTrue(Float.isNaN(t.run(Float.POSITIVE_INFINITY,
-                Float.NEGATIVE_INFINITY)));
-    }
-
-    /**
-     * @title  Arguments = Float.POSITIVE_INFINITY,
-     * Float.POSITIVE_INFINITY
-     */
-    public void testB3() {
-        T_fadd_1 t = new T_fadd_1();
-        assertEquals(Float.POSITIVE_INFINITY, t.run(Float.POSITIVE_INFINITY,
-                Float.POSITIVE_INFINITY));
-    }
-
-    /**
-     * @title  Arguments = Float.POSITIVE_INFINITY, -2.7f
-     */
-    public void testB4() {
-        T_fadd_1 t = new T_fadd_1();
-        assertEquals(Float.POSITIVE_INFINITY, t.run(Float.POSITIVE_INFINITY,
-                -2.7f));
-    }
-
-    /**
-     * @title  Arguments = +0, -0f
-     */
-    public void testB5() {
-        T_fadd_1 t = new T_fadd_1();
-        assertEquals(+0f, t.run(+0f, -0f));
-    }
-
-    /**
-     * @title  Arguments = -0f, -0f
-     */
-    public void testB6() {
-        T_fadd_1 t = new T_fadd_1();
-        assertEquals(-0f, t.run(-0f, -0f));
-    }
-
-    /**
-     * @title  Arguments = -2.7f, 2.7f
-     */
-    public void testB7() {
-        T_fadd_1 t = new T_fadd_1();
-        assertEquals(+0f, t.run(-2.7f, 2.7f));
-    }
-
-    /**
-     * @title  Arguments = Float.MAX_VALUE, Float.MAX_VALUE
-     */
-    public void testB8() {
-        T_fadd_1 t = new T_fadd_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_fadd_1 t = new T_fadd_1();
-        assertEquals(0f, t.run(Float.MIN_VALUE, -1.4E-45f));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.fadd.jm.T_fadd_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - float, double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.fadd.jm.T_fadd_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long, float
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.fadd.jm.T_fadd_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - float, reference
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.fadd.jm.T_fadd_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fadd/jm/T_fadd_1.j b/tools/dx-tests/src/dxc/junit/opcodes/fadd/jm/T_fadd_1.j
deleted file mode 100644
index 81aa01f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fadd/jm/T_fadd_1.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fadd_1.java
-.class public dxc/junit/opcodes/fadd/jm/T_fadd_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(FF)F
-    .limit stack 2
-    .limit locals 3
-    fload_1
-    fload_2
-    fadd
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fadd/jm/T_fadd_1.java b/tools/dx-tests/src/dxc/junit/opcodes/fadd/jm/T_fadd_1.java
deleted file mode 100644
index a093407..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fadd/jm/T_fadd_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fadd.jm;
-
-public class T_fadd_1 {
-
-    public float run(float a, float b) {
-        return a+b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fadd/jm/T_fadd_2.j b/tools/dx-tests/src/dxc/junit/opcodes/fadd/jm/T_fadd_2.j
deleted file mode 100644
index 57ee8d7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fadd/jm/T_fadd_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fadd_2.java
-.class public dxc/junit/opcodes/fadd/jm/T_fadd_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(FF)F
-    .limit stack 2
-    .limit locals 3
-    fload_1
-    ; fload_2    
-    fadd
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fadd/jm/T_fadd_2.java b/tools/dx-tests/src/dxc/junit/opcodes/fadd/jm/T_fadd_2.java
deleted file mode 100644
index 6dfb686..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fadd/jm/T_fadd_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fadd.jm;
-
-public class T_fadd_2 {
-
-    public float run(float a, float b) {
-        return a+b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fadd/jm/T_fadd_3.j b/tools/dx-tests/src/dxc/junit/opcodes/fadd/jm/T_fadd_3.j
deleted file mode 100644
index dadd9e0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fadd/jm/T_fadd_3.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fadd_3.java
-.class public dxc/junit/opcodes/fadd/jm/T_fadd_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(FD)F
-    .limit stack 3
-    .limit locals 5
-    fload_1
-    dload_2    
-    fadd
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fadd/jm/T_fadd_3.java b/tools/dx-tests/src/dxc/junit/opcodes/fadd/jm/T_fadd_3.java
deleted file mode 100644
index 3f26ebd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fadd/jm/T_fadd_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fadd.jm;
-
-public class T_fadd_3 {
-
-    public float run(float a, double b) {
-        return a+(float)b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fadd/jm/T_fadd_4.j b/tools/dx-tests/src/dxc/junit/opcodes/fadd/jm/T_fadd_4.j
deleted file mode 100644
index 6c6aac1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fadd/jm/T_fadd_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fadd_4.java
-.class public dxc/junit/opcodes/fadd/jm/T_fadd_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(JF)F
-    .limit stack 3
-    .limit locals 4
-
-    lload_1
-;    l2f
-    fload_3
-    fadd
-
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fadd/jm/T_fadd_4.java b/tools/dx-tests/src/dxc/junit/opcodes/fadd/jm/T_fadd_4.java
deleted file mode 100644
index 6224205..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fadd/jm/T_fadd_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fadd.jm;
-
-public class T_fadd_4 {
-
-    public float run(long a, float b) {
-        return (float)a+b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fadd/jm/T_fadd_5.j b/tools/dx-tests/src/dxc/junit/opcodes/fadd/jm/T_fadd_5.j
deleted file mode 100644
index e964fb4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fadd/jm/T_fadd_5.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fadd_5.java
-.class public dxc/junit/opcodes/fadd/jm/T_fadd_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(FF)F
-    .limit stack 2
-    .limit locals 3
-
-    fload_1
-    aload_0
-    fadd
-    freturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fadd/jm/T_fadd_5.java b/tools/dx-tests/src/dxc/junit/opcodes/fadd/jm/T_fadd_5.java
deleted file mode 100644
index 78855ef..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fadd/jm/T_fadd_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fadd.jm;
-
-public class T_fadd_5 {
-    
-    public float run(float a, float b) {
-        return a+b;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/faload/Test_faload.java b/tools/dx-tests/src/dxc/junit/opcodes/faload/Test_faload.java
deleted file mode 100644
index 6a04f7d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/faload/Test_faload.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.faload;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.faload.jm.T_faload_1;
-
-public class Test_faload extends DxTestCase {
-
-    /**
-     * @title normal test. Trying different indexes
-     */
-    public void testN1() {
-        T_faload_1 t = new T_faload_1();
-        float[] arr = new float[2];
-        arr[1] = 3.1415f;
-        assertEquals(3.1415f, t.run(arr, 1));
-    }
-
-    /**
-     * @title normal test. Trying different indexes
-     */
-    public void testN2() {
-        T_faload_1 t = new T_faload_1();
-        float[] arr = new float[2];
-        arr[0] = 3.1415f;
-        assertEquals(3.1415f, t.run(arr, 0));
-    }
-
-    /**
-     * @title expected ArrayIndexOutOfBoundsException
-     */
-    public void testE1() {
-        T_faload_1 t = new T_faload_1();
-        float[] arr = new float[2];
-        try {
-            t.run(arr, 2);
-            fail("expected ArrayIndexOutOfBoundsException");
-        } catch (ArrayIndexOutOfBoundsException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @title expected NullPointerException
-     */
-    public void testE2() {
-        T_faload_1 t = new T_faload_1();
-        try {
-            t.run(null, 2);
-            fail("expected NullPointerException");
-        } catch (NullPointerException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @title expected ArrayIndexOutOfBoundsException
-     */
-    public void testE3() {
-        T_faload_1 t = new T_faload_1();
-        float[] arr = new float[2];
-        try {
-            t.run(arr, -1);
-            fail("expected ArrayIndexOutOfBoundsException");
-        } catch (ArrayIndexOutOfBoundsException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.faload.jm.T_faload_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.faload.jm.T_faload_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, double
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.faload.jm.T_faload_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, long
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.faload.jm.T_faload_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - Object, int
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.faload.jm.T_faload_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double[], int
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.faload.jm.T_faload_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long[], int
-     */
-    public void testVFE7() {
-        try {
-            Class.forName("dxc.junit.opcodes.faload.jm.T_faload_8");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, reference
-     */
-    public void testVFE8() {
-        try {
-            Class.forName("dxc.junit.opcodes.faload.jm.T_faload_9");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_1.j b/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_1.j
deleted file mode 100644
index 448ac41..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_1.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_faload_1.java
-.class public dxc/junit/opcodes/faload/jm/T_faload_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([FI)F
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_2
-
-    faload
-
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_1.java b/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_1.java
deleted file mode 100644
index b8173a6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.faload.jm;
-
-public class T_faload_1 {
-    public float run(float[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_2.j b/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_2.j
deleted file mode 100644
index 0f06fe4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_2.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_faload_2.java
-.class public dxc/junit/opcodes/faload/jm/T_faload_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([FI)F
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-;    iload_2
-
-    faload
-
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_2.java b/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_2.java
deleted file mode 100644
index 4894ed9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_2.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.faload.jm;
-
-public class T_faload_2 {
-
-    public float run(float[] arr, int idx) {
-        return arr[idx];
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_3.j b/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_3.j
deleted file mode 100644
index 14e2b64..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_3.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_faload_3.java
-.class public dxc/junit/opcodes/faload/jm/T_faload_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([FI)F
-    .limit stack 3
-    .limit locals 4
-
-    ;aload_1
-    iload_2
-    faload
-
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_3.java b/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_3.java
deleted file mode 100644
index 0ca882b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_3.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.faload.jm;
-
-public class T_faload_3 {
-
-    public float run(float[] arr, int idx) {
-        return arr[idx];
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_4.j b/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_4.j
deleted file mode 100644
index 12c6259..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_4.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_faload_4.java
-.class public dxc/junit/opcodes/faload/jm/T_faload_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run([FD)F
-    .limit stack 4
-    .limit locals 5
-
-    aload_1
-    dload_2
-    faload
-
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_4.java b/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_4.java
deleted file mode 100644
index efff3d7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_4.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.faload.jm;
-
-public class T_faload_4 {
-
-    public float run(float[] arr, double idx) {
-        return arr[(int)idx];
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_5.j b/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_5.j
deleted file mode 100644
index eb3e0d8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_5.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_faload_5.java
-.class public dxc/junit/opcodes/faload/jm/T_faload_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run([FJ)F
-    .limit stack 4
-    .limit locals 5
-
-    aload_1
-    lload_2
-;    l2i
-    faload
-
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_5.java b/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_5.java
deleted file mode 100644
index d5a8738..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.faload.jm;
-
-public class T_faload_5 {
-
-    public float run(float[] arr, long idx) {
-        return arr[(int)idx];
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_6.j b/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_6.j
deleted file mode 100644
index 2592e0d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_6.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_faload_6.java
-.class public dxc/junit/opcodes/faload/jm/T_faload_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/Object;[FI)F
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_3
-
-    faload
-
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_6.java b/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_6.java
deleted file mode 100644
index b70478f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.faload.jm;
-
-public class T_faload_6 {
-
-    public float run(Object a, float[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_7.j b/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_7.j
deleted file mode 100644
index 6ed18fc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_7.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_faload_7.java
-.class public dxc/junit/opcodes/faload/jm/T_faload_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run([D[FI)F
-    .limit stack 2
-    .limit locals 4
-    aload_1
-    iload_3
-    faload
-
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_7.java b/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_7.java
deleted file mode 100644
index 401a9cb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.faload.jm;
-
-public class T_faload_7 {
-
-    public float run(double[] a, float[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_8.j b/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_8.j
deleted file mode 100644
index 5e94ca0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_8.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_faload_8.java
-.class public dxc/junit/opcodes/faload/jm/T_faload_8
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run([J[FI)F
-    .limit stack 2
-    .limit locals 4
-    aload_1
-    iload_3
-    faload
-
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_8.java b/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_8.java
deleted file mode 100644
index 4b6d235..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.faload.jm;
-
-public class T_faload_8 {
-
-    public float run(long[] a, float[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_9.j b/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_9.j
deleted file mode 100644
index 3a8e65c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_9.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_faload_9.java
-.class public dxc/junit/opcodes/faload/jm/T_faload_9
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([FI)F
-    .limit stack 2
-    .limit locals 3
-
-    aload_1
-    aload_0
-    faload
-    freturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_9.java b/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_9.java
deleted file mode 100644
index a53e367..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/faload/jm/T_faload_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.faload.jm;
-
-public class T_faload_9 {
-    
-    public float run(float[] arr, int idx) {
-        return arr[idx];
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fastore/Test_fastore.java b/tools/dx-tests/src/dxc/junit/opcodes/fastore/Test_fastore.java
deleted file mode 100644
index bf2a6c9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fastore/Test_fastore.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fastore;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.fastore.jm.T_fastore_1;
-
-public class Test_fastore extends DxTestCase {
-
-    /**
-     * @title normal test. Trying different indexes
-     */
-    public void testN1() {
-        T_fastore_1 t = new T_fastore_1();
-        float[] arr = new float[2];
-        t.run(arr, 1, 2.7f);
-        assertEquals(2.7f, arr[1]);
-    }
-
-    /**
-     * @title normal test. Trying different indexes
-     */
-    public void testN2() {
-        T_fastore_1 t = new T_fastore_1();
-        float[] arr = new float[2];
-        t.run(arr, 0, 2.7f);
-        assertEquals(2.7f, arr[0]);
-    }
-
-    /**
-     * @title expected ArrayIndexOutOfBoundsException
-     */
-    public void testE1() {
-        T_fastore_1 t = new T_fastore_1();
-        float[] arr = new float[2];
-        try {
-            t.run(arr, 2, 2.7f);
-            fail("expected ArrayIndexOutOfBoundsException");
-        } catch (ArrayIndexOutOfBoundsException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @title expected NullPointerException
-     */
-    public void testE2() {
-        T_fastore_1 t = new T_fastore_1();
-        try {
-            t.run(null, 2, 2.7f);
-            fail("expected NullPointerException");
-        } catch (NullPointerException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @title expected ArrayIndexOutOfBoundsException
-     */
-    public void testE3() {
-        T_fastore_1 t = new T_fastore_1();
-        float[] arr = new float[2];
-        try {
-            t.run(arr, -1, 2.7f);
-            fail("expected ArrayIndexOutOfBoundsException");
-        } catch (ArrayIndexOutOfBoundsException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.fastore.jm.T_fastore_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.fastore.jm.T_fastore_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, double,
-     * float
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.fastore.jm.T_fastore_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, int, long
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.fastore.jm.T_fastore_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - object, int,
-     * float
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.fastore.jm.T_fastore_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double[], int,
-     * float
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.fastore.jm.T_fastore_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long[], int,
-     * float
-     */
-    public void testVFE7() {
-        try {
-            Class.forName("dxc.junit.opcodes.fastore.jm.T_fastore_8");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, reference,
-     * float
-     */
-    public void testVFE8() {
-        try {
-            Class.forName("dxc.junit.opcodes.fastore.jm.T_fastore_9");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_1.j b/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_1.j
deleted file mode 100644
index 82dc298..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_1.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fastore_1.java
-.class public dxc/junit/opcodes/fastore/jm/T_fastore_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([FIF)V
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_2
-    fload_3
-    fastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_1.java b/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_1.java
deleted file mode 100644
index 9977fce..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fastore.jm;
-
-public class T_fastore_1 {
-    public void run(float[] arr, int idx, float value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_2.j b/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_2.j
deleted file mode 100644
index 09d9ee1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_2.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fastore_2.java
-.class public dxc/junit/opcodes/fastore/jm/T_fastore_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([FIF)V
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_2
-    ;fload_3
-    fastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_2.java b/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_2.java
deleted file mode 100644
index d9e9013..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fastore.jm;
-
-public class T_fastore_2 {
-
-    public void run(float[] arr, int idx, float value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_3.j b/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_3.j
deleted file mode 100644
index 861cc0f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_3.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fastore_3.java
-.class public dxc/junit/opcodes/fastore/jm/T_fastore_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([FIF)V
-    .limit stack 3
-    .limit locals 4
-
-    ;aload_1
-    iload_2
-    fload_3
-    fastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_3.java b/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_3.java
deleted file mode 100644
index 7d55003..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fastore.jm;
-
-public class T_fastore_3 {
-
-    public void run(float[] arr, int idx, float value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_4.j b/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_4.j
deleted file mode 100644
index 12318b4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_4.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fastore_4.java
-.class public dxc/junit/opcodes/fastore/jm/T_fastore_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run([FDF)V
-    .limit stack 4
-    .limit locals 5
-
-    aload_1
-    dload_2
-;    d2i
-    fload 4
-
-    fastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_4.java b/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_4.java
deleted file mode 100644
index 6d3b631..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fastore.jm;
-
-public class T_fastore_4 {
-
-    public void run(float[] arr, double idx, float value) {
-        arr[(int)idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_5.j b/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_5.j
deleted file mode 100644
index 4c2325d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_5.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fastore_5.java
-.class public dxc/junit/opcodes/fastore/jm/T_fastore_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run([FIJ)V
-    .limit stack 4
-    .limit locals 5
-
-    aload_1
-    iload_2
-    lload_3
-;    l2f
-    fastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_5.java b/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_5.java
deleted file mode 100644
index 34e158a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fastore.jm;
-
-public class T_fastore_5 {
-
-    public void run(float[] arr, int idx, float value) {
-        arr[idx] = (float)value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_6.j b/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_6.j
deleted file mode 100644
index b1cabb8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_6.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fastore_6.java
-.class public dxc/junit/opcodes/fastore/jm/T_fastore_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/Object;IF)V
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_2
-    fload_3
-    fastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_6.java b/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_6.java
deleted file mode 100644
index 39d8539..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fastore.jm;
-
-public class T_fastore_6 {
-
-    public void run(Object a, float[] arr, int idx, float value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_7.j b/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_7.j
deleted file mode 100644
index 3bf14f7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_7.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fastore_7.java
-.class public dxc/junit/opcodes/fastore/jm/T_fastore_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([D[FIF)V
-    .limit stack 3
-    .limit locals 5
-    
-    aload_1
-    iload_3
-    fload 4
-    fastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_7.java b/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_7.java
deleted file mode 100644
index 8766fd1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fastore.jm;
-
-public class T_fastore_7 {
-
-    public void run(double a[], float[] arr, int idx, float value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_8.j b/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_8.j
deleted file mode 100644
index 138ccc1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_8.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fastore_8.java
-.class public dxc/junit/opcodes/fastore/jm/T_fastore_8
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([J[FIF)V
-    .limit stack 3
-    .limit locals 5
-    
-    aload_1
-    iload_3
-    fload 4
-    fastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_8.java b/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_8.java
deleted file mode 100644
index 38264cf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fastore.jm;
-
-public class T_fastore_8 {
-
-    public void run(long a[], float[] arr, int idx, float value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_9.j b/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_9.j
deleted file mode 100644
index 66e8723..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_9.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fastore_9.java
-.class public dxc/junit/opcodes/fastore/jm/T_fastore_9
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([FIF)V
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    aload_0
-    fload_3
-    fastore
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_9.java b/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_9.java
deleted file mode 100644
index af77ce5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fastore/jm/T_fastore_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fastore.jm;
-
-public class T_fastore_9 {
-    
-    public void run(float[] arr, int idx, float value) {
-        arr[idx] = value;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/Test_fcmpg.java b/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/Test_fcmpg.java
deleted file mode 100644
index 5af23b3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/Test_fcmpg.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fcmpg;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.fcmpg.jm.T_fcmpg_1;
-
-public class Test_fcmpg extends DxTestCase {
-
-    /**
-     * @title  Arguments = 3.14f, 2.7f
-     */
-    public void testN1() {
-        T_fcmpg_1 t = new T_fcmpg_1();
-        assertEquals(1, t.run(3.14f, 2.7f));
-    }
-
-    /**
-     * @title  Arguments = -3.14f, 2.7f
-     */
-    public void testN2() {
-        T_fcmpg_1 t = new T_fcmpg_1();
-        assertEquals(-1, t.run(-3.14f, 2.7f));
-    }
-
-    /**
-     * @title  Arguments = 3.14, 3.14
-     */
-    public void testN3() {
-        T_fcmpg_1 t = new T_fcmpg_1();
-        assertEquals(0, t.run(3.14f, 3.14f));
-    }
-
-    /**
-     * @title  Arguments = Float.NaN, Float.MAX_VALUE
-     */
-    public void testB1() {
-        T_fcmpg_1 t = new T_fcmpg_1();
-        assertEquals(1, t.run(Float.NaN, Float.MAX_VALUE));
-    }
-
-    /**
-     * @title  Arguments = +0, -0
-     */
-    public void testB2() {
-        T_fcmpg_1 t = new T_fcmpg_1();
-        assertEquals(0, t.run(+0f, -0f));
-    }
-
-    /**
-     * @title  Arguments = Float.NEGATIVE_INFINITY, Float.MIN_VALUE
-     */
-    public void testB3() {
-        T_fcmpg_1 t = new T_fcmpg_1();
-        assertEquals(-1, t.run(Float.NEGATIVE_INFINITY, Float.MIN_VALUE));
-    }
-
-    /**
-     * @title  Arguments = Float.POSITIVE_INFINITY, Float.MAX_VALUE
-     */
-    public void testB4() {
-        T_fcmpg_1 t = new T_fcmpg_1();
-        assertEquals(1, t.run(Float.POSITIVE_INFINITY, Float.MAX_VALUE));
-    }
-
-    /**
-     * @title  Arguments = Float.POSITIVE_INFINITY,
-     * Float.NEGATIVE_INFINITY
-     */
-    public void testB5() {
-        T_fcmpg_1 t = new T_fcmpg_1();
-        assertEquals(1, t.run(Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.fcmpg.jm.T_fcmpg_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - float, double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.fcmpg.jm.T_fcmpg_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long, float
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.fcmpg.jm.T_fcmpg_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference, float
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.fcmpg.jm.T_fcmpg_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/jm/T_fcmpg_1.j b/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/jm/T_fcmpg_1.j
deleted file mode 100644
index 557db8b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/jm/T_fcmpg_1.j
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fcmpg_1.java
-.class public dxc/junit/opcodes/fcmpg/jm/T_fcmpg_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(FF)I
-    .limit stack 2
-    .limit locals 3
-    
-    fload_1
-    fload_2
-    
-    fcmpg 
-    dup
-    ifeq Label0
-    ifgt Label1
-    
-    iconst_m1
-    ireturn
-    
-    Label0:
-    iconst_0
-    ireturn
-
-    Label1:
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/jm/T_fcmpg_1.java b/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/jm/T_fcmpg_1.java
deleted file mode 100644
index 90916a4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/jm/T_fcmpg_1.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fcmpg.jm;
-
-public class T_fcmpg_1 {
-
-    public int run(float a, float b) {
-        if(a > b)
-            return 1;
-        if(a == b)
-            return 0;
-        return -1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/jm/T_fcmpg_2.j b/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/jm/T_fcmpg_2.j
deleted file mode 100644
index 98a5a14..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/jm/T_fcmpg_2.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fcmpg_2.java
-.class public dxc/junit/opcodes/fcmpg/jm/T_fcmpg_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(FF)Z
-    .limit stack 2
-    .limit locals 3
-
-    fload_1
-;    fload_2
-    fcmpg
-    ifne Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/jm/T_fcmpg_2.java b/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/jm/T_fcmpg_2.java
deleted file mode 100644
index 76fc02e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/jm/T_fcmpg_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fcmpg.jm;
-
-public class T_fcmpg_2 {
-
-    public boolean run(float a, float b) {
-        return a > b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/jm/T_fcmpg_3.j b/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/jm/T_fcmpg_3.j
deleted file mode 100644
index 8404b13..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/jm/T_fcmpg_3.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fcmpg_3.java
-.class public dxc/junit/opcodes/fcmpg/jm/T_fcmpg_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(FF)Z
-    .limit stack 4
-    .limit locals 3
-
-    fload_1
-    dconst_1
-    fcmpg 
-    ifne Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/jm/T_fcmpg_3.java b/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/jm/T_fcmpg_3.java
deleted file mode 100644
index f559c7e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/jm/T_fcmpg_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fcmpg.jm;
-
-public class T_fcmpg_3 {
-
-    public boolean run(float a, float b) {
-        return a > b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/jm/T_fcmpg_4.j b/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/jm/T_fcmpg_4.j
deleted file mode 100644
index f6ed938..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/jm/T_fcmpg_4.j
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fcmpg_4.java
-.class public dxc/junit/opcodes/fcmpg/jm/T_fcmpg_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(FF)Z
-    .limit stack 3
-    .limit locals 3
-
-    lconst_1    
-    fload_1
-
-    fcmpg 
-    ifne Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/jm/T_fcmpg_4.java b/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/jm/T_fcmpg_4.java
deleted file mode 100644
index b540532..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/jm/T_fcmpg_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fcmpg.jm;
-
-public class T_fcmpg_4 {
-
-    public boolean run(float a, float b) {
-        return a > b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/jm/T_fcmpg_5.j b/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/jm/T_fcmpg_5.j
deleted file mode 100644
index cb0a344..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/jm/T_fcmpg_5.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fcmpg_5.java
-.class public dxc/junit/opcodes/fcmpg/jm/T_fcmpg_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(FF)Z
-    .limit stack 2
-    .limit locals 3
-
-    aload_0
-    fload_2
-    fcmpl
-    ifle Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/jm/T_fcmpg_5.java b/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/jm/T_fcmpg_5.java
deleted file mode 100644
index 75872f7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fcmpg/jm/T_fcmpg_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fcmpg.jm;
-
-public class T_fcmpg_5 {
-    
-    public boolean run(float a, float b) {
-        return a > b;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/Test_fcmpl.java b/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/Test_fcmpl.java
deleted file mode 100644
index 78c0b03..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/Test_fcmpl.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fcmpl;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.fcmpl.jm.T_fcmpl_1;
-
-public class Test_fcmpl extends DxTestCase {
-
-    /**
-     * @title  Arguments = 3.14f, 2.7f
-     */
-    public void testN1() {
-        T_fcmpl_1 t = new T_fcmpl_1();
-        assertEquals(1, t.run(3.14f, 2.7f));
-    }
-
-    /**
-     * @title  Arguments = -3.14f, 2.7f
-     */
-    public void testN2() {
-        T_fcmpl_1 t = new T_fcmpl_1();
-        assertEquals(-1, t.run(-3.14f, 2.7f));
-    }
-
-    /**
-     * @title  Arguments = 3.14, 3.14
-     */
-    public void testN3() {
-        T_fcmpl_1 t = new T_fcmpl_1();
-        assertEquals(0, t.run(3.14f, 3.14f));
-    }
-
-    /**
-     * @title  Arguments = Float.NaN, Float.MAX_VALUE
-     */
-    public void testB1() {
-        T_fcmpl_1 t = new T_fcmpl_1();
-        assertEquals(-1, t.run(Float.NaN, Float.MAX_VALUE));
-    }
-
-    /**
-     * @title  Arguments = +0, -0
-     */
-    public void testB2() {
-        T_fcmpl_1 t = new T_fcmpl_1();
-        assertEquals(0, t.run(+0f, -0f));
-    }
-
-    /**
-     * @title  Arguments = Float.NEGATIVE_INFINITY, Float.MIN_VALUE
-     */
-    public void testB3() {
-        T_fcmpl_1 t = new T_fcmpl_1();
-        assertEquals(-1, t.run(Float.NEGATIVE_INFINITY, Float.MIN_VALUE));
-    }
-
-    /**
-     * @title  Arguments = Float.POSITIVE_INFINITY, Float.MAX_VALUE
-     */
-    public void testB4() {
-        T_fcmpl_1 t = new T_fcmpl_1();
-        assertEquals(1, t.run(Float.POSITIVE_INFINITY, Float.MAX_VALUE));
-    }
-
-    /**
-     * @title  Arguments = Float.POSITIVE_INFINITY,
-     * Float.NEGATIVE_INFINITY
-     */
-    public void testB5() {
-        T_fcmpl_1 t = new T_fcmpl_1();
-        assertEquals(1, t.run(Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.fcmpl.jm.T_fcmpl_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - float, double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.fcmpl.jm.T_fcmpl_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long, float
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.fcmpl.jm.T_fcmpl_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference, float
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.fcmpl.jm.T_fcmpl_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/jm/T_fcmpl_1.j b/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/jm/T_fcmpl_1.j
deleted file mode 100644
index 3bf5533..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/jm/T_fcmpl_1.j
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fcmpl_1.java
-.class public dxc/junit/opcodes/fcmpl/jm/T_fcmpl_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(FF)I
-    .limit stack 2
-    .limit locals 3
-    
-    fload_1
-    fload_2
-    
-    fcmpl 
-    dup
-    ifeq Label0
-    ifgt Label1
-    
-    iconst_m1
-    ireturn
-    
-    Label0:
-    iconst_0
-    ireturn
-
-    Label1:
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/jm/T_fcmpl_1.java b/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/jm/T_fcmpl_1.java
deleted file mode 100644
index 2dd1c26..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/jm/T_fcmpl_1.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fcmpl.jm;
-
-public class T_fcmpl_1 {
-
-    public int run(float a, float b) {
-        if(a > b)
-            return 1;
-        if(a == b)
-            return 0;
-        return -1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/jm/T_fcmpl_2.j b/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/jm/T_fcmpl_2.j
deleted file mode 100644
index 01d6c1a2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/jm/T_fcmpl_2.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fcmpl_2.java
-.class public dxc/junit/opcodes/fcmpl/jm/T_fcmpl_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(FF)Z
-    .limit stack 2
-    .limit locals 3
-
-    fload_1
-;    fload_2
-    fcmpl
-    ifne Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/jm/T_fcmpl_2.java b/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/jm/T_fcmpl_2.java
deleted file mode 100644
index 12cb22f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/jm/T_fcmpl_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fcmpl.jm;
-
-public class T_fcmpl_2 {
-
-    public boolean run(float a, float b) {
-        return a > b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/jm/T_fcmpl_3.j b/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/jm/T_fcmpl_3.j
deleted file mode 100644
index f944312..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/jm/T_fcmpl_3.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fcmpl_3.java
-.class public dxc/junit/opcodes/fcmpl/jm/T_fcmpl_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(FF)Z
-    .limit stack 4
-    .limit locals 3
-
-    fload_1
-    dconst_1
-    fcmpl 
-    ifne Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/jm/T_fcmpl_3.java b/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/jm/T_fcmpl_3.java
deleted file mode 100644
index 984516a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/jm/T_fcmpl_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fcmpl.jm;
-
-public class T_fcmpl_3 {
-
-    public boolean run(float a, float b) {
-        return a > b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/jm/T_fcmpl_4.j b/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/jm/T_fcmpl_4.j
deleted file mode 100644
index 42a0161..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/jm/T_fcmpl_4.j
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fcmpl_4.java
-.class public dxc/junit/opcodes/fcmpl/jm/T_fcmpl_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(FF)Z
-    .limit stack 3
-    .limit locals 3
-
-    lconst_1    
-    fload_1
-
-    fcmpl 
-    ifne Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/jm/T_fcmpl_4.java b/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/jm/T_fcmpl_4.java
deleted file mode 100644
index ca79301..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/jm/T_fcmpl_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fcmpl.jm;
-
-public class T_fcmpl_4 {
-
-    public boolean run(float a, float b) {
-        return a > b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/jm/T_fcmpl_5.j b/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/jm/T_fcmpl_5.j
deleted file mode 100644
index 65742db..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/jm/T_fcmpl_5.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fcmpl_5.java
-.class public dxc/junit/opcodes/fcmpl/jm/T_fcmpl_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(FF)Z
-    .limit stack 2
-    .limit locals 3
-
-    aload_0
-    fload_2
-    fcmpl
-    ifle Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/jm/T_fcmpl_5.java b/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/jm/T_fcmpl_5.java
deleted file mode 100644
index 0a661b1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fcmpl/jm/T_fcmpl_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fcmpl.jm;
-
-public class T_fcmpl_5 {
-    
-    public boolean run(float a, float b) {
-        return a > b;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fconst_0/Test_fconst_0.java b/tools/dx-tests/src/dxc/junit/opcodes/fconst_0/Test_fconst_0.java
deleted file mode 100644
index cf2b492..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fconst_0/Test_fconst_0.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fconst_0;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.fconst_0.jm.T_fconst_0_1;
-
-public class Test_fconst_0 extends DxTestCase {
-
-    /**
-     * @title normal test 
-     */
-    public void testN1() {
-        T_fconst_0_1 t = new T_fconst_0_1();
-        float b = 1234f;
-        float c = 1234f;
-        float d = b - c;
-        assertEquals(d, t.run());
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.fconst_0.jm.T_fconst_0_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fconst_0/jm/T_fconst_0_1.j b/tools/dx-tests/src/dxc/junit/opcodes/fconst_0/jm/T_fconst_0_1.j
deleted file mode 100644
index f96b078..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fconst_0/jm/T_fconst_0_1.j
+++ /dev/null
@@ -1,28 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fconst_0_1.java
-.class public dxc/junit/opcodes/fconst_0/jm/T_fconst_0_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()F
-    fconst_0
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fconst_0/jm/T_fconst_0_1.java b/tools/dx-tests/src/dxc/junit/opcodes/fconst_0/jm/T_fconst_0_1.java
deleted file mode 100644
index 976773d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fconst_0/jm/T_fconst_0_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fconst_0.jm;
-
-public class T_fconst_0_1 {
-
-    public float run() {
-        return 0f;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fconst_0/jm/T_fconst_0_2.j b/tools/dx-tests/src/dxc/junit/opcodes/fconst_0/jm/T_fconst_0_2.j
deleted file mode 100644
index 864b359..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fconst_0/jm/T_fconst_0_2.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fconst_0_2.java
-.class public dxc/junit/opcodes/fconst_0/jm/T_fconst_0_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()F
-    .limit stack 1
-;    .limit locals 1
-
-    fconst_0
-    fconst_0
-
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fconst_0/jm/T_fconst_0_2.java b/tools/dx-tests/src/dxc/junit/opcodes/fconst_0/jm/T_fconst_0_2.java
deleted file mode 100644
index 0f7267b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fconst_0/jm/T_fconst_0_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fconst_0.jm;
-
-public class T_fconst_0_2 {
-
-    public float run() {
-        return 0f;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fconst_1/Test_fconst_1.java b/tools/dx-tests/src/dxc/junit/opcodes/fconst_1/Test_fconst_1.java
deleted file mode 100644
index 25ae549..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fconst_1/Test_fconst_1.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fconst_1;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.fconst_1.jm.T_fconst_1_1;
-
-public class Test_fconst_1 extends DxTestCase {
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_fconst_1_1 t = new T_fconst_1_1();
-        float b = 1235f;
-        float c = 1234f;
-        float d = b - c;
-        assertEquals(d, t.run());
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.fconst_1.jm.T_fconst_1_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fconst_1/jm/T_fconst_1_1.j b/tools/dx-tests/src/dxc/junit/opcodes/fconst_1/jm/T_fconst_1_1.j
deleted file mode 100644
index af3a723..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fconst_1/jm/T_fconst_1_1.j
+++ /dev/null
@@ -1,28 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fconst_1_1.java
-.class public dxc/junit/opcodes/fconst_1/jm/T_fconst_1_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()F
-    fconst_1
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fconst_1/jm/T_fconst_1_1.java b/tools/dx-tests/src/dxc/junit/opcodes/fconst_1/jm/T_fconst_1_1.java
deleted file mode 100644
index b9751a4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fconst_1/jm/T_fconst_1_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fconst_1.jm;
-
-public class T_fconst_1_1 {
-
-    public float run() {
-        return 1f;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fconst_1/jm/T_fconst_1_2.j b/tools/dx-tests/src/dxc/junit/opcodes/fconst_1/jm/T_fconst_1_2.j
deleted file mode 100644
index 98c41d4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fconst_1/jm/T_fconst_1_2.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fconst_1_2.java
-.class public dxc/junit/opcodes/fconst_1/jm/T_fconst_1_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()F
-    .limit stack 1
-;    .limit locals 1
-
-    fconst_1
-    fconst_1
-
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fconst_1/jm/T_fconst_1_2.java b/tools/dx-tests/src/dxc/junit/opcodes/fconst_1/jm/T_fconst_1_2.java
deleted file mode 100644
index 6fa39d1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fconst_1/jm/T_fconst_1_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fconst_1.jm;
-
-public class T_fconst_1_2 {
-
-    public float run() {
-        return 1f;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fconst_2/Test_fconst_2.java b/tools/dx-tests/src/dxc/junit/opcodes/fconst_2/Test_fconst_2.java
deleted file mode 100644
index 4aeaf8b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fconst_2/Test_fconst_2.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fconst_2;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.fconst_2.jm.T_fconst_2_1;
-
-public class Test_fconst_2 extends DxTestCase {
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_fconst_2_1 t = new T_fconst_2_1();
-        float b = 1236f;
-        float c = 1234f;
-        float d = b - c;
-        assertEquals(d, t.run());
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.fconst_2.jm.T_fconst_2_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fconst_2/jm/T_fconst_2_1.j b/tools/dx-tests/src/dxc/junit/opcodes/fconst_2/jm/T_fconst_2_1.j
deleted file mode 100644
index 2c7ef7f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fconst_2/jm/T_fconst_2_1.j
+++ /dev/null
@@ -1,28 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fconst_2_1.java
-.class public dxc/junit/opcodes/fconst_2/jm/T_fconst_2_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()F
-    fconst_2
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fconst_2/jm/T_fconst_2_1.java b/tools/dx-tests/src/dxc/junit/opcodes/fconst_2/jm/T_fconst_2_1.java
deleted file mode 100644
index 7ac0339..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fconst_2/jm/T_fconst_2_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fconst_2.jm;
-
-public class T_fconst_2_1 {
-
-    public float run() {
-        return 2f;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fconst_2/jm/T_fconst_2_2.j b/tools/dx-tests/src/dxc/junit/opcodes/fconst_2/jm/T_fconst_2_2.j
deleted file mode 100644
index 795fb7e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fconst_2/jm/T_fconst_2_2.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fconst_2_2.java
-.class public dxc/junit/opcodes/fconst_2/jm/T_fconst_2_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()F
-    .limit stack 1
-;    .limit locals 1
-
-    fconst_2
-    fconst_2
-
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fconst_2/jm/T_fconst_2_2.java b/tools/dx-tests/src/dxc/junit/opcodes/fconst_2/jm/T_fconst_2_2.java
deleted file mode 100644
index f910831..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fconst_2/jm/T_fconst_2_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fconst_2.jm;
-
-public class T_fconst_2_2 {
-
-    public float run() {
-        return 2f;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fdiv/Test_fdiv.java b/tools/dx-tests/src/dxc/junit/opcodes/fdiv/Test_fdiv.java
deleted file mode 100644
index ce1f3d3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fdiv/Test_fdiv.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fdiv;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.fdiv.jm.T_fdiv_1;
-
-public class Test_fdiv extends DxTestCase {
-
-    /**
-     * @title Arguments = 2.7f, 3.14f
-     */
-    public void testN1() {
-        T_fdiv_1 t = new T_fdiv_1();
-        assertEquals(0.8598726f, t.run(2.7f, 3.14f));
-    }
-
-    /**
-     * @title  Dividend = 0
-     */
-    public void testN2() {
-        T_fdiv_1 t = new T_fdiv_1();
-        assertEquals(0f, t.run(0, 3.14f));
-    }
-
-    /**
-     * @title  Dividend is negative
-     */
-    public void testN3() {
-        T_fdiv_1 t = new T_fdiv_1();
-        assertEquals(-1.162963f, t.run(-3.14f, 2.7f));
-    }
-
-    /**
-     * @title  Arguments = Float.MAX_VALUE, Float.NaN
-     */
-    public void testB1() {
-        T_fdiv_1 t = new T_fdiv_1();
-        assertEquals(Float.NaN, t.run(Float.MAX_VALUE, Float.NaN));
-    }
-
-    /**
-     * @title  Arguments = Float.POSITIVE_INFINITY,
-     * Float.NEGATIVE_INFINITY
-     */
-    public void testB2() {
-        T_fdiv_1 t = new T_fdiv_1();
-        assertEquals(Float.NaN, t.run(Float.POSITIVE_INFINITY,
-                Float.NEGATIVE_INFINITY));
-    }
-
-    /**
-     * @title  Arguments = Float.POSITIVE_INFINITY, -2.7f
-     */
-    public void testB3() {
-        T_fdiv_1 t = new T_fdiv_1();
-        assertEquals(Float.NEGATIVE_INFINITY, t.run(Float.POSITIVE_INFINITY,
-                -2.7f));
-    }
-
-    /**
-     * @title  Arguments = -2.7f, Float.NEGATIVE_INFINITY
-     */
-    public void testB4() {
-        T_fdiv_1 t = new T_fdiv_1();
-        assertEquals(0f, t.run(-2.7f, Float.NEGATIVE_INFINITY));
-    }
-
-    /**
-     * @title  Arguments = 0, 0
-     */
-    public void testB5() {
-        T_fdiv_1 t = new T_fdiv_1();
-        assertEquals(Float.NaN, t.run(0, 0));
-    }
-
-    /**
-     * @title  Arguments = 0, -2.7
-     */
-    public void testB6() {
-        T_fdiv_1 t = new T_fdiv_1();
-        assertEquals(-0f, t.run(0, -2.7f));
-    }
-
-    /**
-     * @title  Arguments = -2.7, 0
-     */
-    public void testB7() {
-        T_fdiv_1 t = new T_fdiv_1();
-        assertEquals(Float.NEGATIVE_INFINITY, t.run(-2.7f, 0));
-    }
-
-    /**
-     * @title  Arguments = 1, Float.MAX_VALUE
-     */
-    public void testB8() {
-        T_fdiv_1 t = new T_fdiv_1();
-        assertEquals(Float.POSITIVE_INFINITY, t.run(1, Float.MIN_VALUE));
-    }
-
-    /**
-     * @title  Arguments = Float.MAX_VALUE, -1E-9f
-     */
-    public void testB9() {
-        T_fdiv_1 t = new T_fdiv_1();
-        assertEquals(Float.NEGATIVE_INFINITY, t.run(Float.MAX_VALUE, -1E-9f));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.fdiv.jm.T_fdiv_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - float / double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.fdiv.jm.T_fdiv_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long / float
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.fdiv.jm.T_fdiv_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference / float
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.fdiv.jm.T_fdiv_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fdiv/jm/T_fdiv_1.j b/tools/dx-tests/src/dxc/junit/opcodes/fdiv/jm/T_fdiv_1.j
deleted file mode 100644
index a64d47f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fdiv/jm/T_fdiv_1.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fdiv_1.java
-.class public dxc/junit/opcodes/fdiv/jm/T_fdiv_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(FF)F
-    .limit stack 2
-    .limit locals 3
-    fload_1
-    fload_2
-    fdiv
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fdiv/jm/T_fdiv_1.java b/tools/dx-tests/src/dxc/junit/opcodes/fdiv/jm/T_fdiv_1.java
deleted file mode 100644
index 4d6c2e3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fdiv/jm/T_fdiv_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fdiv.jm;
-
-public class T_fdiv_1 {
-
-    public float run(float a, float b) {
-        return a/b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fdiv/jm/T_fdiv_2.j b/tools/dx-tests/src/dxc/junit/opcodes/fdiv/jm/T_fdiv_2.j
deleted file mode 100644
index 6755eaf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fdiv/jm/T_fdiv_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fdiv_2.java
-.class public dxc/junit/opcodes/fdiv/jm/T_fdiv_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(FF)F
-    .limit stack 2
-    .limit locals 3
-    fload_1
-    ; fload_2    
-    fdiv
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fdiv/jm/T_fdiv_2.java b/tools/dx-tests/src/dxc/junit/opcodes/fdiv/jm/T_fdiv_2.java
deleted file mode 100644
index 447fe13..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fdiv/jm/T_fdiv_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fdiv.jm;
-
-public class T_fdiv_2 {
-
-    public float run(float a, float b) {
-        return a/b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fdiv/jm/T_fdiv_3.j b/tools/dx-tests/src/dxc/junit/opcodes/fdiv/jm/T_fdiv_3.j
deleted file mode 100644
index 06872a1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fdiv/jm/T_fdiv_3.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fdiv_3.java
-.class public dxc/junit/opcodes/fdiv/jm/T_fdiv_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(FD)F
-    .limit stack 3
-    .limit locals 5
-    fload_1
-    dload_2    
-    fdiv
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fdiv/jm/T_fdiv_3.java b/tools/dx-tests/src/dxc/junit/opcodes/fdiv/jm/T_fdiv_3.java
deleted file mode 100644
index 24d8a09..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fdiv/jm/T_fdiv_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fdiv.jm;
-
-public class T_fdiv_3 {
-
-    public float run(float a, double b) {
-        return a/(float)b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fdiv/jm/T_fdiv_4.j b/tools/dx-tests/src/dxc/junit/opcodes/fdiv/jm/T_fdiv_4.j
deleted file mode 100644
index a8e98ab..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fdiv/jm/T_fdiv_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fdiv_4.java
-.class public dxc/junit/opcodes/fdiv/jm/T_fdiv_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(JF)F
-    .limit stack 3
-    .limit locals 4
-
-    lload_1
-;    l2f
-    fload_3
-    fdiv
-
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fdiv/jm/T_fdiv_4.java b/tools/dx-tests/src/dxc/junit/opcodes/fdiv/jm/T_fdiv_4.java
deleted file mode 100644
index 0c2cc97..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fdiv/jm/T_fdiv_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fdiv.jm;
-
-public class T_fdiv_4 {
-
-    public float run(long a, float b) {
-        return (float)a/b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fdiv/jm/T_fdiv_5.j b/tools/dx-tests/src/dxc/junit/opcodes/fdiv/jm/T_fdiv_5.j
deleted file mode 100644
index c273a5e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fdiv/jm/T_fdiv_5.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fdiv_5.java
-.class public dxc/junit/opcodes/fdiv/jm/T_fdiv_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(FF)F
-    .limit stack 2
-    .limit locals 3
-
-    aload_0
-    fload_2
-    fdiv
-    freturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fdiv/jm/T_fdiv_5.java b/tools/dx-tests/src/dxc/junit/opcodes/fdiv/jm/T_fdiv_5.java
deleted file mode 100644
index f93de7b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fdiv/jm/T_fdiv_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fdiv.jm;
-
-public class T_fdiv_5 {
-    
-    public float run(float a, float b) {
-        return a/b;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload/Test_fload.java b/tools/dx-tests/src/dxc/junit/opcodes/fload/Test_fload.java
deleted file mode 100644
index 736ebbb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload/Test_fload.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.fload.jm.T_fload_1;
-import dxc.junit.opcodes.fload.jm.T_fload_1_w;
-import dxc.junit.opcodes.fload.jm.T_fload_2;
-import dxc.junit.opcodes.fload.jm.T_fload_2_w;
-
-public class Test_fload extends DxTestCase {
-
-    /*
-     * NORMAL fload VERSION
-     */
-
-    /**
-     * @title  Test fload 1
-     */
-    public void testN1() {
-        T_fload_1 t = new T_fload_1();
-        assertEquals(2f, t.run());
-    }
-
-    /**
-     * @title  Test fload 255
-     */
-    public void testN2() {
-        T_fload_2 t = new T_fload_2();
-        assertEquals(2f, t.run());
-    }
-
-    /**
-     * @constraint 4.8.1.21
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.fload.jm.T_fload_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.fload.jm.T_fload_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.fload.jm.T_fload_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.fload.jm.T_fload_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /*
-     * WIDE fload VERSION
-     */
-
-    /**
-     * @title  Test fload 257
-     */
-    public void testN3() {
-        T_fload_1_w t = new T_fload_1_w();
-        assertEquals(2f, t.run());
-    }
-
-    /**
-     * @title  Test fload_w 1
-     */
-    public void testN4() {
-        T_fload_2_w t = new T_fload_2_w();
-        assertEquals(2f, t.run());
-    }
-
-    /**
-     * @constraint 4.8.1.25
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.fload.jm.T_fload_3_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.fload.jm.T_fload_4_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE7() {
-        try {
-            Class.forName("dxc.junit.opcodes.fload.jm.T_fload_5_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE8() {
-        try {
-            Class.forName("dxc.junit.opcodes.fload.jm.T_fload_6_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_1.j b/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_1.j
deleted file mode 100644
index d48d674..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_1.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_1.java
-.class public dxc/junit/opcodes/fload/jm/T_fload_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()F
-    .limit stack 2
-    .limit locals 6
-    
-    fconst_2
-    fstore 4
-    fconst_1
-    fload 4
-    
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_1.java b/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_1.java
deleted file mode 100644
index 0659eb4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload.jm;
-
-public class T_fload_1 {
-
-    public float run() {
-        return 2f;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_1_w.j b/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_1_w.j
deleted file mode 100644
index 5c3e03e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_1_w.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_1_w.java
-.class public dxc/junit/opcodes/fload/jm/T_fload_1_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()F
-    .limit stack 2
-    .limit locals 300
-    
-    fconst_2
-    fstore 257
-    fconst_1
-    fload 257
-    
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_1_w.java b/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_1_w.java
deleted file mode 100644
index 0a75402..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_1_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload.jm;
-
-public class T_fload_1_w {
-
-    public float run() {
-        return 2f;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_2.j b/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_2.j
deleted file mode 100644
index affbbcc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_2.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_2.java
-.class public dxc/junit/opcodes/fload/jm/T_fload_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()F
-    .limit stack 2
-    .limit locals 300
-    
-    fconst_2
-    fstore 255
-    fconst_1
-    fload 255
-    
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_2.java b/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_2.java
deleted file mode 100644
index 5f955cf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload.jm;
-
-public class T_fload_2 {
-
-      public float run() {
-          return 2f;
-      }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_2_w.j b/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_2_w.j
deleted file mode 100644
index 8cfd4b9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_2_w.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_2_w.java
-.class public dxc/junit/opcodes/fload/jm/T_fload_2_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()F
-    .limit stack 2
-    .limit locals 2
-    
-    fconst_2
-    fstore 1
-    fconst_1
-    fload_w 1
-    
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_2_w.java b/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_2_w.java
deleted file mode 100644
index 06e678d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_2_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload.jm;
-
-public class T_fload_2_w {
-
-      public float run() {
-          return 2f;
-      }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_3.j b/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_3.j
deleted file mode 100644
index b46e1ae..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_3.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_3.java
-.class public dxc/junit/opcodes/fload/jm/T_fload_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    fload 0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_3.java b/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_3.java
deleted file mode 100644
index 4a96c8d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload.jm;
-
-public class T_fload_3 {
-
-    public void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_3_w.j b/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_3_w.j
deleted file mode 100644
index ca096aa..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_3_w.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_3_w.java
-.class public dxc/junit/opcodes/fload/jm/T_fload_3_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 300
-
-    fload 300
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_3_w.java b/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_3_w.java
deleted file mode 100644
index e097e18..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_3_w.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload.jm;
-
-public class T_fload_3_w {
-
-    public void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_4.j b/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_4.j
deleted file mode 100644
index 0fb25c9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_4.java
-.class public dxc/junit/opcodes/fload/jm/T_fload_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    dconst_1
-    dstore_0
-    
-    fload 0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_4.java b/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_4.java
deleted file mode 100644
index 07f75b5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload.jm;
-
-public class T_fload_4 {
-
-    public void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_4_w.j b/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_4_w.j
deleted file mode 100644
index d58ae6a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_4_w.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_4_w.java
-.class public dxc/junit/opcodes/fload/jm/T_fload_4_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 300
-
-    dconst_1
-    dstore 260
-    
-    fload_w 260
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_4_w.java b/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_4_w.java
deleted file mode 100644
index 8ae2258..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_4_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload.jm;
-
-public class T_fload_4_w {
-
-    public void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_5.j b/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_5.j
deleted file mode 100644
index 94dc078..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_5.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_5.java
-.class public dxc/junit/opcodes/fload/jm/T_fload_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    lstore_0
-    
-    fload 0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_5.java b/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_5.java
deleted file mode 100644
index 7f7dc3c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload.jm;
-
-public class T_fload_5 {
-
-    public void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_5_w.j b/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_5_w.j
deleted file mode 100644
index dbffaa5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_5_w.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_5_w.java
-.class public dxc/junit/opcodes/fload/jm/T_fload_5_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 300
-
-    lconst_1
-    lstore 260
-    
-    fload_w 260
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_5_w.java b/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_5_w.java
deleted file mode 100644
index 0cabc57..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_5_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload.jm;
-
-public class T_fload_5_w {
-
-    public void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_6.j b/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_6.j
deleted file mode 100644
index b4c0270..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_6.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_6.java
-.class public dxc/junit/opcodes/fload/jm/T_fload_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 2
-
-    fconst_1
-    fstore_0
-    
-    fload 0
-    fload 0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_6.java b/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_6.java
deleted file mode 100644
index 8ce1234..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload.jm;
-
-public class T_fload_6 {
-
-    public void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_6_w.j b/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_6_w.j
deleted file mode 100644
index 32e9795..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_6_w.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_6_w.java
-.class public dxc/junit/opcodes/fload/jm/T_fload_6_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 300
-
-    fconst_1
-    fstore 260
-    
-    fload_w 260
-    fload_w 260
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_6_w.java b/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_6_w.java
deleted file mode 100644
index 5f61753..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload/jm/T_fload_6_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload.jm;
-
-public class T_fload_6_w {
-
-    public void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_0/Test_fload_0.java b/tools/dx-tests/src/dxc/junit/opcodes/fload_0/Test_fload_0.java
deleted file mode 100644
index b796eb7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_0/Test_fload_0.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload_0;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.fload_0.jm.T_fload_0_1;
-import dxc.junit.opcodes.fload_0.jm.T_fload_0_6;
-
-public class Test_fload_0 extends DxTestCase {
-
-    /**
-     * @title  value is pushed onto the operand stack
-     */
-    public void testN1() {
-        assertEquals(2f, T_fload_0_1.run());
-    }
-
-    /**
-     * @title equality of fload_<n> and fload <n>
-     */
-    public void testN2() {
-        assertTrue(T_fload_0_6.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.fload_0.jm.T_fload_0_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.fload_0.jm.T_fload_0_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.fload_0.jm.T_fload_0_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.fload_0.jm.T_fload_0_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_1.j b/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_1.j
deleted file mode 100644
index c7b69ed..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_0_1.java
-.class public dxc/junit/opcodes/fload_0/jm/T_fload_0_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()F
-    .limit stack 2
-    .limit locals 1
-    
-    fconst_2
-    fstore_0
-    fconst_1
-    fload_0
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_1.java b/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_1.java
deleted file mode 100644
index a577960..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload_0.jm;
-
-public class T_fload_0_1 {
-
-    public static float run() {
-        return 2f;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_2.j b/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_2.j
deleted file mode 100644
index 6a795e3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_0_2.java
-.class public dxc/junit/opcodes/fload_0/jm/T_fload_0_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    fload_0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_2.java b/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_2.java
deleted file mode 100644
index 482b227..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload_0.jm;
-
-public class T_fload_0_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_3.j b/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_3.j
deleted file mode 100644
index 4b378f5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_3.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_0_3.java
-.class public dxc/junit/opcodes/fload_0/jm/T_fload_0_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    dconst_1
-    dstore_0
-    
-    fload_0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_3.java b/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_3.java
deleted file mode 100644
index 31db2e6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload_0.jm;
-
-public class T_fload_0_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_4.j b/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_4.j
deleted file mode 100644
index 23f2597..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_0_4.java
-.class public dxc/junit/opcodes/fload_0/jm/T_fload_0_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    lstore_0
-    
-    fload_0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_4.java b/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_4.java
deleted file mode 100644
index c812def..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload_0.jm;
-
-public class T_fload_0_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_5.j b/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_5.j
deleted file mode 100644
index f767cfd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_5.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_0_5.java
-.class public dxc/junit/opcodes/fload_0/jm/T_fload_0_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 2
-
-    fconst_1
-    fstore_0
-    
-    fload_0
-    fload_0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_5.java b/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_5.java
deleted file mode 100644
index 98ebafd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_5.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload_0.jm;
-
-public class T_fload_0_5 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_6.j b/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_6.j
deleted file mode 100644
index dd42b7e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_6.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_0_6.java
-.class public dxc/junit/opcodes/fload_0/jm/T_fload_0_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()Z
-    .limit stack 2
-    .limit locals 1
-
-    fconst_2
-    fstore_0
-
-    fload_0
-    fload 0
-    fcmpl 
-    
-    ifne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_6.java b/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_6.java
deleted file mode 100644
index 1a337b0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_0/jm/T_fload_0_6.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload_0.jm;
-
-public class T_fload_0_6 {
-
-    public static boolean run() {
-        float i = 2f;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_1/Test_fload_1.java b/tools/dx-tests/src/dxc/junit/opcodes/fload_1/Test_fload_1.java
deleted file mode 100644
index 91a6112..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_1/Test_fload_1.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload_1;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.fload_1.jm.T_fload_1_1;
-import dxc.junit.opcodes.fload_1.jm.T_fload_1_6;
-
-public class Test_fload_1 extends DxTestCase {
-
-    /**
-     * @title value is pushed onto the operand stack
-     */
-    public void testN1() {
-        assertEquals(2f, T_fload_1_1.run());
-    }
-
-    /**
-     * @title equality of fload_<n> and fload <n>
-     */
-    public void testN2() {
-        assertTrue(T_fload_1_6.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title (index must be no greater than the value
-     * of max_locals-1).
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.fload_1.jm.T_fload_1_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.fload_1.jm.T_fload_1_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.fload_1.jm.T_fload_1_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.fload_1.jm.T_fload_1_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_1.j b/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_1.j
deleted file mode 100644
index 93f205e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_1_1.java
-.class public dxc/junit/opcodes/fload_1/jm/T_fload_1_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()F
-    .limit stack 2
-    .limit locals 2
-    
-    fconst_2
-    fstore_1
-    fconst_1
-    fload_1
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_1.java b/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_1.java
deleted file mode 100644
index 7e2f5c4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload_1.jm;
-
-public class T_fload_1_1 {
-
-    public static float run() {
-        return 2f;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_2.j b/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_2.j
deleted file mode 100644
index fabb478..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_1_2.java
-.class public dxc/junit/opcodes/fload_1/jm/T_fload_1_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 1
-
-    fload_1
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_2.java b/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_2.java
deleted file mode 100644
index 6e54dd8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload_1.jm;
-
-public class T_fload_1_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_3.j b/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_3.j
deleted file mode 100644
index f28c5bf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_3.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_1_3.java
-.class public dxc/junit/opcodes/fload_1/jm/T_fload_1_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    dconst_1
-    dstore_1
-    
-    fload_1
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_3.java b/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_3.java
deleted file mode 100644
index 10e5e25..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload_1.jm;
-
-public class T_fload_1_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_4.j b/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_4.j
deleted file mode 100644
index f0154b9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_1_4.java
-.class public dxc/junit/opcodes/fload_1/jm/T_fload_1_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    lstore_1
-    
-    fload_1
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_4.java b/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_4.java
deleted file mode 100644
index cd6f66a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload_1.jm;
-
-public class T_fload_1_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_5.j b/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_5.j
deleted file mode 100644
index 6778df6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_5.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_1_5.java
-.class public dxc/junit/opcodes/fload_1/jm/T_fload_1_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 2
-
-    fconst_1
-    fstore_1
-    
-    fload_1
-    fload_1
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_5.java b/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_5.java
deleted file mode 100644
index ba47f43..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_5.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload_1.jm;
-
-public class T_fload_1_5 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_6.j b/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_6.j
deleted file mode 100644
index 8557f82..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_6.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_1_6.java
-.class public dxc/junit/opcodes/fload_1/jm/T_fload_1_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()Z
-    .limit stack 2
-    .limit locals 2
-
-    fconst_2
-    fstore_1
-
-    fload_1
-    fload 1
-    fcmpl 
-    ifne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_6.java b/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_6.java
deleted file mode 100644
index 31d567b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_1/jm/T_fload_1_6.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload_1.jm;
-
-public class T_fload_1_6 {
-
-    public static boolean run() {
-        float i = 2f;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_2/Test_fload_2.java b/tools/dx-tests/src/dxc/junit/opcodes/fload_2/Test_fload_2.java
deleted file mode 100644
index 7a5bb47..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_2/Test_fload_2.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload_2;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.fload_2.jm.T_fload_2_1;
-import dxc.junit.opcodes.fload_2.jm.T_fload_2_6;
-
-public class Test_fload_2 extends DxTestCase {
-
-    /**
-     * @title value is pushed onto the operand stack
-     */
-    public void testN1() {
-        assertEquals(2f, T_fload_2_1.run());
-    }
-
-    /**
-     * @title equality of fload_<n> and fload <n>
-     */
-    public void testN2() {
-        assertTrue(T_fload_2_6.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title (index must be no greater than the value
-     * of max_locals-1).
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.fload_2.jm.T_fload_2_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.fload_2.jm.T_fload_2_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.fload_2.jm.T_fload_2_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.fload_2.jm.T_fload_2_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_1.j b/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_1.j
deleted file mode 100644
index e6fcb75..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_2_1.java
-.class public dxc/junit/opcodes/fload_2/jm/T_fload_2_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()F
-    .limit stack 2
-    .limit locals 3
-    
-    fconst_2
-    fstore_2
-    fconst_1
-    fload_2
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_1.java b/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_1.java
deleted file mode 100644
index c4b1790..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload_2.jm;
-
-public class T_fload_2_1 {
-
-    public static float run() {
-        return 2f;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_2.j b/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_2.j
deleted file mode 100644
index 1d44d0e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_2_2.java
-.class public dxc/junit/opcodes/fload_2/jm/T_fload_2_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 2
-
-    fload_2
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_2.java b/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_2.java
deleted file mode 100644
index e86cd01..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload_2.jm;
-
-public class T_fload_2_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_3.j b/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_3.j
deleted file mode 100644
index 4cc8b98..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_3.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_2_3.java
-.class public dxc/junit/opcodes/fload_2/jm/T_fload_2_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    dconst_1
-    dstore_2
-    
-    fload_2
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_3.java b/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_3.java
deleted file mode 100644
index 09a7cdf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload_2.jm;
-
-public class T_fload_2_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_4.j b/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_4.j
deleted file mode 100644
index 9a1382d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_2_4.java
-.class public dxc/junit/opcodes/fload_2/jm/T_fload_2_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    lstore_2
-    
-    fload_2
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_4.java b/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_4.java
deleted file mode 100644
index 082bc9e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload_2.jm;
-
-public class T_fload_2_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_5.j b/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_5.j
deleted file mode 100644
index 8e37b39..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_5.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_2_5.java
-.class public dxc/junit/opcodes/fload_2/jm/T_fload_2_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 3
-
-    fconst_1
-    fstore_2
-    
-    fload_2
-    fload_2
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_5.java b/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_5.java
deleted file mode 100644
index b3dcd24..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_5.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload_2.jm;
-
-public class T_fload_2_5 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_6.j b/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_6.j
deleted file mode 100644
index 85d7c90..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_6.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_2_6.java
-.class public dxc/junit/opcodes/fload_2/jm/T_fload_2_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()Z
-    .limit stack 2
-    .limit locals 3
-
-    fconst_2
-    fstore_2
-
-    fload_2
-    fload 2
-    fcmpl 
-    ifne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_6.java b/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_6.java
deleted file mode 100644
index a584e41..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_2/jm/T_fload_2_6.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload_2.jm;
-
-public class T_fload_2_6 {
-
-    public static boolean run() {
-        float i = 2f;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_3/Test_fload_3.java b/tools/dx-tests/src/dxc/junit/opcodes/fload_3/Test_fload_3.java
deleted file mode 100644
index cd8d127..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_3/Test_fload_3.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload_3;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.fload_3.jm.T_fload_3_1;
-import dxc.junit.opcodes.fload_3.jm.T_fload_3_6;
-
-public class Test_fload_3 extends DxTestCase {
-
-    /**
-     * @title value is pushed onto the operand stack
-     */
-    public void testN1() {
-        assertEquals(2f, T_fload_3_1.run());
-    }
-
-    /**
-     * @title equality of fload_<n> and fload <n>
-     */
-    public void testN2() {
-        assertTrue(T_fload_3_6.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title (index must be no greater than the value
-     * of max_locals-1).
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.fload_3.jm.T_fload_3_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.fload_3.jm.T_fload_3_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.fload_3.jm.T_fload_3_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.fload_3.jm.T_fload_3_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_1.j b/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_1.j
deleted file mode 100644
index abe83e0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_3_1.java
-.class public dxc/junit/opcodes/fload_3/jm/T_fload_3_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()F
-    .limit stack 2
-    .limit locals 4
-    
-    fconst_2
-    fstore_3
-    fconst_1
-    fload_3
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_1.java b/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_1.java
deleted file mode 100644
index f4e434b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload_3.jm;
-
-public class T_fload_3_1 {
-
-    public static float run() {
-        return 2f;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_2.j b/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_2.j
deleted file mode 100644
index 7b06437..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_3_2.java
-.class public dxc/junit/opcodes/fload_3/jm/T_fload_3_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 3
-
-    fload_3
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_2.java b/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_2.java
deleted file mode 100644
index 896396d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload_3.jm;
-
-public class T_fload_3_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_3.j b/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_3.j
deleted file mode 100644
index 157316a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_3.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_3_3.java
-.class public dxc/junit/opcodes/fload_3/jm/T_fload_3_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 5
-
-    dconst_1
-    dstore_3
-    
-    fload_3
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_3.java b/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_3.java
deleted file mode 100644
index 040faf7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload_3.jm;
-
-public class T_fload_3_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_4.j b/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_4.j
deleted file mode 100644
index 8408f9e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_3_4.java
-.class public dxc/junit/opcodes/fload_3/jm/T_fload_3_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 5
-
-    lconst_1
-    lstore_3
-    
-    fload_3
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_4.java b/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_4.java
deleted file mode 100644
index 240b801..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload_3.jm;
-
-public class T_fload_3_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_5.j b/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_5.j
deleted file mode 100644
index e99cf7e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_5.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_3_5.java
-.class public dxc/junit/opcodes/fload_3/jm/T_fload_3_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 4
-
-    fconst_1
-    fstore_3
-    
-    fload_3
-    fload_3
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_5.java b/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_5.java
deleted file mode 100644
index c1a7754..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_5.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload_3.jm;
-
-public class T_fload_3_5 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_6.j b/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_6.j
deleted file mode 100644
index f61cdc8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_6.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fload_3_6.java
-.class public dxc/junit/opcodes/fload_3/jm/T_fload_3_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()Z
-    .limit stack 2
-    .limit locals 4
-
-    fconst_2
-    fstore_3
-
-    fload_3
-    fload 3
-    fcmpl 
-    ifne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_6.java b/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_6.java
deleted file mode 100644
index 8bbff07..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fload_3/jm/T_fload_3_6.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fload_3.jm;
-
-public class T_fload_3_6 {
-
-    public static boolean run() {
-        float i = 2f;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fmul/Test_fmul.java b/tools/dx-tests/src/dxc/junit/opcodes/fmul/Test_fmul.java
deleted file mode 100644
index 0bbf1ee..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fmul/Test_fmul.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fmul;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.fmul.jm.T_fmul_1;
-
-public class Test_fmul extends DxTestCase {
-
-    /**
-     * @title  Arguments = 2.7f, 3.14f
-     */
-    public void testN1() {
-        T_fmul_1 t = new T_fmul_1();
-        assertEquals(8.478001f, t.run(2.7f, 3.14f));
-    }
-
-    /**
-     * @title  Arguments = 0, -3.14f
-     */
-    public void testN2() {
-        T_fmul_1 t = new T_fmul_1();
-        assertEquals(-0f, t.run(0, -3.14f));
-    }
-
-    /**
-     * @title  Arguments = -2.7f, -3.14f
-     */
-    public void testN3() {
-        T_fmul_1 t = new T_fmul_1();
-        assertEquals(8.478001f, t.run(-3.14f, -2.7f));
-    }
-
-    /**
-     * @title  Arguments = Float.MAX_VALUE, Float.NaN
-     */
-    public void testB1() {
-        T_fmul_1 t = new T_fmul_1();
-        assertEquals(Float.NaN, t.run(Float.MAX_VALUE, Float.NaN));
-    }
-
-    /**
-     * @title  Arguments = Float.POSITIVE_INFINITY, 0
-     */
-    public void testB2() {
-        T_fmul_1 t = new T_fmul_1();
-        assertEquals(Float.NaN, t.run(Float.POSITIVE_INFINITY, 0));
-    }
-
-    /**
-     * @title  Arguments = Float.POSITIVE_INFINITY, -2.7f
-     */
-    public void testB3() {
-        T_fmul_1 t = new T_fmul_1();
-        assertEquals(Float.NEGATIVE_INFINITY, t.run(Float.POSITIVE_INFINITY,
-                -2.7f));
-    }
-
-    /**
-     * @title  Arguments = Float.POSITIVE_INFINITY,
-     * Float.NEGATIVE_INFINITY
-     */
-    public void testB4() {
-        T_fmul_1 t = new T_fmul_1();
-        assertEquals(Float.NEGATIVE_INFINITY, t.run(Float.POSITIVE_INFINITY,
-                Float.NEGATIVE_INFINITY));
-    }
-
-    /**
-     * @title  Arguments = +0, -0f
-     */
-    public void testB5() {
-        T_fmul_1 t = new T_fmul_1();
-        assertEquals(-0f, t.run(+0f, -0f));
-    }
-
-    /**
-     * @title  Arguments = -0f, -0f
-     */
-    public void testB6() {
-        T_fmul_1 t = new T_fmul_1();
-        assertEquals(+0f, t.run(-0f, -0f));
-    }
-
-    /**
-     * @title  Arguments = Float.MAX_VALUE, Float.MAX_VALUE
-     */
-    public void testB7() {
-        T_fmul_1 t = new T_fmul_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_fmul_1 t = new T_fmul_1();
-        assertEquals(-0f, t.run(Float.MIN_VALUE, -1.4E-45f));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.fmul.jm.T_fmul_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - float, double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.fmul.jm.T_fmul_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long, float
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.fmul.jm.T_fmul_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference, float
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.fmul.jm.T_fmul_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fmul/jm/T_fmul_1.j b/tools/dx-tests/src/dxc/junit/opcodes/fmul/jm/T_fmul_1.j
deleted file mode 100644
index 474a8c2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fmul/jm/T_fmul_1.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fmul_1.java
-.class public dxc/junit/opcodes/fmul/jm/T_fmul_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(FF)F
-    .limit stack 2
-    .limit locals 3
-    fload_1
-    fload_2
-    fmul
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fmul/jm/T_fmul_1.java b/tools/dx-tests/src/dxc/junit/opcodes/fmul/jm/T_fmul_1.java
deleted file mode 100644
index 1a12d72..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fmul/jm/T_fmul_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fmul.jm;
-
-public class T_fmul_1 {
-
-    public float run(float a, float b) {
-        return a*b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fmul/jm/T_fmul_2.j b/tools/dx-tests/src/dxc/junit/opcodes/fmul/jm/T_fmul_2.j
deleted file mode 100644
index 35caf66..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fmul/jm/T_fmul_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fmul_2.java
-.class public dxc/junit/opcodes/fmul/jm/T_fmul_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(FF)F
-    .limit stack 2
-    .limit locals 3
-    fload_1
-    ; fload_2    
-    fmul
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fmul/jm/T_fmul_2.java b/tools/dx-tests/src/dxc/junit/opcodes/fmul/jm/T_fmul_2.java
deleted file mode 100644
index 7927d37..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fmul/jm/T_fmul_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fmul.jm;
-
-public class T_fmul_2 {
-
-    public float run(float a, float b) {
-        return a*b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fmul/jm/T_fmul_3.j b/tools/dx-tests/src/dxc/junit/opcodes/fmul/jm/T_fmul_3.j
deleted file mode 100644
index e11cfe1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fmul/jm/T_fmul_3.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fmul_3.java
-.class public dxc/junit/opcodes/fmul/jm/T_fmul_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(FD)F
-    .limit stack 3
-    .limit locals 5
-    fload_1
-    dload_2    
-    fmul
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fmul/jm/T_fmul_3.java b/tools/dx-tests/src/dxc/junit/opcodes/fmul/jm/T_fmul_3.java
deleted file mode 100644
index 7474a90..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fmul/jm/T_fmul_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fmul.jm;
-
-public class T_fmul_3 {
-
-    public float run(float a, double b) {
-        return a*(float)b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fmul/jm/T_fmul_4.j b/tools/dx-tests/src/dxc/junit/opcodes/fmul/jm/T_fmul_4.j
deleted file mode 100644
index 1455bb6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fmul/jm/T_fmul_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fmul_4.java
-.class public dxc/junit/opcodes/fmul/jm/T_fmul_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(JF)F
-    .limit stack 3
-    .limit locals 4
-
-    lload_1
-;    l2f
-    fload_3
-    fmul
-
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fmul/jm/T_fmul_4.java b/tools/dx-tests/src/dxc/junit/opcodes/fmul/jm/T_fmul_4.java
deleted file mode 100644
index 0e5200b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fmul/jm/T_fmul_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fmul.jm;
-
-public class T_fmul_4 {
-
-    public float run(long a, float b) {
-        return (float)a*b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fmul/jm/T_fmul_5.j b/tools/dx-tests/src/dxc/junit/opcodes/fmul/jm/T_fmul_5.j
deleted file mode 100644
index ce62cc0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fmul/jm/T_fmul_5.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fmul_5.java
-.class public dxc/junit/opcodes/fmul/jm/T_fmul_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(FF)F
-    .limit stack 2
-    .limit locals 3
-
-    aload_0
-    fload_2
-    fmul
-    freturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fmul/jm/T_fmul_5.java b/tools/dx-tests/src/dxc/junit/opcodes/fmul/jm/T_fmul_5.java
deleted file mode 100644
index 9da82fa..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fmul/jm/T_fmul_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fmul.jm;
-
-public class T_fmul_5 {
-    
-    public float run(float a, float b) {
-        return a*b;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fneg/Test_fneg.java b/tools/dx-tests/src/dxc/junit/opcodes/fneg/Test_fneg.java
deleted file mode 100644
index d15f754..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fneg/Test_fneg.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fneg;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.fneg.jm.T_fneg_1;
-
-public class Test_fneg extends DxTestCase {
-
-    /**
-     * @title  Argument = 1
-     */
-    public void testN1() {
-        T_fneg_1 t = new T_fneg_1();
-        assertEquals(-1f, t.run(1f));
-    }
-
-    /**
-     * @title  Argument = -1
-     */
-    public void testN2() {
-        T_fneg_1 t = new T_fneg_1();
-        assertEquals(1f, t.run(-1f));
-    }
-
-    /**
-     * @title  Argument = +0
-     */
-    public void testN3() {
-        T_fneg_1 t = new T_fneg_1();
-        assertEquals(-0f, t.run(+0f));
-    }
-
-    /**
-     * @title  Argument = -2.7
-     */
-    public void testN4() {
-        T_fneg_1 t = new T_fneg_1();
-        assertEquals(2.7f, t.run(-2.7f));
-    }
-
-    /**
-     * @title  Argument = Float.NaN
-     */
-    public void testB1() {
-        T_fneg_1 t = new T_fneg_1();
-        assertEquals(Float.NaN, t.run(Float.NaN));
-    }
-
-    /**
-     * @title  Argument = Float.NEGATIVE_INFINITY
-     */
-    public void testB2() {
-        T_fneg_1 t = new T_fneg_1();
-        assertEquals(Float.POSITIVE_INFINITY, t.run(Float.NEGATIVE_INFINITY));
-    }
-
-    /**
-     * @title  Argument = Float.POSITIVE_INFINITY
-     */
-    public void testB3() {
-        T_fneg_1 t = new T_fneg_1();
-        assertEquals(Float.NEGATIVE_INFINITY, t.run(Float.POSITIVE_INFINITY));
-    }
-
-    /**
-     * @title  Argument = Float.MAX_VALUE
-     */
-    public void testB4() {
-        T_fneg_1 t = new T_fneg_1();
-        assertEquals(-3.4028235E38f, t.run(Float.MAX_VALUE));
-    }
-
-    /**
-     * @title  Argument = Float.MIN
-     */
-    public void testB5() {
-        T_fneg_1 t = new T_fneg_1();
-        assertEquals(-1.4E-45f, t.run(Float.MIN_VALUE));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.fneg.jm.T_fneg_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.fneg.jm.T_fneg_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.fneg.jm.T_fneg_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - reference
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.fneg.jm.T_fneg_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fneg/jm/T_fneg_1.j b/tools/dx-tests/src/dxc/junit/opcodes/fneg/jm/T_fneg_1.j
deleted file mode 100644
index ee7b958..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fneg/jm/T_fneg_1.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ineg_1.java
-.class public dxc/junit/opcodes/fneg/jm/T_fneg_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(F)F
-    .limit stack 1
-    .limit locals 2
-    fload_1
-    fneg
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fneg/jm/T_fneg_1.java b/tools/dx-tests/src/dxc/junit/opcodes/fneg/jm/T_fneg_1.java
deleted file mode 100644
index ed652f0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fneg/jm/T_fneg_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fneg.jm;
-
-public class T_fneg_1 {
-
-    public float run(float d) {
-        return -d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fneg/jm/T_fneg_2.j b/tools/dx-tests/src/dxc/junit/opcodes/fneg/jm/T_fneg_2.j
deleted file mode 100644
index 3d91051..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fneg/jm/T_fneg_2.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fneg_2.java
-.class public dxc/junit/opcodes/fneg/jm/T_fneg_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(F)F
-    .limit stack 1
-    .limit locals 2
-    ;fload_1
-    fneg
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fneg/jm/T_fneg_2.java b/tools/dx-tests/src/dxc/junit/opcodes/fneg/jm/T_fneg_2.java
deleted file mode 100644
index 9872e07..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fneg/jm/T_fneg_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fneg.jm;
-
-public class T_fneg_2 {
-
-    public float run(float d) {
-        return -d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fneg/jm/T_fneg_3.j b/tools/dx-tests/src/dxc/junit/opcodes/fneg/jm/T_fneg_3.j
deleted file mode 100644
index 0ef20fe..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fneg/jm/T_fneg_3.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fneg_3.java
-.class public dxc/junit/opcodes/fneg/jm/T_fneg_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(F)F
-    .limit stack 2
-    .limit locals 3
-    ;fload_1
-    dconst_1
-    fneg
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fneg/jm/T_fneg_3.java b/tools/dx-tests/src/dxc/junit/opcodes/fneg/jm/T_fneg_3.java
deleted file mode 100644
index 8ebcf38..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fneg/jm/T_fneg_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fneg.jm;
-
-public class T_fneg_3 {
-
-    public float run(float d) {
-        return -d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fneg/jm/T_fneg_4.j b/tools/dx-tests/src/dxc/junit/opcodes/fneg/jm/T_fneg_4.j
deleted file mode 100644
index 1e8eaad..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fneg/jm/T_fneg_4.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fneg_4.java
-.class public dxc/junit/opcodes/fneg/jm/T_fneg_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(F)F
-    .limit stack 2
-    .limit locals 3
-    ;fload_1
-    lconst_1
-    fneg
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fneg/jm/T_fneg_4.java b/tools/dx-tests/src/dxc/junit/opcodes/fneg/jm/T_fneg_4.java
deleted file mode 100644
index 97504d3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fneg/jm/T_fneg_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fneg.jm;
-
-public class T_fneg_4 {
-
-    public float run(float d) {
-        return -d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fneg/jm/T_fneg_5.j b/tools/dx-tests/src/dxc/junit/opcodes/fneg/jm/T_fneg_5.j
deleted file mode 100644
index 48e5e3a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fneg/jm/T_fneg_5.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fneg_5.java
-.class public dxc/junit/opcodes/fneg/jm/T_fneg_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(F)F
-    .limit stack 1
-    .limit locals 2
-
-    aload_0
-    fneg
-    freturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fneg/jm/T_fneg_5.java b/tools/dx-tests/src/dxc/junit/opcodes/fneg/jm/T_fneg_5.java
deleted file mode 100644
index c46a002..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fneg/jm/T_fneg_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fneg.jm;
-
-public class T_fneg_5 {
-    
-    public float run(float d) {
-        return -d;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/frem/Test_frem.java b/tools/dx-tests/src/dxc/junit/opcodes/frem/Test_frem.java
deleted file mode 100644
index 4cf0a68..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/frem/Test_frem.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.frem;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.frem.jm.T_frem_1;
-
-public class Test_frem extends DxTestCase {
-
-    /**
-     * @title Arguments = 2.7f, 3.14f
-     */
-    public void testN1() {
-        T_frem_1 t = new T_frem_1();
-        assertEquals(2.7f, t.run(2.7f, 3.14f));
-    }
-
-    /**
-     * @title  Dividend = 0
-     */
-    public void testN2() {
-        T_frem_1 t = new T_frem_1();
-        assertEquals(0f, t.run(0, 3.14f));
-    }
-
-    /**
-     * @title  Dividend is negative
-     */
-    public void testN3() {
-        T_frem_1 t = new T_frem_1();
-        assertEquals(-0.44000006f, t.run(-3.14f, 2.7f));
-    }
-
-    /**
-     * @title  Arguments = Float.MAX_VALUE, Float.NaN
-     */
-    public void testB1() {
-        T_frem_1 t = new T_frem_1();
-        assertEquals(Float.NaN, t.run(Float.MAX_VALUE, Float.NaN));
-    }
-
-    /**
-     * @title  Arguments = Float.POSITIVE_INFINITY,
-     * Float.NEGATIVE_INFINITY
-     */
-    public void testB2() {
-        T_frem_1 t = new T_frem_1();
-        assertEquals(Float.NaN, t.run(Float.POSITIVE_INFINITY,
-                Float.NEGATIVE_INFINITY));
-    }
-
-    /**
-     * @title  Arguments = Float.POSITIVE_INFINITY, -2.7f
-     */
-    public void testB3() {
-        T_frem_1 t = new T_frem_1();
-        assertEquals(Float.NaN, t.run(Float.POSITIVE_INFINITY, -2.7f));
-    }
-
-    /**
-     * @title  Arguments = -2.7f, Float.NEGATIVE_INFINITY
-     */
-    public void testB4() {
-        T_frem_1 t = new T_frem_1();
-        assertEquals(-2.7f, t.run(-2.7f, Float.NEGATIVE_INFINITY));
-    }
-
-    /**
-     * @title  Arguments = 0, 0
-     */
-    public void testB5() {
-        T_frem_1 t = new T_frem_1();
-        assertEquals(Float.NaN, t.run(0, 0));
-    }
-
-    /**
-     * @title  Arguments = 0, -2.7
-     */
-    public void testB6() {
-        T_frem_1 t = new T_frem_1();
-        assertEquals(0f, t.run(0, -2.7f));
-    }
-
-    /**
-     * @title  Arguments = -2.7, 0
-     */
-    public void testB7() {
-        T_frem_1 t = new T_frem_1();
-        assertEquals(Float.NaN, t.run(-2.7f, 0));
-    }
-
-    /**
-     * @title  Arguments = 1, Float.MAX_VALUE
-     */
-    public void testB8() {
-        T_frem_1 t = new T_frem_1();
-        assertEquals(0f, t.run(1, Float.MIN_VALUE));
-    }
-
-    /**
-     * @title  Arguments = Float.MAX_VALUE, -1E-9f
-     */
-    public void testB9() {
-        T_frem_1 t = new T_frem_1();
-        assertEquals(7.2584893E-10f, t.run(Float.MAX_VALUE, -1E-9f));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.frem.jm.T_frem_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - float, double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.frem.jm.T_frem_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long, float
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.frem.jm.T_frem_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference, float
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.frem.jm.T_frem_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/frem/jm/T_frem_1.j b/tools/dx-tests/src/dxc/junit/opcodes/frem/jm/T_frem_1.j
deleted file mode 100644
index f8bbda0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/frem/jm/T_frem_1.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_frem_1.java
-.class public dxc/junit/opcodes/frem/jm/T_frem_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(FF)F
-    .limit stack 2
-    .limit locals 3
-    fload_1
-    fload_2
-    frem
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/frem/jm/T_frem_1.java b/tools/dx-tests/src/dxc/junit/opcodes/frem/jm/T_frem_1.java
deleted file mode 100644
index e96b4b0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/frem/jm/T_frem_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.frem.jm;
-
-public class T_frem_1 {
-
-    public float run(float a, float b) {
-        return a%b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/frem/jm/T_frem_2.j b/tools/dx-tests/src/dxc/junit/opcodes/frem/jm/T_frem_2.j
deleted file mode 100644
index 80e3e21..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/frem/jm/T_frem_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_frem_2.java
-.class public dxc/junit/opcodes/frem/jm/T_frem_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(FF)F
-    .limit stack 2
-    .limit locals 3
-    fload_1
-    ; fload_2    
-    frem
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/frem/jm/T_frem_2.java b/tools/dx-tests/src/dxc/junit/opcodes/frem/jm/T_frem_2.java
deleted file mode 100644
index 86b1230..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/frem/jm/T_frem_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.frem.jm;
-
-public class T_frem_2 {
-
-    public float run(float a, float b) {
-        return a%b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/frem/jm/T_frem_3.j b/tools/dx-tests/src/dxc/junit/opcodes/frem/jm/T_frem_3.j
deleted file mode 100644
index 0c55f61..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/frem/jm/T_frem_3.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_frem_3.java
-.class public dxc/junit/opcodes/frem/jm/T_frem_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(FD)F
-    .limit stack 3
-    .limit locals 5
-    fload_1
-    dload_2    
-    frem
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/frem/jm/T_frem_3.java b/tools/dx-tests/src/dxc/junit/opcodes/frem/jm/T_frem_3.java
deleted file mode 100644
index 8047356..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/frem/jm/T_frem_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.frem.jm;
-
-public class T_frem_3 {
-
-    public float run(float a, double b) {
-        return a%(float)b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/frem/jm/T_frem_4.j b/tools/dx-tests/src/dxc/junit/opcodes/frem/jm/T_frem_4.j
deleted file mode 100644
index d179b19..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/frem/jm/T_frem_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_frem_4.java
-.class public dxc/junit/opcodes/frem/jm/T_frem_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(JF)F
-    .limit stack 3
-    .limit locals 4
-
-    lload_1
-;    l2f
-    fload_3
-    frem
-
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/frem/jm/T_frem_4.java b/tools/dx-tests/src/dxc/junit/opcodes/frem/jm/T_frem_4.java
deleted file mode 100644
index ff87ad6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/frem/jm/T_frem_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.frem.jm;
-
-public class T_frem_4 {
-
-    public float run(long a, float b) {
-        return (float)a%b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/frem/jm/T_frem_5.j b/tools/dx-tests/src/dxc/junit/opcodes/frem/jm/T_frem_5.j
deleted file mode 100644
index c82332f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/frem/jm/T_frem_5.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_frem_5.java
-.class public dxc/junit/opcodes/frem/jm/T_frem_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(FF)F
-    .limit stack 2
-    .limit locals 3
-
-    aload_0
-    fload_2
-    frem
-    freturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/frem/jm/T_frem_5.java b/tools/dx-tests/src/dxc/junit/opcodes/frem/jm/T_frem_5.java
deleted file mode 100644
index 9f4f055..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/frem/jm/T_frem_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.frem.jm;
-
-public class T_frem_5 {
-    
-    public float run(float a, float b) {
-        return a%b;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/freturn/Test_freturn.java b/tools/dx-tests/src/dxc/junit/opcodes/freturn/Test_freturn.java
deleted file mode 100644
index a109dfd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/freturn/Test_freturn.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.freturn;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.freturn.jm.T_freturn_1;
-import dxc.junit.opcodes.freturn.jm.T_freturn_6;
-import dxc.junit.opcodes.freturn.jm.T_freturn_7;
-import dxc.junit.opcodes.freturn.jm.T_freturn_8;
-import dxc.junit.opcodes.freturn.jm.T_freturn_9;
-
-public class Test_freturn extends DxTestCase {
-
-    /**
-     * @title  simple
-     */
-    public void testN1() {
-        T_freturn_1 t = new T_freturn_1();
-        assertEquals(123456f, t.run());
-    }
-
-    /**
-     * @title  check that frames are discarded and reinstananted correctly
-     */
-    public void testN2() {
-        T_freturn_6 t = new T_freturn_6();
-        assertEquals(123456f, t.run());
-    }
-
-    /**
-     * @title  check that monitor is released by freturn
-     */
-    public void testN3() {
-        assertTrue(T_freturn_7.execute());
-    }
-
-    /**
-     * @title  Method is synchronized but thread is not monitor owner
-     */
-    public void testE1() {
-        T_freturn_8 t = new T_freturn_8();
-        try {
-            assertTrue(t.run());
-            fail("expected IllegalMonitorStateException");
-        } catch (IllegalMonitorStateException imse) {
-            // expected
-        }
-    }
-
-    /**
-     * @title  Lock structural rule 1 is violated
-     */
-    public void testE2() {
-        T_freturn_9 t = new T_freturn_9();
-        try {
-            assertEquals(1f, t.run());
-            // the JVM spec says that it is optional to implement the structural
-            // lock rules, see JVM spec 8.13 and monitorenter/exit opcodes.
-            System.out.print("dvmvfe:");
-            //fail("expected IllegalMonitorStateException");
-        } catch (IllegalMonitorStateException imse) {
-            // expected
-        }
-    }
-
-
-    /**
-     * @constraint 4.8.2.14
-     * @title method's return type - void
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.freturn.jm.T_freturn_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.14
-     * @title method's return type - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.freturn.jm.T_freturn_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.freturn.jm.T_freturn_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.freturn.jm.T_freturn_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.freturn.jm.T_freturn_10");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - reference
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.freturn.jm.T_freturn_11");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_1.j b/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_1.j
deleted file mode 100644
index e194867..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_1.j
+++ /dev/null
@@ -1,28 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_freturn_1.java
-.class public dxc/junit/opcodes/freturn/jm/T_freturn_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()F
-    ldc 123456.0f
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_1.java b/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_1.java
deleted file mode 100644
index cbc1490..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.freturn.jm;
-
-public class T_freturn_1 {
-
-    public float run() {
-        return 123456f;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_10.j b/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_10.j
deleted file mode 100644
index 0f73349..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_10.j
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_freturn_10.java
-.class public dxc/junit/opcodes/freturn/jm/T_freturn_10
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method private static test()F
-    .limit stack 1
-    .limit locals 0
-    fconst_1
-    freturn
-.end method
-
-
-
-.method public run()F
-    .limit stack 0
-    .limit locals 1
-
-    invokestatic dxc/junit/opcodes/freturn/jm/T_freturn_10/test()F
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_10.java b/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_10.java
deleted file mode 100644
index caa1933..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_10.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.freturn.jm;
-
-public class T_freturn_10 {
-    
-    private static float test()    {
-        return 1f;
-    }
-    
-    public float run() {
-        return test();
-    }
-    
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_11.j b/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_11.j
deleted file mode 100644
index 8143890..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_11.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_freturn_11.java
-.class public dxc/junit/opcodes/freturn/jm/T_freturn_11
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()F
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    freturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_11.java b/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_11.java
deleted file mode 100644
index 303e939..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.freturn.jm;
-
-public class T_freturn_11 {
-    
-    public float run() {
-        return 0f;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_2.j b/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_2.j
deleted file mode 100644
index 685f3f1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_2.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_freturn_2.java
-.class public dxc/junit/opcodes/freturn/jm/T_freturn_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 1
-    .limit locals 1
-
-    fconst_0
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_2.java b/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_2.java
deleted file mode 100644
index 6589925..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.freturn.jm;
-
-public class T_freturn_2 {
-
-    public float run() {
-        return 0f;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_3.j b/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_3.j
deleted file mode 100644
index b1109da..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_3.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_freturn_3.java
-.class public dxc/junit/opcodes/freturn/jm/T_freturn_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()D
-    .limit stack 1
-    .limit locals 1
-
-    fconst_0
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_3.java b/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_3.java
deleted file mode 100644
index 202091d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.freturn.jm;
-
-public class T_freturn_3 {
-
-    public float run() {
-        return 0f;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_4.j b/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_4.j
deleted file mode 100644
index 7da6dfb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_4.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_freturn_4.java
-.class public dxc/junit/opcodes/freturn/jm/T_freturn_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()F
-    .limit stack 1
-    .limit locals 1
-
-    ;fconst_0
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_4.java b/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_4.java
deleted file mode 100644
index e0503e7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.freturn.jm;
-
-public class T_freturn_4 {
-
-    public float run() {
-        return 0f;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_5.j b/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_5.j
deleted file mode 100644
index 21c85b8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_5.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_freturn_5.java
-.class public dxc/junit/opcodes/freturn/jm/T_freturn_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()F
-    .limit stack 2
-    .limit locals 1
-
-    dconst_0
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_5.java b/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_5.java
deleted file mode 100644
index e5018c9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.freturn.jm;
-
-public class T_freturn_5 {
-
-    public float run() {
-        return 0f;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_6.j b/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_6.j
deleted file mode 100644
index 7e7ba2c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_6.j
+++ /dev/null
@@ -1,90 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_freturn_6.java
-.class public dxc/junit/opcodes/freturn/jm/T_freturn_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()F
-    .limit locals 6
-    .limit stack 6
-    
-    fconst_1
-    fstore_1
-    fconst_2
-    fstore_2
-    ldc 3.0f
-    fstore 3
-    
-    ldc 4.0f
-    
-    invokestatic dxc/junit/opcodes/freturn/jm/T_freturn_6/test()F
-    
-    ldc 4444.0f
-    fcmpl
-    ifne Label1
-    
-    ldc 4.0f
-    fcmpl
-    ifne Label0
-    
-    fload_1
-    fconst_1
-    fcmpl
-    ifne Label0
-    
-    fload_2
-    fconst_2
-    fcmpl
-    ifne Label0
-    
-    fload_3
-    ldc 3.0f
-    fcmpl
-    ifne Label0    
-    
-    ldc 123456.0f
-    freturn
-
-Label1:
-    pop
-Label0:
-    fconst_0
-    freturn
-
-.end method
-
-.method private static test()F
-    .limit locals 4
-    .limit stack 4
-    
-    ldc 1111.0f
-    fstore_1
-    ldc 2222.0f
-    fstore_2
-    ldc 3333.0f
-    fstore_3
-    
-    ldc 5555.0f
-    
-    ldc 4444.0f
-    freturn
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_6.java b/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_6.java
deleted file mode 100644
index a6fad35..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_6.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.freturn.jm;
-
-public class T_freturn_6 {
-
-    public float run() {
-        return 123456f;
-    }
-    
-    private static float test() {
-        float a = 1111f;
-        float b = 2222f;
-        float c = 3333f;
-        return 4444f;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_7.j b/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_7.j
deleted file mode 100644
index afa8119..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_7.j
+++ /dev/null
@@ -1,166 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_freturn_7.java
-.class public dxc/junit/opcodes/freturn/jm/T_freturn_7
-.super java/lang/Object
-.implements java/lang/Runnable
-
-.field  value F
-.field  failed Z
-
-.method public <init>()V
-    .limit stack 3
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    aload_0
-    fconst_0
-    putfield dxc.junit.opcodes.freturn.jm.T_freturn_7.value F
-
-    aload_0
-    iconst_0
-    putfield dxc.junit.opcodes.freturn.jm.T_freturn_7.failed Z
-
-    return
-
-.end method
-
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 2
-   
-    iconst_0
-    istore_1
-
-Label4:
-    iload_1
-    sipush 1000
-    if_icmpge Label3
-
-    aload_0
-    invokespecial dxc/junit/opcodes/freturn/jm/T_freturn_7/test()F
-    pop
-
-    iinc 1 1
-
-    goto Label4
-
-
-Label3:
-    return
-
-.end method
-
-
-
-.method private synchronized test()F
-    .limit stack 3
-    .limit locals 2
-    
-.line 16
-    aload_0
-    dup
-    getfield dxc.junit.opcodes.freturn.jm.T_freturn_7.value F
-    dup
-    fstore_1
-
-    fconst_1
-    fadd
-    putfield dxc.junit.opcodes.freturn.jm.T_freturn_7.value F
-
-    fload_1
-    fconst_1
-    fadd
-    fstore_1
-
-    invokestatic java/lang/Thread/yield()V
-
-    fload_1
-    aload_0
-    getfield dxc.junit.opcodes.freturn.jm.T_freturn_7.value F
-    fcmpl
-    ifeq Label0
-
-    aload_0
-    iconst_1
-    putfield dxc.junit.opcodes.freturn.jm.T_freturn_7.failed Z
-
-Label0:
-    fload_1
-    freturn
-.end method
-
-
-
-.method public static execute()Z
-    .limit stack 3
-    .limit locals 4
-
-    new dxc/junit/opcodes/freturn/jm/T_freturn_7
-    dup
-    invokespecial dxc/junit/opcodes/freturn/jm/T_freturn_7/<init>()V
-    astore_0
-
-    new java/lang/Thread
-    dup
-    aload_0
-    invokespecial java/lang/Thread/<init>(Ljava/lang/Runnable;)V
-    astore_1
-
-    new java/lang/Thread
-    dup
-    aload_0
-    invokespecial java/lang/Thread/<init>(Ljava/lang/Runnable;)V
-    astore_2
-
-    aload_1
-    invokevirtual java/lang/Thread/start()V
-
-    aload_2
-    invokevirtual java/lang/Thread/start()V
-
-Label12:
-    ldc2_w 5000
-    invokestatic java/lang/Thread/sleep(J)V
-
-Label13:
-    goto Label0
-
-Label14:            ; exception handler
-    astore_3
-    goto Label3
-
-Label0:
-    aload_0
-    getfield dxc.junit.opcodes.freturn.jm.T_freturn_7.value F
-    ldc 2000.0f
-    fcmpl
-    ifne Label3
-
-    aload_0
-    getfield dxc.junit.opcodes.freturn.jm.T_freturn_7.failed Z
-    ifne Label3
-
-    iconst_1
-    ireturn
-
-Label3:
-    iconst_0
-    ireturn
-
-.catch java/lang/InterruptedException from Label12 to Label13 using Label14
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_7.java b/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_7.java
deleted file mode 100644
index af11cd1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_7.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.freturn.jm;
-
-public class T_freturn_7 implements Runnable {
-    public final static int CNT = 1000;
-    float value = 0;
-    boolean failed = false;
-    
-    public void run() {
-        for(int i = 0; i < CNT; i++) {
-            test();
-        }
-    }
-    
-    private synchronized float test()    {
-        value++;
-        float c = value;
-        Thread.yield();
-        if(c != value)
-            failed = true;
-        return c;
-    }
-    
-    public static boolean execute() {
-        T_freturn_7 test = new T_freturn_7();
-        Thread t1 = new Thread(test);
-        Thread t2 = new Thread(test);
-        
-        t1.start();
-        t2.start();
-        
-        try
-        {
-            Thread.sleep(5000);
-        }
-        catch(InterruptedException ie) {
-            return false;
-        }
-        
-        if(test.value != CNT * 2)
-            return false;
-        return !test.failed;
-    }
-    
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_8.j b/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_8.j
deleted file mode 100644
index e1e6f78..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_8.j
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_freturn_8.java
-.class public dxc/junit/opcodes/freturn/jm/T_freturn_8
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method private synchronized test()F
-    .limit stack 1
-    aload_0
-    monitorexit
-       fconst_0
-    freturn
-.end method
-
-
-
-.method public run()Z
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokespecial dxc/junit/opcodes/freturn/jm/T_freturn_8/test()F
-    pop
-
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_8.java b/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_8.java
deleted file mode 100644
index 230931d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_8.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.freturn.jm;
-
-public class T_freturn_8 {
-    
-    private synchronized float test() {
-        return 0f;
-    }
-    
-    public boolean run() {
-        test();
-        return true;
-    }
-    
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_9.j b/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_9.j
deleted file mode 100644
index e492ac2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_9.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_freturn_9.java
-.class public dxc/junit/opcodes/freturn/jm/T_freturn_9
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()F
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    monitorenter
-
-    fconst_1
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_9.java b/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_9.java
deleted file mode 100644
index d32b8a6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/freturn/jm/T_freturn_9.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.freturn.jm;
-
-public class T_freturn_9 {
-    
-    public float run() {
-        return 1f;
-    }
-    
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore/Test_fstore.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore/Test_fstore.java
deleted file mode 100644
index 1c074f0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore/Test_fstore.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.fstore.jm.T_fstore_1;
-import dxc.junit.opcodes.fstore.jm.T_fstore_1_w;
-import dxc.junit.opcodes.fstore.jm.T_fstore_5;
-import dxc.junit.opcodes.fstore.jm.T_fstore_5_w;
-
-public class Test_fstore extends DxTestCase {
-
-    /*
-     * NORMAL fstore VERSION
-     */
-
-    /**
-     * @title  fstore 0
-     */
-    public void testN1() {
-        assertEquals(2f, T_fstore_1.run());
-    }
-
-    /**
-     * @title  fstore 255
-     */
-    public void testN2() {
-        assertEquals(2f, T_fstore_5.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1)
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.fstore.jm.T_fstore_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.fstore.jm.T_fstore_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.fstore.jm.T_fstore_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /*
-     * WIDE fstore VERSION
-     */
-
-    /**
-     * @title  fstore_w 0
-     */
-    public void testN3() {
-        assertEquals(2f, T_fstore_1_w.run());
-    }
-
-    /**
-     * @title  fstore 257
-     */
-    public void testN4() {
-        assertEquals(2f, T_fstore_5_w.run());
-    }
-
-    /**
-     * @constraint 4.8.1.25
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.fstore.jm.T_fstore_2_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.fstore.jm.T_fstore_3_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.fstore.jm.T_fstore_4_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_1.j b/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_1.j
deleted file mode 100644
index ddbbeaa..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fstore_1.java
-.class public dxc/junit/opcodes/fstore/jm/T_fstore_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()F
-    .limit stack 2
-    .limit locals 1
-    
-    fconst_2
-    fstore 0
-    fconst_1
-    fload 0
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_1.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_1.java
deleted file mode 100644
index 546394b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore.jm;
-
-public class T_fstore_1 {
-
-    public static float run() {
-        return 2;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_1_w.j b/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_1_w.j
deleted file mode 100644
index f3a2c2b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_1_w.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fstore_1_w.java
-.class public dxc/junit/opcodes/fstore/jm/T_fstore_1_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()F
-    .limit stack 2
-    .limit locals 1
-    
-    fconst_2
-    fstore_w 0
-    fconst_1
-    fload 0
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_1_w.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_1_w.java
deleted file mode 100644
index cba5c82..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_1_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore.jm;
-
-public class T_fstore_1_w {
-
-    public static float run() {
-        return 2;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_2.j b/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_2.j
deleted file mode 100644
index 6eb7c7d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fstore_2.java
-.class public dxc/junit/opcodes/fstore/jm/T_fstore_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    fstore 0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_2.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_2.java
deleted file mode 100644
index c535d34..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore.jm;
-
-public class T_fstore_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_2_w.j b/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_2_w.j
deleted file mode 100644
index 20933b4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_2_w.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fstore_2_w.java
-.class public dxc/junit/opcodes/fstore/jm/T_fstore_2_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    fstore_w 0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_2_w.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_2_w.java
deleted file mode 100644
index 0664597..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_2_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore.jm;
-
-public class T_fstore_2_w {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_3.j b/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_3.j
deleted file mode 100644
index 75bc312..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_3.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fstore_3.java
-.class public dxc/junit/opcodes/fstore/jm/T_fstore_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    dconst_1
-    fstore 0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_3.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_3.java
deleted file mode 100644
index 9fe4d51..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore.jm;
-
-public class T_fstore_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_3_w.j b/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_3_w.j
deleted file mode 100644
index a401cf0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_3_w.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fstore_3_w.java
-.class public dxc/junit/opcodes/fstore/jm/T_fstore_3_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    dconst_1
-    fstore_w 0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_3_w.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_3_w.java
deleted file mode 100644
index 7b32dfe..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_3_w.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore.jm;
-
-public class T_fstore_3_w {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_4.j b/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_4.j
deleted file mode 100644
index 7a7ad92..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_4.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fstore_4.java
-.class public dxc/junit/opcodes/fstore/jm/T_fstore_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    fstore 0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_4.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_4.java
deleted file mode 100644
index 97b94bc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore.jm;
-
-public class T_fstore_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_4_w.j b/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_4_w.j
deleted file mode 100644
index afbd8e4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_4_w.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fstore_4_w.java
-.class public dxc/junit/opcodes/fstore/jm/T_fstore_4_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    fstore_w 0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_4_w.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_4_w.java
deleted file mode 100644
index 0e658e0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_4_w.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore.jm;
-
-public class T_fstore_4_w {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_5.j b/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_5.j
deleted file mode 100644
index 818c41f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_5.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fstore_5.java
-.class public dxc/junit/opcodes/fstore/jm/T_fstore_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()F
-    .limit stack 2
-    .limit locals 300
-    
-    fconst_2
-    fstore 255
-    fconst_1
-    fload 255
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_5.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_5.java
deleted file mode 100644
index 9b76887..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore.jm;
-
-public class T_fstore_5 {
-
-    public static float run() {
-        return 2;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_5_w.j b/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_5_w.j
deleted file mode 100644
index ccc6f4c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_5_w.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fstore_5_w.java
-.class public dxc/junit/opcodes/fstore/jm/T_fstore_5_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()F
-    .limit stack 2
-    .limit locals 300
-    
-    fconst_2
-    fstore_w 257
-    fconst_1
-    fload 257
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_5_w.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_5_w.java
deleted file mode 100644
index 119ad9c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore/jm/T_fstore_5_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore.jm;
-
-public class T_fstore_5_w {
-
-    public static float run() {
-        return 2;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/Test_fstore_0.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/Test_fstore_0.java
deleted file mode 100644
index e512d4e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/Test_fstore_0.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore_0;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.fstore_0.jm.T_fstore_0_1;
-import dxc.junit.opcodes.fstore_0.jm.T_fstore_0_5;
-
-public class Test_fstore_0 extends DxTestCase {
-
-    /**
-     * @title value is stored
-     */
-    public void testN1() {
-        assertEquals(2f, T_fstore_0_1.run());
-    }
-
-    /**
-     * @title equality of fstore_<n> and fstore <n>
-     */
-    public void testN2() {
-        assertTrue(T_fstore_0_5.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.fstore_0.jm.T_fstore_0_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.fstore_0.jm.T_fstore_0_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.fstore_0.jm.T_fstore_0_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/jm/T_fstore_0_1.j b/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/jm/T_fstore_0_1.j
deleted file mode 100644
index 288c55e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/jm/T_fstore_0_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fstore_0_1.java
-.class public dxc/junit/opcodes/fstore_0/jm/T_fstore_0_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()F
-    .limit stack 2
-    .limit locals 1
-    
-    fconst_2
-    fstore_0
-    fconst_1
-    fload_0
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/jm/T_fstore_0_1.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/jm/T_fstore_0_1.java
deleted file mode 100644
index a098e2c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/jm/T_fstore_0_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore_0.jm;
-
-public class T_fstore_0_1 {
-
-    public static float run() {
-        return 2f;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/jm/T_fstore_0_2.j b/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/jm/T_fstore_0_2.j
deleted file mode 100644
index 85b0dd8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/jm/T_fstore_0_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fstore_0_2.java
-.class public dxc/junit/opcodes/fstore_0/jm/T_fstore_0_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    fstore_0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/jm/T_fstore_0_2.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/jm/T_fstore_0_2.java
deleted file mode 100644
index 60d6932..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/jm/T_fstore_0_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore_0.jm;
-
-public class T_fstore_0_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/jm/T_fstore_0_3.j b/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/jm/T_fstore_0_3.j
deleted file mode 100644
index 7f0a48a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/jm/T_fstore_0_3.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fstore_0_3.java
-.class public dxc/junit/opcodes/fstore_0/jm/T_fstore_0_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    dconst_1
-    fstore_0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/jm/T_fstore_0_3.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/jm/T_fstore_0_3.java
deleted file mode 100644
index 28ae501..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/jm/T_fstore_0_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore_0.jm;
-
-public class T_fstore_0_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/jm/T_fstore_0_4.j b/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/jm/T_fstore_0_4.j
deleted file mode 100644
index daeb302..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/jm/T_fstore_0_4.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fstore_0_4.java
-.class public dxc/junit/opcodes/fstore_0/jm/T_fstore_0_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    fstore_0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/jm/T_fstore_0_4.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/jm/T_fstore_0_4.java
deleted file mode 100644
index 9ddb0f5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/jm/T_fstore_0_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore_0.jm;
-
-public class T_fstore_0_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/jm/T_fstore_0_5.j b/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/jm/T_fstore_0_5.j
deleted file mode 100644
index bc5488f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/jm/T_fstore_0_5.j
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fstore_0_5.java
-.class public dxc/junit/opcodes/fstore_0/jm/T_fstore_0_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()Z
-    .limit stack 2
-    .limit locals 2
-
-    fconst_2
-    fstore_0
-    fload_0
-
-    fconst_2
-    fstore 0
-    fload_0
-    
-    fcmpl
-    ifne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/jm/T_fstore_0_5.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/jm/T_fstore_0_5.java
deleted file mode 100644
index caf98c1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_0/jm/T_fstore_0_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore_0.jm;
-
-public class T_fstore_0_5 {
-
-    public static boolean run() {
-        float i = 2;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/Test_fstore_1.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/Test_fstore_1.java
deleted file mode 100644
index 1cd1865..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/Test_fstore_1.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore_1;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.fstore_1.jm.T_fstore_1_1;
-import dxc.junit.opcodes.fstore_1.jm.T_fstore_1_5;
-
-public class Test_fstore_1 extends DxTestCase {
-
-    /**
-     * @title value is stored
-     */
-    public void testN1() {
-        assertEquals(2f, T_fstore_1_1.run());
-    }
-
-    /**
-     * @title equality of fstore_<n> and fstore <n>
-     */
-    public void testN2() {
-        assertTrue(T_fstore_1_5.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.fstore_1.jm.T_fstore_1_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.fstore_1.jm.T_fstore_1_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.fstore_1.jm.T_fstore_1_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/jm/T_fstore_1_1.j b/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/jm/T_fstore_1_1.j
deleted file mode 100644
index 4f5183e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/jm/T_fstore_1_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fstore_1_1.java
-.class public dxc/junit/opcodes/fstore_1/jm/T_fstore_1_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()F
-    .limit stack 2
-    .limit locals 2
-    
-    fconst_2
-    fstore_1
-    fconst_1
-    fload_1
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/jm/T_fstore_1_1.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/jm/T_fstore_1_1.java
deleted file mode 100644
index 1f479a2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/jm/T_fstore_1_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore_1.jm;
-
-public class T_fstore_1_1 {
-
-    public static float run() {
-        return 2f;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/jm/T_fstore_1_2.j b/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/jm/T_fstore_1_2.j
deleted file mode 100644
index 438637a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/jm/T_fstore_1_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fstore_1_2.java
-.class public dxc/junit/opcodes/fstore_1/jm/T_fstore_1_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 1
-
-    fstore_1
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/jm/T_fstore_1_2.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/jm/T_fstore_1_2.java
deleted file mode 100644
index 612dead..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/jm/T_fstore_1_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore_1.jm;
-
-public class T_fstore_1_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/jm/T_fstore_1_3.j b/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/jm/T_fstore_1_3.j
deleted file mode 100644
index 17895ad..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/jm/T_fstore_1_3.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fstore_1_3.java
-.class public dxc/junit/opcodes/fstore_1/jm/T_fstore_1_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    dconst_1
-    fstore_1
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/jm/T_fstore_1_3.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/jm/T_fstore_1_3.java
deleted file mode 100644
index f202684..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/jm/T_fstore_1_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore_1.jm;
-
-public class T_fstore_1_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/jm/T_fstore_1_4.j b/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/jm/T_fstore_1_4.j
deleted file mode 100644
index 54b2fce..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/jm/T_fstore_1_4.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fstore_1_4.java
-.class public dxc/junit/opcodes/fstore_1/jm/T_fstore_1_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    fstore_1
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/jm/T_fstore_1_4.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/jm/T_fstore_1_4.java
deleted file mode 100644
index 2aac2d3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/jm/T_fstore_1_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore_1.jm;
-
-public class T_fstore_1_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/jm/T_fstore_1_5.j b/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/jm/T_fstore_1_5.j
deleted file mode 100644
index 8f3a4cc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/jm/T_fstore_1_5.j
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fstore_1_5.java
-.class public dxc/junit/opcodes/fstore_1/jm/T_fstore_1_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()Z
-    .limit stack 2
-    .limit locals 2
-
-    fconst_2
-    fstore_1
-    fload_1
-
-    fconst_2
-    fstore 1
-    fload_1
-    
-    fcmpl
-    ifne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/jm/T_fstore_1_5.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/jm/T_fstore_1_5.java
deleted file mode 100644
index f7aacea..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_1/jm/T_fstore_1_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore_1.jm;
-
-public class T_fstore_1_5 {
-
-    public static boolean run() {
-        float i = 2;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/Test_fstore_2.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/Test_fstore_2.java
deleted file mode 100644
index 02956aa..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/Test_fstore_2.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore_2;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.fstore_2.jm.T_fstore_2_1;
-import dxc.junit.opcodes.fstore_2.jm.T_fstore_2_5;
-
-public class Test_fstore_2 extends DxTestCase {
-
-    /**
-     * @title value is stored
-     */
-    public void testN1() {
-        assertEquals(2f, T_fstore_2_1.run());
-    }
-
-    /**
-     * @title  equality of fstore_<n> and fstore <n>
-     */
-    public void testN2() {
-        assertTrue(T_fstore_2_5.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.fstore_2.jm.T_fstore_2_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.fstore_2.jm.T_fstore_2_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.fstore_2.jm.T_fstore_2_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/jm/T_fstore_2_1.j b/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/jm/T_fstore_2_1.j
deleted file mode 100644
index 544718b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/jm/T_fstore_2_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fstore_2_1.java
-.class public dxc/junit/opcodes/fstore_2/jm/T_fstore_2_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()F
-    .limit stack 2
-    .limit locals 3
-    
-    fconst_2
-    fstore_2
-    fconst_1
-    fload_2
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/jm/T_fstore_2_1.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/jm/T_fstore_2_1.java
deleted file mode 100644
index af93f51..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/jm/T_fstore_2_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore_2.jm;
-
-public class T_fstore_2_1 {
-
-    public static float run() {
-        return 2f;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/jm/T_fstore_2_2.j b/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/jm/T_fstore_2_2.j
deleted file mode 100644
index 9ef2c53..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/jm/T_fstore_2_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fstore_2_2.java
-.class public dxc/junit/opcodes/fstore_2/jm/T_fstore_2_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 2
-
-    fstore_2
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/jm/T_fstore_2_2.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/jm/T_fstore_2_2.java
deleted file mode 100644
index ad6e139..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/jm/T_fstore_2_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore_2.jm;
-
-public class T_fstore_2_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/jm/T_fstore_2_3.j b/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/jm/T_fstore_2_3.j
deleted file mode 100644
index 931c9cd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/jm/T_fstore_2_3.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fstore_2_3.java
-.class public dxc/junit/opcodes/fstore_2/jm/T_fstore_2_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    dconst_1
-    fstore_2
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/jm/T_fstore_2_3.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/jm/T_fstore_2_3.java
deleted file mode 100644
index fef360e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/jm/T_fstore_2_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore_2.jm;
-
-public class T_fstore_2_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/jm/T_fstore_2_4.j b/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/jm/T_fstore_2_4.j
deleted file mode 100644
index 1a28180..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/jm/T_fstore_2_4.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fstore_2_4.java
-.class public dxc/junit/opcodes/fstore_2/jm/T_fstore_2_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    fstore_2
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/jm/T_fstore_2_4.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/jm/T_fstore_2_4.java
deleted file mode 100644
index b164180..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/jm/T_fstore_2_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore_2.jm;
-
-public class T_fstore_2_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/jm/T_fstore_2_5.j b/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/jm/T_fstore_2_5.j
deleted file mode 100644
index 51e53ec..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/jm/T_fstore_2_5.j
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fstore_2_5.java
-.class public dxc/junit/opcodes/fstore_2/jm/T_fstore_2_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()Z
-    .limit stack 2
-    .limit locals 3
-
-    fconst_2
-    fstore_2
-    fload_2
-
-    fconst_2
-    fstore 2
-    fload_2
-    
-    fcmpl
-    ifne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/jm/T_fstore_2_5.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/jm/T_fstore_2_5.java
deleted file mode 100644
index 28956f2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_2/jm/T_fstore_2_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore_2.jm;
-
-public class T_fstore_2_5 {
-
-    public static boolean run() {
-        float i = 2;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/Test_fstore_3.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/Test_fstore_3.java
deleted file mode 100644
index ef6d0a5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/Test_fstore_3.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore_3;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.fstore_3.jm.T_fstore_3_1;
-import dxc.junit.opcodes.fstore_3.jm.T_fstore_3_5;
-
-public class Test_fstore_3 extends DxTestCase {
-
-    /**
-     * @title value is stored
-     */
-    public void testN1() {
-        assertEquals(2f, T_fstore_3_1.run());
-    }
-
-    /**
-     * @title equality of fstore_<n> and fstore <n>
-     */
-    public void testN2() {
-        assertTrue(T_fstore_3_5.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.fstore_3.jm.T_fstore_3_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.fstore_3.jm.T_fstore_3_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.fstore_3.jm.T_fstore_3_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/jm/T_fstore_3_1.j b/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/jm/T_fstore_3_1.j
deleted file mode 100644
index 4aba4f0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/jm/T_fstore_3_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fstore_3_1.java
-.class public dxc/junit/opcodes/fstore_3/jm/T_fstore_3_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()F
-    .limit stack 2
-    .limit locals 4
-    
-    fconst_2
-    fstore_3
-    fconst_1
-    fload_3
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/jm/T_fstore_3_1.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/jm/T_fstore_3_1.java
deleted file mode 100644
index 5d763a7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/jm/T_fstore_3_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore_3.jm;
-
-public class T_fstore_3_1 {
-
-    public static float run() {
-        return 2f;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/jm/T_fstore_3_2.j b/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/jm/T_fstore_3_2.j
deleted file mode 100644
index 554ba64..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/jm/T_fstore_3_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fstore_3_2.java
-.class public dxc/junit/opcodes/fstore_3/jm/T_fstore_3_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 3
-
-    fstore_3
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/jm/T_fstore_3_2.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/jm/T_fstore_3_2.java
deleted file mode 100644
index 54afaa2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/jm/T_fstore_3_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore_3.jm;
-
-public class T_fstore_3_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/jm/T_fstore_3_3.j b/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/jm/T_fstore_3_3.j
deleted file mode 100644
index 3b3c30e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/jm/T_fstore_3_3.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fstore_3_3.java
-.class public dxc/junit/opcodes/fstore_3/jm/T_fstore_3_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 5
-
-    dconst_1
-    fstore_3
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/jm/T_fstore_3_3.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/jm/T_fstore_3_3.java
deleted file mode 100644
index 17de90e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/jm/T_fstore_3_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore_3.jm;
-
-public class T_fstore_3_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/jm/T_fstore_3_4.j b/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/jm/T_fstore_3_4.j
deleted file mode 100644
index 05eb66e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/jm/T_fstore_3_4.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fstore_3_4.java
-.class public dxc/junit/opcodes/fstore_3/jm/T_fstore_3_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 5
-
-    lconst_1
-    fstore_3
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/jm/T_fstore_3_4.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/jm/T_fstore_3_4.java
deleted file mode 100644
index 145fc22..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/jm/T_fstore_3_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore_3.jm;
-
-public class T_fstore_3_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/jm/T_fstore_3_5.j b/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/jm/T_fstore_3_5.j
deleted file mode 100644
index 2904edd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/jm/T_fstore_3_5.j
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fstore_3_5.java
-.class public dxc/junit/opcodes/fstore_3/jm/T_fstore_3_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()Z
-    .limit stack 2
-    .limit locals 4
-
-    fconst_2
-    fstore_3
-    fload_3
-
-    fconst_2
-    fstore 3
-    fload_3
-    
-    fcmpl
-    ifne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/jm/T_fstore_3_5.java b/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/jm/T_fstore_3_5.java
deleted file mode 100644
index 1bf3a26..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fstore_3/jm/T_fstore_3_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fstore_3.jm;
-
-public class T_fstore_3_5 {
-
-    public static boolean run() {
-        float i = 2;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fsub/Test_fsub.java b/tools/dx-tests/src/dxc/junit/opcodes/fsub/Test_fsub.java
deleted file mode 100644
index 897cd58..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fsub/Test_fsub.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fsub;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.fsub.jm.T_fsub_1;
-
-public class Test_fsub extends DxTestCase {
-
-    /**
-     * @title  Arguments = 2.7f, 3.14f
-     */
-    public void testN1() {
-        T_fsub_1 t = new T_fsub_1();
-        assertEquals(-0.44000006f, t.run(2.7f, 3.14f));
-    }
-
-    /**
-     * @title  Arguments = 0, -3.14f
-     */
-    public void testN2() {
-        T_fsub_1 t = new T_fsub_1();
-        assertEquals(3.14f, t.run(0, -3.14f));
-    }
-
-    /**
-     * @title Arguments = -3.14f, -2.7f
-     */
-    public void testN3() {
-        T_fsub_1 t = new T_fsub_1();
-        assertEquals(-0.44000006f, t.run(-3.14f, -2.7f));
-    }
-
-    /**
-     * @title  Arguments = Float.MAX_VALUE, Float.NaN
-     */
-    public void testB1() {
-        T_fsub_1 t = new T_fsub_1();
-        assertEquals(Float.NaN, t.run(Float.MAX_VALUE, Float.NaN));
-    }
-
-    /**
-     * @title  Arguments = Float.POSITIVE_INFINITY,
-     * Float.NEGATIVE_INFINITY
-     */
-    public void testB2() {
-        T_fsub_1 t = new T_fsub_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_fsub_1 t = new T_fsub_1();
-        assertEquals(Float.NaN, t.run(Float.POSITIVE_INFINITY,
-                Float.POSITIVE_INFINITY));
-    }
-
-    /**
-     * @title  Arguments = Float.POSITIVE_INFINITY, -2.7f
-     */
-    public void testB4() {
-        T_fsub_1 t = new T_fsub_1();
-        assertEquals(Float.POSITIVE_INFINITY, t.run(Float.POSITIVE_INFINITY,
-                -2.7f));
-    }
-
-    /**
-     * @title  Arguments = +0, -0f
-     */
-    public void testB5() {
-        T_fsub_1 t = new T_fsub_1();
-        assertEquals(+0f, t.run(+0f, -0f));
-    }
-
-    /**
-     * @title  Arguments = -0f, -0f
-     */
-    public void testB6() {
-        T_fsub_1 t = new T_fsub_1();
-        assertEquals(0f, t.run(-0f, -0f));
-    }
-
-    /**
-     * @title  Arguments = +0f, +0f
-     */
-    public void testB7() {
-        T_fsub_1 t = new T_fsub_1();
-        assertEquals(+0f, t.run(+0f, +0f));
-    }
-
-    /**
-     * @title  Arguments = 2.7f, 2.7f
-     */
-    public void testB8() {
-        T_fsub_1 t = new T_fsub_1();
-        assertEquals(0f, t.run(2.7f, 2.7f));
-    }
-
-    /**
-     * @title  Arguments = Float.MAX_VALUE, Float.MAX_VALUE
-     */
-    public void testB9() {
-        T_fsub_1 t = new T_fsub_1();
-        assertEquals(0f, t.run(Float.MAX_VALUE, Float.MAX_VALUE));
-    }
-
-    /**
-     * @title  Arguments = Float.MIN_VALUE, -1.4E-45f
-     */
-    public void testB10() {
-        T_fsub_1 t = new T_fsub_1();
-        assertEquals(0f, t.run(Float.MIN_VALUE, 1.4E-45f));
-    }
-
-    /**
-     * @title  Arguments = Float.MAX_VALUE, -Float.MAX_VALUE
-     */
-    public void testB11() {
-        T_fsub_1 t = new T_fsub_1();
-        assertEquals(Float.POSITIVE_INFINITY, t.run(Float.MAX_VALUE,
-                -3.402823E+38F));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.fsub.jm.T_fsub_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - float, double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.fsub.jm.T_fsub_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long, float
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.fsub.jm.T_fsub_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference, float
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.fsub.jm.T_fsub_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fsub/jm/T_fsub_1.j b/tools/dx-tests/src/dxc/junit/opcodes/fsub/jm/T_fsub_1.j
deleted file mode 100644
index 649dee4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fsub/jm/T_fsub_1.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fsub_1.java
-.class public dxc/junit/opcodes/fsub/jm/T_fsub_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(FF)F
-    .limit stack 2
-    .limit locals 3
-    fload_1
-    fload_2
-    fsub
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fsub/jm/T_fsub_1.java b/tools/dx-tests/src/dxc/junit/opcodes/fsub/jm/T_fsub_1.java
deleted file mode 100644
index 2038dfa..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fsub/jm/T_fsub_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fsub.jm;
-
-public class T_fsub_1 {
-
-    public float run(float a, float b) {
-        return a-b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fsub/jm/T_fsub_2.j b/tools/dx-tests/src/dxc/junit/opcodes/fsub/jm/T_fsub_2.j
deleted file mode 100644
index e4afbf1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fsub/jm/T_fsub_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fsub_2.java
-.class public dxc/junit/opcodes/fsub/jm/T_fsub_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(FF)F
-    .limit stack 2
-    .limit locals 3
-    fload_1
-    ; fload_2    
-    fsub
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fsub/jm/T_fsub_2.java b/tools/dx-tests/src/dxc/junit/opcodes/fsub/jm/T_fsub_2.java
deleted file mode 100644
index 7971658..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fsub/jm/T_fsub_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fsub.jm;
-
-public class T_fsub_2 {
-
-    public float run(float a, float b) {
-        return a-b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fsub/jm/T_fsub_3.j b/tools/dx-tests/src/dxc/junit/opcodes/fsub/jm/T_fsub_3.j
deleted file mode 100644
index 02633be..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fsub/jm/T_fsub_3.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fsub_3.java
-.class public dxc/junit/opcodes/fsub/jm/T_fsub_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(FD)F
-    .limit stack 3
-    .limit locals 5
-    fload_1
-    dload_2    
-    fsub
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fsub/jm/T_fsub_3.java b/tools/dx-tests/src/dxc/junit/opcodes/fsub/jm/T_fsub_3.java
deleted file mode 100644
index 9cdbf97..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fsub/jm/T_fsub_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fsub.jm;
-
-public class T_fsub_3 {
-
-    public float run(float a, double b) {
-        return a-(float)b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fsub/jm/T_fsub_4.j b/tools/dx-tests/src/dxc/junit/opcodes/fsub/jm/T_fsub_4.j
deleted file mode 100644
index 47c7ba9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fsub/jm/T_fsub_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fsub_4.java
-.class public dxc/junit/opcodes/fsub/jm/T_fsub_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(JF)F
-    .limit stack 3
-    .limit locals 4
-
-    lload_1
-;    l2f
-    fload_3
-    fsub
-
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fsub/jm/T_fsub_4.java b/tools/dx-tests/src/dxc/junit/opcodes/fsub/jm/T_fsub_4.java
deleted file mode 100644
index 86de9bc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fsub/jm/T_fsub_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fsub.jm;
-
-public class T_fsub_4 {
-
-    public float run(long a, float b) {
-        return (float)a-b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fsub/jm/T_fsub_5.j b/tools/dx-tests/src/dxc/junit/opcodes/fsub/jm/T_fsub_5.j
deleted file mode 100644
index 26bb805..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fsub/jm/T_fsub_5.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_fsub_5.java
-.class public dxc/junit/opcodes/fsub/jm/T_fsub_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(FF)F
-    .limit stack 2
-    .limit locals 3
-
-    aload_0
-    fload_2
-    fsub
-    freturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/fsub/jm/T_fsub_5.java b/tools/dx-tests/src/dxc/junit/opcodes/fsub/jm/T_fsub_5.java
deleted file mode 100644
index 7687dc3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/fsub/jm/T_fsub_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.fsub.jm;
-
-public class T_fsub_5 {
-    
-    public float run(float a, float b) {
-        return a-b;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/Test_getfield.java b/tools/dx-tests/src/dxc/junit/opcodes/getfield/Test_getfield.java
deleted file mode 100644
index 39f925f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/Test_getfield.java
+++ /dev/null
@@ -1,285 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getfield;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.getfield.jm.T_getfield_1;
-import dxc.junit.opcodes.getfield.jm.T_getfield_10;
-import dxc.junit.opcodes.getfield.jm.T_getfield_11;
-import dxc.junit.opcodes.getfield.jm.T_getfield_12;
-import dxc.junit.opcodes.getfield.jm.T_getfield_14;
-import dxc.junit.opcodes.getfield.jm.T_getfield_16;
-import dxc.junit.opcodes.getfield.jm.T_getfield_17;
-import dxc.junit.opcodes.getfield.jm.T_getfield_2;
-import dxc.junit.opcodes.getfield.jm.T_getfield_5;
-import dxc.junit.opcodes.getfield.jm.T_getfield_6;
-import dxc.junit.opcodes.getfield.jm.T_getfield_7;
-import dxc.junit.opcodes.getfield.jm.T_getfield_8;
-import dxc.junit.opcodes.getfield.jm.T_getfield_9;
-import dxc.junit.opcodes.getfield.jm.TestStubs;
-
-public class Test_getfield extends DxTestCase {
-    private int TestStubField = 123;
-    protected int TestStubFieldP = 0;
-
-    private int privateInt = 456;
-    
-    /**
-     * @title  type - int
-     */
-    public void testN1() {
-        T_getfield_1 t = new T_getfield_1();
-        assertEquals(5, t.run());
-    }
-
-    /**
-     * @title  type - double
-     */
-    public void testN2() {
-        T_getfield_2 t = new T_getfield_2();
-        assertEquals(123d, t.run());
-    }
-
-    /**
-     * @title  access protected field from subclass
-     */
-    public void testN3() {
-     // @uses dxc.junit.opcodes.getfield.jm.T_getfield_1
-        T_getfield_11 t = new T_getfield_11();
-        assertEquals(10, t.run());
-    }
-
-    /**
-     * @title  assignment compatible references
-     */
-    public void testN4() {
-        // @uses dxc.junit.opcodes.getfield.jm.TChild        
-        // @uses dxc.junit.opcodes.getfield.jm.TSuper        
-        T_getfield_14 t = new T_getfield_14();
-        assertEquals(0, t.run().compareTo("abc"));
-    }
-
-    /**
-     * @title  attempt to access static field
-     */
-    public void testE1() {
-        // @uses dxc.junit.opcodes.getstatic.jm.T_getstatic_1
-        try {
-            T_getfield_5 t = new T_getfield_5();
-            t.run();
-            fail("expected IncompatibleClassChangeError");
-        } catch (IncompatibleClassChangeError e) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        } 
-    }
-
-    /**
-     * @title  attempt to access of non-accessible private field
-     */
-    public void testE2() {
-        try {
-            T_getfield_6 t = new T_getfield_6();
-            int res = t.run();
-            System.out.println("res:"+res);
-            fail("expected IllegalAccessError");
-        } catch (IllegalAccessError iae) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title expected NoClassDefFoundError
-     */
-    public void testE3() {
-        try {
-            // need to include the constructor call into the try-catch block,
-            // since class resolution can take place at any time.
-            // (not only when t.run() is called
-            T_getfield_7 t = new T_getfield_7();
-            t.run();
-            fail("expected NoClassDefFoundError");
-        } catch (NoClassDefFoundError e) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title expected NoSuchFieldError
-     */
-    public void testE4() {
-        try {
-            T_getfield_8 t = new T_getfield_8();
-            t.run();
-            fail("expected NoSuchFieldError");
-        } catch (NoSuchFieldError e) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title  attempt to get int from float field
-     */
-    public void testE5() {
-        try {
-            T_getfield_10 t = new T_getfield_10();
-            t.run();
-            fail("expected NoSuchFieldError");
-        } catch (NoSuchFieldError e) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title expected NullPointerException
-     */
-    public void testE6() {
-        T_getfield_9 t = new T_getfield_9();
-        try {
-            t.run();
-            fail("expected NullPointerException");
-        } catch (NullPointerException e) {
-            // expected
-        }
-    }
-
-    //FIXME: "fail" commented out temporarily - check
-    /**
-     * @title  attempt to read superclass' private field from subclass
-     * in same package
-     * 
-     * FIXME: this seems to be a bug in JDK 1.5?
-     */
-    public void testE7() {
-        // @uses dxc.junit.opcodes.getfield.jm.T_getfield_1
-        try {
-            T_getfield_12 t = new T_getfield_12();
-            //fail("expected IllegalAccessError");
-        } catch (IllegalAccessError e) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title  attempt to read private field of a class which was passed
-     * as argument
-     */
-    public void testE9() {
-        // @uses dxc.junit.opcodes.getfield.jm.TestStubs
-        try {
-            T_getfield_17 t = new T_getfield_17();
-            t.run(new dxc.junit.opcodes.getfield.jm.TestStubs());
-            fail("expected IllegalAccessError");
-        } catch (IllegalAccessError e) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    
-
-    /**
-     * @title  attempt to access of non-accessible protected field
-     */
-    public void testE8() {
-        try {
-            T_getfield_16 t = new T_getfield_16();
-            t.run();
-            fail("expected IllegalAccessError");
-        } catch (IllegalAccessError iae) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.12
-     * @title constant pool index
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.getfield.jm.T_getfield_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.getfield.jm.T_getfield_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.12
-     * @title constant pool type
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.getfield.jm.T_getfield_13");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.16
-     * @title assignment incompatible references
-     */
-    public void testVFE4() {
-        // @uses dxc.junit.opcodes.getfield.jm.TChild        
-        // @uses dxc.junit.opcodes.getfield.jm.TSuper        
-        try {
-            Class.forName("dxc.junit.opcodes.getfield.jm.T_getfield_15");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_1.j b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_1.j
deleted file mode 100644
index a669ff4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_1.j
+++ /dev/null
@@ -1,52 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_getfield_1.java
-.class public dxc/junit/opcodes/getfield/jm/T_getfield_1
-.super java/lang/Object
-
-.field public i1 I
-.field protected p1 I
-.field private pvt1 I
-
-.method public <init>()V
-    .limit stack 2
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    aload_0
-    iconst_5
-    putfield dxc.junit.opcodes.getfield.jm.T_getfield_1.i1 I
-
-    aload_0
-    bipush 10
-    putfield dxc.junit.opcodes.getfield.jm.T_getfield_1.p1 I
-
-    aload_0
-    bipush 20
-    putfield dxc.junit.opcodes.getfield.jm.T_getfield_1.pvt1 I
-
-    return
-
-.end method
-
-
-
-.method public run()I
-    aload_0
-    getfield dxc.junit.opcodes.getfield.jm.T_getfield_1.i1 I
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_1.java b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_1.java
deleted file mode 100644
index 2d0b750..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_1.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getfield.jm;
-
-public class T_getfield_1 {
-    public int i1 = 5;
-    protected int p1 = 10;
-    private int pvt1 = 20;
-    
-    public int run(){
-        return -99;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_10.j b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_10.j
deleted file mode 100644
index 0790ed3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_10.j
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_getfield_10.java
-.class public dxc/junit/opcodes/getfield/jm/T_getfield_10
-.super java/lang/Object
-
-.field public i1 F
-
-
-.method public <init>()V
-    .limit stack 2
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    aload_0    
-    fconst_1
-    putfield dxc.junit.opcodes.getfield.jm.T_getfield_10.i1 F
-    
-
-    return
-.end method
-
-
-
-.method public run()I
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    getfield dxc.junit.opcodes.getfield.jm.T_getfield_10.i1N I
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_10.java b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_10.java
deleted file mode 100644
index ba7aa3d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_10.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getfield.jm;
-
-public class T_getfield_10 {
-    public int i1 = 5;
-    public int run(){
-        return i1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_11.j b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_11.j
deleted file mode 100644
index 6f16f55..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_11.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_getfield_11.java
-.class public dxc/junit/opcodes/getfield/jm/T_getfield_11
-.super dxc/junit/opcodes/getfield/jm/T_getfield_1
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/getfield/jm/T_getfield_1/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    getfield dxc.junit.opcodes.getfield.jm.T_getfield_1.p1 I
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_11.java b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_11.java
deleted file mode 100644
index 1fefaa2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getfield.jm;
-
-public class T_getfield_11 extends T_getfield_1 {
-
-    public int run(){
-        return p1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_12.j b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_12.j
deleted file mode 100644
index 5c535f4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_12.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_getfield_12.java
-.class public dxc/junit/opcodes/getfield/jm/T_getfield_12
-.super dxc/junit/opcodes/getfield/jm/T_getfield_1
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/getfield/jm/T_getfield_1/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 2
-
-    aload_0    
-    getfield dxc.junit.opcodes.getfield.jm.T_getfield_1.pvt1 I
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_12.java b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_12.java
deleted file mode 100644
index 6d92fce..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_12.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getfield.jm;
-
-public class T_getfield_12 extends T_getfield_1 {
-
-    public int run(){
-        return -99;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_13.cfh b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_13.cfh
deleted file mode 100644
index 6ab7906..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_13.cfh
+++ /dev/null
@@ -1,234 +0,0 @@
-//@class:dxc/junit/opcodes/getfield/jm/T_getfield_13
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0013
-// .  .  
-   00 13 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 19, h: 0001: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 29, len 5, h: 0002: float{0x4048f5c3 / 3.14}
-    // .  @  H  .  .  
-       04 40 48 f5 c3 
-    // parsed:, offset 34, len 9, h: 0003: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 43, len 3, h: 0004: type{java.lang.Object}
-    // .  .  .  
-       07 00 01 
-    // parsed:, offset 46, len 5, h: 0005: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 03 00 06 
-    // parsed:, offset 51, len 6, h: 0006: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 57, len 7, h: 0007: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 64, len 4, h: 0008: utf8{"I"}
-    // .  .  .  I  
-       01 00 01 49 
-    // parsed:, offset 68, len 13, h: 0009: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 81, len 3, h: 000a: type{dxc.junit.opcodes.getfield.jm.T_getfield_13}
-    // .  .  .  
-       07 00 11 
-    // parsed:, offset 84, len 5, h: 000b: nat{i1:I}
-    // .  .  .  .  .  
-       0c 00 0f 00 08 
-    // parsed:, offset 89, len 6, h: 000c: utf8{"()I"}
-    // .  .  .  (  )  I  
-       01 00 03 28 29 49 
-    // parsed:, offset 95, len 6, h: 000d: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 101, len 5, h: 000e: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 04 00 05 
-    // parsed:, offset 106, len 5, h: 000f: utf8{"i1"}
-    // .  .  .  i  1  
-       01 00 02 69 31 
-    // parsed:, offset 111, len 21, h: 0010: utf8{"T_getfield_13.java"}
-    // .  .  .  T  _  g  e  t  f  i  e  l  d  _  1  3  .  j  a  v  a  
-       01 00 12 54 5f 67 65 74 66 69 65 6c 64 5f 31 33 2e 6a 61 76 61 
-    // parsed:, offset 132, len 46, h: 0011: utf8{"dxc/junit/opcodes/getfield/jm/T_getfield_13"}
-    // .  .  +  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  g  e  t  f  i  e  l  d  /  j  m  /  T  _  g  e  t  f  i  e  l  d  _  1  3  
-       01 00 2b 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 67 65 74 66 69 65 6c 64 2f 6a 6d 2f 54 5f 67 65 74 66 69 65 6c 64 5f 31 33 
-    // parsed:, offset 178, len 5, h: 0012: field{dxc.junit.opcodes.getfield.jm.T_getfield_13.i1:I}
-    // .  .  .  .  .  
-       09 00 0a 00 0b 
-// parsed:, offset 183, len 0, h: end constant_pool
-// parsed:, offset 183, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 185, len 2, h: this_class: type{dxc.junit.opcodes.getfield.jm.T_getfield_13}
-// .  .  
-   00 0a 
-// parsed:, offset 187, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 04 
-// parsed:, offset 189, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 191, len 2, h: fields_count: 0001
-// .  .  
-   00 01 
-// ========== start-ParseMember:i1, offset 193, len:91,desc: I
-// parsed:, offset 193, len 0, h:  fields[0]: 
-    // parsed:, offset 193, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 195, len 2, h: name: i1
-    // .  .  
-       00 0f 
-    // parsed:, offset 197, len 2, h: descriptor: I
-    // .  .  
-       00 08 
-    // parsed:, offset 199, len 2, h: attributes_count: 0000
-    // .  .  
-       00 00 
-// parsed:, offset 201, len 0, h: end fields[0] 
-// ========== end-ParseMember:i1, desc: I
-// parsed:, offset 201, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 203, len:81,desc: ()V
-// parsed:, offset 203, len 0, h:  methods[0]: 
-    // parsed:, offset 203, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 205, len 2, h: name: <init>
-    // .  .  
-       00 03 
-    // parsed:, offset 207, len 2, h: descriptor: ()V
-    // .  .  
-       00 06 
-    // parsed:, offset 209, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 211, len 0, h:  attributes[0]: 
-        // parsed:, offset 211, len 2, h: name: Code
-        // .  .  
-           00 07 
-        // parsed:, offset 213, len 4, h: length: 00000017
-        // .  .  .  .  
-           00 00 00 17 
-        // parsed:, offset 217, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 219, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 221, len 4, h: code_length: 0000000b
-        // .  .  .  .  
-           00 00 00 0b 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 0e 
-        // parsed:, offset 4, len 1, h: 0004: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 5, len 1, h: 0005: iconst_5 // #+05
-        // .  
-           08 
-        // parsed:, offset 6, len 3, h: 0006: putfield field{dxc.junit.opcodes.getfield.jm.T_getfield_13.i1:I}
-        // .  .  .  
-           b5 00 12 
-        // parsed:, offset 9, len 1, h: 0009: return
-        // .  
-           b1 
-        // parsed:, offset 10, len 1, h: 000a: return
-        // .  
-           b1 
-        // parsed:, offset 236, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 238, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 240, len 0, h: end attributes[0] 
-// parsed:, offset 240, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 240, len:44,desc: ()I
-// parsed:, offset 240, len 0, h:  methods[1]: 
-    // parsed:, offset 240, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 242, len 2, h: name: run
-    // .  .  
-       00 0d 
-    // parsed:, offset 244, len 2, h: descriptor: ()I
-    // .  .  
-       00 0c 
-    // parsed:, offset 246, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 248, len 0, h:  attributes[0]: 
-        // parsed:, offset 248, len 2, h: name: Code
-        // .  .  
-           00 07 
-        // parsed:, offset 250, len 4, h: length: 00000014
-        // .  .  .  .  
-           00 00 00 14 
-        // parsed:, offset 254, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 256, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 258, len 4, h: code_length: 00000008
-        // .  .  .  .  
-           00 00 00 08 
-        // parsed:, offset 0, len 2, h: 0000: ldc #4048f5c3 // 3.14
-        // .  .  
-           12 02 
-        // parsed:, offset 2, len 1, h: 0002: pop
-        // W  
-           57 
-        // parsed:, offset 3, len 1, h: 0003: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 4, len 3, h: 0004: getfield field{dxc.junit.opcodes.getfield.jm.T_getfield_13.i1:I}
-        // .  .  .  
-//@mod           b4 00 12 
-           b4 00 02
-        // parsed:, offset 7, len 1, h: 0007: ireturn
-        // .  
-           ac 
-        // parsed:, offset 270, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 272, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 274, len 0, h: end attributes[0] 
-// parsed:, offset 274, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()I
-// parsed:, offset 274, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 276, len 0, h:  attributes[0]: 
-    // parsed:, offset 276, len 2, h: name: SourceFile
-    // .  .  
-       00 09 
-    // parsed:, offset 278, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 282, len 2, h: source: utf8{"T_getfield_13.java"}
-    // .  .  
-       00 10 
-// parsed:, offset 284, len 0, h: end attributes[0] 
-// parsed:, offset 284, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_13.j b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_13.j
deleted file mode 100644
index de3b816..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_13.j
+++ /dev/null
@@ -1,49 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_getfield_13.java
-.class public dxc/junit/opcodes/getfield/jm/T_getfield_13
-.super java/lang/Object
-
-.field public i1 I
-
-.method public <init>()V
-    .limit stack 2
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    
-    aload_0
-    iconst_5
-    putfield dxc.junit.opcodes.getfield.jm.T_getfield_13.i1 I
-    return
-
-    return
-.end method
-
-
-
-.method public run()I
-    .limit stack 1
-    .limit locals 1
-    
-    ldc 3.14
-    pop
-
-    aload_0
-    getfield dxc.junit.opcodes.getfield.jm.T_getfield_13.i1 I
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_13.java b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_13.java
deleted file mode 100644
index 3087341..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_13.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getfield.jm;
-
-public class T_getfield_13 {
-
-    public int i1 = 5;
-    public int run(){
-        return i1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_14.j b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_14.j
deleted file mode 100644
index 1b8b562..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_14.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_getfield_14.java
-.class public dxc/junit/opcodes/getfield/jm/T_getfield_14
-.super java/lang/Object
-
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()Ljava/lang/String;
-    .limit stack 2
-    .limit locals 2
-
-    new dxc/junit/opcodes/getfield/jm/TChild
-    dup
-    invokespecial dxc/junit/opcodes/getfield/jm/TChild/<init>()V
-    astore_1
-
-    aload_1
-    getfield dxc.junit.opcodes.getfield.jm.TSuper.s Ljava/lang/String;
-
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_14.java b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_14.java
deleted file mode 100644
index ec06180..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_14.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getfield.jm;
-
-public class T_getfield_14 {
-
-    public String run() {
-        //TChild c = new TChild();
-        return null;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_15.j b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_15.j
deleted file mode 100644
index 5c5d5a8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_15.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_getfield_15.java
-.class public dxc/junit/opcodes/getfield/jm/T_getfield_15
-.super java/lang/Object
-
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()Ljava/lang/Object;
-    .limit stack 2
-    .limit locals 2
-
-    new dxc/junit/opcodes/getfield/jm/TSuper
-    dup
-    invokespecial dxc/junit/opcodes/getfield/jm/TSuper/<init>()V
-    astore_1
-
-    aload_1
-    getfield dxc.junit.opcodes.getfield.jm.TChild.o Ljava/lang/Object;
-
-    areturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_15.java b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_15.java
deleted file mode 100644
index 7424e02..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_15.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getfield.jm;
-
-public class T_getfield_15 {
-
-    public Object run() {
-        TChild s = new TChild();
-        return s.o;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_16.j b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_16.j
deleted file mode 100644
index 9c17d05..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_16.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_getfield_16.java
-.class public dxc/junit/opcodes/getfield/jm/T_getfield_16
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 2
-
-    new dxc/junit/opcodes/getfield/Test_getfield
-    dup
-    invokespecial dxc/junit/opcodes/getfield/Test_getfield/<init>()V
-
-    getfield dxc.junit.opcodes.getfield.Test_getfield.TestStubFieldP I
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_16.java b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_16.java
deleted file mode 100644
index b7114d7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_16.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getfield.jm;
-
-public class T_getfield_16 {
-
-    public int run() {
-        return -99;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_17.j b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_17.j
deleted file mode 100644
index 2ef0aa4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_17.j
+++ /dev/null
@@ -1,30 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_getfield_17.java
-.class public dxc/junit/opcodes/getfield/jm/T_getfield_17
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ldxc/junit/opcodes/getfield/jm/TestStubs;)I
-    .limit locals 2
-    aload_1
-    getfield dxc.junit.opcodes.getfield.jm.TestStubs.privateInt I
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_17.java b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_17.java
deleted file mode 100644
index 95d4f75..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_17.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getfield.jm;
-
-
-public class T_getfield_17 {
-
-    public int run(TestStubs t) {
-        return -99;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_2.j b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_2.j
deleted file mode 100644
index 9082c3f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_2.j
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_getfield_2.java
-.class public dxc/junit/opcodes/getfield/jm/T_getfield_2
-.super java/lang/Object
-
-.field public val D
-
-.method public <init>()V
-    .limit stack 3
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    aload_0    
-    ldc2_w 123.0
-    putfield dxc.junit.opcodes.getfield.jm.T_getfield_2.val D
-
-    return
-.end method
-
-
-
-.method public run()D
-    .limit stack 3
-    .limit locals 1
-
-    aload_0
-    getfield dxc.junit.opcodes.getfield.jm.T_getfield_2.val D
-
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_2.java b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_2.java
deleted file mode 100644
index 36c976a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_2.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getfield.jm;
-
-public class T_getfield_2 {
-
-    public double val = 123.0d;
-    
-    public double run() {
-        return val;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_3.j b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_3.j
deleted file mode 100644
index 12c523e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_3.j
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_getfield_3.java
-.class public dxc/junit/opcodes/getfield/jm/T_getfield_3
-.super java/lang/Object
-
-.field public val D
-
-.method public <init>()V
-    .limit stack 3
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    
-    aload_0
-    ldc2_w 123.0
-    putstatic dxc.junit.opcodes.getfield.jm.T_getfield_3.val D
-
-    return
-.end method
-
-
-
-.method public run()D
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    getfield dxc.junit.opcodes.getfield.jm.T_getfield_3.val D
-
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_3.java b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_3.java
deleted file mode 100644
index 7b91429..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_3.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getfield.jm;
-
-public class T_getfield_3 {
-
-    public double val = 123.0d;
-    
-    public double run() {
-        return val;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_4.cfh b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_4.cfh
deleted file mode 100644
index e6a6403..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_4.cfh
+++ /dev/null
@@ -1,225 +0,0 @@
-//@class:dxc/junit/opcodes/getfield/jm/T_getfield_4
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0012
-// .  .  
-   00 12 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0f 00 08 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 6, h: 0005: utf8{"()I"}
-    // .  .  .  (  )  I  
-       01 00 03 28 29 49 
-    // parsed:, offset 62, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 68, len 20, h: 0007: utf8{"T_getfield_4.java"}
-    // .  .  .  T  _  g  e  t  f  i  e  l  d  _  4  .  j  a  v  a  
-       01 00 11 54 5f 67 65 74 66 69 65 6c 64 5f 34 2e 6a 61 76 61 
-    // parsed:, offset 88, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 0e 
-    // parsed:, offset 93, len 5, h: 0009: utf8{"i1"}
-    // .  .  .  i  1  
-       01 00 02 69 31 
-    // parsed:, offset 98, len 7, h: 000a: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 105, len 45, h: 000b: utf8{"dxc/junit/opcodes/getfield/jm/T_getfield_4"}
-    // .  .  *  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  g  e  t  f  i  e  l  d  /  j  m  /  T  _  g  e  t  f  i  e  l  d  _  4  
-       01 00 2a 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 67 65 74 66 69 65 6c 64 2f 6a 6d 2f 54 5f 67 65 74 66 69 65 6c 64 5f 34 
-    // parsed:, offset 150, len 3, h: 000c: type{dxc.junit.opcodes.getfield.jm.T_getfield_4}
-    // .  .  .  
-       07 00 0b 
-    // parsed:, offset 153, len 5, h: 000d: field{dxc.junit.opcodes.getfield.jm.T_getfield_4.i1:I}
-    // .  .  .  .  .  
-       09 00 0c 00 11 
-    // parsed:, offset 158, len 6, h: 000e: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 164, len 3, h: 000f: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-    // parsed:, offset 167, len 4, h: 0010: utf8{"I"}
-    // .  .  .  I  
-       01 00 01 49 
-    // parsed:, offset 171, len 5, h: 0011: nat{i1:I}
-    // .  .  .  .  .  
-       0c 00 09 00 10 
-// parsed:, offset 176, len 0, h: end constant_pool
-// parsed:, offset 176, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 178, len 2, h: this_class: type{dxc.junit.opcodes.getfield.jm.T_getfield_4}
-// .  .  
-   00 0c 
-// parsed:, offset 180, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0f 
-// parsed:, offset 182, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 184, len 2, h: fields_count: 0001
-// .  .  
-   00 01 
-// ========== start-ParseMember:i1, offset 186, len:88,desc: I
-// parsed:, offset 186, len 0, h:  fields[0]: 
-    // parsed:, offset 186, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 188, len 2, h: name: i1
-    // .  .  
-       00 09 
-    // parsed:, offset 190, len 2, h: descriptor: I
-    // .  .  
-       00 10 
-    // parsed:, offset 192, len 2, h: attributes_count: 0000
-    // .  .  
-       00 00 
-// parsed:, offset 194, len 0, h: end fields[0] 
-// ========== end-ParseMember:i1, desc: I
-// parsed:, offset 194, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 196, len:78,desc: ()V
-// parsed:, offset 196, len 0, h:  methods[0]: 
-    // parsed:, offset 196, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 198, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 200, len 2, h: descriptor: ()V
-    // .  .  
-       00 0e 
-    // parsed:, offset 202, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 204, len 0, h:  attributes[0]: 
-        // parsed:, offset 204, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 206, len 4, h: length: 00000017
-        // .  .  .  .  
-           00 00 00 17 
-        // parsed:, offset 210, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 212, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 214, len 4, h: code_length: 0000000b
-        // .  .  .  .  
-           00 00 00 0b 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 5, len 1, h: 0005: iconst_5 // #+05
-        // .  
-           08 
-        // parsed:, offset 6, len 3, h: 0006: putfield field{dxc.junit.opcodes.getfield.jm.T_getfield_4.i1:I}
-        // .  .  .  
-           b5 00 0d 
-        // parsed:, offset 9, len 1, h: 0009: return
-        // .  
-           b1 
-        // parsed:, offset 10, len 1, h: 000a: return
-        // .  
-           b1 
-        // parsed:, offset 229, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 231, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 233, len 0, h: end attributes[0] 
-// parsed:, offset 233, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 233, len:41,desc: ()I
-// parsed:, offset 233, len 0, h:  methods[1]: 
-    // parsed:, offset 233, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 235, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 237, len 2, h: descriptor: ()I
-    // .  .  
-       00 05 
-    // parsed:, offset 239, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 241, len 0, h:  attributes[0]: 
-        // parsed:, offset 241, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 243, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 247, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 249, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 251, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: getfield field{dxc.junit.opcodes.getfield.jm.T_getfield_4.i1:I}
-        // .  .  .  
-//@mod           b4 00 0d 
-           b4 01 0d 
-        // parsed:, offset 4, len 1, h: 0004: ireturn
-        // .  
-           ac 
-        // parsed:, offset 260, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 262, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 264, len 0, h: end attributes[0] 
-// parsed:, offset 264, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()I
-// parsed:, offset 264, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 266, len 0, h:  attributes[0]: 
-    // parsed:, offset 266, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 268, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 272, len 2, h: source: utf8{"T_getfield_4.java"}
-    // .  .  
-       00 07 
-// parsed:, offset 274, len 0, h: end attributes[0] 
-// parsed:, offset 274, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_4.j b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_4.j
deleted file mode 100644
index 815e7a8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_4.j
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_getfield_4.java
-.class public dxc/junit/opcodes/getfield/jm/T_getfield_4
-.super java/lang/Object
-
-.field public i1 I
-
-.method public <init>()V
-    .limit stack 2
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    
-    aload_0
-    iconst_5
-    putfield dxc.junit.opcodes.getfield.jm.T_getfield_4.i1 I
-    return
-    
-
-    return
-.end method
-
-
-
-.method public run()I
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    getfield dxc.junit.opcodes.getfield.jm.T_getfield_4.i1 I
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_4.java b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_4.java
deleted file mode 100644
index 2c9c301..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_4.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getfield.jm;
-
-public class T_getfield_4 {
-
-    public int i1 = 5;
-    public int run(){
-        return i1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_5.j b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_5.j
deleted file mode 100644
index 172f791..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_5.j
+++ /dev/null
@@ -1,48 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_getfield_5.java
-.class public dxc/junit/opcodes/getfield/jm/T_getfield_5
-.super java/lang/Object
-
-.field public static i1 I
-
-.method static <clinit>()V
-    .limit stack 1
-    .limit locals 0
-
-    iconst_5
-    putstatic dxc.junit.opcodes.getstatic.jm.T_getstatic_1.i1 I
-    
-    return
-.end method
-
-.method public <init>()V
-    .limit stack 2
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()I
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    getfield dxc.junit.opcodes.getfield.jm.T_getfield_5.i1 I
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_5.java b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_5.java
deleted file mode 100644
index 34ca783..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_5.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getfield.jm;
-
-public class T_getfield_5 {
-
-    public static int i1 = 5;
-    public int run(){
-        return i1;
-    }
-}
-
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_6.j b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_6.j
deleted file mode 100644
index dcf9a08..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_6.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_getfield_6.java
-.class public dxc/junit/opcodes/getfield/jm/T_getfield_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 2
-
-    new dxc/junit/opcodes/getfield/Test_getfield
-    dup
-    invokespecial dxc/junit/opcodes/getfield/Test_getfield/<init>()V
-
-    getfield dxc.junit.opcodes.getfield.Test_getfield.TestStubField I
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_6.java b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_6.java
deleted file mode 100644
index 07ab1b0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getfield.jm;
-
-public class T_getfield_6 {
-
-    public int run() {
-        return -99;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_7.j b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_7.j
deleted file mode 100644
index ebffccc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_7.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_getfield_7.java
-.class public dxc/junit/opcodes/getfield/jm/T_getfield_7
-.super java/lang/Object
-
-.field public i1 I
-
-.method public <init>()V
-    .limit stack 2
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    aload_0
-    iconst_5
-    putfield dxc.junit.opcodes.getfield.jm.T_getfield_7.i1 I
-    return
-.end method
-
-.method public run()I
-    aload_0
-    getfield dxc.junit.opcodes.getfield.jm.T_getfield_7abc.i1 I
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_7.java b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_7.java
deleted file mode 100644
index ad0b3a6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getfield.jm;
-
-public class T_getfield_7 {
-    public int i1 = 5;
-    public int run(){
-        return i1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_8.j b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_8.j
deleted file mode 100644
index 1d3e3d7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_8.j
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_getfield_8.java
-.class public dxc/junit/opcodes/getfield/jm/T_getfield_8
-.super java/lang/Object
-
-.field public i1 I
-
-
-.method public <init>()V
-    .limit stack 2
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    
-    aload_0
-    iconst_5
-    putfield dxc.junit.opcodes.getfield.jm.T_getfield_8.i1 I
-
-    return
-.end method
-
-
-
-.method public run()I
-    .limit stack 1
-    .limit locals 1
-    
-    aload_0
-    getfield dxc.junit.opcodes.getfield.jm.T_getfield_8.i1N I
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_8.java b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_8.java
deleted file mode 100644
index 884d068..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getfield.jm;
-
-public class T_getfield_8 {
-    public int i1 = 5;
-    public int run(){
-        return i1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_9.j b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_9.j
deleted file mode 100644
index b2fd59d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_9.j
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_getfield_9.java
-.class public dxc/junit/opcodes/getfield/jm/T_getfield_9
-.super java/lang/Object
-
-.field public i1 I
-
-.method public <init>()V
-    .limit stack 2
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    aload_0    
-    iconst_5
-    putfield dxc.junit.opcodes.getfield.jm.T_getfield_9.i1 I
-    
-    return
-.end method
-
-
-
-.method public run()I
-    .limit stack 1
-    .limit locals 1
-
-;    aload_0
-    aconst_null
-    getfield dxc.junit.opcodes.getfield.jm.T_getfield_9.i1 I
-
-    ireturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_9.java b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_9.java
deleted file mode 100644
index f2868db..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/T_getfield_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getfield.jm;
-
-public class T_getfield_9 {
-    public int i1 = 5;
-    public int run(){
-        return i1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/TestStubs.java b/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/TestStubs.java
deleted file mode 100644
index 09b654f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getfield/jm/TestStubs.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getfield.jm;
-
-
-
-class TSuper {
-    public String s = "abc";
-}
-
-class TChild extends TSuper {
-    public Object o = null;    
-}
-
-public class TestStubs {
-    private int privateInt = 456;
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/TestStubs.java b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/TestStubs.java
deleted file mode 100644
index b681d91..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/TestStubs.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getstatic;
-
-public class TestStubs {
-    private static int TestStubField = 50;
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/Test_getstatic.java b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/Test_getstatic.java
deleted file mode 100644
index 290cc0e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/Test_getstatic.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getstatic;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.getstatic.jm.T_getstatic_1;
-import dxc.junit.opcodes.getstatic.jm.T_getstatic_10;
-import dxc.junit.opcodes.getstatic.jm.T_getstatic_11;
-import dxc.junit.opcodes.getstatic.jm.T_getstatic_12;
-import dxc.junit.opcodes.getstatic.jm.T_getstatic_2;
-import dxc.junit.opcodes.getstatic.jm.T_getstatic_5;
-import dxc.junit.opcodes.getstatic.jm.T_getstatic_6;
-import dxc.junit.opcodes.getstatic.jm.T_getstatic_7;
-import dxc.junit.opcodes.getstatic.jm.T_getstatic_8;
-import dxc.junit.opcodes.getstatic.jm.T_getstatic_9;
-
-public class Test_getstatic extends DxTestCase {
-    
-    /**
-     * @title  type - int
-     */
-    public void testN1() {
-        T_getstatic_1 t = new T_getstatic_1();
-        assertEquals(5, t.run());
-    }
-
-    /**
-     * @title  type - double
-     */
-    public void testN2() {
-        T_getstatic_2 t = new T_getstatic_2();
-        assertEquals(123d, t.run());
-    }
-
-    /**
-     * @title  access protected field from subclass
-     */
-    public void testN3() {
-        // @uses dxc.junit.opcodes.getstatic.jm.T_getstatic_1
-        T_getstatic_11 t = new T_getstatic_11();
-        assertEquals(10, t.run());
-    }
-
-    /**
-     * @title  attempt to access non-static field
-     */
-    public void testE1() {
-        T_getstatic_5 t = new T_getstatic_5();
-        try {
-            t.run();
-            fail("expected IncompatibleClassChangeError");
-        } catch (IncompatibleClassChangeError e) {
-            // expected
-        }
-    }
-
-    /**
-     * @title  attempt to access of non-accessible field
-     */
-    public void testE2() {
-        // @uses dxc.junit.opcodes.getstatic.TestStubs        
-        try {
-            T_getstatic_6 t = new T_getstatic_6();
-            t.run();
-            fail("expected IllegalAccessError");
-        } catch (IllegalAccessError iae) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title expected NoClassDefFoundError
-     */
-    public void testE3() {
-        try {
-            T_getstatic_7 t = new T_getstatic_7();
-            t.run();
-            fail("expected NoClassDefFoundError");
-        } catch (NoClassDefFoundError e) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title expected NoSuchFieldError
-     */
-    public void testE4() {
-        try {
-               T_getstatic_8 t = new T_getstatic_8();
-            t.run();
-            fail("expected NoSuchFieldError");
-        } catch (NoSuchFieldError e) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title  attempt to get int from float field
-     */
-    public void testE5() {
-        try {
-            T_getstatic_10 t = new T_getstatic_10();
-            t.run();
-            fail("expected NoSuchFieldError");
-        } catch (NoSuchFieldError e) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title  initialization of referenced class throws exception
-     */
-    public void testE6() {
-        // @uses dxc.junit.opcodes.getstatic.jm.StubInitError
-        T_getstatic_9 t = new T_getstatic_9();
-        try {
-            t.run();
-            fail("expected Error");
-        } catch (Error e) {
-            // expected
-        }
-    }
-
-    //  FIXME: "fail" commented out temporarily - check
-    /**
-     * @title  attempt to read superclass' private field from subclass
-     * 
-     * FIXME: is this a JVM bug?
-     */
-    public void testE7() {
-        // @uses dxc.junit.opcodes.getstatic.jm.T_getstatic_1
-        try {
-            T_getstatic_12 t = new T_getstatic_12();
-            t.run();
-            //fail("expected IllegalAccessError");
-        } catch (IllegalAccessError e) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.12
-     * @title constant pool index
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.getstatic.jm.T_getstatic_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.getstatic.jm.T_getstatic_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.12
-     * @title constant pool type
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.getstatic.jm.T_getstatic_13");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_1.j b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_1.j
deleted file mode 100644
index 3143fda..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_1.j
+++ /dev/null
@@ -1,60 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_getstatic_1.java
-.class public dxc/junit/opcodes/getstatic/jm/T_getstatic_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 stack 1
-    .limit locals 0
-
-    iconst_5
-    putstatic dxc.junit.opcodes.getstatic.jm.T_getstatic_1.i1 I
-    
-    ldc 10
-    putstatic dxc.junit.opcodes.getstatic.jm.T_getstatic_1.p1 I
-    
-    ldc 20
-    putstatic dxc.junit.opcodes.getstatic.jm.T_getstatic_1.pvt1 I
-    return
-
-.end method
-
-
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-.end method
-
-
-
-.method public run()I
-    .limit stack 1
-    .limit locals 1
-
-    getstatic dxc.junit.opcodes.getstatic.jm.T_getstatic_1.i1 I
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_1.java b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_1.java
deleted file mode 100644
index 052182e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_1.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getstatic.jm;
-
-public class T_getstatic_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/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_10.j b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_10.j
deleted file mode 100644
index 29880ed..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_10.j
+++ /dev/null
@@ -1,52 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_getstatic_10.java
-.class public dxc/junit/opcodes/getstatic/jm/T_getstatic_10
-.super java/lang/Object
-
-.field public static i1 F
-
-.method static <clinit>()V
-    .limit stack 1
-    .limit locals 0
-
-    fconst_1
-    putstatic dxc.junit.opcodes.getstatic.jm.T_getstatic_10.i1 F
-    return
-
-.end method
-
-
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-.end method
-
-
-
-.method public run()I
-    .limit stack 1
-    .limit locals 1
-
-    getstatic dxc.junit.opcodes.getstatic.jm.T_getstatic_10.i1N I
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_10.java b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_10.java
deleted file mode 100644
index 0dda175..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_10.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getstatic.jm;
-
-public class T_getstatic_10 {
-    public static int i1 = 5;
-    public int run(){
-        return i1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_11.j b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_11.j
deleted file mode 100644
index aaa565b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_11.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_getstatic_11.java
-.class public dxc/junit/opcodes/getstatic/jm/T_getstatic_11
-.super dxc/junit/opcodes/getstatic/jm/T_getstatic_1
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/getstatic/jm/T_getstatic_1/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 1
-    .limit locals 1
-
-    getstatic dxc.junit.opcodes.getstatic.jm.T_getstatic_1.p1 I
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_11.java b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_11.java
deleted file mode 100644
index 25923d4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getstatic.jm;
-
-public class T_getstatic_11 extends T_getstatic_1 {
-
-    public int run(){
-        return p1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_12.j b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_12.j
deleted file mode 100644
index 72385f8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_12.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_getstatic_12.java
-.class public dxc/junit/opcodes/getstatic/jm/T_getstatic_12
-.super dxc/junit/opcodes/getstatic/jm/T_getstatic_1
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/getstatic/jm/T_getstatic_1/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 1
-    .limit locals 1
-
-    getstatic dxc.junit.opcodes.getstatic.jm.T_getstatic_1.pvt1 I
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_12.java b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_12.java
deleted file mode 100644
index ee091a2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_12.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getstatic.jm;
-
-public class T_getstatic_12 extends T_getstatic_1 {
-
-    public int run(){
-        return -99;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_13.cfh b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_13.cfh
deleted file mode 100644
index 92ad194..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_13.cfh
+++ /dev/null
@@ -1,270 +0,0 @@
-//@class:dxc/junit/opcodes/getstatic/jm/T_getstatic_13
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0014
-// .  .  
-   00 14 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 19, h: 0001: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 29, len 5, h: 0002: float{0x4048f5c3 / 3.14}
-    // .  @  H  .  .  
-       04 40 48 f5 c3 
-    // parsed:, offset 34, len 9, h: 0003: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 43, len 3, h: 0004: type{java.lang.Object}
-    // .  .  .  
-       07 00 01 
-    // parsed:, offset 46, len 5, h: 0005: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 03 00 07 
-    // parsed:, offset 51, len 11, h: 0006: utf8{"<clinit>"}
-    // .  .  .  <  c  l  i  n  i  t  >  
-       01 00 08 3c 63 6c 69 6e 69 74 3e 
-    // parsed:, offset 62, len 6, h: 0007: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 68, len 5, h: 0008: field{dxc.junit.opcodes.getstatic.jm.T_getstatic_13.i1:I}
-    // .  .  .  .  .  
-       09 00 11 00 0d 
-    // parsed:, offset 73, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 80, len 13, h: 000a: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 93, len 4, h: 000b: utf8{"I"}
-    // .  .  .  I  
-       01 00 01 49 
-    // parsed:, offset 97, len 48, h: 000c: utf8{"dxc/junit/opcodes/getstatic/jm/T_getstatic_13"}
-    // .  .  -  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  g  e  t  s  t  a  t  i  c  /  j  m  /  T  _  g  e  t  s  t  a  t  i  c  _  1  3  
-       01 00 2d 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 67 65 74 73 74 61 74 69 63 2f 6a 6d 2f 54 5f 67 65 74 73 74 61 74 69 63 5f 31 33 
-    // parsed:, offset 145, len 5, h: 000d: nat{i1:I}
-    // .  .  .  .  .  
-       0c 00 12 00 0b 
-    // parsed:, offset 150, len 6, h: 000e: utf8{"()I"}
-    // .  .  .  (  )  I  
-       01 00 03 28 29 49 
-    // parsed:, offset 156, len 6, h: 000f: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 162, len 5, h: 0010: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 04 00 05 
-    // parsed:, offset 167, len 3, h: 0011: type{dxc.junit.opcodes.getstatic.jm.T_getstatic_13}
-    // .  .  .  
-       07 00 0c 
-    // parsed:, offset 170, len 5, h: 0012: utf8{"i1"}
-    // .  .  .  i  1  
-       01 00 02 69 31 
-    // parsed:, offset 175, len 22, h: 0013: utf8{"T_getstatic_13.java"}
-    // .  .  .  T  _  g  e  t  s  t  a  t  i  c  _  1  3  .  j  a  v  a  
-       01 00 13 54 5f 67 65 74 73 74 61 74 69 63 5f 31 33 2e 6a 61 76 61 
-// parsed:, offset 197, len 0, h: end constant_pool
-// parsed:, offset 197, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 199, len 2, h: this_class: type{dxc.junit.opcodes.getstatic.jm.T_getstatic_13}
-// .  .  
-   00 11 
-// parsed:, offset 201, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 04 
-// parsed:, offset 203, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 205, len 2, h: fields_count: 0001
-// .  .  
-   00 01 
-// ========== start-ParseMember:i1, offset 207, len:115,desc: I
-// parsed:, offset 207, len 0, h:  fields[0]: 
-    // parsed:, offset 207, len 2, h: access_flags: public|static
-    // .  .  
-       00 09 
-    // parsed:, offset 209, len 2, h: name: i1
-    // .  .  
-       00 12 
-    // parsed:, offset 211, len 2, h: descriptor: I
-    // .  .  
-       00 0b 
-    // parsed:, offset 213, len 2, h: attributes_count: 0000
-    // .  .  
-       00 00 
-// parsed:, offset 215, len 0, h: end fields[0] 
-// ========== end-ParseMember:i1, desc: I
-// parsed:, offset 215, len 2, h: methods_count: 0003
-// .  .  
-   00 03 
-// ========== start-ParseMember:<clinit>, offset 217, len:105,desc: ()V
-// parsed:, offset 217, len 0, h:  methods[0]: 
-    // parsed:, offset 217, len 2, h: access_flags: static
-    // .  .  
-       00 08 
-    // parsed:, offset 219, len 2, h: name: <clinit>
-    // .  .  
-       00 06 
-    // parsed:, offset 221, len 2, h: descriptor: ()V
-    // .  .  
-       00 07 
-    // parsed:, offset 223, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 225, len 0, h:  attributes[0]: 
-        // parsed:, offset 225, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 227, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 231, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 233, len 2, h: max_locals: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 235, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: iconst_5 // #+05
-        // .  
-           08 
-        // parsed:, offset 1, len 3, h: 0001: putstatic field{dxc.junit.opcodes.getstatic.jm.T_getstatic_13.i1:I}
-        // .  .  .  
-           b3 00 08 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 244, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 246, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 248, len 0, h: end attributes[0] 
-// parsed:, offset 248, len 0, h: end methods[0] 
-// ========== end-ParseMember:<clinit>, desc: ()V
-// ========== start-ParseMember:<init>, offset 248, len:74,desc: ()V
-// parsed:, offset 248, len 0, h:  methods[1]: 
-    // parsed:, offset 248, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 250, len 2, h: name: <init>
-    // .  .  
-       00 03 
-    // parsed:, offset 252, len 2, h: descriptor: ()V
-    // .  .  
-       00 07 
-    // parsed:, offset 254, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 256, len 0, h:  attributes[0]: 
-        // parsed:, offset 256, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 258, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 262, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 264, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 266, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 10 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 275, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 277, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 279, len 0, h: end attributes[0] 
-// parsed:, offset 279, len 0, h: end methods[1] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 279, len:43,desc: ()I
-// parsed:, offset 279, len 0, h:  methods[2]: 
-    // parsed:, offset 279, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 281, len 2, h: name: run
-    // .  .  
-       00 0f 
-    // parsed:, offset 283, len 2, h: descriptor: ()I
-    // .  .  
-       00 0e 
-    // parsed:, offset 285, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 287, len 0, h:  attributes[0]: 
-        // parsed:, offset 287, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 289, len 4, h: length: 00000013
-        // .  .  .  .  
-           00 00 00 13 
-        // parsed:, offset 293, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 295, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 297, len 4, h: code_length: 00000007
-        // .  .  .  .  
-           00 00 00 07 
-        // parsed:, offset 0, len 2, h: 0000: ldc #4048f5c3 // 3.14
-        // .  .  
-           12 02 
-        // parsed:, offset 2, len 1, h: 0002: pop
-        // W  
-           57 
-        // parsed:, offset 3, len 3, h: 0003: getstatic field{dxc.junit.opcodes.getstatic.jm.T_getstatic_13.i1:I}
-        // .  .  .  
-//@mod           b2 00 08 
-           b2 00 02 
-        // parsed:, offset 6, len 1, h: 0006: ireturn
-        // .  
-           ac 
-        // parsed:, offset 308, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 310, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 312, len 0, h: end attributes[0] 
-// parsed:, offset 312, len 0, h: end methods[2] 
-// ========== end-ParseMember:run, desc: ()I
-// parsed:, offset 312, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 314, len 0, h:  attributes[0]: 
-    // parsed:, offset 314, len 2, h: name: SourceFile
-    // .  .  
-       00 0a 
-    // parsed:, offset 316, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 320, len 2, h: source: utf8{"T_getstatic_13.java"}
-    // .  .  
-       00 13 
-// parsed:, offset 322, len 0, h: end attributes[0] 
-// parsed:, offset 322, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_13.j b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_13.j
deleted file mode 100644
index 7d3769a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_13.j
+++ /dev/null
@@ -1,55 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_getstatic_13.java
-.class public dxc/junit/opcodes/getstatic/jm/T_getstatic_13
-.super java/lang/Object
-
-.field public static i1 I
-
-.method static <clinit>()V
-    .limit stack 1
-    .limit locals 0
-
-    iconst_5
-    putstatic dxc.junit.opcodes.getstatic.jm.T_getstatic_13.i1 I
-    return
-
-.end method
-
-
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-.end method
-
-
-
-.method public run()I
-    .limit stack 1
-    .limit locals 1
-    
-    ldc 3.14
-    pop
-
-    getstatic dxc.junit.opcodes.getstatic.jm.T_getstatic_13.i1 I
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_13.java b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_13.java
deleted file mode 100644
index 37f5811..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_13.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getstatic.jm;
-
-public class T_getstatic_13 {
-
-    public static int i1 = 5;
-    public int run(){
-        return i1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_2.j b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_2.j
deleted file mode 100644
index dcd4322..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_2.j
+++ /dev/null
@@ -1,51 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_getstatic_2.java
-.class public dxc/junit/opcodes/getstatic/jm/T_getstatic_2
-.super java/lang/Object
-
-.field public static val D
-
-.method static <clinit>()V
-    .limit stack 2
-    .limit locals 0
-
-    ldc2_w 123.0
-    putstatic dxc.junit.opcodes.getstatic.jm.T_getstatic_2.val D
-
-    return
-.end method
-
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-.end method
-
-
-
-.method public run()D
-    .limit stack 2
-    .limit locals 1
-
-    getstatic dxc.junit.opcodes.getstatic.jm.T_getstatic_2.val D
-
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_2.java b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_2.java
deleted file mode 100644
index f9f2d23..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_2.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getstatic.jm;
-
-public class T_getstatic_2 {
-
-    public static double val = 123.0d;
-    
-    public double run() {
-        return val;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_3.j b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_3.j
deleted file mode 100644
index cb47889..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_3.j
+++ /dev/null
@@ -1,51 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_getstatic_3.java
-.class public dxc/junit/opcodes/getstatic/jm/T_getstatic_3
-.super java/lang/Object
-
-.field public static val D
-
-.method static <clinit>()V
-    .limit stack 2
-    .limit locals 0
-
-    ldc2_w 123.0
-    putstatic dxc.junit.opcodes.getstatic.jm.T_getstatic_3.val D
-
-    return
-.end method
-
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-.end method
-
-
-
-.method public run()D
-    .limit stack 1
-    .limit locals 1
-
-    getstatic dxc.junit.opcodes.getstatic.jm.T_getstatic_3.val D
-
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_3.java b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_3.java
deleted file mode 100644
index 98d1f15..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_3.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getstatic.jm;
-
-public class T_getstatic_3 {
-
-    public static double val = 123.0d;
-    
-    public double run() {
-        return val;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_4.cfh b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_4.cfh
deleted file mode 100644
index b384bf3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_4.cfh
+++ /dev/null
@@ -1,261 +0,0 @@
-//@class:dxc/junit/opcodes/getstatic/jm/T_getstatic_4
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0013
-// .  .  
-   00 13 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: nat{i1:I}
-    // .  .  .  .  .  
-       0c 00 11 00 0c 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 9, h: 0003: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 43, len 47, h: 0004: utf8{"dxc/junit/opcodes/getstatic/jm/T_getstatic_4"}
-    // .  .  ,  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  g  e  t  s  t  a  t  i  c  /  j  m  /  T  _  g  e  t  s  t  a  t  i  c  _  4  
-       01 00 2c 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 67 65 74 73 74 61 74 69 63 2f 6a 6d 2f 54 5f 67 65 74 73 74 61 74 69 63 5f 34 
-    // parsed:, offset 90, len 3, h: 0005: type{dxc.junit.opcodes.getstatic.jm.T_getstatic_4}
-    // .  .  .  
-       07 00 04 
-    // parsed:, offset 93, len 6, h: 0006: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 99, len 7, h: 0007: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 106, len 11, h: 0008: utf8{"<clinit>"}
-    // .  .  .  <  c  l  i  n  i  t  >  
-       01 00 08 3c 63 6c 69 6e 69 74 3e 
-    // parsed:, offset 117, len 13, h: 0009: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 130, len 5, h: 000a: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 03 00 06 
-    // parsed:, offset 135, len 3, h: 000b: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-    // parsed:, offset 138, len 4, h: 000c: utf8{"I"}
-    // .  .  .  I  
-       01 00 01 49 
-    // parsed:, offset 142, len 6, h: 000d: utf8{"()I"}
-    // .  .  .  (  )  I  
-       01 00 03 28 29 49 
-    // parsed:, offset 148, len 6, h: 000e: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 154, len 5, h: 000f: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0b 00 0a 
-    // parsed:, offset 159, len 5, h: 0010: field{dxc.junit.opcodes.getstatic.jm.T_getstatic_4.i1:I}
-    // .  .  .  .  .  
-       09 00 05 00 01 
-    // parsed:, offset 164, len 5, h: 0011: utf8{"i1"}
-    // .  .  .  i  1  
-       01 00 02 69 31 
-    // parsed:, offset 169, len 21, h: 0012: utf8{"T_getstatic_4.java"}
-    // .  .  .  T  _  g  e  t  s  t  a  t  i  c  _  4  .  j  a  v  a  
-       01 00 12 54 5f 67 65 74 73 74 61 74 69 63 5f 34 2e 6a 61 76 61 
-// parsed:, offset 190, len 0, h: end constant_pool
-// parsed:, offset 190, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 192, len 2, h: this_class: type{dxc.junit.opcodes.getstatic.jm.T_getstatic_4}
-// .  .  
-   00 05 
-// parsed:, offset 194, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0b 
-// parsed:, offset 196, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 198, len 2, h: fields_count: 0001
-// .  .  
-   00 01 
-// ========== start-ParseMember:i1, offset 200, len:112,desc: I
-// parsed:, offset 200, len 0, h:  fields[0]: 
-    // parsed:, offset 200, len 2, h: access_flags: public|static
-    // .  .  
-       00 09 
-    // parsed:, offset 202, len 2, h: name: i1
-    // .  .  
-       00 11 
-    // parsed:, offset 204, len 2, h: descriptor: I
-    // .  .  
-       00 0c 
-    // parsed:, offset 206, len 2, h: attributes_count: 0000
-    // .  .  
-       00 00 
-// parsed:, offset 208, len 0, h: end fields[0] 
-// ========== end-ParseMember:i1, desc: I
-// parsed:, offset 208, len 2, h: methods_count: 0003
-// .  .  
-   00 03 
-// ========== start-ParseMember:<clinit>, offset 210, len:102,desc: ()V
-// parsed:, offset 210, len 0, h:  methods[0]: 
-    // parsed:, offset 210, len 2, h: access_flags: static
-    // .  .  
-       00 08 
-    // parsed:, offset 212, len 2, h: name: <clinit>
-    // .  .  
-       00 08 
-    // parsed:, offset 214, len 2, h: descriptor: ()V
-    // .  .  
-       00 06 
-    // parsed:, offset 216, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 218, len 0, h:  attributes[0]: 
-        // parsed:, offset 218, len 2, h: name: Code
-        // .  .  
-           00 07 
-        // parsed:, offset 220, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 224, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 226, len 2, h: max_locals: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 228, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: iconst_5 // #+05
-        // .  
-           08 
-        // parsed:, offset 1, len 3, h: 0001: putstatic field{dxc.junit.opcodes.getstatic.jm.T_getstatic_4.i1:I}
-        // .  .  .  
-           b3 00 10 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 237, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 239, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 241, len 0, h: end attributes[0] 
-// parsed:, offset 241, len 0, h: end methods[0] 
-// ========== end-ParseMember:<clinit>, desc: ()V
-// ========== start-ParseMember:<init>, offset 241, len:71,desc: ()V
-// parsed:, offset 241, len 0, h:  methods[1]: 
-    // parsed:, offset 241, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 243, len 2, h: name: <init>
-    // .  .  
-       00 03 
-    // parsed:, offset 245, len 2, h: descriptor: ()V
-    // .  .  
-       00 06 
-    // parsed:, offset 247, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 249, len 0, h:  attributes[0]: 
-        // parsed:, offset 249, len 2, h: name: Code
-        // .  .  
-           00 07 
-        // parsed:, offset 251, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 255, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 257, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 259, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 0f 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 268, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 270, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 272, len 0, h: end attributes[0] 
-// parsed:, offset 272, len 0, h: end methods[1] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 272, len:40,desc: ()I
-// parsed:, offset 272, len 0, h:  methods[2]: 
-    // parsed:, offset 272, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 274, len 2, h: name: run
-    // .  .  
-       00 0e 
-    // parsed:, offset 276, len 2, h: descriptor: ()I
-    // .  .  
-       00 0d 
-    // parsed:, offset 278, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 280, len 0, h:  attributes[0]: 
-        // parsed:, offset 280, len 2, h: name: Code
-        // .  .  
-           00 07 
-        // parsed:, offset 282, len 4, h: length: 00000010
-        // .  .  .  .  
-           00 00 00 10 
-        // parsed:, offset 286, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 288, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 290, len 4, h: code_length: 00000004
-        // .  .  .  .  
-           00 00 00 04 
-        // parsed:, offset 0, len 3, h: 0000: getstatic field{dxc.junit.opcodes.getstatic.jm.T_getstatic_4.i1:I}
-        // .  .  .  
-//@mod           b2 00 10 
-           b2 01 10 
-        // parsed:, offset 3, len 1, h: 0003: ireturn
-        // .  
-           ac 
-        // parsed:, offset 298, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 300, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 302, len 0, h: end attributes[0] 
-// parsed:, offset 302, len 0, h: end methods[2] 
-// ========== end-ParseMember:run, desc: ()I
-// parsed:, offset 302, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 304, len 0, h:  attributes[0]: 
-    // parsed:, offset 304, len 2, h: name: SourceFile
-    // .  .  
-       00 09 
-    // parsed:, offset 306, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 310, len 2, h: source: utf8{"T_getstatic_4.java"}
-    // .  .  
-       00 12 
-// parsed:, offset 312, len 0, h: end attributes[0] 
-// parsed:, offset 312, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_4.j b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_4.j
deleted file mode 100644
index 349b217..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_4.j
+++ /dev/null
@@ -1,52 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_getstatic_4.java
-.class public dxc/junit/opcodes/getstatic/jm/T_getstatic_4
-.super java/lang/Object
-
-.field public static i1 I
-
-.method static <clinit>()V
-    .limit stack 1
-    .limit locals 0
-
-    iconst_5
-    putstatic dxc.junit.opcodes.getstatic.jm.T_getstatic_4.i1 I
-    return
-
-.end method
-
-
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-.end method
-
-
-
-.method public run()I
-    .limit stack 1
-    .limit locals 1
-
-    getstatic dxc.junit.opcodes.getstatic.jm.T_getstatic_4.i1 I
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_4.java b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_4.java
deleted file mode 100644
index 2fa815d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_4.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getstatic.jm;
-
-public class T_getstatic_4 {
-
-    public static int i1 = 5;
-    public int run(){
-        return i1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_5.j b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_5.j
deleted file mode 100644
index 0f26e28..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_5.j
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_getstatic_5.java
-.class public dxc/junit/opcodes/getstatic/jm/T_getstatic_5
-.super java/lang/Object
-
-.field public i1 I
-
-.method public <init>()V
-    .limit stack 2
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    aload_0
-    iconst_5
-    putfield dxc.junit.opcodes.getstatic.jm.T_getstatic_5.i1 I
-
-    return
-.end method
-
-
-.method public run()I
-    .limit stack 1
-    .limit locals 1
-
-    getstatic dxc.junit.opcodes.getstatic.jm.T_getstatic_5.i1 I
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_5.java b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_5.java
deleted file mode 100644
index d183ca4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_5.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getstatic.jm;
-
-public class T_getstatic_5 {
-
-    public int i1 = 5;
-    public int run(){
-        return i1;
-    }
-}
-
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_6.j b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_6.j
deleted file mode 100644
index ba60eb9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_6.j
+++ /dev/null
@@ -1,28 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_getstatic_6.java
-.class public dxc/junit/opcodes/getstatic/jm/T_getstatic_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    getstatic dxc.junit.opcodes.getstatic.TestStubs.TestStubField I
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_6.java b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_6.java
deleted file mode 100644
index 746d6a7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getstatic.jm;
-
-public class T_getstatic_6 {
-
-    public int run() {
-        throw new UnsupportedOperationException();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_7.j b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_7.j
deleted file mode 100644
index ecb55ef..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_7.j
+++ /dev/null
@@ -1,52 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_getstatic_7.java
-.class public dxc/junit/opcodes/getstatic/jm/T_getstatic_7
-.super java/lang/Object
-
-.field public static i1 I
-
-.method static <clinit>()V
-    .limit stack 1
-    .limit locals 0
-
-    iconst_5
-    putstatic dxc.junit.opcodes.getstatic.jm.T_getstatic_7.i1 I
-    return
-
-.end method
-
-
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-.end method
-
-
-
-.method public run()I
-    .limit stack 1
-    .limit locals 1
-
-    getstatic dxc.junit.opcodes.getstatic.jm.T_getstatic_71.i1 I
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_7.java b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_7.java
deleted file mode 100644
index 362759e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getstatic.jm;
-
-public class T_getstatic_7 {
-    public static int i1 = 5;
-    public int run(){
-        return i1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_8.j b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_8.j
deleted file mode 100644
index 5391bed..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_8.j
+++ /dev/null
@@ -1,52 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_getstatic_8.java
-.class public dxc/junit/opcodes/getstatic/jm/T_getstatic_8
-.super java/lang/Object
-
-.field public static i1 I
-
-.method static <clinit>()V
-    .limit stack 1
-    .limit locals 0
-
-    iconst_5
-    putstatic dxc.junit.opcodes.getstatic.jm.T_getstatic_8.i1 I
-    return
-
-.end method
-
-
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-.end method
-
-
-
-.method public run()I
-    .limit stack 1
-    .limit locals 1
-
-    getstatic dxc.junit.opcodes.getstatic.jm.T_getstatic_8.i1N I
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_8.java b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_8.java
deleted file mode 100644
index d187e34..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getstatic.jm;
-
-public class T_getstatic_8 {
-    public static int i1 = 5;
-    public int run(){
-        return i1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_9.j b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_9.j
deleted file mode 100644
index f7a7c9f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_9.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_getstatic_9.java
-.class public dxc/junit/opcodes/getstatic/jm/T_getstatic_9
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 1
-    .limit locals 1
-
-    getstatic dxc.junit.opcodes.getstatic.jm.StubInitError.value I
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_9.java b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_9.java
deleted file mode 100644
index e569935..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/T_getstatic_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getstatic.jm;
-
-public class T_getstatic_9 {
-    
-    public int run(){
-        return -99;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/TestStubs.java b/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/TestStubs.java
deleted file mode 100644
index 97c647f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/getstatic/jm/TestStubs.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.getstatic.jm;
-
-
-class StubInitError{
-    public static int value = 5 / 0;
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/goto_w/Test_goto_w.java b/tools/dx-tests/src/dxc/junit/opcodes/goto_w/Test_goto_w.java
deleted file mode 100644
index 4cac33d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/goto_w/Test_goto_w.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.goto_w;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.goto_w.jm.T_goto_w_1;
-import dxc.junit.opcodes.goto_w.jm.T_goto_w_5;
-
-public class Test_goto_w extends DxTestCase {
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_goto_w_1 t = new T_goto_w_1();
-        assertEquals(0, t.run(20));
-    }
-
-    /**
-     * @title normal test
-     */
-    public void testN2() {
-        T_goto_w_1 t = new T_goto_w_1();
-        assertEquals(-20, t.run(-20));
-    }
-
-    /**
-     * @title  negative offset
-     */
-    public void testN3() {
-        T_goto_w_5 t = new T_goto_w_5();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target is inside instruction
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.goto_w.jm.T_goto_w_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall be inside the
-     * method
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.goto_w.jm.T_goto_w_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall not be "inside" wide
-     * instruction
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.goto_w.jm.T_goto_w_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_1.j b/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_1.j
deleted file mode 100644
index e7b623b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_1.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_w_1.java
-.class public dxc/junit/opcodes/goto_w/jm/T_goto_w_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-    goto_w Label0
-
-    Label1:
-    iinc 1 -1
-
-    Label0:
-    iload_1
-    ifgt Label1
-
-    iload_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_1.java b/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_1.java
deleted file mode 100644
index d0a8e94..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_1.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.goto_w.jm;
-
-public class T_goto_w_1 {
-
-    public int run(int a) {
-        while (a > 0) {
-            a--;
-        }
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_2.cfh b/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_2.cfh
deleted file mode 100644
index 4abb7c6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_2.cfh
+++ /dev/null
@@ -1,193 +0,0 @@
-//@class:dxc/junit/opcodes/goto_w/jm/T_goto_w_2
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000f
-// .  .  
-   00 0f 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 09 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 3, h: 0004: string{"a"}
-    // .  .  .  
-       08 00 0c 
-    // parsed:, offset 50, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 59, len 18, h: 0006: utf8{"T_goto_w_2.java"}
-    // .  .  .  T  _  g  o  t  o  _  w  _  2  .  j  a  v  a  
-       01 00 0f 54 5f 67 6f 74 6f 5f 77 5f 32 2e 6a 61 76 61 
-    // parsed:, offset 77, len 6, h: 0007: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 83, len 3, h: 0008: type{dxc.junit.opcodes.goto_w.jm.T_goto_w_2}
-    // .  .  .  
-       07 00 0e 
-    // parsed:, offset 86, len 5, h: 0009: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0b 
-    // parsed:, offset 91, len 7, h: 000a: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 98, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 104, len 4, h: 000c: utf8{"a"}
-    // .  .  .  a  
-       01 00 01 61 
-    // parsed:, offset 108, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-    // parsed:, offset 111, len 41, h: 000e: utf8{"dxc/junit/opcodes/goto_w/jm/T_goto_w_2"}
-    // .  .  &  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  g  o  t  o  _  w  /  j  m  /  T  _  g  o  t  o  _  w  _  2  
-       01 00 26 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 67 6f 74 6f 5f 77 2f 6a 6d 2f 54 5f 67 6f 74 6f 5f 77 5f 32 
-// parsed:, offset 152, len 0, h: end constant_pool
-// parsed:, offset 152, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 154, len 2, h: this_class: type{dxc.junit.opcodes.goto_w.jm.T_goto_w_2}
-// .  .  
-   00 08 
-// parsed:, offset 156, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 158, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 160, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 162, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 164, len:76,desc: ()V
-// parsed:, offset 164, len 0, h:  methods[0]: 
-    // parsed:, offset 164, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 166, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 168, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 170, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 172, len 0, h:  attributes[0]: 
-        // parsed:, offset 172, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 174, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 178, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 180, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 182, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 191, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 193, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 195, len 0, h: end attributes[0] 
-// parsed:, offset 195, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 195, len:45,desc: ()V
-// parsed:, offset 195, len 0, h:  methods[1]: 
-    // parsed:, offset 195, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 197, len 2, h: name: run
-    // .  .  
-       00 07 
-    // parsed:, offset 199, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 201, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 203, len 0, h:  attributes[0]: 
-        // parsed:, offset 203, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 205, len 4, h: length: 00000015
-        // .  .  .  .  
-           00 00 00 15 
-        // parsed:, offset 209, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 211, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 213, len 4, h: code_length: 00000009
-        // .  .  .  .  
-           00 00 00 09 
-        // parsed:, offset 0, len 5, h: 0000: goto_w 00000006
-        // .  .  .  .  .  
-//@mod:    c8 00 00 00 06 
-// we jump to the parameter of a byte code (was: ldc, now: string "a"), so this 
-// must be rejected by the verifier  
-           c8 00 00 00 07 
-        // parsed:, offset 5, len 1, h: 0005: return
-        // .  
-           b1 
-        // parsed:, offset 6, len 2, h: 0006: ldc string{"a"}
-        // .  .  
-           12 04 
-        // parsed:, offset 8, len 1, h: 0008: return
-        // .  
-           b1 
-        // parsed:, offset 226, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 228, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 230, len 0, h: end attributes[0] 
-// parsed:, offset 230, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()V
-// parsed:, offset 230, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 232, len 0, h:  attributes[0]: 
-    // parsed:, offset 232, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 234, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 238, len 2, h: source: utf8{"T_goto_w_2.java"}
-    // .  .  
-       00 06 
-// parsed:, offset 240, len 0, h: end attributes[0] 
-// parsed:, offset 240, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_2.j b/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_2.j
deleted file mode 100644
index d2c8771..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_2.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_w_2.java
-.class public dxc/junit/opcodes/goto_w/jm/T_goto_w_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    goto_w Label0
-    return
-Label0:    
-    ldc "a"
-    return
-.end method
-
-
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_2.java b/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_2.java
deleted file mode 100644
index 89e57ad..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.goto_w.jm;
-
-public class T_goto_w_2 {
-
-    public void run() {
-        String a = "a";
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_3.cfh b/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_3.cfh
deleted file mode 100644
index 4a45a9c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_3.cfh
+++ /dev/null
@@ -1,191 +0,0 @@
-//@class:dxc/junit/opcodes/goto_w/jm/T_goto_w_3
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000f
-// .  .  
-   00 0f 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 07 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 3, h: 0004: string{"a"}
-    // .  .  .  
-       08 00 0c 
-    // parsed:, offset 50, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 59, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 65, len 5, h: 0007: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0b 
-    // parsed:, offset 70, len 3, h: 0008: type{dxc.junit.opcodes.goto_w.jm.T_goto_w_3}
-    // .  .  .  
-       07 00 0e 
-    // parsed:, offset 73, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 80, len 18, h: 000a: utf8{"T_goto_w_3.java"}
-    // .  .  .  T  _  g  o  t  o  _  w  _  3  .  j  a  v  a  
-       01 00 0f 54 5f 67 6f 74 6f 5f 77 5f 33 2e 6a 61 76 61 
-    // parsed:, offset 98, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 104, len 4, h: 000c: utf8{"a"}
-    // .  .  .  a  
-       01 00 01 61 
-    // parsed:, offset 108, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-    // parsed:, offset 111, len 41, h: 000e: utf8{"dxc/junit/opcodes/goto_w/jm/T_goto_w_3"}
-    // .  .  &  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  g  o  t  o  _  w  /  j  m  /  T  _  g  o  t  o  _  w  _  3  
-       01 00 26 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 67 6f 74 6f 5f 77 2f 6a 6d 2f 54 5f 67 6f 74 6f 5f 77 5f 33 
-// parsed:, offset 152, len 0, h: end constant_pool
-// parsed:, offset 152, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 154, len 2, h: this_class: type{dxc.junit.opcodes.goto_w.jm.T_goto_w_3}
-// .  .  
-   00 08 
-// parsed:, offset 156, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 158, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 160, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 162, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 164, len:76,desc: ()V
-// parsed:, offset 164, len 0, h:  methods[0]: 
-    // parsed:, offset 164, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 166, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 168, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 170, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 172, len 0, h:  attributes[0]: 
-        // parsed:, offset 172, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 174, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 178, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 180, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 182, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 191, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 193, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 195, len 0, h: end attributes[0] 
-// parsed:, offset 195, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 195, len:45,desc: ()V
-// parsed:, offset 195, len 0, h:  methods[1]: 
-    // parsed:, offset 195, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 197, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 199, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 201, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 203, len 0, h:  attributes[0]: 
-        // parsed:, offset 203, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 205, len 4, h: length: 00000015
-        // .  .  .  .  
-           00 00 00 15 
-        // parsed:, offset 209, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 211, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 213, len 4, h: code_length: 00000009
-        // .  .  .  .  
-           00 00 00 09 
-        // parsed:, offset 0, len 5, h: 0000: goto_w 00000006
-        // .  .  .  .  .  
-//@mod           c8 00 00 00 06 
-           c8 00 ff 00 06 
-        // parsed:, offset 5, len 1, h: 0005: return
-        // .  
-           b1 
-        // parsed:, offset 6, len 2, h: 0006: ldc string{"a"}
-        // .  .  
-           12 04 
-        // parsed:, offset 8, len 1, h: 0008: return
-        // .  
-           b1 
-        // parsed:, offset 226, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 228, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 230, len 0, h: end attributes[0] 
-// parsed:, offset 230, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()V
-// parsed:, offset 230, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 232, len 0, h:  attributes[0]: 
-    // parsed:, offset 232, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 234, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 238, len 2, h: source: utf8{"T_goto_w_3.java"}
-    // .  .  
-       00 0a 
-// parsed:, offset 240, len 0, h: end attributes[0] 
-// parsed:, offset 240, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_3.j b/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_3.j
deleted file mode 100644
index 040e7ed..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_3.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_w_3.java
-.class public dxc/junit/opcodes/goto_w/jm/T_goto_w_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    goto_w Label0
-    return
-Label0:    
-    ldc "a"
-    return
-.end method
-
-
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_3.java b/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_3.java
deleted file mode 100644
index a32670d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.goto_w.jm;
-
-public class T_goto_w_3 {
-
-    public void run() {
-        String a = "a";
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_4.cfh b/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_4.cfh
deleted file mode 100644
index e02cd46..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_4.cfh
+++ /dev/null
@@ -1,182 +0,0 @@
-//@class:dxc/junit/opcodes/goto_w/jm/T_goto_w_4
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000d
-// .  .  
-   00 0d 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0a 00 06 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 6, h: 0005: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 62, len 5, h: 0006: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 09 
-    // parsed:, offset 67, len 3, h: 0007: type{dxc.junit.opcodes.goto_w.jm.T_goto_w_4}
-    // .  .  .  
-       07 00 0b 
-    // parsed:, offset 70, len 7, h: 0008: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 77, len 6, h: 0009: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 83, len 3, h: 000a: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-    // parsed:, offset 86, len 41, h: 000b: utf8{"dxc/junit/opcodes/goto_w/jm/T_goto_w_4"}
-    // .  .  &  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  g  o  t  o  _  w  /  j  m  /  T  _  g  o  t  o  _  w  _  4  
-       01 00 26 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 67 6f 74 6f 5f 77 2f 6a 6d 2f 54 5f 67 6f 74 6f 5f 77 5f 34 
-    // parsed:, offset 127, len 18, h: 000c: utf8{"T_goto_w_4.java"}
-    // .  .  .  T  _  g  o  t  o  _  w  _  4  .  j  a  v  a  
-       01 00 0f 54 5f 67 6f 74 6f 5f 77 5f 34 2e 6a 61 76 61 
-// parsed:, offset 145, len 0, h: end constant_pool
-// parsed:, offset 145, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 147, len 2, h: this_class: type{dxc.junit.opcodes.goto_w.jm.T_goto_w_4}
-// .  .  
-   00 07 
-// parsed:, offset 149, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0a 
-// parsed:, offset 151, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 153, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 155, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 157, len:77,desc: ()V
-// parsed:, offset 157, len 0, h:  methods[0]: 
-    // parsed:, offset 157, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 159, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 161, len 2, h: descriptor: ()V
-    // .  .  
-       00 09 
-    // parsed:, offset 163, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 165, len 0, h:  attributes[0]: 
-        // parsed:, offset 165, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 167, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 171, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 173, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 175, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 184, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 186, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 188, len 0, h: end attributes[0] 
-// parsed:, offset 188, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 188, len:46,desc: ()V
-// parsed:, offset 188, len 0, h:  methods[1]: 
-    // parsed:, offset 188, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 190, len 2, h: name: run
-    // .  .  
-       00 05 
-    // parsed:, offset 192, len 2, h: descriptor: ()V
-    // .  .  
-       00 09 
-    // parsed:, offset 194, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 196, len 0, h:  attributes[0]: 
-        // parsed:, offset 196, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 198, len 4, h: length: 00000016
-        // .  .  .  .  
-           00 00 00 16 
-        // parsed:, offset 202, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 204, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 206, len 4, h: code_length: 0000000a
-        // .  .  .  .  
-           00 00 00 0a 
-        // parsed:, offset 0, len 5, h: 0000: goto_w 00000005
-        // .  .  .  .  .  
-//@mod           c8 00 00 00 05 
-           c8 00 00 00 06 
-        // parsed:, offset 5, len 4, h: 0005: wide aload 0000
-        // .  .  .  .  
-           c4 19 00 00 
-        // parsed:, offset 9, len 1, h: 0009: return
-        // .  
-           b1 
-        // parsed:, offset 220, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 222, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 224, len 0, h: end attributes[0] 
-// parsed:, offset 224, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()V
-// parsed:, offset 224, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 226, len 0, h:  attributes[0]: 
-    // parsed:, offset 226, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 228, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 232, len 2, h: source: utf8{"T_goto_w_4.java"}
-    // .  .  
-       00 0c 
-// parsed:, offset 234, len 0, h: end attributes[0] 
-// parsed:, offset 234, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_4.j b/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_4.j
deleted file mode 100644
index 1c0b768..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_4.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_w_4.java
-.class public dxc/junit/opcodes/goto_w/jm/T_goto_w_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    goto_w Label0
-Label0:    
-    aload_w 0
-    return
-.end method
-
-
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_4.java b/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_4.java
deleted file mode 100644
index 3914675..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.goto_w.jm;
-
-public class T_goto_w_4 {
-
-    public void run() {
-        String a = "a";
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_5.j b/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_5.j
deleted file mode 100644
index 97309d9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_5.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_w_5.java
-.class public dxc/junit/opcodes/goto_w/jm/T_goto_w_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    goto_w Label1
-Label0:
-    nop
-    nop
-    nop
-    iconst_1
-    ireturn
-Label1:    
-    goto_w Label0
-    iconst_0
-    ireturn
-.end method
-
-
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_5.java b/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_5.java
deleted file mode 100644
index 82daea8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/goto_w/jm/T_goto_w_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.goto_w.jm;
-
-public class T_goto_w_5 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2b/Test_i2b.java b/tools/dx-tests/src/dxc/junit/opcodes/i2b/Test_i2b.java
deleted file mode 100644
index 096b453..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2b/Test_i2b.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2b;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.i2b.jm.T_i2b_1;
-
-public class Test_i2b extends DxTestCase {
-
-    /**
-     * @title  Argument = 1
-     */
-    public void testN1() {
-        T_i2b_1 t = new T_i2b_1();
-        assertEquals(1, t.run(1));
-    }
-
-    /**
-     * @title  Argument = -1
-     */
-    public void testN2() {
-        T_i2b_1 t = new T_i2b_1();
-        assertEquals(-1, t.run(-1));
-    }
-
-    /**
-     * @title  Argument = 16
-     */
-    public void testN3() {
-        T_i2b_1 t = new T_i2b_1();
-        assertEquals(16, t.run(16));
-    }
-
-    /**
-     * @title  Argument = -32
-     */
-    public void testN4() {
-        T_i2b_1 t = new T_i2b_1();
-        assertEquals(-32, t.run(-32));
-    }
-
-    /**
-     * @title  Argument = 134
-     */
-    public void testN5() {
-        T_i2b_1 t = new T_i2b_1();
-        assertEquals(-122, t.run(134));
-    }
-
-    /**
-     * @title  Argument = -134
-     */
-    public void testN6() {
-        T_i2b_1 t = new T_i2b_1();
-        assertEquals(122, t.run(-134));
-    }
-
-    /**
-     * @title s. Argument = 127
-     */
-    public void testB1() {
-        T_i2b_1 t = new T_i2b_1();
-        assertEquals(127, t.run(127));
-    }
-
-    /**
-     * @title s. Argument = 128
-     */
-    public void testB2() {
-        T_i2b_1 t = new T_i2b_1();
-        assertEquals(-128, t.run(128));
-    }
-
-    /**
-     * @title s. Argument = 0
-     */
-    public void testB3() {
-        T_i2b_1 t = new T_i2b_1();
-        assertEquals(0, t.run(0));
-    }
-
-    /**
-     * @title s. Argument = -128
-     */
-    public void testB4() {
-        T_i2b_1 t = new T_i2b_1();
-        assertEquals(-128, t.run(-128));
-    }
-
-    /**
-     * @title s. Argument = -129
-     */
-    public void testB5() {
-        T_i2b_1 t = new T_i2b_1();
-        assertEquals(127, t.run(-129));
-    }
-
-    /**
-     * @title s. Argument = Integer.MAX_VALUE
-     */
-    public void testB6() {
-        T_i2b_1 t = new T_i2b_1();
-        assertEquals(-1, t.run(Integer.MAX_VALUE));
-    }
-
-    /**
-     * @title s. Argument = Integer.MIN_VALUE
-     */
-    public void testB7() {
-        T_i2b_1 t = new T_i2b_1();
-        assertEquals(0, t.run(Integer.MIN_VALUE));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.i2b.jm.T_i2b_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.i2b.jm.T_i2b_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.i2b.jm.T_i2b_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - reference
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.i2b.jm.T_i2b_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2b/jm/T_i2b_1.j b/tools/dx-tests/src/dxc/junit/opcodes/i2b/jm/T_i2b_1.j
deleted file mode 100644
index 6beef3b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2b/jm/T_i2b_1.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2b_1.java
-.class public dxc/junit/opcodes/i2b/jm/T_i2b_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)B
-    .limit stack 1
-    .limit locals 2
-    iload_1
-    i2b
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2b/jm/T_i2b_1.java b/tools/dx-tests/src/dxc/junit/opcodes/i2b/jm/T_i2b_1.java
deleted file mode 100644
index ad3dd2b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2b/jm/T_i2b_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2b.jm;
-
-public class T_i2b_1 {
-
-    public byte run(int a) {
-        return (byte) a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2b/jm/T_i2b_2.j b/tools/dx-tests/src/dxc/junit/opcodes/i2b/jm/T_i2b_2.j
deleted file mode 100644
index eb7c2c6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2b/jm/T_i2b_2.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2b_2.java
-.class public dxc/junit/opcodes/i2b/jm/T_i2b_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(I)B
-    .limit stack 1
-    .limit locals 2
-    ; iload_1
-    i2b
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2b/jm/T_i2b_2.java b/tools/dx-tests/src/dxc/junit/opcodes/i2b/jm/T_i2b_2.java
deleted file mode 100644
index 0a6f16f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2b/jm/T_i2b_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2b.jm;
-
-public class T_i2b_2 {
-
-    public byte run(int a) {
-        return (byte) a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2b/jm/T_i2b_3.j b/tools/dx-tests/src/dxc/junit/opcodes/i2b/jm/T_i2b_3.j
deleted file mode 100644
index 3c2b8dd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2b/jm/T_i2b_3.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2b_3.java
-.class public dxc/junit/opcodes/i2b/jm/T_i2b_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(D)B
-    .limit stack 2
-    .limit locals 3
-    dload_1
-    i2b
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2b/jm/T_i2b_3.java b/tools/dx-tests/src/dxc/junit/opcodes/i2b/jm/T_i2b_3.java
deleted file mode 100644
index f16d916..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2b/jm/T_i2b_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2b.jm;
-
-public class T_i2b_3 {
-
-    public byte run(double a) {
-        return (byte) a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2b/jm/T_i2b_4.j b/tools/dx-tests/src/dxc/junit/opcodes/i2b/jm/T_i2b_4.j
deleted file mode 100644
index 93653fa..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2b/jm/T_i2b_4.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2b_4.java
-.class public dxc/junit/opcodes/i2b/jm/T_i2b_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(J)B
-    .limit stack 2
-    .limit locals 3
-
-    lload_1
-    i2b
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2b/jm/T_i2b_4.java b/tools/dx-tests/src/dxc/junit/opcodes/i2b/jm/T_i2b_4.java
deleted file mode 100644
index 10aa70d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2b/jm/T_i2b_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2b.jm;
-
-public class T_i2b_4 {
-
-    public byte run(long a) {
-        return (byte) a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2b/jm/T_i2b_5.j b/tools/dx-tests/src/dxc/junit/opcodes/i2b/jm/T_i2b_5.j
deleted file mode 100644
index 85ee243..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2b/jm/T_i2b_5.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2b_5.java
-.class public dxc/junit/opcodes/i2b/jm/T_i2b_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)B
-    .limit stack 1
-    .limit locals 2
-
-    aload_0
-    i2b
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2b/jm/T_i2b_5.java b/tools/dx-tests/src/dxc/junit/opcodes/i2b/jm/T_i2b_5.java
deleted file mode 100644
index a77b9c3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2b/jm/T_i2b_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2b.jm;
-
-public class T_i2b_5 {
-    
-    public byte run(int a) {
-        return (byte) a;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2c/Test_i2c.java b/tools/dx-tests/src/dxc/junit/opcodes/i2c/Test_i2c.java
deleted file mode 100644
index c610a6c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2c/Test_i2c.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2c;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.i2c.jm.T_i2c_1;
-
-public class Test_i2c extends DxTestCase {
-
-    /**
-     * @title  Argument = 65
-     */
-    public void testN1() {
-        T_i2c_1 t = new T_i2c_1();
-        assertEquals('A', t.run(65));
-    }
-
-    /**
-     * @title  Argument = 65537
-     */
-    public void testN2() {
-        T_i2c_1 t = new T_i2c_1();
-        assertEquals('\u0001', t.run(65537));
-    }
-
-    /**
-     * @title  Argument = -2
-     */
-    public void testN3() {
-        T_i2c_1 t = new T_i2c_1();
-        assertEquals('\ufffe', t.run(-2));
-    }
-
-    /**
-     * @title  Argument = 0x110000
-     */
-    public void testN4() {
-        T_i2c_1 t = new T_i2c_1();
-        assertEquals('\u0000', t.run(0x110000));
-    }
-
-    /**
-     * @title  Argument = 0
-     */
-    public void testB1() {
-        T_i2c_1 t = new T_i2c_1();
-        assertEquals('\u0000', t.run(0));
-    }
-
-    /**
-     * @title  Argument = 65535
-     */
-    public void testB2() {
-        T_i2c_1 t = new T_i2c_1();
-        assertEquals('\uffff', t.run(65535));
-    }
-
-    /**
-     * @title  Argument = Integer.MAX_VALUE
-     */
-    public void testB3() {
-        T_i2c_1 t = new T_i2c_1();
-        assertEquals('\uffff', t.run(Integer.MAX_VALUE));
-    }
-
-    /**
-     * @title  Argument = Integer.MIN_VALUE
-     */
-    public void testB4() {
-        T_i2c_1 t = new T_i2c_1();
-        assertEquals('\u0000', t.run(Integer.MIN_VALUE));
-    }
-
-    /**
-     * verify test
-     */
-    /**
-     * @constraint 4.8.2
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.i2c.jm.T_i2c_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2
-     * @title type of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.i2c.jm.T_i2c_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2
-     * @title type of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.i2c.jm.T_i2c_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2
-     * @title type of argument - reference
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.i2c.jm.T_i2c_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2c/jm/T_i2c_1.j b/tools/dx-tests/src/dxc/junit/opcodes/i2c/jm/T_i2c_1.j
deleted file mode 100644
index e15178d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2c/jm/T_i2c_1.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2c_1.java
-.class public dxc/junit/opcodes/i2c/jm/T_i2c_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)C
-    .limit stack 1
-    .limit locals 2
-    iload_1
-    i2c
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2c/jm/T_i2c_1.java b/tools/dx-tests/src/dxc/junit/opcodes/i2c/jm/T_i2c_1.java
deleted file mode 100644
index a255f60..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2c/jm/T_i2c_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2c.jm;
-
-public class T_i2c_1 {
-
-    public char run(int a) {
-        return (char) a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2c/jm/T_i2c_2.j b/tools/dx-tests/src/dxc/junit/opcodes/i2c/jm/T_i2c_2.j
deleted file mode 100644
index e6dcb12..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2c/jm/T_i2c_2.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2c_2.java
-.class public dxc/junit/opcodes/i2c/jm/T_i2c_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(I)C
-    .limit stack 1
-    .limit locals 2
-    
-;    iload_1
-    i2c
-    
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2c/jm/T_i2c_2.java b/tools/dx-tests/src/dxc/junit/opcodes/i2c/jm/T_i2c_2.java
deleted file mode 100644
index 6ee574c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2c/jm/T_i2c_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2c.jm;
-
-public class T_i2c_2 {
-
-    public char run(int a) {
-        return (char) a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2c/jm/T_i2c_3.j b/tools/dx-tests/src/dxc/junit/opcodes/i2c/jm/T_i2c_3.j
deleted file mode 100644
index af0e098..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2c/jm/T_i2c_3.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2c_3.java
-.class public dxc/junit/opcodes/i2c/jm/T_i2c_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(D)C
-    .limit stack 2
-    .limit locals 3
-
-    dload_1
-;    d2i
-    i2c
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2c/jm/T_i2c_3.java b/tools/dx-tests/src/dxc/junit/opcodes/i2c/jm/T_i2c_3.java
deleted file mode 100644
index 12e7e70..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2c/jm/T_i2c_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2c.jm;
-
-public class T_i2c_3 {
-
-    public char run(double a) {
-        return (char) a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2c/jm/T_i2c_4.j b/tools/dx-tests/src/dxc/junit/opcodes/i2c/jm/T_i2c_4.j
deleted file mode 100644
index 0ac4503..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2c/jm/T_i2c_4.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2c_4.java
-.class public dxc/junit/opcodes/i2c/jm/T_i2c_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(J)C
-    .limit stack 2
-    .limit locals 3
-
-    lload_1
-;    l2i
-    i2c
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2c/jm/T_i2c_4.java b/tools/dx-tests/src/dxc/junit/opcodes/i2c/jm/T_i2c_4.java
deleted file mode 100644
index 0583ce8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2c/jm/T_i2c_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2c.jm;
-
-public class T_i2c_4 {
-
-    public char run(long a) {
-        return (char) a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2c/jm/T_i2c_5.j b/tools/dx-tests/src/dxc/junit/opcodes/i2c/jm/T_i2c_5.j
deleted file mode 100644
index 54e6ad3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2c/jm/T_i2c_5.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2c_5.java
-.class public dxc/junit/opcodes/i2c/jm/T_i2c_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)C
-    .limit stack 1
-    .limit locals 2
-
-    aload_0
-    i2c
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2c/jm/T_i2c_5.java b/tools/dx-tests/src/dxc/junit/opcodes/i2c/jm/T_i2c_5.java
deleted file mode 100644
index a1d485d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2c/jm/T_i2c_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2c.jm;
-
-public class T_i2c_5 {
-    
-    public char run(int a) {
-        return (char) a;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2d/Test_i2d.java b/tools/dx-tests/src/dxc/junit/opcodes/i2d/Test_i2d.java
deleted file mode 100644
index c6e57d3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2d/Test_i2d.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2d;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.i2d.jm.T_i2d_1;
-
-public class Test_i2d extends DxTestCase {
-
-    /**
-     * @title  Argument = 300000000
-     */
-    public void testN1() {
-        T_i2d_1 t = new T_i2d_1();
-        assertEquals(300000000d, t.run(300000000), 0d);
-    }
-
-    /**
-     * @title  Argument = 1
-     */
-    public void testN2() {
-        T_i2d_1 t = new T_i2d_1();
-        assertEquals(1d, t.run(1), 0d);
-    }
-
-    /**
-     * @title  Argument = -1
-     */
-    public void testN3() {
-        T_i2d_1 t = new T_i2d_1();
-        assertEquals(-1d, t.run(-1), 0d);
-    }
-
-
-    /**
-     * @title  Argument = Integer.MAX_VALUE
-     */
-    public void testB1() {
-        T_i2d_1 t = new T_i2d_1();
-        assertEquals(2147483647d, t.run(Integer.MAX_VALUE), 0d);
-    }
-
-    /**
-     * @title  Argument = Integer.MIN_VALUE
-     */
-    public void testB2() {
-        T_i2d_1 t = new T_i2d_1();
-        assertEquals(-2147483648d, t.run(Integer.MIN_VALUE), 0d);
-    }
-
-    /**
-     * @title  Argument = 0
-     */
-    public void testB3() {
-        T_i2d_1 t = new T_i2d_1();
-        assertEquals(0d, t.run(0), 0d);
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.i2d.jm.T_i2d_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.i2d.jm.T_i2d_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.i2d.jm.T_i2d_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.i2d.jm.T_i2d_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - reference
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.i2d.jm.T_i2d_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_1.j b/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_1.j
deleted file mode 100644
index d44d272..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_1.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2d_1.java
-.class public dxc/junit/opcodes/i2d/jm/T_i2d_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)D
-    .limit stack 2
-    .limit locals 2
-    iload_1
-    i2d
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_1.java b/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_1.java
deleted file mode 100644
index 0375f9d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2d.jm;
-
-public class T_i2d_1 {
-
-    public double run(int a) {
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_2.j b/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_2.j
deleted file mode 100644
index abd492b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_2.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2d_2.java
-.class public dxc/junit/opcodes/i2d/jm/T_i2d_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(I)D
-    .limit stack 2
-    .limit locals 2
-
-;    iload_1
-    i2d
-
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_2.java b/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_2.java
deleted file mode 100644
index 0b2112d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2d.jm;
-
-public class T_i2d_2 {
-
-    public double run(int a) {
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_3.j b/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_3.j
deleted file mode 100644
index 7396e0c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_3.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2d_3.java
-.class public dxc/junit/opcodes/i2d/jm/T_i2d_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(F)D
-    .limit stack 2
-    .limit locals 2
-
-    fload_1
-;    f2i
-    i2d
-
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_3.java b/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_3.java
deleted file mode 100644
index 39125cf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2d.jm;
-
-public class T_i2d_3 {
-
-    public double run(float a) {
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_4.j b/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_4.j
deleted file mode 100644
index 041aa6c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2d_4.java
-.class public dxc/junit/opcodes/i2d/jm/T_i2d_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(J)D
-    .limit stack 2
-    .limit locals 3
-
-    lload_1
-;    l2i
-    i2d
-
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_4.java b/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_4.java
deleted file mode 100644
index 7386ba9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2d.jm;
-
-public class T_i2d_4 {
-
-    public double run(long a) {
-        return (double) a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_5.j b/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_5.j
deleted file mode 100644
index e9ca3ac..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_5.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2d_5.java
-.class public dxc/junit/opcodes/i2d/jm/T_i2d_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(I)D
-    .limit stack 1
-    .limit locals 2
-
-    iload_1
-    i2d
-    
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_5.java b/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_5.java
deleted file mode 100644
index 5af85bd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2d.jm;
-
-public class T_i2d_5 {
-
-    public double run(int a) {
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_6.j b/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_6.j
deleted file mode 100644
index 00a7b78..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_6.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2d_6.java
-.class public dxc/junit/opcodes/i2d/jm/T_i2d_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)D
-    .limit stack 2
-    .limit locals 2
-
-    aload_0
-    i2d
-    dreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_6.java b/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_6.java
deleted file mode 100644
index a003add..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2d/jm/T_i2d_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2d.jm;
-
-public class T_i2d_6 {
-    
-    public double run(int a) {
-        return a;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2f/Test_i2f.java b/tools/dx-tests/src/dxc/junit/opcodes/i2f/Test_i2f.java
deleted file mode 100644
index 4a5bcec..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2f/Test_i2f.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2f;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.i2f.jm.T_i2f_1;
-
-public class Test_i2f extends DxTestCase {
-
-    /**
-     * @title  Argument = 123456
-     */
-    public void testN1() {
-        T_i2f_1 t = new T_i2f_1();
-        assertEquals(123456f, t.run(123456), 0f);
-    }
-
-    /**
-     * @title  Argument = 1
-     */
-    public void testN2() {
-        T_i2f_1 t = new T_i2f_1();
-        assertEquals(1f, t.run(1), 0f);
-    }
-
-    /**
-     * @title  Argument = -1
-     */
-    public void testN3() {
-        T_i2f_1 t = new T_i2f_1();
-        assertEquals(-1f, t.run(-1), 0f);
-    }
-
-    /**
-     * @title  Argument = 33564439
-     */
-    public void testN4() {
-        T_i2f_1 t = new T_i2f_1();
-        assertEquals(3.356444E7f, t.run(33564439), 0f);
-    }
-
-    /**
-     * @title  Argument = 0
-     */
-    public void testB1() {
-        T_i2f_1 t = new T_i2f_1();
-        assertEquals(0f, t.run(0), 0f);
-    }
-
-    /**
-     * @title  Argument = Argument = Integer.MAX_VALUE
-     */
-    public void testB2() {
-        T_i2f_1 t = new T_i2f_1();
-        assertEquals(2147483650f, t.run(Integer.MAX_VALUE), 0f);
-    }
-
-    /**
-     * @title  Argument = Integer.MIN_VALUE
-     */
-    public void testB3() {
-        T_i2f_1 t = new T_i2f_1();
-        assertEquals(-2147483650f, t.run(Integer.MIN_VALUE), 0f);
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.i2f.jm.T_i2f_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.i2f.jm.T_i2f_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.i2f.jm.T_i2f_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - reference
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.i2f.jm.T_i2f_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2f/jm/T_i2f_1.j b/tools/dx-tests/src/dxc/junit/opcodes/i2f/jm/T_i2f_1.j
deleted file mode 100644
index e77cc6d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2f/jm/T_i2f_1.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2f_1.java
-.class public dxc/junit/opcodes/i2f/jm/T_i2f_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)F
-    .limit stack 1
-    .limit locals 2
-    iload_1
-    i2f
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2f/jm/T_i2f_1.java b/tools/dx-tests/src/dxc/junit/opcodes/i2f/jm/T_i2f_1.java
deleted file mode 100644
index e985e19..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2f/jm/T_i2f_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2f.jm;
-
-public class T_i2f_1 {
-
-    public float run(int a) {
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2f/jm/T_i2f_2.j b/tools/dx-tests/src/dxc/junit/opcodes/i2f/jm/T_i2f_2.j
deleted file mode 100644
index f1e729f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2f/jm/T_i2f_2.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2f_2.java
-.class public dxc/junit/opcodes/i2f/jm/T_i2f_2
-.super java/lang/Object
-
-
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(I)F
-    .limit stack 1
-    .limit locals 2
-
-;    iload_1
-    i2f
-
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2f/jm/T_i2f_2.java b/tools/dx-tests/src/dxc/junit/opcodes/i2f/jm/T_i2f_2.java
deleted file mode 100644
index ae113ed..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2f/jm/T_i2f_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2f.jm;
-
-public class T_i2f_2 {
-
-    public float run(int a) {
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2f/jm/T_i2f_3.j b/tools/dx-tests/src/dxc/junit/opcodes/i2f/jm/T_i2f_3.j
deleted file mode 100644
index fac0ac4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2f/jm/T_i2f_3.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2f_3.java
-.class public dxc/junit/opcodes/i2f/jm/T_i2f_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(D)F
-    .limit stack 2
-    .limit locals 3
-
-    dload_1
-;    d2i
-    i2f
-
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2f/jm/T_i2f_3.java b/tools/dx-tests/src/dxc/junit/opcodes/i2f/jm/T_i2f_3.java
deleted file mode 100644
index a4f1727..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2f/jm/T_i2f_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2f.jm;
-
-public class T_i2f_3 {
-
-    public float run(double a) {
-        return (float)a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2f/jm/T_i2f_4.j b/tools/dx-tests/src/dxc/junit/opcodes/i2f/jm/T_i2f_4.j
deleted file mode 100644
index 3194274..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2f/jm/T_i2f_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2f_4.java
-.class public dxc/junit/opcodes/i2f/jm/T_i2f_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(J)F
-    .limit stack 2
-    .limit locals 3
-
-    lload_1
-    ;l2i
-    i2f
-
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2f/jm/T_i2f_4.java b/tools/dx-tests/src/dxc/junit/opcodes/i2f/jm/T_i2f_4.java
deleted file mode 100644
index 5aad4ad..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2f/jm/T_i2f_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2f.jm;
-
-public class T_i2f_4 {
-
-    public float run(long a) {
-        return (float) a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2f/jm/T_i2f_5.j b/tools/dx-tests/src/dxc/junit/opcodes/i2f/jm/T_i2f_5.j
deleted file mode 100644
index 9dfed0c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2f/jm/T_i2f_5.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2f_5.java
-.class public dxc/junit/opcodes/i2f/jm/T_i2f_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)F
-    .limit stack 1
-    .limit locals 2
-
-    aload_0
-    i2f
-    freturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2f/jm/T_i2f_5.java b/tools/dx-tests/src/dxc/junit/opcodes/i2f/jm/T_i2f_5.java
deleted file mode 100644
index fcbe7e2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2f/jm/T_i2f_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2f.jm;
-
-public class T_i2f_5 {
-    
-    public float run(int a) {
-        return a;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2l/Test_i2l.java b/tools/dx-tests/src/dxc/junit/opcodes/i2l/Test_i2l.java
deleted file mode 100644
index 8bd6a89..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2l/Test_i2l.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2l;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.i2l.jm.T_i2l_1;
-
-public class Test_i2l extends DxTestCase {
-
-    /**
-     * @title Argument = 123456
-     */
-    public void testN1() {
-        T_i2l_1 t = new T_i2l_1();
-        assertEquals(123456l, t.run(123456));
-    }
-
-    /**
-     * @title  Argument = 1
-     */
-    public void testN2() {
-        T_i2l_1 t = new T_i2l_1();
-        assertEquals(1l, t.run(1));
-    }
-
-    /**
-     * @title  Argument = -1
-     */
-    public void testN3() {
-        T_i2l_1 t = new T_i2l_1();
-        assertEquals(-1l, t.run(-1));
-    }
-
-    /**
-     * @title  Argument = 0
-     */
-    public void testB1() {
-        T_i2l_1 t = new T_i2l_1();
-        assertEquals(0l, t.run(0));
-    }
-
-    /**
-     * @title  Argument = Integer.MAX_VALUE
-     */
-    public void testB2() {
-        T_i2l_1 t = new T_i2l_1();
-        assertEquals(2147483647l, t.run(Integer.MAX_VALUE));
-    }
-
-    /**
-     * @title  Argument = Integer.MIN_VALUE
-     */
-    public void testB3() {
-        T_i2l_1 t = new T_i2l_1();
-        assertEquals(-2147483648l, t.run(Integer.MIN_VALUE));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.i2l.jm.T_i2l_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.i2l.jm.T_i2l_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.i2l.jm.T_i2l_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.i2l.jm.T_i2l_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - reference
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.i2l.jm.T_i2l_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_1.j b/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_1.j
deleted file mode 100644
index 49660c4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_1.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2l_1.java
-.class public dxc/junit/opcodes/i2l/jm/T_i2l_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)J
-    .limit stack 2
-    .limit locals 2
-    iload_1
-    i2l
-    lreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_1.java b/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_1.java
deleted file mode 100644
index 5b03ca0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2l.jm;
-
-public class T_i2l_1 {
-
-    public long run(int a) {
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_2.j b/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_2.j
deleted file mode 100644
index 0435fb4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_2.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2l_2.java
-.class public dxc/junit/opcodes/i2l/jm/T_i2l_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(I)J
-    .limit stack 2
-    .limit locals 2
-
-;    iload_1
-    i2l
-
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_2.java b/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_2.java
deleted file mode 100644
index 4209cad..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2l.jm;
-
-public class T_i2l_2 {
-
-    public long run(int a) {
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_3.j b/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_3.j
deleted file mode 100644
index ed8c96a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_3.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2l_3.java
-.class public dxc/junit/opcodes/i2l/jm/T_i2l_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-
-.method public run(D)J
-    .limit stack 2
-    .limit locals 3
- 
-    dload_1
- ;   d2i
-     i2l
-
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_3.java b/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_3.java
deleted file mode 100644
index c8b8704..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2l.jm;
-
-public class T_i2l_3 {
-
-    public long run(double a) {
-        return (long)a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_4.j b/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_4.j
deleted file mode 100644
index a172ce4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_4.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2l_4.java
-.class public dxc/junit/opcodes/i2l/jm/T_i2l_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(J)J
-    .limit stack 2
-    .limit locals 3
-
-    lload_1
-
-    i2l
-
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_4.java b/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_4.java
deleted file mode 100644
index cc27bc2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2l.jm;
-
-public class T_i2l_4 {
-
-    public long run(long a) {
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_5.j b/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_5.j
deleted file mode 100644
index 8dcd481..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_5.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2l_5.java
-.class public dxc/junit/opcodes/i2l/jm/T_i2l_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(I)J
-    .limit stack 1
-    .limit locals 2
-
-    iload_1
-    i2l
-
-    lreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_5.java b/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_5.java
deleted file mode 100644
index 407650d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2l.jm;
-
-public class T_i2l_5 {
-
-    public long run(int a) {
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_6.j b/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_6.j
deleted file mode 100644
index 75c9693..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_6.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2l_6.java
-.class public dxc/junit/opcodes/i2l/jm/T_i2l_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)J
-    .limit stack 2
-    .limit locals 2
-
-    aload_0
-    i2l
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_6.java b/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_6.java
deleted file mode 100644
index 9f2d674..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2l/jm/T_i2l_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2l.jm;
-
-public class T_i2l_6 {
-    
-    public long run(int a) {
-        return a;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2s/Test_i2s.java b/tools/dx-tests/src/dxc/junit/opcodes/i2s/Test_i2s.java
deleted file mode 100644
index f0ae1f2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2s/Test_i2s.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2s;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.i2s.jm.T_i2s_1;
-
-public class Test_i2s extends DxTestCase {
-
-    /**
-     * @title  Argument = 1
-     */
-    public void testN1() {
-        T_i2s_1 t = new T_i2s_1();
-        assertEquals(1, t.run(1));
-    }
-
-    /**
-     * @title  Argument = -1
-     */
-    public void testN2() {
-        T_i2s_1 t = new T_i2s_1();
-        assertEquals(-1, t.run(-1));
-    }
-
-    /**
-     * @title  Argument = 32767
-     */
-    public void testN3() {
-        T_i2s_1 t = new T_i2s_1();
-        assertEquals(32767, t.run(32767));
-    }
-
-    /**
-     * @title  Argument = -32768
-     */
-    public void testN4() {
-        T_i2s_1 t = new T_i2s_1();
-        assertEquals(-32768, t.run(-32768));
-    }
-
-    /**
-     * @title  Argument = -32769
-     */
-    public void testN5() {
-        T_i2s_1 t = new T_i2s_1();
-        assertEquals(32767, t.run(-32769));
-    }
-
-    /**
-     * @title  Argument = 32768
-     */
-    public void testN6() {
-        T_i2s_1 t = new T_i2s_1();
-        assertEquals(-32768, t.run(32768));
-    }
-
-    /**
-     * @title  Argument = 0x10fedc;
-     */
-    public void testN7() {
-        T_i2s_1 t = new T_i2s_1();
-        assertEquals(0xfffffedc, t.run(0x10fedc));
-    }
-
-    /**
-     * @title  Argument = 0
-     */
-    public void testB1() {
-        T_i2s_1 t = new T_i2s_1();
-        assertEquals(0, t.run(0));
-    }
-
-    /**
-     * @title  Argument = Integer.MAX_VALUE
-     */
-    public void testB2() {
-        T_i2s_1 t = new T_i2s_1();
-        assertEquals(-1, t.run(Integer.MAX_VALUE));
-    }
-
-    /**
-     * @title  Argument = Integer.MIN_VALUE
-     */
-    public void testB3() {
-        T_i2s_1 t = new T_i2s_1();
-        assertEquals(0, t.run(Integer.MIN_VALUE));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.i2s.jm.T_i2s_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.i2s.jm.T_i2s_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.i2s.jm.T_i2s_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - reference
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.i2s.jm.T_i2s_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2s/jm/T_i2s_1.j b/tools/dx-tests/src/dxc/junit/opcodes/i2s/jm/T_i2s_1.j
deleted file mode 100644
index 2224057..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2s/jm/T_i2s_1.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2s_1.java
-.class public dxc/junit/opcodes/i2s/jm/T_i2s_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)S
-    .limit stack 1
-    .limit locals 2
-    iload_1
-    i2s
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2s/jm/T_i2s_1.java b/tools/dx-tests/src/dxc/junit/opcodes/i2s/jm/T_i2s_1.java
deleted file mode 100644
index f01646d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2s/jm/T_i2s_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2s.jm;
-
-public class T_i2s_1 {
-
-    public short run(int a) {
-        return (short)a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2s/jm/T_i2s_2.j b/tools/dx-tests/src/dxc/junit/opcodes/i2s/jm/T_i2s_2.j
deleted file mode 100644
index c62c56f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2s/jm/T_i2s_2.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2s_2.java
-.class public dxc/junit/opcodes/i2s/jm/T_i2s_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(I)S
-    .limit stack 1
-    .limit locals 2
-
-;    iload_1
-    i2s
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2s/jm/T_i2s_2.java b/tools/dx-tests/src/dxc/junit/opcodes/i2s/jm/T_i2s_2.java
deleted file mode 100644
index 73e3134..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2s/jm/T_i2s_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2s.jm;
-
-public class T_i2s_2 {
-
-    public short run(int a) {
-        return (short)a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2s/jm/T_i2s_3.j b/tools/dx-tests/src/dxc/junit/opcodes/i2s/jm/T_i2s_3.j
deleted file mode 100644
index 05b14f7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2s/jm/T_i2s_3.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2s_3.java
-.class public dxc/junit/opcodes/i2s/jm/T_i2s_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(D)S
-    .limit stack 2
-    .limit locals 3
- 
-    dload_1
-;    d2i
-    i2s
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2s/jm/T_i2s_3.java b/tools/dx-tests/src/dxc/junit/opcodes/i2s/jm/T_i2s_3.java
deleted file mode 100644
index 92d6144..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2s/jm/T_i2s_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2s.jm;
-
-public class T_i2s_3 {
-
-    public short run(double a) {
-        return (short)a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2s/jm/T_i2s_4.j b/tools/dx-tests/src/dxc/junit/opcodes/i2s/jm/T_i2s_4.j
deleted file mode 100644
index 927254c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2s/jm/T_i2s_4.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2s_4.java
-.class public dxc/junit/opcodes/i2s/jm/T_i2s_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(J)S
-    .limit stack 2
-    .limit locals 3
-
-    lload_1
-;    l2i
-    i2s
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2s/jm/T_i2s_4.java b/tools/dx-tests/src/dxc/junit/opcodes/i2s/jm/T_i2s_4.java
deleted file mode 100644
index 703e103..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2s/jm/T_i2s_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2s.jm;
-
-public class T_i2s_4 {
-
-    public short run(long a) {
-        return (short)a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2s/jm/T_i2s_5.j b/tools/dx-tests/src/dxc/junit/opcodes/i2s/jm/T_i2s_5.j
deleted file mode 100644
index 6ee161e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2s/jm/T_i2s_5.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_i2s_5.java
-.class public dxc/junit/opcodes/i2s/jm/T_i2s_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)S
-    .limit stack 1
-    .limit locals 2
-
-    aload_0
-    i2s
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/i2s/jm/T_i2s_5.java b/tools/dx-tests/src/dxc/junit/opcodes/i2s/jm/T_i2s_5.java
deleted file mode 100644
index 85dde1d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/i2s/jm/T_i2s_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.i2s.jm;
-
-public class T_i2s_5 {
-    
-    public short run(int a) {
-        return (short)a;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iadd/Test_iadd.java b/tools/dx-tests/src/dxc/junit/opcodes/iadd/Test_iadd.java
deleted file mode 100644
index 4e65023..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iadd/Test_iadd.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iadd;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.iadd.jm.T_iadd_1;
-
-public class Test_iadd extends DxTestCase {
-
-    /**
-     * @title Arguments = 8, 4
-     */
-    public void testN1() {
-        T_iadd_1 t = new T_iadd_1();
-        assertEquals(12, t.run(8, 4));
-    }
-
-    /**
-     * @title Arguments = 0, 255
-     */
-    public void testN2() {
-        T_iadd_1 t = new T_iadd_1();
-        assertEquals(255, t.run(0, 255));
-    }
-
-    /**
-     * @title Arguments = 0, -65536
-     */
-    public void testN3() {
-        T_iadd_1 t = new T_iadd_1();
-        assertEquals(-65536, t.run(0, -65536));
-    }
-
-    /**
-     * @title Arguments = 0, -2147483647
-     */
-    public void testN4() {
-        T_iadd_1 t = new T_iadd_1();
-        assertEquals(-2147483647, t.run(0, -2147483647));
-    }
-
-    /**
-     * @title Arguments = 0x7ffffffe, 2
-     */
-    public void testN5() {
-        T_iadd_1 t = new T_iadd_1();
-        assertEquals(-2147483648, t.run(0x7ffffffe, 2));
-    }
-
-    /**
-     * @title Arguments = -1, 1
-     */
-    public void testN6() {
-        T_iadd_1 t = new T_iadd_1();
-        assertEquals(0, t.run(-1, 1));
-    }
-
-    /**
-     * @title Arguments = 0, Integer.MAX_VALUE
-     */
-    public void testB1() {
-        T_iadd_1 t = new T_iadd_1();
-        assertEquals(Integer.MAX_VALUE, t.run(0, Integer.MAX_VALUE));
-    }
-
-    /**
-     * @title Arguments = Integer.MAX_VALUE, Integer.MAX_VALUE
-     */
-    public void testB2() {
-        T_iadd_1 t = new T_iadd_1();
-        assertEquals(-2, t.run(Integer.MAX_VALUE, Integer.MAX_VALUE));
-    }
-
-    /**
-     * @title Arguments = Integer.MAX_VALUE, 1
-     */
-    public void testB3() {
-        T_iadd_1 t = new T_iadd_1();
-        assertEquals(Integer.MIN_VALUE, t.run(Integer.MAX_VALUE, 1));
-    }
-
-    /**
-     * @title Arguments = Integer.MIN_VALUE, 1
-     */
-    public void testB4() {
-        T_iadd_1 t = new T_iadd_1();
-        assertEquals(-2147483647, t.run(Integer.MIN_VALUE, 1));
-    }
-
-    /**
-     * @title Arguments = 0, 0
-     */
-    public void testB5() {
-        T_iadd_1 t = new T_iadd_1();
-        assertEquals(0, t.run(0, 0));
-    }
-
-    /**
-     * @title Arguments = Integer.MIN_VALUE, Integer.MIN_VALUE
-     */
-    public void testB6() {
-        T_iadd_1 t = new T_iadd_1();
-        assertEquals(0, t.run(Integer.MIN_VALUE, Integer.MIN_VALUE));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.iadd.jm.T_iadd_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int, double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.iadd.jm.T_iadd_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long, int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.iadd.jm.T_iadd_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference, int
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.iadd.jm.T_iadd_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iadd/jm/T_iadd_1.j b/tools/dx-tests/src/dxc/junit/opcodes/iadd/jm/T_iadd_1.j
deleted file mode 100644
index 7d5ab14..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iadd/jm/T_iadd_1.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iadd_1.java
-.class public dxc/junit/opcodes/iadd/jm/T_iadd_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-    iload_1
-    iload_2
-    iadd
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iadd/jm/T_iadd_1.java b/tools/dx-tests/src/dxc/junit/opcodes/iadd/jm/T_iadd_1.java
deleted file mode 100644
index 63e35c9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iadd/jm/T_iadd_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iadd.jm;
-
-public class T_iadd_1 {
-
-    public int run(int a, int b) {
-        return a+b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iadd/jm/T_iadd_2.j b/tools/dx-tests/src/dxc/junit/opcodes/iadd/jm/T_iadd_2.j
deleted file mode 100644
index 4000167..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iadd/jm/T_iadd_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iadd_2.java
-.class public dxc/junit/opcodes/iadd/jm/T_iadd_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-    iload_1
-    ; iload_2    
-    iadd
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iadd/jm/T_iadd_2.java b/tools/dx-tests/src/dxc/junit/opcodes/iadd/jm/T_iadd_2.java
deleted file mode 100644
index 249c9de..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iadd/jm/T_iadd_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iadd.jm;
-
-public class T_iadd_2 {
-
-    public int run(int a, int b) {
-        return a+b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iadd/jm/T_iadd_3.j b/tools/dx-tests/src/dxc/junit/opcodes/iadd/jm/T_iadd_3.j
deleted file mode 100644
index 61a788f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iadd/jm/T_iadd_3.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iadd_3.java
-.class public dxc/junit/opcodes/iadd/jm/T_iadd_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(ID)I
-    .limit stack 3
-    .limit locals 5
-    iload_1
-    dload_2    
-    iadd
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iadd/jm/T_iadd_3.java b/tools/dx-tests/src/dxc/junit/opcodes/iadd/jm/T_iadd_3.java
deleted file mode 100644
index 98ac780..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iadd/jm/T_iadd_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iadd.jm;
-
-public class T_iadd_3 {
-
-    public int run(int a, double b) {
-        return a+(int)b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iadd/jm/T_iadd_4.j b/tools/dx-tests/src/dxc/junit/opcodes/iadd/jm/T_iadd_4.j
deleted file mode 100644
index b80dbca..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iadd/jm/T_iadd_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iadd_4.java
-.class public dxc/junit/opcodes/iadd/jm/T_iadd_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(JI)I
-    .limit stack 3
-    .limit locals 4
-
-    lload_1
-;    l2i
-    iload_3
-    iadd
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iadd/jm/T_iadd_4.java b/tools/dx-tests/src/dxc/junit/opcodes/iadd/jm/T_iadd_4.java
deleted file mode 100644
index cb97c39..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iadd/jm/T_iadd_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iadd.jm;
-
-public class T_iadd_4 {
-
-    public int run(long a, int b) {
-        return (int)a+b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iadd/jm/T_iadd_5.j b/tools/dx-tests/src/dxc/junit/opcodes/iadd/jm/T_iadd_5.j
deleted file mode 100644
index e815ee4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iadd/jm/T_iadd_5.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iadd_5.java
-.class public dxc/junit/opcodes/iadd/jm/T_iadd_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-
-    aload_0
-    iload_2
-    iadd
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iadd/jm/T_iadd_5.java b/tools/dx-tests/src/dxc/junit/opcodes/iadd/jm/T_iadd_5.java
deleted file mode 100644
index 6d05810..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iadd/jm/T_iadd_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iadd.jm;
-
-public class T_iadd_5 {
-    
-    public int run(int a, int b) {
-        return a+b;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iaload/Test_iaload.java b/tools/dx-tests/src/dxc/junit/opcodes/iaload/Test_iaload.java
deleted file mode 100644
index 0b37ac2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iaload/Test_iaload.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iaload;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.iaload.jm.T_iaload_1;
-
-public class Test_iaload extends DxTestCase {
-
-    /**
-     * @title Normal test/. Trying different indexes
-     */
-    public void testN1() {
-        T_iaload_1 t = new T_iaload_1();
-        int[] arr = new int[2];
-        arr[1] = 100000000;
-        assertEquals(100000000, t.run(arr, 1));
-    }
-
-    /**
-     * @title Normal test/. Trying different indexes
-     */
-    public void testN2() {
-        T_iaload_1 t = new T_iaload_1();
-        int[] arr = new int[2];
-        arr[0] = 100000000;
-        assertEquals(100000000, t.run(arr, 0));
-    }
-
-    /**
-     * @title expected ArrayIndexOutOfBoundsException
-     */
-    public void testE1() {
-        T_iaload_1 t = new T_iaload_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_iaload_1 t = new T_iaload_1();
-        try {
-            t.run(null, 2);
-            fail("expected NullPointerException");
-        } catch (NullPointerException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @title expected ArrayIndexOutOfBoundsException
-     */
-    public void testE3() {
-        T_iaload_1 t = new T_iaload_1();
-        int[] arr = new int[2];
-        try {
-            t.run(arr, -1);
-            fail("expected ArrayIndexOutOfBoundsException");
-        } catch (ArrayIndexOutOfBoundsException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.iaload.jm.T_iaload_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.iaload.jm.T_iaload_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, double
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.iaload.jm.T_iaload_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, long
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.iaload.jm.T_iaload_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - Object, int
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.iaload.jm.T_iaload_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double[], int
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.iaload.jm.T_iaload_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long[], int
-     */
-    public void testVFE7() {
-        try {
-            Class.forName("dxc.junit.opcodes.iaload.jm.T_iaload_8");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, reference
-     */
-    public void testVFE8() {
-        try {
-            Class.forName("dxc.junit.opcodes.iaload.jm.T_iaload_9");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_1.j b/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_1.j
deleted file mode 100644
index 097f974..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_1.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iaload_1.java
-.class public dxc/junit/opcodes/iaload/jm/T_iaload_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([II)I
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_2
-
-    iaload
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_1.java b/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_1.java
deleted file mode 100644
index 06baef4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iaload.jm;
-
-public class T_iaload_1 {
-    public int run(int[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_2.j b/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_2.j
deleted file mode 100644
index 949cf4c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_2.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iaload_2.java
-.class public dxc/junit/opcodes/iaload/jm/T_iaload_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([II)I
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-;    iload_2
-
-    iaload
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_2.java b/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_2.java
deleted file mode 100644
index dda4c99..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_2.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iaload.jm;
-
-public class T_iaload_2 {
-
-    public int run(int[] arr, int idx) {
-        return arr[idx];
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_3.j b/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_3.j
deleted file mode 100644
index f54bde1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_3.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iaload_3.java
-.class public dxc/junit/opcodes/iaload/jm/T_iaload_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([II)I
-    .limit stack 3
-    .limit locals 4
-
-    ;aload_1
-    iload_2
-    iaload
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_3.java b/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_3.java
deleted file mode 100644
index 3ce0959..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_3.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iaload.jm;
-
-public class T_iaload_3 {
-
-    public int run(int[] arr, int idx) {
-        return arr[idx];
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_4.j b/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_4.j
deleted file mode 100644
index fd6243c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_4.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iaload_4.java
-.class public dxc/junit/opcodes/iaload/jm/T_iaload_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run([ID)I
-    .limit stack 4
-    .limit locals 5
-
-    aload_1
-    dload_2
-;    d2i
-    iaload
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_4.java b/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_4.java
deleted file mode 100644
index 376f303..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_4.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iaload.jm;
-
-public class T_iaload_4 {
-
-    public int run(int[] arr, double idx) {
-        return arr[(int)idx];
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_5.j b/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_5.j
deleted file mode 100644
index b29eeae..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_5.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iaload_5.java
-.class public dxc/junit/opcodes/iaload/jm/T_iaload_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run([IJ)I
-    .limit stack 4
-    .limit locals 5
-
-    aload_1
-    lload_2
-;    l2i
-    iaload
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_5.java b/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_5.java
deleted file mode 100644
index a1e260b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iaload.jm;
-
-public class T_iaload_5 {
-
-    public int run(int[] arr, long idx) {
-        return arr[(int)idx];
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_6.j b/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_6.j
deleted file mode 100644
index dd84023..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_6.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iaload_6.java
-.class public dxc/junit/opcodes/iaload/jm/T_iaload_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/Object;[II)I
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_3
-
-    iaload
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_6.java b/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_6.java
deleted file mode 100644
index b371b7b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iaload.jm;
-
-public class T_iaload_6 {
-
-    public int run(Object a, int[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_7.j b/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_7.j
deleted file mode 100644
index 5989d3c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_7.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iaload_7.java
-.class public dxc/junit/opcodes/iaload/jm/T_iaload_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run([D[II)I
-    .limit stack 2
-    .limit locals 4
-    aload_1
-    iload_3
-    iaload
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_7.java b/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_7.java
deleted file mode 100644
index a6ab6ed..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iaload.jm;
-
-public class T_iaload_7 {
-
-    public int run(double[] a, int[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_8.j b/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_8.j
deleted file mode 100644
index 3b83df4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_8.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iaload_8.java
-.class public dxc/junit/opcodes/iaload/jm/T_iaload_8
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run([J[II)I
-    .limit stack 2
-    .limit locals 4
-    aload_1
-    iload_3
-    iaload
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_8.java b/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_8.java
deleted file mode 100644
index 7fc1fd4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iaload.jm;
-
-public class T_iaload_8 {
-
-    public int run(long[] a, int[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_9.j b/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_9.j
deleted file mode 100644
index 73c8718..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_9.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iaload_9.java
-.class public dxc/junit/opcodes/iaload/jm/T_iaload_9
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([II)I
-    .limit stack 2
-    .limit locals 3
-
-    aload_1
-    aload_0
-    iaload
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_9.java b/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_9.java
deleted file mode 100644
index 3ac4522..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iaload/jm/T_iaload_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iaload.jm;
-
-public class T_iaload_9 {
-    
-    public int run(int[] arr, int idx) {
-        return arr[idx];
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iand/Test_iand.java b/tools/dx-tests/src/dxc/junit/opcodes/iand/Test_iand.java
deleted file mode 100644
index 3ffc871..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iand/Test_iand.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iand;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.iand.jm.T_iand_1;
-
-public class Test_iand extends DxTestCase {
-
-    /**
-     * @title Arguments = 15, 8
-     */
-    public void testN1() {
-        T_iand_1 t = new T_iand_1();
-        assertEquals(8, t.run(15, 8));
-    }
-
-    /**
-     * @title Arguments = 0xfffffff8, 0xfffffff1
-     */
-    public void testN2() {
-        T_iand_1 t = new T_iand_1();
-        assertEquals(0xfffffff0, t.run(0xfffffff8, 0xfffffff1));
-    }
-
-    /**
-     * @title  Arguments = 0xcafe & -1
-     */
-    public void testN3() {
-        T_iand_1 t = new T_iand_1();
-        assertEquals(0xcafe, t.run(0xcafe, -1));
-    }
-
-    /**
-     * @title  Arguments = 0 & -1
-     */
-    public void testB1() {
-        T_iand_1 t = new T_iand_1();
-        assertEquals(0, t.run(0, -1));
-    }
-
-    /**
-     * @title  Arguments = Integer.MAX_VALUE & Integer.MIN_VALUE
-     */
-    public void testB2() {
-        T_iand_1 t = new T_iand_1();
-        assertEquals(0, t.run(Integer.MAX_VALUE, Integer.MIN_VALUE));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.iand.jm.T_iand_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double & int
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.iand.jm.T_iand_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long & int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.iand.jm.T_iand_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int & reference
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.iand.jm.T_iand_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iand/jm/T_iand_1.j b/tools/dx-tests/src/dxc/junit/opcodes/iand/jm/T_iand_1.j
deleted file mode 100644
index 8a1bd03..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iand/jm/T_iand_1.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iand_1.java
-.class public dxc/junit/opcodes/iand/jm/T_iand_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-    iload_1
-    iload_2
-    iand
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iand/jm/T_iand_1.java b/tools/dx-tests/src/dxc/junit/opcodes/iand/jm/T_iand_1.java
deleted file mode 100644
index e0783a5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iand/jm/T_iand_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iand.jm;
-
-public class T_iand_1 {
-
-    public int run(int a, int b) {
-        return a & b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iand/jm/T_iand_2.j b/tools/dx-tests/src/dxc/junit/opcodes/iand/jm/T_iand_2.j
deleted file mode 100644
index 44323a9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iand/jm/T_iand_2.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iand_2.java
-.class public dxc/junit/opcodes/iand/jm/T_iand_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-    iload_1
-;    iload_2
-    iand
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iand/jm/T_iand_2.java b/tools/dx-tests/src/dxc/junit/opcodes/iand/jm/T_iand_2.java
deleted file mode 100644
index 6eef083..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iand/jm/T_iand_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iand.jm;
-
-public class T_iand_2 {
-
-    public int run(int a, int b) {
-        return a & b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iand/jm/T_iand_3.j b/tools/dx-tests/src/dxc/junit/opcodes/iand/jm/T_iand_3.j
deleted file mode 100644
index f5ea270..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iand/jm/T_iand_3.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iand_3.java
-.class public dxc/junit/opcodes/iand/jm/T_iand_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(DI)I
-    .limit stack 3
-    .limit locals 4
-
-    dload_1
-;    d2i
-    iload_3
-    iand
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iand/jm/T_iand_3.java b/tools/dx-tests/src/dxc/junit/opcodes/iand/jm/T_iand_3.java
deleted file mode 100644
index c87a78f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iand/jm/T_iand_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iand.jm;
-
-public class T_iand_3 {
-
-    public int run(double a, int b) {
-        return (int)a & b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iand/jm/T_iand_4.j b/tools/dx-tests/src/dxc/junit/opcodes/iand/jm/T_iand_4.j
deleted file mode 100644
index c849643..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iand/jm/T_iand_4.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iand_4.java
-.class public dxc/junit/opcodes/iand/jm/T_iand_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(IJ)I
-    .limit stack 3
-    .limit locals 4
-
-    iload_1
-    lload_2
-;    l2i
-    iand
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iand/jm/T_iand_4.java b/tools/dx-tests/src/dxc/junit/opcodes/iand/jm/T_iand_4.java
deleted file mode 100644
index bbfe63d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iand/jm/T_iand_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iand.jm;
-
-public class T_iand_4 {
-
-    public int run(int a, long b) {
-        return a & (int)b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iand/jm/T_iand_5.j b/tools/dx-tests/src/dxc/junit/opcodes/iand/jm/T_iand_5.j
deleted file mode 100644
index daa5908..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iand/jm/T_iand_5.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iand_5.java
-.class public dxc/junit/opcodes/iand/jm/T_iand_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    aload_0
-    iand
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iand/jm/T_iand_5.java b/tools/dx-tests/src/dxc/junit/opcodes/iand/jm/T_iand_5.java
deleted file mode 100644
index 177c707..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iand/jm/T_iand_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iand.jm;
-
-public class T_iand_5 {
-    
-    public int run(int a, int b) {
-        return a & b;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iastore/Test_iastore.java b/tools/dx-tests/src/dxc/junit/opcodes/iastore/Test_iastore.java
deleted file mode 100644
index 539e8ae..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iastore/Test_iastore.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iastore;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.iastore.jm.T_iastore_1;
-
-public class Test_iastore extends DxTestCase {
-
-    /**
-     * @title Normal test/. Trying different indexes
-     */
-    public void testN1() {
-        T_iastore_1 t = new T_iastore_1();
-        int[] arr = new int[2];
-        t.run(arr, 1, 100000000);
-        assertEquals(100000000, arr[1]);
-    }
-
-    /**
-     * @title Normal test/. Trying different indexes
-     */
-    public void testN2() {
-        T_iastore_1 t = new T_iastore_1();
-        int[] arr = new int[2];
-        t.run(arr, 0, 100000000);
-        assertEquals(100000000, arr[0]);
-    }
-
-    /**
-     * @title expected ArrayIndexOutOfBoundsException
-     */
-    public void testE1() {
-        T_iastore_1 t = new T_iastore_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_iastore_1 t = new T_iastore_1();
-        try {
-            t.run(null, 2, 100000000);
-            fail("expected NullPointerException");
-        } catch (NullPointerException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @title expected ArrayIndexOutOfBoundsException
-     */
-    public void testE3() {
-        T_iastore_1 t = new T_iastore_1();
-        int[] arr = new int[2];
-        try {
-            t.run(arr, -1, 100000000);
-            fail("expected ArrayIndexOutOfBoundsException");
-        } catch (ArrayIndexOutOfBoundsException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.iastore.jm.T_iastore_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.iastore.jm.T_iastore_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, double,
-     * int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.iastore.jm.T_iastore_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, int, long
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.iastore.jm.T_iastore_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - object, int, int
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.iastore.jm.T_iastore_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double[], int,
-     * int
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.iastore.jm.T_iastore_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long[], int, int
-     */
-    public void testVFE7() {
-        try {
-            Class.forName("dxc.junit.opcodes.iastore.jm.T_iastore_8");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, reference,
-     * long
-     */
-    public void testVFE8() {
-        try {
-            Class.forName("dxc.junit.opcodes.iastore.jm.T_iastore_9");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_1.j b/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_1.j
deleted file mode 100644
index 8a2c771..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_1.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iastore_1.java
-.class public dxc/junit/opcodes/iastore/jm/T_iastore_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([III)V
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_2
-    iload_3
-    iastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_1.java b/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_1.java
deleted file mode 100644
index 253e9d3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iastore.jm;
-
-public class T_iastore_1 {
-    public void run(int[] arr, int idx, int value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_2.j b/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_2.j
deleted file mode 100644
index 7c34197..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_2.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iastore_2.java
-.class public dxc/junit/opcodes/iastore/jm/T_iastore_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([III)V
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_2
-    ;iload_3
-    iastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_2.java b/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_2.java
deleted file mode 100644
index f407f92..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iastore.jm;
-
-public class T_iastore_2 {
-
-    public void run(int[] arr, int idx, int value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_3.j b/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_3.j
deleted file mode 100644
index cb6cfb5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_3.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iastore_3.java
-.class public dxc/junit/opcodes/iastore/jm/T_iastore_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([III)V
-    .limit stack 3
-    .limit locals 4
-
-    ;aload_1
-    iload_2
-    iload_3
-    iastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_3.java b/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_3.java
deleted file mode 100644
index 0df3ee9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iastore.jm;
-
-public class T_iastore_3 {
-
-    public void run(int[] arr, int idx, int value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_4.j b/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_4.j
deleted file mode 100644
index 0fa6d09..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_4.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iastore_4.java
-.class public dxc/junit/opcodes/iastore/jm/T_iastore_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run([IDI)V
-    .limit stack 4
-    .limit locals 5
-
-    aload_1
-    dload_2
-;    d2i
-    iload 4
-
-    iastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_4.java b/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_4.java
deleted file mode 100644
index 0706835..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iastore.jm;
-
-public class T_iastore_4 {
-
-    public void run(int[] arr, double idx, int value) {
-        arr[(int)idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_5.j b/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_5.j
deleted file mode 100644
index 59f0399..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_5.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iastore_5.java
-.class public dxc/junit/opcodes/iastore/jm/T_iastore_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run([IIJ)V
-    .limit stack 4
-    .limit locals 5
-
-    aload_1
-    iload_2
-    lload_3
-;    l2i
-    iastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_5.java b/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_5.java
deleted file mode 100644
index 989da2f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iastore.jm;
-
-public class T_iastore_5 {
-
-    public void run(int[] arr, int idx, long value) {
-        arr[idx] = (int)value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_6.j b/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_6.j
deleted file mode 100644
index f3d75dc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_6.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iastore_6.java
-.class public dxc/junit/opcodes/iastore/jm/T_iastore_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/Object;II)V
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_2
-    iload_3
-    iastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_6.java b/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_6.java
deleted file mode 100644
index 0f5ea3e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iastore.jm;
-
-public class T_iastore_6 {
-
-    public void run(Object a, int[] arr, int idx, int value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_7.j b/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_7.j
deleted file mode 100644
index 5ee1b4d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_7.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iastore_7.java
-.class public dxc/junit/opcodes/iastore/jm/T_iastore_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([D[III)V
-    .limit stack 3
-    .limit locals 5
-    
-    aload_1
-    iload_3
-    iload 4
-    iastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_7.java b/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_7.java
deleted file mode 100644
index 22b4348..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iastore.jm;
-
-public class T_iastore_7 {
-
-    public void run(double a[], int[] arr, int idx, int value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_8.j b/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_8.j
deleted file mode 100644
index 1de1c74..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_8.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iastore_8.java
-.class public dxc/junit/opcodes/iastore/jm/T_iastore_8
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([J[III)V
-    .limit stack 3
-    .limit locals 5
-    
-    aload_1
-    iload_3
-    iload 4
-    iastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_8.java b/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_8.java
deleted file mode 100644
index 5493e4d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iastore.jm;
-
-public class T_iastore_8 {
-
-    public void run(long a[], int[] arr, int idx, int value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_9.j b/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_9.j
deleted file mode 100644
index a0b993b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_9.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iastore_9.java
-.class public dxc/junit/opcodes/iastore/jm/T_iastore_9
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([III)V
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    aload_0
-    iload_3
-    iastore
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_9.java b/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_9.java
deleted file mode 100644
index 8b30629..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iastore/jm/T_iastore_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iastore.jm;
-
-public class T_iastore_9 {
-    
-    public void run(int[] arr, int idx, int value) {
-        arr[idx] = value;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_0/Test_iconst_0.java b/tools/dx-tests/src/dxc/junit/opcodes/iconst_0/Test_iconst_0.java
deleted file mode 100644
index d394385..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_0/Test_iconst_0.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iconst_0;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.iconst_0.jm.T_iconst_0_1;
-
-public class Test_iconst_0 extends DxTestCase {
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_iconst_0_1 t = new T_iconst_0_1();
-        int b = 1234;
-        int c = 1234;
-        int d = b - c;
-        assertEquals(d, t.run());
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.iconst_0.jm.T_iconst_0_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_0/jm/T_iconst_0_1.j b/tools/dx-tests/src/dxc/junit/opcodes/iconst_0/jm/T_iconst_0_1.j
deleted file mode 100644
index 9510066..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_0/jm/T_iconst_0_1.j
+++ /dev/null
@@ -1,28 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iconst_0_1.java
-.class public dxc/junit/opcodes/iconst_0/jm/T_iconst_0_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    iconst_0
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_0/jm/T_iconst_0_1.java b/tools/dx-tests/src/dxc/junit/opcodes/iconst_0/jm/T_iconst_0_1.java
deleted file mode 100644
index 112b6d5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_0/jm/T_iconst_0_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iconst_0.jm;
-
-public class T_iconst_0_1 {
-
-    public int run() {
-        return 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_0/jm/T_iconst_0_2.j b/tools/dx-tests/src/dxc/junit/opcodes/iconst_0/jm/T_iconst_0_2.j
deleted file mode 100644
index 90d93a8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_0/jm/T_iconst_0_2.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iconst_0_2.java
-.class public dxc/junit/opcodes/iconst_0/jm/T_iconst_0_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 1
-;    .limit locals 1
-
-    iconst_0
-    iconst_0
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_0/jm/T_iconst_0_2.java b/tools/dx-tests/src/dxc/junit/opcodes/iconst_0/jm/T_iconst_0_2.java
deleted file mode 100644
index 9f40962..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_0/jm/T_iconst_0_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iconst_0.jm;
-
-public class T_iconst_0_2 {
-
-    public int run() {
-        return 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_1/Test_iconst_1.java b/tools/dx-tests/src/dxc/junit/opcodes/iconst_1/Test_iconst_1.java
deleted file mode 100644
index 2ceda6d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_1/Test_iconst_1.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iconst_1;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.iconst_1.jm.T_iconst_1_1;
-
-public class Test_iconst_1 extends DxTestCase {
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_iconst_1_1 t = new T_iconst_1_1();
-        int b = 1235;
-        int c = 1234;
-        int d = b - c;
-        assertEquals(d, t.run());
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.iconst_1.jm.T_iconst_1_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_1/jm/T_iconst_1_1.j b/tools/dx-tests/src/dxc/junit/opcodes/iconst_1/jm/T_iconst_1_1.j
deleted file mode 100644
index b7c4558..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_1/jm/T_iconst_1_1.j
+++ /dev/null
@@ -1,28 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iconst_1_1.java
-.class public dxc/junit/opcodes/iconst_1/jm/T_iconst_1_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_1/jm/T_iconst_1_1.java b/tools/dx-tests/src/dxc/junit/opcodes/iconst_1/jm/T_iconst_1_1.java
deleted file mode 100644
index 963428c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_1/jm/T_iconst_1_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iconst_1.jm;
-
-public class T_iconst_1_1 {
-
-    public int run() {
-        return 1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_1/jm/T_iconst_1_2.j b/tools/dx-tests/src/dxc/junit/opcodes/iconst_1/jm/T_iconst_1_2.j
deleted file mode 100644
index 10f3e61..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_1/jm/T_iconst_1_2.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iconst_1_2.java
-.class public dxc/junit/opcodes/iconst_1/jm/T_iconst_1_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 1
-;    .limit locals 1
- 
-    iconst_1
-    iconst_1
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_1/jm/T_iconst_1_2.java b/tools/dx-tests/src/dxc/junit/opcodes/iconst_1/jm/T_iconst_1_2.java
deleted file mode 100644
index c2f95f1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_1/jm/T_iconst_1_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iconst_1.jm;
-
-public class T_iconst_1_2 {
-
-    public int run() {
-        return 1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_2/Test_iconst_2.java b/tools/dx-tests/src/dxc/junit/opcodes/iconst_2/Test_iconst_2.java
deleted file mode 100644
index fc3b558..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_2/Test_iconst_2.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iconst_2;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.iconst_2.jm.T_iconst_2_1;
-
-public class Test_iconst_2 extends DxTestCase {
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_iconst_2_1 t = new T_iconst_2_1();
-        int b = 1236;
-        int c = 1234;
-        int d = b - c;
-        assertEquals(d, t.run());
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.iconst_2.jm.T_iconst_2_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_2/jm/T_iconst_2_1.j b/tools/dx-tests/src/dxc/junit/opcodes/iconst_2/jm/T_iconst_2_1.j
deleted file mode 100644
index 582564e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_2/jm/T_iconst_2_1.j
+++ /dev/null
@@ -1,28 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iconst_2_1.java
-.class public dxc/junit/opcodes/iconst_2/jm/T_iconst_2_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    iconst_2
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_2/jm/T_iconst_2_1.java b/tools/dx-tests/src/dxc/junit/opcodes/iconst_2/jm/T_iconst_2_1.java
deleted file mode 100644
index 7a00ed3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_2/jm/T_iconst_2_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iconst_2.jm;
-
-public class T_iconst_2_1 {
-
-    public int run() {
-        return 2;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_2/jm/T_iconst_2_2.j b/tools/dx-tests/src/dxc/junit/opcodes/iconst_2/jm/T_iconst_2_2.j
deleted file mode 100644
index d0a6b7e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_2/jm/T_iconst_2_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iconst_2_2.java
-.class public dxc/junit/opcodes/iconst_2/jm/T_iconst_2_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()I
-    .limit stack 1
-;    .limit locals 1
-
-    iconst_2
-    iconst_2    
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_2/jm/T_iconst_2_2.java b/tools/dx-tests/src/dxc/junit/opcodes/iconst_2/jm/T_iconst_2_2.java
deleted file mode 100644
index c9b35a6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_2/jm/T_iconst_2_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iconst_2.jm;
-
-public class T_iconst_2_2 {
-
-    public int run() {
-        return 2;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_3/Test_iconst_3.java b/tools/dx-tests/src/dxc/junit/opcodes/iconst_3/Test_iconst_3.java
deleted file mode 100644
index 7c35d71..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_3/Test_iconst_3.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iconst_3;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.iconst_3.jm.T_iconst_3_1;
-
-public class Test_iconst_3 extends DxTestCase {
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_iconst_3_1 t = new T_iconst_3_1();
-        int b = 1237;
-        int c = 1234;
-        int d = b - c;
-        assertEquals(d, t.run());
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.iconst_3.jm.T_iconst_3_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_3/jm/T_iconst_3_1.j b/tools/dx-tests/src/dxc/junit/opcodes/iconst_3/jm/T_iconst_3_1.j
deleted file mode 100644
index ef97813..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_3/jm/T_iconst_3_1.j
+++ /dev/null
@@ -1,28 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iconst_3_1.java
-.class public dxc/junit/opcodes/iconst_3/jm/T_iconst_3_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    iconst_3
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_3/jm/T_iconst_3_1.java b/tools/dx-tests/src/dxc/junit/opcodes/iconst_3/jm/T_iconst_3_1.java
deleted file mode 100644
index c3ce680..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_3/jm/T_iconst_3_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iconst_3.jm;
-
-public class T_iconst_3_1 {
-
-    public int run() {
-        return 3;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_3/jm/T_iconst_3_2.j b/tools/dx-tests/src/dxc/junit/opcodes/iconst_3/jm/T_iconst_3_2.j
deleted file mode 100644
index 9c501dd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_3/jm/T_iconst_3_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iconst_3_2.java
-.class public dxc/junit/opcodes/iconst_3/jm/T_iconst_3_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()I
-    .limit stack 1
-;    .limit locals 1
-
-    iconst_3
-    iconst_3
-    
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_3/jm/T_iconst_3_2.java b/tools/dx-tests/src/dxc/junit/opcodes/iconst_3/jm/T_iconst_3_2.java
deleted file mode 100644
index 2e5cfc3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_3/jm/T_iconst_3_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iconst_3.jm;
-
-public class T_iconst_3_2 {
-
-    public int run() {
-        return 3;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_4/Test_iconst_4.java b/tools/dx-tests/src/dxc/junit/opcodes/iconst_4/Test_iconst_4.java
deleted file mode 100644
index f883f6d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_4/Test_iconst_4.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iconst_4;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.iconst_4.jm.T_iconst_4_1;
-
-public class Test_iconst_4 extends DxTestCase {
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_iconst_4_1 t = new T_iconst_4_1();
-        int b = 1238;
-        int c = 1234;
-        int d = b - c;
-        assertEquals(d, t.run());
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.iconst_4.jm.T_iconst_4_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_4/jm/T_iconst_4_1.j b/tools/dx-tests/src/dxc/junit/opcodes/iconst_4/jm/T_iconst_4_1.j
deleted file mode 100644
index 0bc6c6a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_4/jm/T_iconst_4_1.j
+++ /dev/null
@@ -1,29 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iconst_4_1.java
-.class public dxc/junit/opcodes/iconst_4/jm/T_iconst_4_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    iconst_4
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_4/jm/T_iconst_4_1.java b/tools/dx-tests/src/dxc/junit/opcodes/iconst_4/jm/T_iconst_4_1.java
deleted file mode 100644
index b662051..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_4/jm/T_iconst_4_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iconst_4.jm;
-
-public class T_iconst_4_1 {
-
-    public int run() {
-        return 4;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_4/jm/T_iconst_4_2.j b/tools/dx-tests/src/dxc/junit/opcodes/iconst_4/jm/T_iconst_4_2.j
deleted file mode 100644
index 36ae08b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_4/jm/T_iconst_4_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iconst_4_2.java
-.class public dxc/junit/opcodes/iconst_4/jm/T_iconst_4_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()I
-    .limit stack 1
-;    .limit locals 1
-
-    iconst_4
-    iconst_4    
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_4/jm/T_iconst_4_2.java b/tools/dx-tests/src/dxc/junit/opcodes/iconst_4/jm/T_iconst_4_2.java
deleted file mode 100644
index effef30..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_4/jm/T_iconst_4_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iconst_4.jm;
-
-public class T_iconst_4_2 {
-
-    public int run() {
-        return 4;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_5/Test_iconst_5.java b/tools/dx-tests/src/dxc/junit/opcodes/iconst_5/Test_iconst_5.java
deleted file mode 100644
index 6fbe360..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_5/Test_iconst_5.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iconst_5;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.iconst_5.jm.T_iconst_5_1;
-
-public class Test_iconst_5 extends DxTestCase {
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_iconst_5_1 t = new T_iconst_5_1();
-        int b = 1239;
-        int c = 1234;
-        int d = b - c;
-        assertEquals(d, t.run());
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.iconst_5.jm.T_iconst_5_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_5/jm/T_iconst_5_1.j b/tools/dx-tests/src/dxc/junit/opcodes/iconst_5/jm/T_iconst_5_1.j
deleted file mode 100644
index 12b2f81..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_5/jm/T_iconst_5_1.j
+++ /dev/null
@@ -1,28 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iconst_5_1.java
-.class public dxc/junit/opcodes/iconst_5/jm/T_iconst_5_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    iconst_5
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_5/jm/T_iconst_5_1.java b/tools/dx-tests/src/dxc/junit/opcodes/iconst_5/jm/T_iconst_5_1.java
deleted file mode 100644
index 0762065..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_5/jm/T_iconst_5_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iconst_5.jm;
-
-public class T_iconst_5_1 {
-
-    public int run() {
-        return 5;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_5/jm/T_iconst_5_2.j b/tools/dx-tests/src/dxc/junit/opcodes/iconst_5/jm/T_iconst_5_2.j
deleted file mode 100644
index 307c804..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_5/jm/T_iconst_5_2.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iconst_5_2.java
-.class public dxc/junit/opcodes/iconst_5/jm/T_iconst_5_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()I
-    .limit stack 1
-;    .limit locals 1
-
-    iconst_5
-    iconst_5
-        
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_5/jm/T_iconst_5_2.java b/tools/dx-tests/src/dxc/junit/opcodes/iconst_5/jm/T_iconst_5_2.java
deleted file mode 100644
index ec01b76..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_5/jm/T_iconst_5_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iconst_5.jm;
-
-public class T_iconst_5_2 {
-
-    public int run() {
-        return 5;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_m1/Test_iconst_m1.java b/tools/dx-tests/src/dxc/junit/opcodes/iconst_m1/Test_iconst_m1.java
deleted file mode 100644
index 9eb2765..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_m1/Test_iconst_m1.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iconst_m1;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.iconst_m1.jm.T_iconst_m1_1;
-
-public class Test_iconst_m1 extends DxTestCase {
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_iconst_m1_1 t = new T_iconst_m1_1();
-        int b = 1233;
-        int c = 1234;
-        int d = b - c;
-        assertEquals(d, t.run());
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.iconst_m1.jm.T_iconst_m1_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_m1/jm/T_iconst_m1_1.j b/tools/dx-tests/src/dxc/junit/opcodes/iconst_m1/jm/T_iconst_m1_1.j
deleted file mode 100644
index 4cc89b1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_m1/jm/T_iconst_m1_1.j
+++ /dev/null
@@ -1,28 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iconst_m1_1.java
-.class public dxc/junit/opcodes/iconst_m1/jm/T_iconst_m1_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    iconst_m1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_m1/jm/T_iconst_m1_1.java b/tools/dx-tests/src/dxc/junit/opcodes/iconst_m1/jm/T_iconst_m1_1.java
deleted file mode 100644
index e54eee4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_m1/jm/T_iconst_m1_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iconst_m1.jm;
-
-public class T_iconst_m1_1 {
-
-    public int run() {
-        return -1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_m1/jm/T_iconst_m1_2.j b/tools/dx-tests/src/dxc/junit/opcodes/iconst_m1/jm/T_iconst_m1_2.j
deleted file mode 100644
index 68cb7ee..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_m1/jm/T_iconst_m1_2.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iconst_m1_2.java
-.class public dxc/junit/opcodes/iconst_m1/jm/T_iconst_m1_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()I
-    .limit stack 1
-;    .limit locals 1
-
-    iconst_m1
-    iconst_m1    
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iconst_m1/jm/T_iconst_m1_2.java b/tools/dx-tests/src/dxc/junit/opcodes/iconst_m1/jm/T_iconst_m1_2.java
deleted file mode 100644
index ad1c701..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iconst_m1/jm/T_iconst_m1_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iconst_m1.jm;
-
-public class T_iconst_m1_2 {
-
-    public int run() {
-        return -1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/idiv/Test_idiv.java b/tools/dx-tests/src/dxc/junit/opcodes/idiv/Test_idiv.java
deleted file mode 100644
index 73ca296..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/idiv/Test_idiv.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.idiv;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.idiv.jm.T_idiv_1;
-
-public class Test_idiv extends DxTestCase {
-
-    /**
-     * @title Arguments = 8, 4
-     */
-    public void testN1() {
-        T_idiv_1 t = new T_idiv_1();
-        assertEquals(2, t.run(8, 4));
-    }
-
-    /**
-     * @title  Rounding
-     */
-    public void testN2() {
-        T_idiv_1 t = new T_idiv_1();
-        assertEquals(268435455, t.run(1073741823, 4));
-    }
-
-    /**
-     * @title  Dividend = 0
-     */
-    public void testN3() {
-        T_idiv_1 t = new T_idiv_1();
-        assertEquals(0, t.run(0, 4));
-    }
-
-    /**
-     * @title  Dividend is negative
-     */
-    public void testN4() {
-        T_idiv_1 t = new T_idiv_1();
-        assertEquals(-3, t.run(-10, 3));
-    }
-
-    /**
-     * @title  Divisor is negative
-     */
-    public void testN5() {
-        T_idiv_1 t = new T_idiv_1();
-        assertEquals(-357913941, t.run(1073741824, -3));
-    }
-
-    /**
-     * @title  Both Dividend and divisor are negative
-     */
-    public void testN6() {
-        T_idiv_1 t = new T_idiv_1();
-        assertEquals(5965, t.run(-17895697, -3000));
-    }
-
-    /**
-     * @title Arguments = Integer.MIN_VALUE, -1
-     */
-    public void testB1() {
-        T_idiv_1 t = new T_idiv_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_idiv_1 t = new T_idiv_1();
-        assertEquals(Integer.MIN_VALUE, t.run(Integer.MIN_VALUE, 1));
-    }
-
-    /**
-     * @title Arguments = Integer.MAX_VALUE, 1
-     */
-    public void testB3() {
-        T_idiv_1 t = new T_idiv_1();
-        assertEquals(Integer.MAX_VALUE, t.run(Integer.MAX_VALUE, 1));
-    }
-
-    /**
-     * @title Arguments = Integer.MIN_VALUE, Integer.MAX_VALUE
-     */
-    public void testB4() {
-        T_idiv_1 t = new T_idiv_1();
-        assertEquals(-1, t.run(Integer.MIN_VALUE, Integer.MAX_VALUE));
-    }
-    
-    /**
-     * @title Arguments = 1, Integer.MAX_VALUE
-     */
-    public void testB5() {
-        T_idiv_1 t = new T_idiv_1();
-        assertEquals(0, t.run(1, Integer.MAX_VALUE));
-    }
-
-    /**
-     * @title Arguments = 1, Integer.MIN_VALUE
-     */
-    public void testB6() {
-        T_idiv_1 t = new T_idiv_1();
-        assertEquals(0, t.run(1, Integer.MIN_VALUE));
-    }
-
-    /**
-     * @title  Divisor is 0
-     */
-    public void testE1() {
-        T_idiv_1 t = new T_idiv_1();
-        try {
-            t.run(1, 0);
-            fail("expected ArithmeticException");
-        } catch (ArithmeticException ae) {
-            // expected
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.idiv.jm.T_idiv_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int / double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.idiv.jm.T_idiv_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long / int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.idiv.jm.T_idiv_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference / int
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.idiv.jm.T_idiv_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/idiv/jm/T_idiv_1.j b/tools/dx-tests/src/dxc/junit/opcodes/idiv/jm/T_idiv_1.j
deleted file mode 100644
index 97b601d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/idiv/jm/T_idiv_1.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_idiv_1.java
-.class public dxc/junit/opcodes/idiv/jm/T_idiv_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-    iload_1
-    iload_2
-    idiv
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/idiv/jm/T_idiv_1.java b/tools/dx-tests/src/dxc/junit/opcodes/idiv/jm/T_idiv_1.java
deleted file mode 100644
index b3e1ecc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/idiv/jm/T_idiv_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.idiv.jm;
-
-public class T_idiv_1 {
-
-    public int run(int a, int b) {
-        return a/b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/idiv/jm/T_idiv_2.j b/tools/dx-tests/src/dxc/junit/opcodes/idiv/jm/T_idiv_2.j
deleted file mode 100644
index 71cd321..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/idiv/jm/T_idiv_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_idiv_2.java
-.class public dxc/junit/opcodes/idiv/jm/T_idiv_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-    iload_1
-    ; iload_2    
-    idiv
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/idiv/jm/T_idiv_2.java b/tools/dx-tests/src/dxc/junit/opcodes/idiv/jm/T_idiv_2.java
deleted file mode 100644
index ec8834c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/idiv/jm/T_idiv_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.idiv.jm;
-
-public class T_idiv_2 {
-
-    public int run(int a, int b) {
-        return a/b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/idiv/jm/T_idiv_3.j b/tools/dx-tests/src/dxc/junit/opcodes/idiv/jm/T_idiv_3.j
deleted file mode 100644
index 897b705..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/idiv/jm/T_idiv_3.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_idiv_3.java
-.class public dxc/junit/opcodes/idiv/jm/T_idiv_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(ID)I
-    .limit stack 3
-    .limit locals 5
-    iload_1
-    dload_2    
-    idiv
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/idiv/jm/T_idiv_3.java b/tools/dx-tests/src/dxc/junit/opcodes/idiv/jm/T_idiv_3.java
deleted file mode 100644
index a28eb6a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/idiv/jm/T_idiv_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.idiv.jm;
-
-public class T_idiv_3 {
-
-    public int run(int a, double b) {
-        return a/(int)b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/idiv/jm/T_idiv_4.j b/tools/dx-tests/src/dxc/junit/opcodes/idiv/jm/T_idiv_4.j
deleted file mode 100644
index ddf5f01..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/idiv/jm/T_idiv_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_idiv_4.java
-.class public dxc/junit/opcodes/idiv/jm/T_idiv_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(JI)I
-    .limit stack 3
-    .limit locals 4
-
-    lload_1
-;    l2i
-    iload_3
-    idiv
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/idiv/jm/T_idiv_4.java b/tools/dx-tests/src/dxc/junit/opcodes/idiv/jm/T_idiv_4.java
deleted file mode 100644
index c2cf3dd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/idiv/jm/T_idiv_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.idiv.jm;
-
-public class T_idiv_4 {
-
-    public int run(long a, int b) {
-        return (int)a/b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/idiv/jm/T_idiv_5.j b/tools/dx-tests/src/dxc/junit/opcodes/idiv/jm/T_idiv_5.j
deleted file mode 100644
index 20b4402..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/idiv/jm/T_idiv_5.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_idiv_5.java
-.class public dxc/junit/opcodes/idiv/jm/T_idiv_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-
-    aload_0
-    iload_2
-    idiv
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/idiv/jm/T_idiv_5.java b/tools/dx-tests/src/dxc/junit/opcodes/idiv/jm/T_idiv_5.java
deleted file mode 100644
index c5a3579..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/idiv/jm/T_idiv_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.idiv.jm;
-
-public class T_idiv_5 {
-    
-    public int run(int a, int b) {
-        return a/b;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/Test_if_acmpeq.java b/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/Test_if_acmpeq.java
deleted file mode 100644
index 2591871..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/Test_if_acmpeq.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_acmpeq;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.if_acmpeq.jm.T_if_acmpeq_1;
-
-public class Test_if_acmpeq extends DxTestCase {
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_if_acmpeq_1 t = new T_if_acmpeq_1();
-        String a = "a";
-        String b = "b";
-
-        /*
-         * Compare with 1234 to check that in case of failed comparison
-         * execution proceeds at the address following if_acmpeq instruction
-         */
-        assertEquals(1234, t.run(a, b));
-    }
-
-    /**
-     * @title  normal test
-     */
-    public void testN2() {
-        T_if_acmpeq_1 t = new T_if_acmpeq_1();
-        String a = "a";
-        assertEquals(1, t.run(a, a));
-    }
-
-    /**
-     * @title  Compare with null
-     */
-    public void testB1() {
-        T_if_acmpeq_1 t = new T_if_acmpeq_1();
-        String a = "a";
-        assertEquals(1234, t.run(null, a));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_acmpeq.jm.T_if_acmpeq_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference, double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_acmpeq.jm.T_if_acmpeq_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference,
-     * integer
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_acmpeq.jm.T_if_acmpeq_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall be inside the
-     * method
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_acmpeq.jm.T_if_acmpeq_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall not be "inside" wide
-     * instruction
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_acmpeq.jm.T_if_acmpeq_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_1.j b/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_1.j
deleted file mode 100644
index c31a282..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_1.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_acmpeq_1.java
-.class public dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-; this method returns 1234 in case of failed comparison to check that execution proceeds
-; at the address following if_acmpeq instruction
-.method public run(Ljava/lang/String;Ljava/lang/String;)I
-    .limit stack 2
-    .limit locals 3
-    aload_1
-    aload_2
-    if_acmpeq Label0
-    sipush 1234
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_1.java b/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_1.java
deleted file mode 100644
index e72a4fb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_acmpeq.jm;
-
-public class T_if_acmpeq_1 {
-
-    public int run(String a, String b) {
-        return a == b ? 1 : 1234;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_2.j b/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_2.j
deleted file mode 100644
index 51fb9e4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_2.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_acmpeq_2.java
-.class public dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/String;Ljava/lang/String;)Z
-    .limit stack 2
-    .limit locals 3
-;    aload_1
-    aload_2
-    if_acmpeq Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_2.java b/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_2.java
deleted file mode 100644
index f346bae..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_acmpeq.jm;
-
-public class T_if_acmpeq_2 {
-
-    public boolean run(String a, String b) {
-        return a == b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_3.j b/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_3.j
deleted file mode 100644
index cc93549..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_3.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_acmpeq_3.java
-.class public dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/String;Ljava/lang/String;)Z
-    .limit stack 4
-    .limit locals 3
-
-    aload_1
-    dconst_1
-    if_acmpeq Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_3.java b/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_3.java
deleted file mode 100644
index 2f986fb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_acmpeq.jm;
-
-public class T_if_acmpeq_3 {
-
-    public boolean run(String a, String b) {
-        return a == b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_4.j b/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_4.j
deleted file mode 100644
index 3541259..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_4.j
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_acmpeq_4.java
-.class public dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(Ljava/lang/String;Ljava/lang/String;)Z
-    .limit stack 2
-    .limit locals 3
-
-    aload_1
-    iconst_1
-    
-    if_acmpeq Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_4.java b/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_4.java
deleted file mode 100644
index 995a198..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_acmpeq.jm;
-
-public class T_if_acmpeq_4 {
-
-    public boolean run(String a, String b) {
-        return a == b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_5.cfh b/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_5.cfh
deleted file mode 100644
index 657c425..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_5.cfh
+++ /dev/null
@@ -1,197 +0,0 @@
-//@class:dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_5
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 08 
-    // parsed:, offset 15, len 42, h: 0002: utf8{"(Ljava/lang/String;Ljava/lang/String;)Z"}
-    // .  .  '  (  L  j  a  v  a  /  l  a  n  g  /  S  t  r  i  n  g  ;  L  j  a  v  a  /  l  a  n  g  /  S  t  r  i  n  g  ;  )  Z  
-       01 00 27 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 5a 
-    // parsed:, offset 57, len 19, h: 0003: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 76, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 89, len 47, h: 0005: utf8{"dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_5"}
-    // .  .  ,  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  _  a  c  m  p  e  q  /  j  m  /  T  _  i  f  _  a  c  m  p  e  q  _  5  
-       01 00 2c 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 5f 61 63 6d 70 65 71 2f 6a 6d 2f 54 5f 69 66 5f 61 63 6d 70 65 71 5f 35 
-    // parsed:, offset 136, len 9, h: 0006: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 145, len 6, h: 0007: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 151, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 06 00 0a 
-    // parsed:, offset 156, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 163, len 6, h: 000a: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 169, len 3, h: 000b: type{dxc.junit.opcodes.if_acmpeq.jm.T_if_acmpeq_5}
-    // .  .  .  
-       07 00 05 
-    // parsed:, offset 172, len 21, h: 000c: utf8{"T_if_acmpeq_5.java"}
-    // .  .  .  T  _  i  f  _  a  c  m  p  e  q  _  5  .  j  a  v  a  
-       01 00 12 54 5f 69 66 5f 61 63 6d 70 65 71 5f 35 2e 6a 61 76 61 
-    // parsed:, offset 193, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 03 
-// parsed:, offset 196, len 0, h: end constant_pool
-// parsed:, offset 196, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 198, len 2, h: this_class: type{dxc.junit.opcodes.if_acmpeq.jm.T_if_acmpeq_5}
-// .  .  
-   00 0b 
-// parsed:, offset 200, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 202, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 204, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 206, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 208, len:76,desc: ()V
-// parsed:, offset 208, len 0, h:  methods[0]: 
-    // parsed:, offset 208, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 210, len 2, h: name: <init>
-    // .  .  
-       00 06 
-    // parsed:, offset 212, len 2, h: descriptor: ()V
-    // .  .  
-       00 0a 
-    // parsed:, offset 214, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 216, len 0, h:  attributes[0]: 
-        // parsed:, offset 216, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 218, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 222, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 224, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 226, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 235, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 237, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 239, len 0, h: end attributes[0] 
-// parsed:, offset 239, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 239, len:45,desc: (Ljava/lang/String;Ljava/lang/String;)Z
-// parsed:, offset 239, len 0, h:  methods[1]: 
-    // parsed:, offset 239, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 241, len 2, h: name: run
-    // .  .  
-       00 07 
-    // parsed:, offset 243, len 2, h: descriptor: (Ljava/lang/String;Ljava/lang/String;)Z
-    // .  .  
-       00 02 
-    // parsed:, offset 245, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 247, len 0, h:  attributes[0]: 
-        // parsed:, offset 247, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 249, len 4, h: length: 00000015
-        // .  .  .  .  
-           00 00 00 15 
-        // parsed:, offset 253, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 255, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 257, len 4, h: code_length: 00000009
-        // .  .  .  .  
-           00 00 00 09 
-        // parsed:, offset 0, len 1, h: 0000: aload_1 // 01
-        // +  
-           2b 
-        // parsed:, offset 1, len 1, h: 0001: aload_2 // 02
-        // ,  
-           2c 
-        // parsed:, offset 2, len 3, h: 0002: if_acmpeq 0007
-        // .  .  .  
-//@mod     a5 00 05    
-           a5 00 ff 
-        // parsed:, offset 5, len 1, h: 0005: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 6, len 1, h: 0006: ireturn
-        // .  
-           ac 
-        // parsed:, offset 7, len 1, h: 0007: iconst_1 // #+01
-        // .  
-           04 
-        // parsed:, offset 8, len 1, h: 0008: ireturn
-        // .  
-           ac 
-        // parsed:, offset 270, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 272, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 274, len 0, h: end attributes[0] 
-// parsed:, offset 274, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (Ljava/lang/String;Ljava/lang/String;)Z
-// parsed:, offset 274, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 276, len 0, h:  attributes[0]: 
-    // parsed:, offset 276, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 278, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 282, len 2, h: source: utf8{"T_if_acmpeq_5.java"}
-    // .  .  
-       00 0c 
-// parsed:, offset 284, len 0, h: end attributes[0] 
-// parsed:, offset 284, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_5.j b/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_5.j
deleted file mode 100644
index 12d77df..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_5.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_acmpeq_5.java
-.class public dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(Ljava/lang/String;Ljava/lang/String;)Z
-    .limit stack 2
-    .limit locals 3
-    
-    aload_1
-    aload_2
-    if_acmpeq Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-    
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_5.java b/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_5.java
deleted file mode 100644
index ec022a5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_acmpeq.jm;
-
-public class T_if_acmpeq_5 {
-
-    public boolean run(String a, String b) {
-        return a == b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_6.cfh b/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_6.cfh
deleted file mode 100644
index 3b400e22..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_6.cfh
+++ /dev/null
@@ -1,205 +0,0 @@
-//@class:dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_6
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 09 
-    // parsed:, offset 15, len 42, h: 0002: utf8{"(Ljava/lang/String;Ljava/lang/String;)Z"}
-    // .  .  '  (  L  j  a  v  a  /  l  a  n  g  /  S  t  r  i  n  g  ;  L  j  a  v  a  /  l  a  n  g  /  S  t  r  i  n  g  ;  )  Z  
-       01 00 27 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 5a 
-    // parsed:, offset 57, len 19, h: 0003: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 76, len 47, h: 0004: utf8{"dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_6"}
-    // .  .  ,  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  _  a  c  m  p  e  q  /  j  m  /  T  _  i  f  _  a  c  m  p  e  q  _  6  
-       01 00 2c 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 5f 61 63 6d 70 65 71 2f 6a 6d 2f 54 5f 69 66 5f 61 63 6d 70 65 71 5f 36 
-    // parsed:, offset 123, len 13, h: 0005: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 136, len 9, h: 0006: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 145, len 21, h: 0007: utf8{"T_if_acmpeq_6.java"}
-    // .  .  .  T  _  i  f  _  a  c  m  p  e  q  _  6  .  j  a  v  a  
-       01 00 12 54 5f 69 66 5f 61 63 6d 70 65 71 5f 36 2e 6a 61 76 61 
-    // parsed:, offset 166, len 6, h: 0008: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 172, len 5, h: 0009: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 06 00 0b 
-    // parsed:, offset 177, len 7, h: 000a: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 184, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 190, len 3, h: 000c: type{dxc.junit.opcodes.if_acmpeq.jm.T_if_acmpeq_6}
-    // .  .  .  
-       07 00 04 
-    // parsed:, offset 193, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 03 
-// parsed:, offset 196, len 0, h: end constant_pool
-// parsed:, offset 196, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 198, len 2, h: this_class: type{dxc.junit.opcodes.if_acmpeq.jm.T_if_acmpeq_6}
-// .  .  
-   00 0c 
-// parsed:, offset 200, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 202, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 204, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 206, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 208, len:79,desc: ()V
-// parsed:, offset 208, len 0, h:  methods[0]: 
-    // parsed:, offset 208, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 210, len 2, h: name: <init>
-    // .  .  
-       00 06 
-    // parsed:, offset 212, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 214, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 216, len 0, h:  attributes[0]: 
-        // parsed:, offset 216, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 218, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 222, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 224, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 226, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 235, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 237, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 239, len 0, h: end attributes[0] 
-// parsed:, offset 239, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 239, len:48,desc: (Ljava/lang/String;Ljava/lang/String;)Z
-// parsed:, offset 239, len 0, h:  methods[1]: 
-    // parsed:, offset 239, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 241, len 2, h: name: run
-    // .  .  
-       00 08 
-    // parsed:, offset 243, len 2, h: descriptor: (Ljava/lang/String;Ljava/lang/String;)Z
-    // .  .  
-       00 02 
-    // parsed:, offset 245, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 247, len 0, h:  attributes[0]: 
-        // parsed:, offset 247, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 249, len 4, h: length: 00000018
-        // .  .  .  .  
-           00 00 00 18 
-        // parsed:, offset 253, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 255, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 257, len 4, h: code_length: 0000000c
-        // .  .  .  .  
-           00 00 00 0c 
-        // parsed:, offset 0, len 1, h: 0000: aload_1 // 01
-        // +  
-           2b 
-        // parsed:, offset 1, len 1, h: 0001: aload_2 // 02
-        // ,  
-           2c 
-        // parsed:, offset 2, len 3, h: 0002: if_acmpeq 0008
-        // .  .  .  
-//@mod     a5 00 05    
-           a5 00 06 
-        // parsed:, offset 5, len 1, h: 0005: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 6, len 1, h: 0006: ireturn
-        // .  
-           ac 
-        // parsed:, offset 7, len 1, h: 0007: wide
-        // .
-//@mod     00      
-           c4 
-        // parsed:, offset 8, len 2, h: 0008: iload 01
-        // .  .  
-           15 01 
-        // parsed:, offset 10, len 1, h: 000a: nop
-        // . 
-//@mod     00     
-           02 
-        // parsed:, offset 11, len 1, h: 000b: ireturn
-        // .  
-           ac 
-        // parsed:, offset 273, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 275, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 277, len 0, h: end attributes[0] 
-// parsed:, offset 277, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (Ljava/lang/String;Ljava/lang/String;)Z
-// parsed:, offset 277, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 279, len 0, h:  attributes[0]: 
-    // parsed:, offset 279, len 2, h: name: SourceFile
-    // .  .  
-       00 05 
-    // parsed:, offset 281, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 285, len 2, h: source: utf8{"T_if_acmpeq_6.java"}
-    // .  .  
-       00 07 
-// parsed:, offset 287, len 0, h: end attributes[0] 
-// parsed:, offset 287, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_6.j b/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_6.j
deleted file mode 100644
index 855ba59..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_6.j
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_acmpeq_6.java
-.class public dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(Ljava/lang/String;Ljava/lang/String;)Z
-    .limit stack 2
-    .limit locals 3
-    aload_1
-    aload_2
-    if_acmpeq Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    nop
-    iload 1
-    nop
-    ; iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_6.java b/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_6.java
deleted file mode 100644
index 3e5bb90..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpeq/jm/T_if_acmpeq_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_acmpeq.jm;
-
-public class T_if_acmpeq_6 {
-
-    public boolean run(String a, String b) {
-        return a == b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/Test_if_acmpne.java b/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/Test_if_acmpne.java
deleted file mode 100644
index 012742d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/Test_if_acmpne.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_acmpne;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.if_acmpne.jm.T_if_acmpne_1;
-
-public class Test_if_acmpne extends DxTestCase {
-
-    /**
-     * @title  normal test
-     */
-    public void testN1() {
-        T_if_acmpne_1 t = new T_if_acmpne_1();
-        String a = "a";
-        String b = "b";
-        /*
-         * Compare with 1234 to check that in case of failed comparison
-         * execution proceeds at the address following if_acmpeq instruction
-         */
-        assertEquals(1234, t.run(a, b));
-    }
-
-    /**
-     * @title  normal test
-     */
-    public void testN2() {
-        T_if_acmpne_1 t = new T_if_acmpne_1();
-        String a = "a";
-        assertEquals(1, t.run(a, a));
-    }
-
-    /**
-     * @title  Compare with null
-     */
-    public void testB1() {
-        T_if_acmpne_1 t = new T_if_acmpne_1();
-        String a = "a";
-        assertEquals(1234, t.run(a, null));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_acmpne.jm.T_if_acmpne_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference, double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_acmpne.jm.T_if_acmpne_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference,
-     * integer
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_acmpne.jm.T_if_acmpne_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall be inside the
-     * method
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_acmpne.jm.T_if_acmpne_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall not be "inside" wide
-     * instruction
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_acmpne.jm.T_if_acmpne_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_1.j b/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_1.j
deleted file mode 100644
index b500b91..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_1.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_acmpne_1.java
-.class public dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-; this method returns 1234 in case of failed comparison to check that execution proceeds
-; at the address following if_acmpeq instruction
-.method public run(Ljava/lang/String;Ljava/lang/String;)I
-    .limit stack 2
-    .limit locals 3
-   
-    aload_1
-    aload_2
-    if_acmpne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    sipush 1234
-    ireturn
-    
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_1.java b/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_1.java
deleted file mode 100644
index 4485e6f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_acmpne.jm;
-
-public class T_if_acmpne_1 {
-
-    public int run(String a, String b) {
-        return a == b ? 1 : 1234;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_2.j b/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_2.j
deleted file mode 100644
index 1e84a6e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_2.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_acmpne_2.java
-.class public dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/String;Ljava/lang/String;)Z
-    .limit stack 2
-    .limit locals 3
-
-    aload_1
-;    aload_2
-    if_acmpne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_2.java b/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_2.java
deleted file mode 100644
index 52b734c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_acmpne.jm;
-
-public class T_if_acmpne_2 {
-
-    public boolean run(String a, String b) {
-        return a == b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_3.j b/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_3.j
deleted file mode 100644
index 48c32da..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_3.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_acmpne_3.java
-.class public dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/String;Ljava/lang/String;)Z
-    .limit stack 4
-    .limit locals 3
-   
-    aload_1
-    dconst_1
-    if_acmpne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-    
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_3.java b/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_3.java
deleted file mode 100644
index 609e0ad..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_acmpne.jm;
-
-public class T_if_acmpne_3 {
-
-    public boolean run(String a, String b) {
-        return a == b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_4.j b/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_4.j
deleted file mode 100644
index b167481..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_4.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_acmpne_4.java
-.class public dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/String;Ljava/lang/String;)Z
-    .limit stack 2
-    .limit locals 3
-   
-    aload_1
-    iconst_1
-    if_acmpne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-    
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_4.java b/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_4.java
deleted file mode 100644
index 1abd87a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_acmpne.jm;
-
-public class T_if_acmpne_4 {
-
-    public boolean run(String a, String b) {
-        return a == b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_5.cfh b/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_5.cfh
deleted file mode 100644
index 85dfc7a8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_5.cfh
+++ /dev/null
@@ -1,197 +0,0 @@
-//@class:dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_5
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 47, h: 0001: utf8{"dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_5"}
-    // .  .  ,  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  _  a  c  m  p  n  e  /  j  m  /  T  _  i  f  _  a  c  m  p  n  e  _  5  
-       01 00 2c 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 5f 61 63 6d 70 6e 65 2f 6a 6d 2f 54 5f 69 66 5f 61 63 6d 70 6e 65 5f 35 
-    // parsed:, offset 57, len 5, h: 0002: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 08 
-    // parsed:, offset 62, len 42, h: 0003: utf8{"(Ljava/lang/String;Ljava/lang/String;)Z"}
-    // .  .  '  (  L  j  a  v  a  /  l  a  n  g  /  S  t  r  i  n  g  ;  L  j  a  v  a  /  l  a  n  g  /  S  t  r  i  n  g  ;  )  Z  
-       01 00 27 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 5a 
-    // parsed:, offset 104, len 19, h: 0004: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 123, len 13, h: 0005: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 136, len 9, h: 0006: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 145, len 6, h: 0007: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 151, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 06 00 0a 
-    // parsed:, offset 156, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 163, len 6, h: 000a: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 169, len 3, h: 000b: type{dxc.junit.opcodes.if_acmpne.jm.T_if_acmpne_5}
-    // .  .  .  
-       07 00 01 
-    // parsed:, offset 172, len 21, h: 000c: utf8{"T_if_acmpne_5.java"}
-    // .  .  .  T  _  i  f  _  a  c  m  p  n  e  _  5  .  j  a  v  a  
-       01 00 12 54 5f 69 66 5f 61 63 6d 70 6e 65 5f 35 2e 6a 61 76 61 
-    // parsed:, offset 193, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 04 
-// parsed:, offset 196, len 0, h: end constant_pool
-// parsed:, offset 196, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 198, len 2, h: this_class: type{dxc.junit.opcodes.if_acmpne.jm.T_if_acmpne_5}
-// .  .  
-   00 0b 
-// parsed:, offset 200, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 202, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 204, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 206, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 208, len:76,desc: ()V
-// parsed:, offset 208, len 0, h:  methods[0]: 
-    // parsed:, offset 208, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 210, len 2, h: name: <init>
-    // .  .  
-       00 06 
-    // parsed:, offset 212, len 2, h: descriptor: ()V
-    // .  .  
-       00 0a 
-    // parsed:, offset 214, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 216, len 0, h:  attributes[0]: 
-        // parsed:, offset 216, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 218, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 222, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 224, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 226, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 02 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 235, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 237, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 239, len 0, h: end attributes[0] 
-// parsed:, offset 239, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 239, len:45,desc: (Ljava/lang/String;Ljava/lang/String;)Z
-// parsed:, offset 239, len 0, h:  methods[1]: 
-    // parsed:, offset 239, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 241, len 2, h: name: run
-    // .  .  
-       00 07 
-    // parsed:, offset 243, len 2, h: descriptor: (Ljava/lang/String;Ljava/lang/String;)Z
-    // .  .  
-       00 03 
-    // parsed:, offset 245, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 247, len 0, h:  attributes[0]: 
-        // parsed:, offset 247, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 249, len 4, h: length: 00000015
-        // .  .  .  .  
-           00 00 00 15 
-        // parsed:, offset 253, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 255, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 257, len 4, h: code_length: 00000009
-        // .  .  .  .  
-           00 00 00 09 
-        // parsed:, offset 0, len 1, h: 0000: aload_1 // 01
-        // +  
-           2b 
-        // parsed:, offset 1, len 1, h: 0001: aload_2 // 02
-        // ,  
-           2c 
-        // parsed:, offset 2, len 3, h: 0002: if_acmpne 00ff
-        // .  .  .  
-//@mod     a6 00 05    
-           a6 00 ff 
-        // parsed:, offset 5, len 1, h: 0005: iconst_1 // #+01
-        // .  
-           04 
-        // parsed:, offset 6, len 1, h: 0006: ireturn
-        // .  
-           ac 
-        // parsed:, offset 7, len 1, h: 0007: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 8, len 1, h: 0008: ireturn
-        // .  
-           ac 
-        // parsed:, offset 270, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 272, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 274, len 0, h: end attributes[0] 
-// parsed:, offset 274, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (Ljava/lang/String;Ljava/lang/String;)Z
-// parsed:, offset 274, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 276, len 0, h:  attributes[0]: 
-    // parsed:, offset 276, len 2, h: name: SourceFile
-    // .  .  
-       00 05 
-    // parsed:, offset 278, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 282, len 2, h: source: utf8{"T_if_acmpne_5.java"}
-    // .  .  
-       00 0c 
-// parsed:, offset 284, len 0, h: end attributes[0] 
-// parsed:, offset 284, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_5.j b/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_5.j
deleted file mode 100644
index 46a46dd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_5.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_acmpne_5.java
-.class public dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/String;Ljava/lang/String;)Z
-    .limit stack 2
-    .limit locals 3
-   
-    aload_1
-    aload_2
-    if_acmpne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-    
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_5.java b/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_5.java
deleted file mode 100644
index 1eb6ef6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_acmpne.jm;
-
-public class T_if_acmpne_5 {
-
-    public boolean run(String a, String b) {
-        return a == b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_6.cfh b/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_6.cfh
deleted file mode 100644
index ffe5bbf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_6.cfh
+++ /dev/null
@@ -1,204 +0,0 @@
-//@class:dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_6
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0c 00 08 
-    // parsed:, offset 15, len 42, h: 0002: utf8{"(Ljava/lang/String;Ljava/lang/String;)Z"}
-    // .  .  '  (  L  j  a  v  a  /  l  a  n  g  /  S  t  r  i  n  g  ;  L  j  a  v  a  /  l  a  n  g  /  S  t  r  i  n  g  ;  )  Z  
-       01 00 27 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 5a 
-    // parsed:, offset 57, len 19, h: 0003: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 76, len 21, h: 0004: utf8{"T_if_acmpne_6.java"}
-    // .  .  .  T  _  i  f  _  a  c  m  p  n  e  _  6  .  j  a  v  a  
-       01 00 12 54 5f 69 66 5f 61 63 6d 70 6e 65 5f 36 2e 6a 61 76 61 
-    // parsed:, offset 97, len 13, h: 0005: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 110, len 9, h: 0006: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 119, len 6, h: 0007: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 125, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 06 00 0a 
-    // parsed:, offset 130, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 137, len 6, h: 000a: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 143, len 3, h: 000b: type{dxc.junit.opcodes.if_acmpne.jm.T_if_acmpne_6}
-    // .  .  .  
-       07 00 0d 
-    // parsed:, offset 146, len 3, h: 000c: type{java.lang.Object}
-    // .  .  .  
-       07 00 03 
-    // parsed:, offset 149, len 47, h: 000d: utf8{"dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_6"}
-    // .  .  ,  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  _  a  c  m  p  n  e  /  j  m  /  T  _  i  f  _  a  c  m  p  n  e  _  6  
-       01 00 2c 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 5f 61 63 6d 70 6e 65 2f 6a 6d 2f 54 5f 69 66 5f 61 63 6d 70 6e 65 5f 36 
-// parsed:, offset 196, len 0, h: end constant_pool
-// parsed:, offset 196, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 198, len 2, h: this_class: type{dxc.junit.opcodes.if_acmpne.jm.T_if_acmpne_6}
-// .  .  
-   00 0b 
-// parsed:, offset 200, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0c 
-// parsed:, offset 202, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 204, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 206, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 208, len:79,desc: ()V
-// parsed:, offset 208, len 0, h:  methods[0]: 
-    // parsed:, offset 208, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 210, len 2, h: name: <init>
-    // .  .  
-       00 06 
-    // parsed:, offset 212, len 2, h: descriptor: ()V
-    // .  .  
-       00 0a 
-    // parsed:, offset 214, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 216, len 0, h:  attributes[0]: 
-        // parsed:, offset 216, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 218, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 222, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 224, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 226, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 235, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 237, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 239, len 0, h: end attributes[0] 
-// parsed:, offset 239, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 239, len:48,desc: (Ljava/lang/String;Ljava/lang/String;)Z
-// parsed:, offset 239, len 0, h:  methods[1]: 
-    // parsed:, offset 239, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 241, len 2, h: name: run
-    // .  .  
-       00 07 
-    // parsed:, offset 243, len 2, h: descriptor: (Ljava/lang/String;Ljava/lang/String;)Z
-    // .  .  
-       00 02 
-    // parsed:, offset 245, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 247, len 0, h:  attributes[0]: 
-        // parsed:, offset 247, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 249, len 4, h: length: 00000018
-        // .  .  .  .  
-           00 00 00 18 
-        // parsed:, offset 253, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 255, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 257, len 4, h: code_length: 0000000c
-        // .  .  .  .  
-           00 00 00 0c 
-        // parsed:, offset 0, len 1, h: 0000: aload_1 // 01
-        // +  
-           2b 
-        // parsed:, offset 1, len 1, h: 0001: aload_2 // 02
-        // ,  
-           2c 
-        // parsed:, offset 2, len 3, h: 0002: if_acmpne 0008
-        // .  .  .  
-//@mod     a6 00 05    
-           a6 00 06 
-        // parsed:, offset 5, len 1, h: 0005: iconst_1 // #+01
-        // .  
-           04 
-        // parsed:, offset 6, len 1, h: 0006: ireturn
-        // .  
-           ac 
-        // parsed:, offset 7, len 1, h: 0007: wide
-        // .  
-//@mod     00    
-           c4 
-        // parsed:, offset 8, len 2, h: 0008: iload 01
-        // .  .  
-           15 01 
-        // parsed:, offset 10, len 1, h: 000a: nop
-        // .  
-           00 
-        // parsed:, offset 11, len 1, h: 000b: ireturn
-        // .  
-           ac 
-        // parsed:, offset 273, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 275, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 277, len 0, h: end attributes[0] 
-// parsed:, offset 277, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (Ljava/lang/String;Ljava/lang/String;)Z
-// parsed:, offset 277, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 279, len 0, h:  attributes[0]: 
-    // parsed:, offset 279, len 2, h: name: SourceFile
-    // .  .  
-       00 05 
-    // parsed:, offset 281, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 285, len 2, h: source: utf8{"T_if_acmpne_6.java"}
-    // .  .  
-       00 04 
-// parsed:, offset 287, len 0, h: end attributes[0] 
-// parsed:, offset 287, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_6.j b/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_6.j
deleted file mode 100644
index 0ff4d66..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_6.j
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_acmpne_6.java
-.class public dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/String;Ljava/lang/String;)Z
-    .limit stack 2
-    .limit locals 3
-   
-    aload_1
-    aload_2
-    if_acmpne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-     nop
-    iload 1
-    nop    
-;    iconst_0
-    ireturn
-    
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_6.java b/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_6.java
deleted file mode 100644
index 24fc8f3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_acmpne/jm/T_if_acmpne_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_acmpne.jm;
-
-public class T_if_acmpne_6 {
-
-    public boolean run(String a, String b) {
-        return a == b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/Test_if_icmpeq.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/Test_if_icmpeq.java
deleted file mode 100644
index b538559..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/Test_if_icmpeq.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpeq;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.if_icmpeq.jm.T_if_icmpeq_1;
-
-public class Test_if_icmpeq extends DxTestCase {
-
-    /**
-     * @title  Arguments = 5, 6
-     */
-    public void testN1() {
-        T_if_icmpeq_1 t = new T_if_icmpeq_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, 6));
-    }
-
-    /**
-     * @title  Arguments = 0x0f0e0d0c, 0x0f0e0d0c
-     */
-    public void testN2() {
-        T_if_icmpeq_1 t = new T_if_icmpeq_1();
-        assertEquals(1, t.run(0x0f0e0d0c, 0x0f0e0d0c));
-    }
-
-    /**
-     * @title  Arguments = 5, -5
-     */
-    public void testN3() {
-        T_if_icmpeq_1 t = new T_if_icmpeq_1();
-        assertEquals(1234, t.run(5, -5));
-    }
-
-    /**
-     * @title  Arguments = 0x01001234, 0x1234
-     */
-    public void testN4() {
-        T_if_icmpeq_1 t = new T_if_icmpeq_1();
-        assertEquals(1234, t.run(0x01001234, 0x1234));
-    }
-
-    /**
-     * @title  Arguments = Integer.MAX_VALUE, Integer.MAX_VALUE
-     */
-    public void testB1() {
-        T_if_icmpeq_1 t = new T_if_icmpeq_1();
-        assertEquals(1, t.run(Integer.MAX_VALUE, Integer.MAX_VALUE));
-    }
-
-    /**
-     * @title  Arguments = Integer.MIN_VALUE, Integer.MIN_VALUE
-     */
-    public void testB2() {
-        T_if_icmpeq_1 t = new T_if_icmpeq_1();
-        assertEquals(1, t.run(Integer.MIN_VALUE, Integer.MIN_VALUE));
-    }
-
-    /**
-     * @title  Arguments = 0, 1234567
-     */
-    public void testB3() {
-        T_if_icmpeq_1 t = new T_if_icmpeq_1();
-        assertEquals(1234, t.run(0, 1234567));
-    }
-
-    /**
-     * @title  Arguments = 0, 0
-     */
-    public void testB4() {
-        T_if_icmpeq_1 t = new T_if_icmpeq_1();
-        assertEquals(1, t.run(0, 0));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmpeq.jm.T_if_icmpeq_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int, double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmpeq.jm.T_if_icmpeq_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long, int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmpeq.jm.T_if_icmpeq_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall be inside the
-     * method
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmpeq.jm.T_if_icmpeq_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall not be "inside" wide
-     * instruction
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmpeq.jm.T_if_icmpeq_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int, reference
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmpeq.jm.T_if_icmpeq_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_1.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_1.j
deleted file mode 100644
index d15a155..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_1.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmpeq_1.java
-.class public dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-; this method returns 1234 in case of failed comparison to check that execution proceeds
-; at the address following if_acmpeq instruction
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-    
-    iload_1
-    iload_2
-    
-    if_icmpeq Label0
-    sipush 1234
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_1.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_1.java
deleted file mode 100644
index 392360e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpeq.jm;
-
-public class T_if_icmpeq_1 {
-
-    public int run(int a, int b) {
-        return a == b ? 1 : 1234;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_2.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_2.j
deleted file mode 100644
index ca05c70..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_2.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmpeq_2.java
-.class public dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(II)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-;    iload_2
-    if_icmpeq Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_2.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_2.java
deleted file mode 100644
index a437976..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpeq.jm;
-
-public class T_if_icmpeq_2 {
-
-    public boolean run(int a, int b) {
-        return a == b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_3.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_3.j
deleted file mode 100644
index fc9e4aa..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_3.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmpeq_3.java
-.class public dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(II)Z
-    .limit stack 4
-    .limit locals 3
-
-    iload_1
-    dconst_1
-    if_icmpeq Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_3.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_3.java
deleted file mode 100644
index bc636ce..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpeq.jm;
-
-public class T_if_icmpeq_3 {
-
-    public boolean run(int a, int b) {
-        return a == b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_4.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_4.j
deleted file mode 100644
index 98266e8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_4.j
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmpeq_4.java
-.class public dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(II)Z
-    .limit stack 3
-    .limit locals 3
-
-    lconst_1    
-    iload_1
-    ;iload_2
-
-    if_icmpeq Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_4.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_4.java
deleted file mode 100644
index 4923485..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpeq.jm;
-
-public class T_if_icmpeq_4 {
-
-    public boolean run(int a, int b) {
-        return a == b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_5.cfh b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_5.cfh
deleted file mode 100644
index 00dbe44..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_5.cfh
+++ /dev/null
@@ -1,197 +0,0 @@
-//@class:dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_5
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 3, h: 0001: type{dxc.junit.opcodes.if_icmpeq.jm.T_if_icmpeq_5}
-    // .  .  .  
-       07 00 0b 
-    // parsed:, offset 13, len 5, h: 0002: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 09 
-    // parsed:, offset 18, len 19, h: 0003: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 37, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 50, len 8, h: 0005: utf8{"(II)Z"}
-    // .  .  .  (  I  I  )  Z  
-       01 00 05 28 49 49 29 5a 
-    // parsed:, offset 58, len 9, h: 0006: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 67, len 21, h: 0007: utf8{"T_if_icmpeq_5.java"}
-    // .  .  .  T  _  i  f  _  i  c  m  p  e  q  _  5  .  j  a  v  a  
-       01 00 12 54 5f 69 66 5f 69 63 6d 70 65 71 5f 35 2e 6a 61 76 61 
-    // parsed:, offset 88, len 6, h: 0008: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 94, len 5, h: 0009: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 06 00 0c 
-    // parsed:, offset 99, len 7, h: 000a: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 106, len 47, h: 000b: utf8{"dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_5"}
-    // .  .  ,  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  _  i  c  m  p  e  q  /  j  m  /  T  _  i  f  _  i  c  m  p  e  q  _  5  
-       01 00 2c 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 5f 69 63 6d 70 65 71 2f 6a 6d 2f 54 5f 69 66 5f 69 63 6d 70 65 71 5f 35 
-    // parsed:, offset 153, len 6, h: 000c: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 159, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 03 
-// parsed:, offset 162, len 0, h: end constant_pool
-// parsed:, offset 162, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 164, len 2, h: this_class: type{dxc.junit.opcodes.if_icmpeq.jm.T_if_icmpeq_5}
-// .  .  
-   00 01 
-// parsed:, offset 166, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 168, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 170, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 172, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 174, len:76,desc: ()V
-// parsed:, offset 174, len 0, h:  methods[0]: 
-    // parsed:, offset 174, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 176, len 2, h: name: <init>
-    // .  .  
-       00 06 
-    // parsed:, offset 178, len 2, h: descriptor: ()V
-    // .  .  
-       00 0c 
-    // parsed:, offset 180, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 182, len 0, h:  attributes[0]: 
-        // parsed:, offset 182, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 184, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 188, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 190, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 192, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 02 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 201, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 203, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 205, len 0, h: end attributes[0] 
-// parsed:, offset 205, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 205, len:45,desc: (II)Z
-// parsed:, offset 205, len 0, h:  methods[1]: 
-    // parsed:, offset 205, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 207, len 2, h: name: run
-    // .  .  
-       00 08 
-    // parsed:, offset 209, len 2, h: descriptor: (II)Z
-    // .  .  
-       00 05 
-    // parsed:, offset 211, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 213, len 0, h:  attributes[0]: 
-        // parsed:, offset 213, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 215, len 4, h: length: 00000015
-        // .  .  .  .  
-           00 00 00 15 
-        // parsed:, offset 219, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 221, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 223, len 4, h: code_length: 00000009
-        // .  .  .  .  
-           00 00 00 09 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 1, h: 0001: iload_2 // 02
-        // .  
-           1c 
-        // parsed:, offset 2, len 3, h: 0002: if_icmpeq 0007
-        // .  .  .  
-//@mod     9f 00 05    
-           9f 00 ff 
-        // parsed:, offset 5, len 1, h: 0005: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 6, len 1, h: 0006: ireturn
-        // .  
-           ac 
-        // parsed:, offset 7, len 1, h: 0007: iconst_1 // #+01
-        // .  
-           04 
-        // parsed:, offset 8, len 1, h: 0008: ireturn
-        // .  
-           ac 
-        // parsed:, offset 236, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 238, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 240, len 0, h: end attributes[0] 
-// parsed:, offset 240, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (II)Z
-// parsed:, offset 240, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 242, len 0, h:  attributes[0]: 
-    // parsed:, offset 242, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 244, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 248, len 2, h: source: utf8{"T_if_icmpeq_5.java"}
-    // .  .  
-       00 07 
-// parsed:, offset 250, len 0, h: end attributes[0] 
-// parsed:, offset 250, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_5.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_5.j
deleted file mode 100644
index add33fe..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_5.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmpeq_5.java
-.class public dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(II)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    iload_2
-    if_icmpeq Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_5.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_5.java
deleted file mode 100644
index c720274..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpeq.jm;
-
-public class T_if_icmpeq_5 {
-
-    public boolean run(int a, int b) {
-        return a == b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_6.cfh b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_6.cfh
deleted file mode 100644
index d1d6b8c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_6.cfh
+++ /dev/null
@@ -1,204 +0,0 @@
-//@class:dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_6
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0c 00 07 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 8, h: 0004: utf8{"(II)Z"}
-    // .  .  .  (  I  I  )  Z  
-       01 00 05 28 49 49 29 5a 
-    // parsed:, offset 55, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 64, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 70, len 5, h: 0007: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0b 
-    // parsed:, offset 75, len 7, h: 0008: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 82, len 47, h: 0009: utf8{"dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_6"}
-    // .  .  ,  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  _  i  c  m  p  e  q  /  j  m  /  T  _  i  f  _  i  c  m  p  e  q  _  6  
-       01 00 2c 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 5f 69 63 6d 70 65 71 2f 6a 6d 2f 54 5f 69 66 5f 69 63 6d 70 65 71 5f 36 
-    // parsed:, offset 129, len 21, h: 000a: utf8{"T_if_icmpeq_6.java"}
-    // .  .  .  T  _  i  f  _  i  c  m  p  e  q  _  6  .  j  a  v  a  
-       01 00 12 54 5f 69 66 5f 69 63 6d 70 65 71 5f 36 2e 6a 61 76 61 
-    // parsed:, offset 150, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 156, len 3, h: 000c: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-    // parsed:, offset 159, len 3, h: 000d: type{dxc.junit.opcodes.if_icmpeq.jm.T_if_icmpeq_6}
-    // .  .  .  
-       07 00 09 
-// parsed:, offset 162, len 0, h: end constant_pool
-// parsed:, offset 162, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 164, len 2, h: this_class: type{dxc.junit.opcodes.if_icmpeq.jm.T_if_icmpeq_6}
-// .  .  
-   00 0d 
-// parsed:, offset 166, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0c 
-// parsed:, offset 168, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 170, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 172, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 174, len:79,desc: ()V
-// parsed:, offset 174, len 0, h:  methods[0]: 
-    // parsed:, offset 174, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 176, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 178, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 180, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 182, len 0, h:  attributes[0]: 
-        // parsed:, offset 182, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 184, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 188, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 190, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 192, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 201, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 203, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 205, len 0, h: end attributes[0] 
-// parsed:, offset 205, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 205, len:48,desc: (II)Z
-// parsed:, offset 205, len 0, h:  methods[1]: 
-    // parsed:, offset 205, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 207, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 209, len 2, h: descriptor: (II)Z
-    // .  .  
-       00 04 
-    // parsed:, offset 211, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 213, len 0, h:  attributes[0]: 
-        // parsed:, offset 213, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 215, len 4, h: length: 00000018
-        // .  .  .  .  
-           00 00 00 18 
-        // parsed:, offset 219, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 221, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 223, len 4, h: code_length: 0000000c
-        // .  .  .  .  
-           00 00 00 0c 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 1, h: 0001: iload_2 // 02
-        // .  
-           1c 
-        // parsed:, offset 2, len 3, h: 0002: if_icmpeq 0008
-        // .  .  .  
-//@mod     9f 00 05    
-           9f 00 06 
-        // parsed:, offset 5, len 1, h: 0005: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 6, len 1, h: 0006: ireturn
-        // .  
-           ac 
-        // parsed:, offset 7, len 1, h: 0007: wide
-        // .  
-//@mod     00    
-           c4 
-        // parsed:, offset 8, len 2, h: 0008: iload 01
-        // .  .  
-           15 01 
-        // parsed:, offset 10, len 1, h: 000a: nop
-        // .  
-           00 
-        // parsed:, offset 11, len 1, h: 000b: ireturn
-        // .  
-           ac 
-        // parsed:, offset 239, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 241, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 243, len 0, h: end attributes[0] 
-// parsed:, offset 243, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (II)Z
-// parsed:, offset 243, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 245, len 0, h:  attributes[0]: 
-    // parsed:, offset 245, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 247, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 251, len 2, h: source: utf8{"T_if_icmpeq_6.java"}
-    // .  .  
-       00 0a 
-// parsed:, offset 253, len 0, h: end attributes[0] 
-// parsed:, offset 253, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_6.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_6.j
deleted file mode 100644
index 2b6a7b8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_6.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmpeq_6.java
-.class public dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(II)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    iload_2
-    if_icmpeq Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    nop
-    iload 1
-    nop
-;    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_6.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_6.java
deleted file mode 100644
index ee004b7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpeq.jm;
-
-public class T_if_icmpeq_6 {
-
-    public boolean run(int a, int b) {
-        return a == b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_7.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_7.j
deleted file mode 100644
index bee1c6c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_7.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmpeq_7.java
-.class public dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    aload_0
-    if_icmpne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-
-    Label2:
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_7.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_7.java
deleted file mode 100644
index 18aaaf9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpeq/jm/T_if_icmpeq_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpeq.jm;
-
-public class T_if_icmpeq_7 {
-    
-    public boolean run(int a, int b) {
-        return a == b;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/Test_if_icmpge.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/Test_if_icmpge.java
deleted file mode 100644
index ab38187..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/Test_if_icmpge.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpge;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.if_icmpge.jm.T_if_icmpge_1;
-
-public class Test_if_icmpge extends DxTestCase {
-
-    /**
-     * @title  Arguments = 5, 6
-     */
-    public void testN1() {
-        T_if_icmpge_1 t = new T_if_icmpge_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, 6));
-    }
-
-    /**
-     * @title  Arguments = 0x0f0e0d0c, 0x0f0e0d0c
-     */
-    public void testN2() {
-        T_if_icmpge_1 t = new T_if_icmpge_1();
-        assertEquals(1, t.run(0x0f0e0d0c, 0x0f0e0d0c));
-    }
-
-    /**
-     * @title  Arguments = 5, -5
-     */
-    public void testN3() {
-        T_if_icmpge_1 t = new T_if_icmpge_1();
-        assertEquals(1, t.run(5, -5));
-    }
-
-    /**
-     * @title  Arguments = 0x0f0e0d0d, 0x0f0e0d0c
-     */
-    public void testN4() {
-        T_if_icmpge_1 t = new T_if_icmpge_1();
-        assertEquals(1, t.run(0x0f0e0d0d, 0x0f0e0d0c));
-    }
-
-    /**
-     * @title  Arguments = 0x1234, 0x01001234
-     */
-    public void testN5() {
-        T_if_icmpge_1 t = new T_if_icmpge_1();
-        assertEquals(1234, t.run(0x1234, 0x01001234));
-    }
-
-    /**
-     * @title  Arguments = -5, 5
-     */
-    public void testN6() {
-        T_if_icmpge_1 t = new T_if_icmpge_1();
-        assertEquals(1234, t.run(-5, 5));
-    }
-
-    /**
-     * @title  Arguments = Integer.MAX_VALUE, Integer.MAX_VALUE
-     */
-    public void testB1() {
-        T_if_icmpge_1 t = new T_if_icmpge_1();
-        assertEquals(1, t.run(Integer.MAX_VALUE, Integer.MAX_VALUE));
-    }
-
-    /**
-     * @title  Arguments = Integer.MIN_VALUE, Integer.MIN_VALUE
-     */
-    public void testB2() {
-        T_if_icmpge_1 t = new T_if_icmpge_1();
-        assertEquals(1, t.run(Integer.MIN_VALUE, Integer.MIN_VALUE));
-    }
-
-    /**
-     * @title  Arguments = 1234567, 0
-     */
-    public void testB3() {
-        T_if_icmpge_1 t = new T_if_icmpge_1();
-        assertEquals(1, t.run(1234567, 0));
-    }
-
-    /**
-     * @title  Arguments = 0, 1234567
-     */
-    public void testB4() {
-        T_if_icmpge_1 t = new T_if_icmpge_1();
-        assertEquals(1234, t.run(0, 1234567));
-    }
-
-    /**
-     * @title  Arguments = 0, 0
-     */
-    public void testB5() {
-        T_if_icmpge_1 t = new T_if_icmpge_1();
-        assertEquals(1, t.run(0, 0));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmpge.jm.T_if_icmpge_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int, double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmpge.jm.T_if_icmpge_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long, int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmpge.jm.T_if_icmpge_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall be inside the
-     * method
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmpge.jm.T_if_icmpge_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall not be "inside" wide
-     * instruction
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmpge.jm.T_if_icmpge_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference, int
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmpge.jm.T_if_icmpge_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_1.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_1.j
deleted file mode 100644
index e283915..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_1.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_1.java
-.class public dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-; this method returns 1234 in case of failed comparison to check that execution proceeds
-; at the address following if_acmpeq instruction
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-    
-    iload_1
-    iload_2
-    
-    if_icmpge Label0
-    sipush 1234
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_1.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_1.java
deleted file mode 100644
index 719b6d0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpge.jm;
-
-public class T_if_icmpge_1 {
-
-    public int run(int a, int b) {
-        return a >= b ? 1 : 1234;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_2.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_2.j
deleted file mode 100644
index 3c2e871..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_2.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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 dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(II)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-;    iload_2
-    if_icmpge Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_2.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_2.java
deleted file mode 100644
index 175e276..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpge.jm;
-
-public class T_if_icmpge_2 {
-
-    public boolean run(int a, int b) {
-        return a >= b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_3.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_3.j
deleted file mode 100644
index 7f4b515..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_3.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_3.java
-.class public dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(II)Z
-    .limit stack 4
-    .limit locals 3
-
-    iload_1
-;    iload_2
-    dconst_1
-    if_icmpge Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_3.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_3.java
deleted file mode 100644
index 69addc3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpge.jm;
-
-public class T_if_icmpge_3 {
-
-    public boolean run(int a, int b) {
-        return a >= b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_4.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_4.j
deleted file mode 100644
index f8a9ddd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_4.j
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_4.java
-.class public dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(II)Z
-    .limit stack 3
-    .limit locals 3
-
-    lconst_1    
-    iload_1
-    ;iload_2
-
-    if_icmpge Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_4.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_4.java
deleted file mode 100644
index 8347b6c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpge.jm;
-
-public class T_if_icmpge_4 {
-
-    public boolean run(int a, int b) {
-        return a >= b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_5.cfh b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_5.cfh
deleted file mode 100644
index 16399c0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_5.cfh
+++ /dev/null
@@ -1,197 +0,0 @@
-//@class:dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_5
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 08 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 8, h: 0004: utf8{"(II)Z"}
-    // .  .  .  (  I  I  )  Z  
-       01 00 05 28 49 49 29 5a 
-    // parsed:, offset 55, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 64, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 70, len 21, h: 0007: utf8{"T_if_icmpge_5.java"}
-    // .  .  .  T  _  i  f  _  i  c  m  p  g  e  _  5  .  j  a  v  a  
-       01 00 12 54 5f 69 66 5f 69 63 6d 70 67 65 5f 35 2e 6a 61 76 61 
-    // parsed:, offset 91, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0c 
-    // parsed:, offset 96, len 3, h: 0009: type{dxc.junit.opcodes.if_icmpge.jm.T_if_icmpge_5}
-    // .  .  .  
-       07 00 0b 
-    // parsed:, offset 99, len 7, h: 000a: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 106, len 47, h: 000b: utf8{"dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_5"}
-    // .  .  ,  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  _  i  c  m  p  g  e  /  j  m  /  T  _  i  f  _  i  c  m  p  g  e  _  5  
-       01 00 2c 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 5f 69 63 6d 70 67 65 2f 6a 6d 2f 54 5f 69 66 5f 69 63 6d 70 67 65 5f 35 
-    // parsed:, offset 153, len 6, h: 000c: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 159, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 162, len 0, h: end constant_pool
-// parsed:, offset 162, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 164, len 2, h: this_class: type{dxc.junit.opcodes.if_icmpge.jm.T_if_icmpge_5}
-// .  .  
-   00 09 
-// parsed:, offset 166, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 168, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 170, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 172, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 174, len:76,desc: ()V
-// parsed:, offset 174, len 0, h:  methods[0]: 
-    // parsed:, offset 174, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 176, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 178, len 2, h: descriptor: ()V
-    // .  .  
-       00 0c 
-    // parsed:, offset 180, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 182, len 0, h:  attributes[0]: 
-        // parsed:, offset 182, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 184, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 188, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 190, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 192, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 201, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 203, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 205, len 0, h: end attributes[0] 
-// parsed:, offset 205, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 205, len:45,desc: (II)Z
-// parsed:, offset 205, len 0, h:  methods[1]: 
-    // parsed:, offset 205, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 207, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 209, len 2, h: descriptor: (II)Z
-    // .  .  
-       00 04 
-    // parsed:, offset 211, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 213, len 0, h:  attributes[0]: 
-        // parsed:, offset 213, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 215, len 4, h: length: 00000015
-        // .  .  .  .  
-           00 00 00 15 
-        // parsed:, offset 219, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 221, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 223, len 4, h: code_length: 00000009
-        // .  .  .  .  
-           00 00 00 09 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 1, h: 0001: iload_2 // 02
-        // .  
-           1c 
-        // parsed:, offset 2, len 3, h: 0002: if_icmpge 0007
-        // .  .  .  
-//@mod     a2 00 05    
-           a2 00 ff 
-        // parsed:, offset 5, len 1, h: 0005: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 6, len 1, h: 0006: ireturn
-        // .  
-           ac 
-        // parsed:, offset 7, len 1, h: 0007: iconst_1 // #+01
-        // .  
-           04 
-        // parsed:, offset 8, len 1, h: 0008: ireturn
-        // .  
-           ac 
-        // parsed:, offset 236, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 238, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 240, len 0, h: end attributes[0] 
-// parsed:, offset 240, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (II)Z
-// parsed:, offset 240, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 242, len 0, h:  attributes[0]: 
-    // parsed:, offset 242, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 244, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 248, len 2, h: source: utf8{"T_if_icmpge_5.java"}
-    // .  .  
-       00 07 
-// parsed:, offset 250, len 0, h: end attributes[0] 
-// parsed:, offset 250, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_5.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_5.j
deleted file mode 100644
index 30dbd29..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_5.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_5.java
-.class public dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(II)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    iload_2
-    if_icmpge Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_5.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_5.java
deleted file mode 100644
index 4ea2d24..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpge.jm;
-
-public class T_if_icmpge_5 {
-
-    public boolean run(int a, int b) {
-        return a >= b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_6.cfh b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_6.cfh
deleted file mode 100644
index 4f67cf3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_6.cfh
+++ /dev/null
@@ -1,204 +0,0 @@
-//@class:dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_6
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 08 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 8, h: 0004: utf8{"(II)Z"}
-    // .  .  .  (  I  I  )  Z  
-       01 00 05 28 49 49 29 5a 
-    // parsed:, offset 55, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 64, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 70, len 3, h: 0007: type{dxc.junit.opcodes.if_icmpge.jm.T_if_icmpge_6}
-    // .  .  .  
-       07 00 0a 
-    // parsed:, offset 73, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0c 
-    // parsed:, offset 78, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 85, len 47, h: 000a: utf8{"dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_6"}
-    // .  .  ,  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  _  i  c  m  p  g  e  /  j  m  /  T  _  i  f  _  i  c  m  p  g  e  _  6  
-       01 00 2c 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 5f 69 63 6d 70 67 65 2f 6a 6d 2f 54 5f 69 66 5f 69 63 6d 70 67 65 5f 36 
-    // parsed:, offset 132, len 21, h: 000b: utf8{"T_if_icmpge_6.java"}
-    // .  .  .  T  _  i  f  _  i  c  m  p  g  e  _  6  .  j  a  v  a  
-       01 00 12 54 5f 69 66 5f 69 63 6d 70 67 65 5f 36 2e 6a 61 76 61 
-    // parsed:, offset 153, len 6, h: 000c: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 159, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 162, len 0, h: end constant_pool
-// parsed:, offset 162, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 164, len 2, h: this_class: type{dxc.junit.opcodes.if_icmpge.jm.T_if_icmpge_6}
-// .  .  
-   00 07 
-// parsed:, offset 166, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 168, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 170, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 172, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 174, len:79,desc: ()V
-// parsed:, offset 174, len 0, h:  methods[0]: 
-    // parsed:, offset 174, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 176, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 178, len 2, h: descriptor: ()V
-    // .  .  
-       00 0c 
-    // parsed:, offset 180, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 182, len 0, h:  attributes[0]: 
-        // parsed:, offset 182, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 184, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 188, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 190, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 192, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 201, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 203, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 205, len 0, h: end attributes[0] 
-// parsed:, offset 205, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 205, len:48,desc: (II)Z
-// parsed:, offset 205, len 0, h:  methods[1]: 
-    // parsed:, offset 205, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 207, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 209, len 2, h: descriptor: (II)Z
-    // .  .  
-       00 04 
-    // parsed:, offset 211, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 213, len 0, h:  attributes[0]: 
-        // parsed:, offset 213, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 215, len 4, h: length: 00000018
-        // .  .  .  .  
-           00 00 00 18 
-        // parsed:, offset 219, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 221, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 223, len 4, h: code_length: 0000000c
-        // .  .  .  .  
-           00 00 00 0c 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 1, h: 0001: iload_2 // 02
-        // .  
-           1c 
-        // parsed:, offset 2, len 3, h: 0002: if_icmpge 0008
-        // .  .  .  
-//@mod     a2 00 05    
-           a2 00 06 
-        // parsed:, offset 5, len 1, h: 0005: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 6, len 1, h: 0006: ireturn
-        // .  
-           ac 
-        // parsed:, offset 7, len 1, h: 0007: wide
-        // .  
-//@mod     00    
-           c4 
-        // parsed:, offset 8, len 2, h: 0008: iload 01
-        // .  .  
-           15 01 
-        // parsed:, offset 10, len 1, h: 000a: nop
-        // .  
-           00 
-        // parsed:, offset 11, len 1, h: 000b: ireturn
-        // .  
-           ac 
-        // parsed:, offset 239, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 241, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 243, len 0, h: end attributes[0] 
-// parsed:, offset 243, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (II)Z
-// parsed:, offset 243, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 245, len 0, h:  attributes[0]: 
-    // parsed:, offset 245, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 247, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 251, len 2, h: source: utf8{"T_if_icmpge_6.java"}
-    // .  .  
-       00 0b 
-// parsed:, offset 253, len 0, h: end attributes[0] 
-// parsed:, offset 253, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_6.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_6.j
deleted file mode 100644
index 35475dd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_6.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_6.java
-.class public dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(II)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    iload_2
-    if_icmpge Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    nop
-    iload 1
-    nop
-;    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_6.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_6.java
deleted file mode 100644
index 3aafaba..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpge.jm;
-
-public class T_if_icmpge_6 {
-
-    public boolean run(int a, int b) {
-        return a >= b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_7.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_7.j
deleted file mode 100644
index cf4e418..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_7.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_7.java
-.class public dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)Z
-    .limit stack 2
-    .limit locals 3
-
-    aload_0
-    iload_2
-    if_icmplt Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-
-    Label2:
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_7.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_7.java
deleted file mode 100644
index 8c98983..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpge/jm/T_if_icmpge_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpge.jm;
-
-public class T_if_icmpge_7 {
-    
-    public boolean run(int a, int b) {
-        return a >= b;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/Test_if_icmpgt.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/Test_if_icmpgt.java
deleted file mode 100644
index dd19bd9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/Test_if_icmpgt.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpgt;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.if_icmpgt.jm.T_if_icmpgt_1;
-
-public class Test_if_icmpgt extends DxTestCase {
-
-    /**
-     * @title  Arguments = 5, 6
-     */
-    public void testN1() {
-        T_if_icmpgt_1 t = new T_if_icmpgt_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, 6));
-    }
-
-    /**
-     * @title  Arguments = 0x0f0e0d0c, 0x0f0e0d0c
-     */
-    public void testN2() {
-        T_if_icmpgt_1 t = new T_if_icmpgt_1();
-        assertEquals(1234, t.run(0x0f0e0d0c, 0x0f0e0d0c));
-    }
-
-    /**
-     * @title  Arguments = 5, -5
-     */
-    public void testN3() {
-        T_if_icmpgt_1 t = new T_if_icmpgt_1();
-        assertEquals(1, t.run(5, -5));
-    }
-
-    /**
-     * @title  Arguments = 0x0f0e0d0d, 0x0f0e0d0c
-     */
-    public void testN4() {
-        T_if_icmpgt_1 t = new T_if_icmpgt_1();
-        assertEquals(1, t.run(0x0f0e0d0d, 0x0f0e0d0c));
-    }
-
-    /**
-     * @title  Arguments = 0x1234, 0x01001234
-     */
-    public void testN5() {
-        T_if_icmpgt_1 t = new T_if_icmpgt_1();
-        assertEquals(1234, t.run(0x1234, 0x01001234));
-    }
-
-    /**
-     * @title  Arguments = -5, 5
-     */
-    public void testN6() {
-        T_if_icmpgt_1 t = new T_if_icmpgt_1();
-        assertEquals(1234, t.run(-5, 5));
-    }
-
-    /**
-     * @title  Arguments = Integer.MAX_VALUE, Integer.MAX_VALUE
-     */
-    public void testB1() {
-        T_if_icmpgt_1 t = new T_if_icmpgt_1();
-        assertEquals(1234, t.run(Integer.MAX_VALUE, Integer.MAX_VALUE));
-    }
-
-    /**
-     * @title  Arguments = Integer.MIN_VALUE, Integer.MIN_VALUE
-     */
-    public void testB2() {
-        T_if_icmpgt_1 t = new T_if_icmpgt_1();
-        assertEquals(1234, t.run(Integer.MIN_VALUE, Integer.MIN_VALUE));
-    }
-
-    /**
-     * @title  Arguments = 1234567, 0
-     */
-    public void testB3() {
-        T_if_icmpgt_1 t = new T_if_icmpgt_1();
-        assertEquals(1, t.run(1234567, 0));
-    }
-
-    /**
-     * @title  Arguments = 0, 1234567
-     */
-    public void testB4() {
-        T_if_icmpgt_1 t = new T_if_icmpgt_1();
-        assertEquals(1234, t.run(0, 1234567));
-    }
-
-    /**
-     * @title  Arguments = 0, 0
-     */
-    public void testB5() {
-        T_if_icmpgt_1 t = new T_if_icmpgt_1();
-        assertEquals(1234, t.run(0, 0));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmpgt.jm.T_if_icmpgt_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int, double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmpgt.jm.T_if_icmpgt_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long, int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmpgt.jm.T_if_icmpgt_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall be inside the
-     * method
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmpgt.jm.T_if_icmpgt_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall not be "inside" wide
-     * instruction
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmpgt.jm.T_if_icmpgt_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference, int
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmpgt.jm.T_if_icmpgt_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_1.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_1.j
deleted file mode 100644
index 8e5abdc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_1.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmpgt_1.java
-.class public dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-; this method returns 1234 in case of failed comparison to check that execution proceeds
-; at the address following if_acmpeq instruction
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-    
-    iload_1
-    iload_2
-    
-    if_icmpgt Label0
-    sipush 1234
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_1.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_1.java
deleted file mode 100644
index 4cb1f12..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpgt.jm;
-
-public class T_if_icmpgt_1 {
-
-    public int run(int a, int b) {
-        return a > b ? 1 : 1234;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_2.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_2.j
deleted file mode 100644
index 75f8000..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_2.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmpgt_2.java
-.class public dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(II)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-;    iload_2
-    if_icmpgt Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_2.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_2.java
deleted file mode 100644
index bacaba5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpgt.jm;
-
-public class T_if_icmpgt_2 {
-
-    public boolean run(int a, int b) {
-        return a > b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_3.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_3.j
deleted file mode 100644
index 0fb8567..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_3.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmpgt_3.java
-.class public dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(II)Z
-    .limit stack 4
-    .limit locals 3
-
-    iload_1
-;    iload_2
-    dconst_1
-    if_icmpgt Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_3.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_3.java
deleted file mode 100644
index 2791fc9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpgt.jm;
-
-public class T_if_icmpgt_3 {
-
-    public boolean run(int a, int b) {
-        return a > b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_4.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_4.j
deleted file mode 100644
index ae3796d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_4.j
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmpgt_4.java
-.class public dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(II)Z
-    .limit stack 3
-    .limit locals 3
-
-    lconst_1    
-    iload_1
-    ;iload_2
-
-    if_icmpgt Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_4.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_4.java
deleted file mode 100644
index 390bd08..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpgt.jm;
-
-public class T_if_icmpgt_4 {
-
-    public boolean run(int a, int b) {
-        return a > b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_5.cfh b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_5.cfh
deleted file mode 100644
index 9909d78..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_5.cfh
+++ /dev/null
@@ -1,197 +0,0 @@
-//@class:dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_5
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 08 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 47, h: 0003: utf8{"dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_5"}
-    // .  .  ,  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  _  i  c  m  p  g  t  /  j  m  /  T  _  i  f  _  i  c  m  p  g  t  _  5  
-       01 00 2c 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 5f 69 63 6d 70 67 74 2f 6a 6d 2f 54 5f 69 66 5f 69 63 6d 70 67 74 5f 35 
-    // parsed:, offset 81, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 94, len 8, h: 0005: utf8{"(II)Z"}
-    // .  .  .  (  I  I  )  Z  
-       01 00 05 28 49 49 29 5a 
-    // parsed:, offset 102, len 9, h: 0006: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 111, len 6, h: 0007: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 117, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 06 00 0b 
-    // parsed:, offset 122, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 129, len 21, h: 000a: utf8{"T_if_icmpgt_5.java"}
-    // .  .  .  T  _  i  f  _  i  c  m  p  g  t  _  5  .  j  a  v  a  
-       01 00 12 54 5f 69 66 5f 69 63 6d 70 67 74 5f 35 2e 6a 61 76 61 
-    // parsed:, offset 150, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 156, len 3, h: 000c: type{dxc.junit.opcodes.if_icmpgt.jm.T_if_icmpgt_5}
-    // .  .  .  
-       07 00 03 
-    // parsed:, offset 159, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 162, len 0, h: end constant_pool
-// parsed:, offset 162, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 164, len 2, h: this_class: type{dxc.junit.opcodes.if_icmpgt.jm.T_if_icmpgt_5}
-// .  .  
-   00 0c 
-// parsed:, offset 166, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 168, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 170, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 172, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 174, len:76,desc: ()V
-// parsed:, offset 174, len 0, h:  methods[0]: 
-    // parsed:, offset 174, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 176, len 2, h: name: <init>
-    // .  .  
-       00 06 
-    // parsed:, offset 178, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 180, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 182, len 0, h:  attributes[0]: 
-        // parsed:, offset 182, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 184, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 188, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 190, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 192, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 201, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 203, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 205, len 0, h: end attributes[0] 
-// parsed:, offset 205, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 205, len:45,desc: (II)Z
-// parsed:, offset 205, len 0, h:  methods[1]: 
-    // parsed:, offset 205, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 207, len 2, h: name: run
-    // .  .  
-       00 07 
-    // parsed:, offset 209, len 2, h: descriptor: (II)Z
-    // .  .  
-       00 05 
-    // parsed:, offset 211, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 213, len 0, h:  attributes[0]: 
-        // parsed:, offset 213, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 215, len 4, h: length: 00000015
-        // .  .  .  .  
-           00 00 00 15 
-        // parsed:, offset 219, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 221, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 223, len 4, h: code_length: 00000009
-        // .  .  .  .  
-           00 00 00 09 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 1, h: 0001: iload_2 // 02
-        // .  
-           1c 
-        // parsed:, offset 2, len 3, h: 0002: if_icmpgt 0007
-        // .  .  .  
-//@mod     a3 00 05    
-           a3 00 ff 
-        // parsed:, offset 5, len 1, h: 0005: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 6, len 1, h: 0006: ireturn
-        // .  
-           ac 
-        // parsed:, offset 7, len 1, h: 0007: iconst_1 // #+01
-        // .  
-           04 
-        // parsed:, offset 8, len 1, h: 0008: ireturn
-        // .  
-           ac 
-        // parsed:, offset 236, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 238, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 240, len 0, h: end attributes[0] 
-// parsed:, offset 240, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (II)Z
-// parsed:, offset 240, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 242, len 0, h:  attributes[0]: 
-    // parsed:, offset 242, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 244, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 248, len 2, h: source: utf8{"T_if_icmpgt_5.java"}
-    // .  .  
-       00 0a 
-// parsed:, offset 250, len 0, h: end attributes[0] 
-// parsed:, offset 250, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_5.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_5.j
deleted file mode 100644
index b04cb99..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_5.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmpgt_5.java
-.class public dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(II)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    iload_2
-    if_icmpgt Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_5.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_5.java
deleted file mode 100644
index 74f812f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpgt.jm;
-
-public class T_if_icmpgt_5 {
-
-    public boolean run(int a, int b) {
-        return a > b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_6.cfh b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_6.cfh
deleted file mode 100644
index 1b032b5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_6.cfh
+++ /dev/null
@@ -1,203 +0,0 @@
-//@class:dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_6
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 08 
-    // parsed:, offset 15, len 47, h: 0002: utf8{"dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_6"}
-    // .  .  ,  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  _  i  c  m  p  g  t  /  j  m  /  T  _  i  f  _  i  c  m  p  g  t  _  6  
-       01 00 2c 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 5f 69 63 6d 70 67 74 2f 6a 6d 2f 54 5f 69 66 5f 69 63 6d 70 67 74 5f 36 
-    // parsed:, offset 62, len 19, h: 0003: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 81, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 94, len 8, h: 0005: utf8{"(II)Z"}
-    // .  .  .  (  I  I  )  Z  
-       01 00 05 28 49 49 29 5a 
-    // parsed:, offset 102, len 9, h: 0006: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 111, len 6, h: 0007: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 117, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 06 00 0a 
-    // parsed:, offset 122, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 129, len 6, h: 000a: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 135, len 3, h: 000b: type{dxc.junit.opcodes.if_icmpgt.jm.T_if_icmpgt_6}
-    // .  .  .  
-       07 00 02 
-    // parsed:, offset 138, len 21, h: 000c: utf8{"T_if_icmpgt_6.java"}
-    // .  .  .  T  _  i  f  _  i  c  m  p  g  t  _  6  .  j  a  v  a  
-       01 00 12 54 5f 69 66 5f 69 63 6d 70 67 74 5f 36 2e 6a 61 76 61 
-    // parsed:, offset 159, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 03 
-// parsed:, offset 162, len 0, h: end constant_pool
-// parsed:, offset 162, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 164, len 2, h: this_class: type{dxc.junit.opcodes.if_icmpgt.jm.T_if_icmpgt_6}
-// .  .  
-   00 0b 
-// parsed:, offset 166, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 168, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 170, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 172, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 174, len:79,desc: ()V
-// parsed:, offset 174, len 0, h:  methods[0]: 
-    // parsed:, offset 174, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 176, len 2, h: name: <init>
-    // .  .  
-       00 06 
-    // parsed:, offset 178, len 2, h: descriptor: ()V
-    // .  .  
-       00 0a 
-    // parsed:, offset 180, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 182, len 0, h:  attributes[0]: 
-        // parsed:, offset 182, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 184, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 188, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 190, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 192, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 201, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 203, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 205, len 0, h: end attributes[0] 
-// parsed:, offset 205, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 205, len:48,desc: (II)Z
-// parsed:, offset 205, len 0, h:  methods[1]: 
-    // parsed:, offset 205, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 207, len 2, h: name: run
-    // .  .  
-       00 07 
-    // parsed:, offset 209, len 2, h: descriptor: (II)Z
-    // .  .  
-       00 05 
-    // parsed:, offset 211, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 213, len 0, h:  attributes[0]: 
-        // parsed:, offset 213, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 215, len 4, h: length: 00000018
-        // .  .  .  .  
-           00 00 00 18 
-        // parsed:, offset 219, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 221, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 223, len 4, h: code_length: 0000000c
-        // .  .  .  .  
-           00 00 00 0c 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 1, h: 0001: iload_2 // 02
-        // .  
-           1c 
-        // parsed:, offset 2, len 3, h: 0002: if_icmpgt 0008
-        // .  .  .  
-           a3 00 05 
-        // parsed:, offset 5, len 1, h: 0005: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 6, len 1, h: 0006: ireturn
-        // .  
-           ac 
-        // parsed:, offset 7, len 1, h: 0007: wide
-        // .  
-//@mod     00    
-           c4 
-        // parsed:, offset 8, len 2, h: 0008: iload 01
-        // .  .  
-           15 01 
-        // parsed:, offset 10, len 1, h: 000a: nop
-        // .  
-           00 
-        // parsed:, offset 11, len 1, h: 000b: ireturn
-        // .  
-           ac 
-        // parsed:, offset 239, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 241, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 243, len 0, h: end attributes[0] 
-// parsed:, offset 243, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (II)Z
-// parsed:, offset 243, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 245, len 0, h:  attributes[0]: 
-    // parsed:, offset 245, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 247, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 251, len 2, h: source: utf8{"T_if_icmpgt_6.java"}
-    // .  .  
-       00 0c 
-// parsed:, offset 253, len 0, h: end attributes[0] 
-// parsed:, offset 253, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_6.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_6.j
deleted file mode 100644
index 118b7c1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_6.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmpgt_6.java
-.class public dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(II)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    iload_2
-    if_icmpgt Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    nop
-    iload 1
-    nop
-;    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_6.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_6.java
deleted file mode 100644
index 438ed36..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpgt.jm;
-
-public class T_if_icmpgt_6 {
-
-    public boolean run(int a, int b) {
-        return a > b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_7.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_7.j
deleted file mode 100644
index f94e884..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_7.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmpgt_7.java
-.class public dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)Z
-    .limit stack 2
-    .limit locals 3
-
-    aload_0
-    iload_2
-    if_icmple Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-
-    Label2:
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_7.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_7.java
deleted file mode 100644
index dce8480..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpgt/jm/T_if_icmpgt_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpgt.jm;
-
-public class T_if_icmpgt_7 {
-    
-    public boolean run(int a, int b) {
-        return a > b;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/Test_if_icmple.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/Test_if_icmple.java
deleted file mode 100644
index 11335e3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/Test_if_icmple.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmple;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.if_icmple.jm.T_if_icmple_1;
-
-public class Test_if_icmple extends DxTestCase {
-
-    /**
-     * @title  Arguments = 5, 6
-     */
-    public void testN1() {
-        T_if_icmple_1 t = new T_if_icmple_1();
-
-        assertEquals(1, t.run(5, 6));
-    }
-
-    /**
-     * @title  Arguments = 0x0f0e0d0c, 0x0f0e0d0c
-     */
-    public void testN2() {
-        T_if_icmple_1 t = new T_if_icmple_1();
-        assertEquals(1, t.run(0x0f0e0d0c, 0x0f0e0d0c));
-    }
-
-    /**
-     * @title  Arguments = 5, -5
-     */
-    public void testN3() {
-        T_if_icmple_1 t = new T_if_icmple_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, -5));
-    }
-
-    /**
-     * @title  Arguments = 0x0f0e0d0d, 0x0f0e0d0c
-     */
-    public void testN4() {
-        T_if_icmple_1 t = new T_if_icmple_1();
-        assertEquals(1234, t.run(0x0f0e0d0d, 0x0f0e0d0c));
-    }
-
-    /**
-     * @title  Arguments = 0x1234, 0x01001234
-     */
-    public void testN5() {
-        T_if_icmple_1 t = new T_if_icmple_1();
-        assertEquals(1, t.run(0x1234, 0x01001234));
-    }
-
-    /**
-     * @title  Arguments = -5, 5
-     */
-    public void testN6() {
-        T_if_icmple_1 t = new T_if_icmple_1();
-        assertEquals(1, t.run(-5, 5));
-    }
-
-    /**
-     * @title  Arguments = Integer.MAX_VALUE, Integer.MAX_VALUE
-     */
-    public void testB1() {
-        T_if_icmple_1 t = new T_if_icmple_1();
-        assertEquals(1, t.run(Integer.MAX_VALUE, Integer.MAX_VALUE));
-    }
-
-    /**
-     * @title  Arguments = Integer.MIN_VALUE, Integer.MIN_VALUE
-     */
-    public void testB2() {
-        T_if_icmple_1 t = new T_if_icmple_1();
-        assertEquals(1, t.run(Integer.MIN_VALUE, Integer.MIN_VALUE));
-    }
-
-    /**
-     * @title  Arguments = 1234567, 0
-     */
-    public void testB3() {
-        T_if_icmple_1 t = new T_if_icmple_1();
-        assertEquals(1234, t.run(1234567, 0));
-    }
-
-    /**
-     * @title  Arguments = 0, 1234567
-     */
-    public void testB4() {
-        T_if_icmple_1 t = new T_if_icmple_1();
-        assertEquals(1, t.run(0, 1234567));
-    }
-
-    /**
-     * @title  Arguments = 0, 0
-     */
-    public void testB5() {
-        T_if_icmple_1 t = new T_if_icmple_1();
-        assertEquals(1, t.run(0, 0));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmple.jm.T_if_icmple_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int, double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmple.jm.T_if_icmple_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long, int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmple.jm.T_if_icmple_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall be inside the
-     * method
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmple.jm.T_if_icmple_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall not be "inside" wide
-     * instruction
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmple.jm.T_if_icmple_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference, int
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmple.jm.T_if_icmple_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_1.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_1.j
deleted file mode 100644
index 14d7df0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_1.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmple_1.java
-.class public dxc/junit/opcodes/if_icmple/jm/T_if_icmple_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-; this method returns 1234 in case of failed comparison to check that execution proceeds
-; at the address following if_acmpeq instruction
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-    
-    iload_1
-    iload_2
-    
-    if_icmple Label0
-    sipush 1234
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_1.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_1.java
deleted file mode 100644
index 21f0339..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmple.jm;
-
-public class T_if_icmple_1 {
-
-    public int run(int a, int b) {
-        return a <= b ? 1 : 1234;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_2.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_2.j
deleted file mode 100644
index d4c8db7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_2.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmple_2.java
-.class public dxc/junit/opcodes/if_icmple/jm/T_if_icmple_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(II)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-;    iload_2
-    if_icmple Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_2.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_2.java
deleted file mode 100644
index d426d43..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmple.jm;
-
-public class T_if_icmple_2 {
-
-    public boolean run(int a, int b) {
-        return a <= b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_3.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_3.j
deleted file mode 100644
index f2da81e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_3.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmple_3.java
-.class public dxc/junit/opcodes/if_icmple/jm/T_if_icmple_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(II)Z
-    .limit stack 4
-    .limit locals 3
-
-    iload_1
-;    iload_2
-    dconst_1
-    if_icmple Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_3.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_3.java
deleted file mode 100644
index 76b5458..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmple.jm;
-
-public class T_if_icmple_3 {
-
-    public boolean run(int a, int b) {
-        return a <= b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_4.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_4.j
deleted file mode 100644
index 1a6368b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_4.j
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmple_4.java
-.class public dxc/junit/opcodes/if_icmple/jm/T_if_icmple_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(II)Z
-    .limit stack 3
-    .limit locals 3
-
-    lconst_1    
-    iload_1
-    ;iload_2
-
-    if_icmple Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_4.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_4.java
deleted file mode 100644
index b530f67..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmple.jm;
-
-public class T_if_icmple_4 {
-
-    public boolean run(int a, int b) {
-        return a <= b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_5.cfh b/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_5.cfh
deleted file mode 100644
index e83f3b0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_5.cfh
+++ /dev/null
@@ -1,197 +0,0 @@
-//@class:dxc/junit/opcodes/if_icmple/jm/T_if_icmple_5
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 09 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 3, h: 0003: type{dxc.junit.opcodes.if_icmple.jm.T_if_icmple_5}
-    // .  .  .  
-       07 00 08 
-    // parsed:, offset 37, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 50, len 8, h: 0005: utf8{"(II)Z"}
-    // .  .  .  (  I  I  )  Z  
-       01 00 05 28 49 49 29 5a 
-    // parsed:, offset 58, len 9, h: 0006: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 67, len 6, h: 0007: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 73, len 47, h: 0008: utf8{"dxc/junit/opcodes/if_icmple/jm/T_if_icmple_5"}
-    // .  .  ,  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  _  i  c  m  p  l  e  /  j  m  /  T  _  i  f  _  i  c  m  p  l  e  _  5  
-       01 00 2c 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 5f 69 63 6d 70 6c 65 2f 6a 6d 2f 54 5f 69 66 5f 69 63 6d 70 6c 65 5f 35 
-    // parsed:, offset 120, len 5, h: 0009: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 06 00 0c 
-    // parsed:, offset 125, len 7, h: 000a: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 132, len 21, h: 000b: utf8{"T_if_icmple_5.java"}
-    // .  .  .  T  _  i  f  _  i  c  m  p  l  e  _  5  .  j  a  v  a  
-       01 00 12 54 5f 69 66 5f 69 63 6d 70 6c 65 5f 35 2e 6a 61 76 61 
-    // parsed:, offset 153, len 6, h: 000c: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 159, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 162, len 0, h: end constant_pool
-// parsed:, offset 162, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 164, len 2, h: this_class: type{dxc.junit.opcodes.if_icmple.jm.T_if_icmple_5}
-// .  .  
-   00 03 
-// parsed:, offset 166, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 168, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 170, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 172, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 174, len:76,desc: ()V
-// parsed:, offset 174, len 0, h:  methods[0]: 
-    // parsed:, offset 174, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 176, len 2, h: name: <init>
-    // .  .  
-       00 06 
-    // parsed:, offset 178, len 2, h: descriptor: ()V
-    // .  .  
-       00 0c 
-    // parsed:, offset 180, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 182, len 0, h:  attributes[0]: 
-        // parsed:, offset 182, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 184, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 188, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 190, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 192, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 201, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 203, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 205, len 0, h: end attributes[0] 
-// parsed:, offset 205, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 205, len:45,desc: (II)Z
-// parsed:, offset 205, len 0, h:  methods[1]: 
-    // parsed:, offset 205, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 207, len 2, h: name: run
-    // .  .  
-       00 07 
-    // parsed:, offset 209, len 2, h: descriptor: (II)Z
-    // .  .  
-       00 05 
-    // parsed:, offset 211, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 213, len 0, h:  attributes[0]: 
-        // parsed:, offset 213, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 215, len 4, h: length: 00000015
-        // .  .  .  .  
-           00 00 00 15 
-        // parsed:, offset 219, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 221, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 223, len 4, h: code_length: 00000009
-        // .  .  .  .  
-           00 00 00 09 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 1, h: 0001: iload_2 // 02
-        // .  
-           1c 
-        // parsed:, offset 2, len 3, h: 0002: if_icmple 0007
-        // .  .  .  
-//@mod     a4 00 05    
-           a4 00 ff 
-        // parsed:, offset 5, len 1, h: 0005: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 6, len 1, h: 0006: ireturn
-        // .  
-           ac 
-        // parsed:, offset 7, len 1, h: 0007: iconst_1 // #+01
-        // .  
-           04 
-        // parsed:, offset 8, len 1, h: 0008: ireturn
-        // .  
-           ac 
-        // parsed:, offset 236, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 238, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 240, len 0, h: end attributes[0] 
-// parsed:, offset 240, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (II)Z
-// parsed:, offset 240, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 242, len 0, h:  attributes[0]: 
-    // parsed:, offset 242, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 244, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 248, len 2, h: source: utf8{"T_if_icmple_5.java"}
-    // .  .  
-       00 0b 
-// parsed:, offset 250, len 0, h: end attributes[0] 
-// parsed:, offset 250, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_5.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_5.j
deleted file mode 100644
index 3aacfb3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_5.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmple_5.java
-.class public dxc/junit/opcodes/if_icmple/jm/T_if_icmple_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(II)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    iload_2
-    if_icmple Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_5.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_5.java
deleted file mode 100644
index 09a7272..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmple.jm;
-
-public class T_if_icmple_5 {
-
-    public boolean run(int a, int b) {
-        return a <= b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_6.cfh b/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_6.cfh
deleted file mode 100644
index 7f734e7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_6.cfh
+++ /dev/null
@@ -1,204 +0,0 @@
-//@class:dxc/junit/opcodes/if_icmple/jm/T_if_icmple_6
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 09 
-    // parsed:, offset 15, len 3, h: 0002: type{dxc.junit.opcodes.if_icmple.jm.T_if_icmple_6}
-    // .  .  .  
-       07 00 08 
-    // parsed:, offset 18, len 19, h: 0003: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 37, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 50, len 8, h: 0005: utf8{"(II)Z"}
-    // .  .  .  (  I  I  )  Z  
-       01 00 05 28 49 49 29 5a 
-    // parsed:, offset 58, len 9, h: 0006: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 67, len 6, h: 0007: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 73, len 47, h: 0008: utf8{"dxc/junit/opcodes/if_icmple/jm/T_if_icmple_6"}
-    // .  .  ,  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  _  i  c  m  p  l  e  /  j  m  /  T  _  i  f  _  i  c  m  p  l  e  _  6  
-       01 00 2c 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 5f 69 63 6d 70 6c 65 2f 6a 6d 2f 54 5f 69 66 5f 69 63 6d 70 6c 65 5f 36 
-    // parsed:, offset 120, len 5, h: 0009: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 06 00 0b 
-    // parsed:, offset 125, len 7, h: 000a: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 132, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 138, len 21, h: 000c: utf8{"T_if_icmple_6.java"}
-    // .  .  .  T  _  i  f  _  i  c  m  p  l  e  _  6  .  j  a  v  a  
-       01 00 12 54 5f 69 66 5f 69 63 6d 70 6c 65 5f 36 2e 6a 61 76 61 
-    // parsed:, offset 159, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 03 
-// parsed:, offset 162, len 0, h: end constant_pool
-// parsed:, offset 162, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 164, len 2, h: this_class: type{dxc.junit.opcodes.if_icmple.jm.T_if_icmple_6}
-// .  .  
-   00 02 
-// parsed:, offset 166, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 168, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 170, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 172, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 174, len:79,desc: ()V
-// parsed:, offset 174, len 0, h:  methods[0]: 
-    // parsed:, offset 174, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 176, len 2, h: name: <init>
-    // .  .  
-       00 06 
-    // parsed:, offset 178, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 180, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 182, len 0, h:  attributes[0]: 
-        // parsed:, offset 182, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 184, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 188, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 190, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 192, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 201, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 203, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 205, len 0, h: end attributes[0] 
-// parsed:, offset 205, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 205, len:48,desc: (II)Z
-// parsed:, offset 205, len 0, h:  methods[1]: 
-    // parsed:, offset 205, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 207, len 2, h: name: run
-    // .  .  
-       00 07 
-    // parsed:, offset 209, len 2, h: descriptor: (II)Z
-    // .  .  
-       00 05 
-    // parsed:, offset 211, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 213, len 0, h:  attributes[0]: 
-        // parsed:, offset 213, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 215, len 4, h: length: 00000018
-        // .  .  .  .  
-           00 00 00 18 
-        // parsed:, offset 219, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 221, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 223, len 4, h: code_length: 0000000c
-        // .  .  .  .  
-           00 00 00 0c 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 1, h: 0001: iload_2 // 02
-        // .  
-           1c 
-        // parsed:, offset 2, len 3, h: 0002: if_icmple 0008
-        // .  .  .  
-//@mod     a4 00 05    
-           a4 00 06 
-        // parsed:, offset 5, len 1, h: 0005: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 6, len 1, h: 0006: ireturn
-        // .  
-           ac 
-        // parsed:, offset 7, len 1, h: 0007: wide
-        // .  
-//@mod     00    
-           c4 
-        // parsed:, offset 8, len 2, h: 0008: iload 01
-        // .  .  
-           15 01 
-        // parsed:, offset 10, len 1, h: 000a: nop
-        // .  
-           00 
-        // parsed:, offset 11, len 1, h: 000b: ireturn
-        // .  
-           ac 
-        // parsed:, offset 239, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 241, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 243, len 0, h: end attributes[0] 
-// parsed:, offset 243, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (II)Z
-// parsed:, offset 243, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 245, len 0, h:  attributes[0]: 
-    // parsed:, offset 245, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 247, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 251, len 2, h: source: utf8{"T_if_icmple_6.java"}
-    // .  .  
-       00 0c 
-// parsed:, offset 253, len 0, h: end attributes[0] 
-// parsed:, offset 253, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_6.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_6.j
deleted file mode 100644
index f8c5961..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_6.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmple_6.java
-.class public dxc/junit/opcodes/if_icmple/jm/T_if_icmple_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(II)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    iload_2
-    if_icmple Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    nop
-    iload 1
-    nop
-;    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_6.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_6.java
deleted file mode 100644
index 9152a6f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmple.jm;
-
-public class T_if_icmple_6 {
-
-    public boolean run(int a, int b) {
-        return a <= b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_7.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_7.j
deleted file mode 100644
index 13ebcb5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_7.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmple_7.java
-.class public dxc/junit/opcodes/if_icmple/jm/T_if_icmple_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)Z
-    .limit stack 2
-    .limit locals 3
-
-    aload_0
-    iload_2
-    if_icmpgt Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-
-    Label2:
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_7.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_7.java
deleted file mode 100644
index 1080ee2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmple/jm/T_if_icmple_7.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmple.jm;
-
-public class T_if_icmple_7 {
-    public boolean run(int a, int b) {
-        return a <= b;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/Test_if_icmplt.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/Test_if_icmplt.java
deleted file mode 100644
index b318512..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/Test_if_icmplt.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmplt;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.if_icmplt.jm.T_if_icmplt_1;
-
-public class Test_if_icmplt extends DxTestCase {
-
-    /**
-     * @title  Arguments = 5, 6
-     */
-    public void testN1() {
-        T_if_icmplt_1 t = new T_if_icmplt_1();
-        assertEquals(1, t.run(5, 6));
-    }
-
-    /**
-     * @title  Arguments = 0x0f0e0d0c, 0x0f0e0d0c
-     */
-    public void testN2() {
-        T_if_icmplt_1 t = new T_if_icmplt_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(0x0f0e0d0c, 0x0f0e0d0c));
-    }
-
-    /**
-     * @title  Arguments = 5, -5
-     */
-    public void testN3() {
-        T_if_icmplt_1 t = new T_if_icmplt_1();
-        assertEquals(1234, t.run(5, -5));
-    }
-
-    /**
-     * @title  Arguments = 0x0f0e0d0d, 0x0f0e0d0c
-     */
-    public void testN4() {
-        T_if_icmplt_1 t = new T_if_icmplt_1();
-        assertEquals(1234, t.run(0x0f0e0d0d, 0x0f0e0d0c));
-    }
-
-    /**
-     * @title  Arguments = 0x1234, 0x01001234
-     */
-    public void testN5() {
-        T_if_icmplt_1 t = new T_if_icmplt_1();
-        assertEquals(1, t.run(0x1234, 0x01001234));
-    }
-
-    /**
-     * @title  Arguments = -5, 5
-     */
-    public void testN6() {
-        T_if_icmplt_1 t = new T_if_icmplt_1();
-        assertEquals(1, t.run(-5, 5));
-    }
-
-    /**
-     * @title  Arguments = Integer.MAX_VALUE, Integer.MAX_VALUE
-     */
-    public void testB1() {
-        T_if_icmplt_1 t = new T_if_icmplt_1();
-        assertEquals(1234, t.run(Integer.MAX_VALUE, Integer.MAX_VALUE));
-    }
-
-    /**
-     * @title  Arguments = Integer.MIN_VALUE, Integer.MIN_VALUE
-     */
-    public void testB2() {
-        T_if_icmplt_1 t = new T_if_icmplt_1();
-        assertEquals(1234, t.run(Integer.MIN_VALUE, Integer.MIN_VALUE));
-    }
-
-    /**
-     * @title  Arguments = 1234567, 0
-     */
-    public void testB3() {
-        T_if_icmplt_1 t = new T_if_icmplt_1();
-        assertEquals(1234, t.run(1234567, 0));
-    }
-
-    /**
-     * @title  Arguments = 0, 1234567
-     */
-    public void testB4() {
-        T_if_icmplt_1 t = new T_if_icmplt_1();
-        assertEquals(1, t.run(0, 1234567));
-    }
-
-    /**
-     * @title  Arguments = 0, 0
-     */
-    public void testB5() {
-        T_if_icmplt_1 t = new T_if_icmplt_1();
-        assertEquals(1234, t.run(0, 0));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmplt.jm.T_if_icmplt_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int, double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmplt.jm.T_if_icmplt_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long, int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmplt.jm.T_if_icmplt_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall be inside the
-     * method
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmplt.jm.T_if_icmplt_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall not be "inside" wide
-     * instruction
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmplt.jm.T_if_icmplt_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference, int
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmplt.jm.T_if_icmplt_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_1.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_1.j
deleted file mode 100644
index 91b3ef6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_1.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_1.java
-.class public dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-; this method returns 1234 in case of failed comparison to check that execution proceeds
-; at the address following if_acmpeq instruction
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-    
-    iload_1
-    iload_2
-    
-    if_icmplt Label0
-    sipush 1234
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_1.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_1.java
deleted file mode 100644
index 5cf6dfa..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmplt.jm;
-
-public class T_if_icmplt_1 {
-
-    public int run(int a, int b) {
-        return a < b ? 1 : 1234;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_2.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_2.j
deleted file mode 100644
index a2c9d4c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_2.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmplt_2.java
-.class public dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(II)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-;    iload_2
-    if_icmplt Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_2.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_2.java
deleted file mode 100644
index 5c557a0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmplt.jm;
-
-public class T_if_icmplt_2 {
-
-    public boolean run(int a, int b) {
-        return a < b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_3.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_3.j
deleted file mode 100644
index 0b80fdc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_3.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmplt_3.java
-.class public dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(II)Z
-    .limit stack 4
-    .limit locals 3
-
-    iload_1
-;    iload_2
-    dconst_1
-    if_icmplt Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_3.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_3.java
deleted file mode 100644
index 210bfdf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmplt.jm;
-
-public class T_if_icmplt_3 {
-
-    public boolean run(int a, int b) {
-        return a < b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_4.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_4.j
deleted file mode 100644
index fdf43d5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_4.j
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmplt_4.java
-.class public dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(II)Z
-    .limit stack 3
-    .limit locals 3
-
-    lconst_1    
-    iload_1
-    ;iload_2
-
-    if_icmplt Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_4.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_4.java
deleted file mode 100644
index 323c06c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmplt.jm;
-
-public class T_if_icmplt_4 {
-
-    public boolean run(int a, int b) {
-        return a < b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_5.cfh b/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_5.cfh
deleted file mode 100644
index 96d6e1c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_5.cfh
+++ /dev/null
@@ -1,197 +0,0 @@
-//@class:dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_5
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 07 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 8, h: 0004: utf8{"(II)Z"}
-    // .  .  .  (  I  I  )  Z  
-       01 00 05 28 49 49 29 5a 
-    // parsed:, offset 55, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 64, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 70, len 5, h: 0007: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0a 
-    // parsed:, offset 75, len 7, h: 0008: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 82, len 3, h: 0009: type{dxc.junit.opcodes.if_icmplt.jm.T_if_icmplt_5}
-    // .  .  .  
-       07 00 0b 
-    // parsed:, offset 85, len 6, h: 000a: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 91, len 47, h: 000b: utf8{"dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_5"}
-    // .  .  ,  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  _  i  c  m  p  l  t  /  j  m  /  T  _  i  f  _  i  c  m  p  l  t  _  5  
-       01 00 2c 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 5f 69 63 6d 70 6c 74 2f 6a 6d 2f 54 5f 69 66 5f 69 63 6d 70 6c 74 5f 35 
-    // parsed:, offset 138, len 21, h: 000c: utf8{"T_if_icmplt_5.java"}
-    // .  .  .  T  _  i  f  _  i  c  m  p  l  t  _  5  .  j  a  v  a  
-       01 00 12 54 5f 69 66 5f 69 63 6d 70 6c 74 5f 35 2e 6a 61 76 61 
-    // parsed:, offset 159, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 162, len 0, h: end constant_pool
-// parsed:, offset 162, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 164, len 2, h: this_class: type{dxc.junit.opcodes.if_icmplt.jm.T_if_icmplt_5}
-// .  .  
-   00 09 
-// parsed:, offset 166, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 168, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 170, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 172, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 174, len:76,desc: ()V
-// parsed:, offset 174, len 0, h:  methods[0]: 
-    // parsed:, offset 174, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 176, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 178, len 2, h: descriptor: ()V
-    // .  .  
-       00 0a 
-    // parsed:, offset 180, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 182, len 0, h:  attributes[0]: 
-        // parsed:, offset 182, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 184, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 188, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 190, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 192, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 201, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 203, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 205, len 0, h: end attributes[0] 
-// parsed:, offset 205, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 205, len:45,desc: (II)Z
-// parsed:, offset 205, len 0, h:  methods[1]: 
-    // parsed:, offset 205, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 207, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 209, len 2, h: descriptor: (II)Z
-    // .  .  
-       00 04 
-    // parsed:, offset 211, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 213, len 0, h:  attributes[0]: 
-        // parsed:, offset 213, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 215, len 4, h: length: 00000015
-        // .  .  .  .  
-           00 00 00 15 
-        // parsed:, offset 219, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 221, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 223, len 4, h: code_length: 00000009
-        // .  .  .  .  
-           00 00 00 09 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 1, h: 0001: iload_2 // 02
-        // .  
-           1c 
-        // parsed:, offset 2, len 3, h: 0002: if_icmplt 00ff
-        // .  .  .  
-//@mod     a1 00 05    
-           a1 00 ff 
-        // parsed:, offset 5, len 1, h: 0005: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 6, len 1, h: 0006: ireturn
-        // .  
-           ac 
-        // parsed:, offset 7, len 1, h: 0007: iconst_1 // #+01
-        // .  
-           04 
-        // parsed:, offset 8, len 1, h: 0008: ireturn
-        // .  
-           ac 
-        // parsed:, offset 236, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 238, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 240, len 0, h: end attributes[0] 
-// parsed:, offset 240, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (II)Z
-// parsed:, offset 240, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 242, len 0, h:  attributes[0]: 
-    // parsed:, offset 242, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 244, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 248, len 2, h: source: utf8{"T_if_icmplt_5.java"}
-    // .  .  
-       00 0c 
-// parsed:, offset 250, len 0, h: end attributes[0] 
-// parsed:, offset 250, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_5.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_5.j
deleted file mode 100644
index 3a8cd46..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_5.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmplt_5.java
-.class public dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(II)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    iload_2
-    if_icmplt Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_5.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_5.java
deleted file mode 100644
index 426cfbb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmplt.jm;
-
-public class T_if_icmplt_5 {
-
-    public boolean run(int a, int b) {
-        return a < b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_6.cfh b/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_6.cfh
deleted file mode 100644
index 7722c6b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_6.cfh
+++ /dev/null
@@ -1,204 +0,0 @@
-//@class:dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_6
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 08 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 21, h: 0003: utf8{"T_if_icmplt_6.java"}
-    // .  .  .  T  _  i  f  _  i  c  m  p  l  t  _  6  .  j  a  v  a  
-       01 00 12 54 5f 69 66 5f 69 63 6d 70 6c 74 5f 36 2e 6a 61 76 61 
-    // parsed:, offset 55, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 68, len 8, h: 0005: utf8{"(II)Z"}
-    // .  .  .  (  I  I  )  Z  
-       01 00 05 28 49 49 29 5a 
-    // parsed:, offset 76, len 9, h: 0006: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 85, len 6, h: 0007: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 91, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 06 00 0b 
-    // parsed:, offset 96, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 103, len 3, h: 000a: type{dxc.junit.opcodes.if_icmplt.jm.T_if_icmplt_6}
-    // .  .  .  
-       07 00 0c 
-    // parsed:, offset 106, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 112, len 47, h: 000c: utf8{"dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_6"}
-    // .  .  ,  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  _  i  c  m  p  l  t  /  j  m  /  T  _  i  f  _  i  c  m  p  l  t  _  6  
-       01 00 2c 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 5f 69 63 6d 70 6c 74 2f 6a 6d 2f 54 5f 69 66 5f 69 63 6d 70 6c 74 5f 36 
-    // parsed:, offset 159, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 162, len 0, h: end constant_pool
-// parsed:, offset 162, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 164, len 2, h: this_class: type{dxc.junit.opcodes.if_icmplt.jm.T_if_icmplt_6}
-// .  .  
-   00 0a 
-// parsed:, offset 166, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 168, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 170, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 172, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 174, len:79,desc: ()V
-// parsed:, offset 174, len 0, h:  methods[0]: 
-    // parsed:, offset 174, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 176, len 2, h: name: <init>
-    // .  .  
-       00 06 
-    // parsed:, offset 178, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 180, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 182, len 0, h:  attributes[0]: 
-        // parsed:, offset 182, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 184, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 188, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 190, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 192, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 201, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 203, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 205, len 0, h: end attributes[0] 
-// parsed:, offset 205, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 205, len:48,desc: (II)Z
-// parsed:, offset 205, len 0, h:  methods[1]: 
-    // parsed:, offset 205, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 207, len 2, h: name: run
-    // .  .  
-       00 07 
-    // parsed:, offset 209, len 2, h: descriptor: (II)Z
-    // .  .  
-       00 05 
-    // parsed:, offset 211, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 213, len 0, h:  attributes[0]: 
-        // parsed:, offset 213, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 215, len 4, h: length: 00000018
-        // .  .  .  .  
-           00 00 00 18 
-        // parsed:, offset 219, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 221, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 223, len 4, h: code_length: 0000000c
-        // .  .  .  .  
-           00 00 00 0c 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 1, h: 0001: iload_2 // 02
-        // .  
-           1c 
-        // parsed:, offset 2, len 3, h: 0002: if_icmplt 0008
-        // .  .  .  
-//@mod     a1 00 05    
-           a1 00 06 
-        // parsed:, offset 5, len 1, h: 0005: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 6, len 1, h: 0006: ireturn
-        // .  
-           ac 
-        // parsed:, offset 7, len 1, h: 0007: wide
-        // .  
-//@mod     00    
-           c4 
-        // parsed:, offset 8, len 2, h: 0008: iload 01
-        // .  .  
-           15 01 
-        // parsed:, offset 10, len 1, h: 000a: nop
-        // .  
-           00 
-        // parsed:, offset 11, len 1, h: 000b: ireturn
-        // .  
-           ac 
-        // parsed:, offset 239, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 241, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 243, len 0, h: end attributes[0] 
-// parsed:, offset 243, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (II)Z
-// parsed:, offset 243, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 245, len 0, h:  attributes[0]: 
-    // parsed:, offset 245, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 247, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 251, len 2, h: source: utf8{"T_if_icmplt_6.java"}
-    // .  .  
-       00 03 
-// parsed:, offset 253, len 0, h: end attributes[0] 
-// parsed:, offset 253, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_6.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_6.j
deleted file mode 100644
index e0e56f7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_6.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmplt_6.java
-.class public dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(II)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    iload_2
-    if_icmplt Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    nop
-    iload 1
-    nop
-;    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_6.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_6.java
deleted file mode 100644
index 8f5f94c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmplt.jm;
-
-public class T_if_icmplt_6 {
-
-    public boolean run(int a, int b) {
-        return a < b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_7.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_7.j
deleted file mode 100644
index b702a2d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_7.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmplt_7.java
-.class public dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)Z
-    .limit stack 2
-    .limit locals 3
-
-    aload_0
-    iload_2
-    if_icmpge Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-
-    Label2:
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_7.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_7.java
deleted file mode 100644
index b3cbb72..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmplt/jm/T_if_icmplt_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmplt.jm;
-
-public class T_if_icmplt_7 {
-    
-    public boolean run(int a, int b) {
-        return a < b;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/Test_if_icmpne.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/Test_if_icmpne.java
deleted file mode 100644
index db62187..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/Test_if_icmpne.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpne;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.if_icmpne.jm.T_if_icmpne_1;
-
-public class Test_if_icmpne extends DxTestCase {
-
-    /**
-     * @title  Arguments = 5, 6
-     */
-    public void testN1() {
-        T_if_icmpne_1 t = new T_if_icmpne_1();
-        assertEquals(1, t.run(5, 6));
-    }
-
-    /**
-     * @title  Arguments = 0x0f0e0d0c, 0x0f0e0d0c
-     */
-    public void testN2() {
-        T_if_icmpne_1 t = new T_if_icmpne_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(0x0f0e0d0c, 0x0f0e0d0c));
-    }
-
-    /**
-     * @title  Arguments = 5, -5
-     */
-    public void testN3() {
-        T_if_icmpne_1 t = new T_if_icmpne_1();
-        assertEquals(1, t.run(5, -5));
-    }
-
-    /**
-     * @title  Arguments = 0x01001234, 0x1234
-     */
-    public void testN4() {
-        T_if_icmpne_1 t = new T_if_icmpne_1();
-        assertEquals(1, t.run(0x01001234, 0x1234));
-    }
-
-    /**
-     * @title  Arguments = Integer.MAX_VALUE, Integer.MAX_VALUE
-     */
-    public void testB1() {
-        T_if_icmpne_1 t = new T_if_icmpne_1();
-        assertEquals(1234, t.run(Integer.MAX_VALUE, Integer.MAX_VALUE));
-    }
-
-    /**
-     * @title  Arguments = Integer.MIN_VALUE, Integer.MIN_VALUE
-     */
-    public void testB2() {
-        T_if_icmpne_1 t = new T_if_icmpne_1();
-        assertEquals(1234, t.run(Integer.MIN_VALUE, Integer.MIN_VALUE));
-    }
-
-    /**
-     * @title  Arguments = 0, 1234567
-     */
-    public void testB3() {
-        T_if_icmpne_1 t = new T_if_icmpne_1();
-        assertEquals(1, t.run(0, 1234567));
-    }
-
-    /**
-     * @title  Arguments = 0, 0
-     */
-    public void testB4() {
-        T_if_icmpne_1 t = new T_if_icmpne_1();
-        assertEquals(1234, t.run(0, 0));
-    }
-
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmpne.jm.T_if_icmpne_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int, double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmpne.jm.T_if_icmpne_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long, int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmpne.jm.T_if_icmpne_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall be inside the
-     * method
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmpne.jm.T_if_icmpne_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall not be "inside" wide
-     * instruction
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmpne.jm.T_if_icmpne_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference, int
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.if_icmpne.jm.T_if_icmpne_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_1.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_1.j
deleted file mode 100644
index b5aba30..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_1.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmpne_1.java
-.class public dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-; this method returns 1234 in case of failed comparison to check that execution proceeds
-; at the address following if_acmpeq instruction
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-    
-    iload_1
-    iload_2
-    
-    if_icmpne Label0
-    sipush 1234
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_1.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_1.java
deleted file mode 100644
index ea94397..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpne.jm;
-
-public class T_if_icmpne_1 {
-
-    public int run(int a, int b) {
-        return a != b ? 1 : 1234;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_2.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_2.j
deleted file mode 100644
index 60a57ef..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_2.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmpne_2.java
-.class public dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(II)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-;    iload_2
-    if_icmpne Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_2.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_2.java
deleted file mode 100644
index 2d83a4a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpne.jm;
-
-public class T_if_icmpne_2 {
-
-    public boolean run(int a, int b) {
-        return a != b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_3.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_3.j
deleted file mode 100644
index eb4f44c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_3.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmpne_3.java
-.class public dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(II)Z
-    .limit stack 4
-    .limit locals 3
-
-    iload_1
-;    iload_2
-    dconst_1
-    if_icmpne Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_3.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_3.java
deleted file mode 100644
index 2b53702..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpne.jm;
-
-public class T_if_icmpne_3 {
-
-    public boolean run(int a, int b) {
-        return a != b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_4.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_4.j
deleted file mode 100644
index 92c5f2d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_4.j
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmpne_4.java
-.class public dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(II)Z
-    .limit stack 3
-    .limit locals 3
-
-    lconst_1    
-    iload_1
-    ;iload_2
-
-    if_icmpne Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_4.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_4.java
deleted file mode 100644
index beb6454..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpne.jm;
-
-public class T_if_icmpne_4 {
-
-    public boolean run(int a, int b) {
-        return a != b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_5.cfh b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_5.cfh
deleted file mode 100644
index f0acc92..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_5.cfh
+++ /dev/null
@@ -1,197 +0,0 @@
-//@class:dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_5
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 08 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 8, h: 0004: utf8{"(II)Z"}
-    // .  .  .  (  I  I  )  Z  
-       01 00 05 28 49 49 29 5a 
-    // parsed:, offset 55, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 64, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 70, len 21, h: 0007: utf8{"T_if_icmpne_5.java"}
-    // .  .  .  T  _  i  f  _  i  c  m  p  n  e  _  5  .  j  a  v  a  
-       01 00 12 54 5f 69 66 5f 69 63 6d 70 6e 65 5f 35 2e 6a 61 76 61 
-    // parsed:, offset 91, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0b 
-    // parsed:, offset 96, len 47, h: 0009: utf8{"dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_5"}
-    // .  .  ,  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  _  i  c  m  p  n  e  /  j  m  /  T  _  i  f  _  i  c  m  p  n  e  _  5  
-       01 00 2c 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 5f 69 63 6d 70 6e 65 2f 6a 6d 2f 54 5f 69 66 5f 69 63 6d 70 6e 65 5f 35 
-    // parsed:, offset 143, len 7, h: 000a: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 150, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 156, len 3, h: 000c: type{dxc.junit.opcodes.if_icmpne.jm.T_if_icmpne_5}
-    // .  .  .  
-       07 00 09 
-    // parsed:, offset 159, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 162, len 0, h: end constant_pool
-// parsed:, offset 162, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 164, len 2, h: this_class: type{dxc.junit.opcodes.if_icmpne.jm.T_if_icmpne_5}
-// .  .  
-   00 0c 
-// parsed:, offset 166, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 168, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 170, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 172, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 174, len:76,desc: ()V
-// parsed:, offset 174, len 0, h:  methods[0]: 
-    // parsed:, offset 174, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 176, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 178, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 180, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 182, len 0, h:  attributes[0]: 
-        // parsed:, offset 182, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 184, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 188, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 190, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 192, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 201, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 203, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 205, len 0, h: end attributes[0] 
-// parsed:, offset 205, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 205, len:45,desc: (II)Z
-// parsed:, offset 205, len 0, h:  methods[1]: 
-    // parsed:, offset 205, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 207, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 209, len 2, h: descriptor: (II)Z
-    // .  .  
-       00 04 
-    // parsed:, offset 211, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 213, len 0, h:  attributes[0]: 
-        // parsed:, offset 213, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 215, len 4, h: length: 00000015
-        // .  .  .  .  
-           00 00 00 15 
-        // parsed:, offset 219, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 221, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 223, len 4, h: code_length: 00000009
-        // .  .  .  .  
-           00 00 00 09 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 1, h: 0001: iload_2 // 02
-        // .  
-           1c 
-        // parsed:, offset 2, len 3, h: 0002: if_icmpne 00ff
-        // .  .  .  
-//@mod     a0 00 05    
-           a0 00 ff 
-        // parsed:, offset 5, len 1, h: 0005: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 6, len 1, h: 0006: ireturn
-        // .  
-           ac 
-        // parsed:, offset 7, len 1, h: 0007: iconst_1 // #+01
-        // .  
-           04 
-        // parsed:, offset 8, len 1, h: 0008: ireturn
-        // .  
-           ac 
-        // parsed:, offset 236, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 238, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 240, len 0, h: end attributes[0] 
-// parsed:, offset 240, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (II)Z
-// parsed:, offset 240, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 242, len 0, h:  attributes[0]: 
-    // parsed:, offset 242, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 244, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 248, len 2, h: source: utf8{"T_if_icmpne_5.java"}
-    // .  .  
-       00 07 
-// parsed:, offset 250, len 0, h: end attributes[0] 
-// parsed:, offset 250, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_5.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_5.j
deleted file mode 100644
index 74d20f3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_5.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmpne_5.java
-.class public dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(II)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    iload_2
-    if_icmpne Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_5.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_5.java
deleted file mode 100644
index 157e7f2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpne.jm;
-
-public class T_if_icmpne_5 {
-
-    public boolean run(int a, int b) {
-        return a != b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_6.cfh b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_6.cfh
deleted file mode 100644
index 1991416..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_6.cfh
+++ /dev/null
@@ -1,204 +0,0 @@
-//@class:dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_6
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 07 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 8, h: 0004: utf8{"(II)Z"}
-    // .  .  .  (  I  I  )  Z  
-       01 00 05 28 49 49 29 5a 
-    // parsed:, offset 55, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 64, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 70, len 5, h: 0007: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0b 
-    // parsed:, offset 75, len 47, h: 0008: utf8{"dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_6"}
-    // .  .  ,  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  _  i  c  m  p  n  e  /  j  m  /  T  _  i  f  _  i  c  m  p  n  e  _  6  
-       01 00 2c 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 5f 69 63 6d 70 6e 65 2f 6a 6d 2f 54 5f 69 66 5f 69 63 6d 70 6e 65 5f 36 
-    // parsed:, offset 122, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 129, len 21, h: 000a: utf8{"T_if_icmpne_6.java"}
-    // .  .  .  T  _  i  f  _  i  c  m  p  n  e  _  6  .  j  a  v  a  
-       01 00 12 54 5f 69 66 5f 69 63 6d 70 6e 65 5f 36 2e 6a 61 76 61 
-    // parsed:, offset 150, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 156, len 3, h: 000c: type{dxc.junit.opcodes.if_icmpne.jm.T_if_icmpne_6}
-    // .  .  .  
-       07 00 08 
-    // parsed:, offset 159, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 162, len 0, h: end constant_pool
-// parsed:, offset 162, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 164, len 2, h: this_class: type{dxc.junit.opcodes.if_icmpne.jm.T_if_icmpne_6}
-// .  .  
-   00 0c 
-// parsed:, offset 166, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 168, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 170, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 172, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 174, len:79,desc: ()V
-// parsed:, offset 174, len 0, h:  methods[0]: 
-    // parsed:, offset 174, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 176, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 178, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 180, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 182, len 0, h:  attributes[0]: 
-        // parsed:, offset 182, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 184, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 188, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 190, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 192, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 201, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 203, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 205, len 0, h: end attributes[0] 
-// parsed:, offset 205, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 205, len:48,desc: (II)Z
-// parsed:, offset 205, len 0, h:  methods[1]: 
-    // parsed:, offset 205, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 207, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 209, len 2, h: descriptor: (II)Z
-    // .  .  
-       00 04 
-    // parsed:, offset 211, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 213, len 0, h:  attributes[0]: 
-        // parsed:, offset 213, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 215, len 4, h: length: 00000018
-        // .  .  .  .  
-           00 00 00 18 
-        // parsed:, offset 219, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 221, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 223, len 4, h: code_length: 0000000c
-        // .  .  .  .  
-           00 00 00 0c 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 1, h: 0001: iload_2 // 02
-        // .  
-           1c 
-        // parsed:, offset 2, len 3, h: 0002: if_icmpne 0008
-        // .  .  .  
-//@mod     a0 00 05    
-           a0 00 06 
-        // parsed:, offset 5, len 1, h: 0005: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 6, len 1, h: 0006: ireturn
-        // .  
-           ac 
-        // parsed:, offset 7, len 1, h: 0007: wide
-        // .  
-//@mod     00    
-           c4 
-        // parsed:, offset 8, len 2, h: 0008: iload 01
-        // .  .  
-           15 01 
-        // parsed:, offset 10, len 1, h: 000a: nop
-        // .  
-           00 
-        // parsed:, offset 11, len 1, h: 000b: ireturn
-        // .  
-           ac 
-        // parsed:, offset 239, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 241, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 243, len 0, h: end attributes[0] 
-// parsed:, offset 243, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (II)Z
-// parsed:, offset 243, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 245, len 0, h:  attributes[0]: 
-    // parsed:, offset 245, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 247, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 251, len 2, h: source: utf8{"T_if_icmpne_6.java"}
-    // .  .  
-       00 0a 
-// parsed:, offset 253, len 0, h: end attributes[0] 
-// parsed:, offset 253, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_6.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_6.j
deleted file mode 100644
index 2344281..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_6.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmpne_6.java
-.class public dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(II)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    iload_2
-    if_icmpne Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    nop
-    iload 1
-    nop
-;    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_6.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_6.java
deleted file mode 100644
index c0ed691..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpne.jm;
-
-public class T_if_icmpne_6 {
-
-    public boolean run(int a, int b) {
-        return a != b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_7.j b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_7.j
deleted file mode 100644
index b17f2de..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_7.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_icmpne_7.java
-.class public dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)Z
-    .limit stack 2
-    .limit locals 3
-
-    aload_0
-    iload_2
-    if_icmpeq Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-
-    Label2:
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_7.java b/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_7.java
deleted file mode 100644
index 6d777ca..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/if_icmpne/jm/T_if_icmpne_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.if_icmpne.jm;
-
-public class T_if_icmpne_7 {
-    
-    public boolean run(int a, int b) {
-        return a != b;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/Test_ifeq.java b/tools/dx-tests/src/dxc/junit/opcodes/ifeq/Test_ifeq.java
deleted file mode 100644
index 3927098..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/Test_ifeq.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifeq;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.ifeq.jm.T_ifeq_1;
-
-public class Test_ifeq extends DxTestCase {
-
-    /**
-     * @title  Argument = 5
-     */
-    public void testN1() {
-        T_ifeq_1 t = new T_ifeq_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));
-    }
-
-    /**
-     * @title  Argument = 0
-     */
-    public void testN2() {
-        T_ifeq_1 t = new T_ifeq_1();
-        assertEquals(1, t.run(0));
-    }
-
-    /**
-     * @title  Arguments = -5
-     */
-    public void testN3() {
-        T_ifeq_1 t = new T_ifeq_1();
-        assertEquals(1234, t.run(-5));
-    }
-
-    /**
-     * @title  Arguments = Integer.MAX_VALUE
-     */
-    public void testB1() {
-        T_ifeq_1 t = new T_ifeq_1();
-        assertEquals(1234, t.run(Integer.MAX_VALUE));
-    }
-
-    /**
-     * @title  Arguments = Integer.MIN_VALUE
-     */
-    public void testB2() {
-        T_ifeq_1 t = new T_ifeq_1();
-        assertEquals(1234, t.run(Integer.MIN_VALUE));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifeq.jm.T_ifeq_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifeq.jm.T_ifeq_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifeq.jm.T_ifeq_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall be inside the
-     * method
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifeq.jm.T_ifeq_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall not be "inside" wide
-     * instruction
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifeq.jm.T_ifeq_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifeq.jm.T_ifeq_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_1.j b/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_1.j
deleted file mode 100644
index ebbf58d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_1.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifeq_1.java
-.class public dxc/junit/opcodes/ifeq/jm/T_ifeq_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-; this method returns 1234 in case of failed comparison to check that execution proceeds
-; at the address following if_acmpeq instruction
-.method public run(I)I
-    .limit stack 2
-    .limit locals 3
-    
-    iload_1
-   
-    ifeq Label0
-    sipush 1234
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_1.java b/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_1.java
deleted file mode 100644
index 4fbd9fe..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifeq.jm;
-
-public class T_ifeq_1 {
-
-    public int run(int a) {
-        return a == 0 ? 1 : 1234;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_2.j b/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_2.j
deleted file mode 100644
index 55b0609..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_2.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifeq_2.java
-.class public dxc/junit/opcodes/ifeq/jm/T_ifeq_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(I)Z
-    .limit stack 2
-    .limit locals 3
-
-;    iload_1
-    ifeq Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_2.java b/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_2.java
deleted file mode 100644
index 86c487b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifeq.jm;
-
-public class T_ifeq_2 {
-
-    public boolean run(int a) {
-        return a == 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_3.j b/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_3.j
deleted file mode 100644
index 0d57e2f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_3.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifeq_3.java
-.class public dxc/junit/opcodes/ifeq/jm/T_ifeq_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(I)Z
-    .limit stack 4
-    .limit locals 3
-
-;    iload_1
-    dconst_1
-    ifeq Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_3.java b/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_3.java
deleted file mode 100644
index c511d7f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifeq.jm;
-
-public class T_ifeq_3 {
-
-    public boolean run(int a) {
-        return a == 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_4.j b/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_4.j
deleted file mode 100644
index 0d3cbb5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_4.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifeq_4.java
-.class public dxc/junit/opcodes/ifeq/jm/T_ifeq_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(I)Z
-    .limit stack 3
-    .limit locals 3
-
-    lconst_1
-
-    ifeq Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_4.java b/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_4.java
deleted file mode 100644
index ca0acbb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifeq.jm;
-
-public class T_ifeq_4 {
-
-    public boolean run(int a) {
-        return a == 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_5.cfh b/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_5.cfh
deleted file mode 100644
index cc71d99..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_5.cfh
+++ /dev/null
@@ -1,194 +0,0 @@
-//@class:dxc/junit/opcodes/ifeq/jm/T_ifeq_5
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 07 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 7, h: 0005: utf8{"(I)Z"}
-    // .  .  .  (  I  )  Z  
-       01 00 04 28 49 29 5a 
-    // parsed:, offset 63, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 69, len 5, h: 0007: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 0a 
-    // parsed:, offset 74, len 37, h: 0008: utf8{"dxc/junit/opcodes/ifeq/jm/T_ifeq_5"}
-    // .  .  "  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  e  q  /  j  m  /  T  _  i  f  e  q  _  5  
-       01 00 22 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 65 71 2f 6a 6d 2f 54 5f 69 66 65 71 5f 35 
-    // parsed:, offset 111, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 118, len 6, h: 000a: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 124, len 3, h: 000b: type{dxc.junit.opcodes.ifeq.jm.T_ifeq_5}
-    // .  .  .  
-       07 00 08 
-    // parsed:, offset 127, len 16, h: 000c: utf8{"T_ifeq_5.java"}
-    // .  .  .  T  _  i  f  e  q  _  5  .  j  a  v  a  
-       01 00 0d 54 5f 69 66 65 71 5f 35 2e 6a 61 76 61 
-    // parsed:, offset 143, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 146, len 0, h: end constant_pool
-// parsed:, offset 146, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 148, len 2, h: this_class: type{dxc.junit.opcodes.ifeq.jm.T_ifeq_5}
-// .  .  
-   00 0b 
-// parsed:, offset 150, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 152, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 154, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 156, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 158, len:75,desc: ()V
-// parsed:, offset 158, len 0, h:  methods[0]: 
-    // parsed:, offset 158, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 160, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 162, len 2, h: descriptor: ()V
-    // .  .  
-       00 0a 
-    // parsed:, offset 164, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 166, len 0, h:  attributes[0]: 
-        // parsed:, offset 166, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 168, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 172, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 174, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 176, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 185, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 187, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 189, len 0, h: end attributes[0] 
-// parsed:, offset 189, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 189, len:44,desc: (I)Z
-// parsed:, offset 189, len 0, h:  methods[1]: 
-    // parsed:, offset 189, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 191, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 193, len 2, h: descriptor: (I)Z
-    // .  .  
-       00 05 
-    // parsed:, offset 195, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 197, len 0, h:  attributes[0]: 
-        // parsed:, offset 197, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 199, len 4, h: length: 00000014
-        // .  .  .  .  
-           00 00 00 14 
-        // parsed:, offset 203, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 205, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 207, len 4, h: code_length: 00000008
-        // .  .  .  .  
-           00 00 00 08 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 3, h: 0001: ifeq 0006
-        // .  .  .  
-//@mod     99 00 05    
-           99 00 ff 
-        // parsed:, offset 4, len 1, h: 0004: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 5, len 1, h: 0005: ireturn
-        // .  
-           ac 
-        // parsed:, offset 6, len 1, h: 0006: iconst_1 // #+01
-        // .  
-           04 
-        // parsed:, offset 7, len 1, h: 0007: ireturn
-        // .  
-           ac 
-        // parsed:, offset 219, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 221, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 223, len 0, h: end attributes[0] 
-// parsed:, offset 223, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (I)Z
-// parsed:, offset 223, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 225, len 0, h:  attributes[0]: 
-    // parsed:, offset 225, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 227, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 231, len 2, h: source: utf8{"T_ifeq_5.java"}
-    // .  .  
-       00 0c 
-// parsed:, offset 233, len 0, h: end attributes[0] 
-// parsed:, offset 233, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_5.j b/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_5.j
deleted file mode 100644
index 004f71c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_5.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifeq_5.java
-.class public dxc/junit/opcodes/ifeq/jm/T_ifeq_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(I)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    ifeq Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_5.java b/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_5.java
deleted file mode 100644
index 3ed3f25..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifeq.jm;
-
-public class T_ifeq_5 {
-
-    public boolean run(int a) {
-        return a == 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_6.cfh b/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_6.cfh
deleted file mode 100644
index 32cd5c3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_6.cfh
+++ /dev/null
@@ -1,201 +0,0 @@
-//@class:dxc/junit/opcodes/ifeq/jm/T_ifeq_6
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 08 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 16, h: 0005: utf8{"T_ifeq_6.java"}
-    // .  .  .  T  _  i  f  e  q  _  6  .  j  a  v  a  
-       01 00 0d 54 5f 69 66 65 71 5f 36 2e 6a 61 76 61 
-    // parsed:, offset 72, len 7, h: 0006: utf8{"(I)Z"}
-    // .  .  .  (  I  )  Z  
-       01 00 04 28 49 29 5a 
-    // parsed:, offset 79, len 6, h: 0007: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 85, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 0b 
-    // parsed:, offset 90, len 37, h: 0009: utf8{"dxc/junit/opcodes/ifeq/jm/T_ifeq_6"}
-    // .  .  "  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  e  q  /  j  m  /  T  _  i  f  e  q  _  6  
-       01 00 22 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 65 71 2f 6a 6d 2f 54 5f 69 66 65 71 5f 36 
-    // parsed:, offset 127, len 7, h: 000a: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 134, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 140, len 3, h: 000c: type{dxc.junit.opcodes.ifeq.jm.T_ifeq_6}
-    // .  .  .  
-       07 00 09 
-    // parsed:, offset 143, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 146, len 0, h: end constant_pool
-// parsed:, offset 146, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 148, len 2, h: this_class: type{dxc.junit.opcodes.ifeq.jm.T_ifeq_6}
-// .  .  
-   00 0c 
-// parsed:, offset 150, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 152, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 154, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 156, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 158, len:78,desc: ()V
-// parsed:, offset 158, len 0, h:  methods[0]: 
-    // parsed:, offset 158, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 160, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 162, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 164, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 166, len 0, h:  attributes[0]: 
-        // parsed:, offset 166, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 168, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 172, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 174, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 176, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 185, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 187, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 189, len 0, h: end attributes[0] 
-// parsed:, offset 189, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 189, len:47,desc: (I)Z
-// parsed:, offset 189, len 0, h:  methods[1]: 
-    // parsed:, offset 189, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 191, len 2, h: name: run
-    // .  .  
-       00 07 
-    // parsed:, offset 193, len 2, h: descriptor: (I)Z
-    // .  .  
-       00 06 
-    // parsed:, offset 195, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 197, len 0, h:  attributes[0]: 
-        // parsed:, offset 197, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 199, len 4, h: length: 00000017
-        // .  .  .  .  
-           00 00 00 17 
-        // parsed:, offset 203, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 205, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 207, len 4, h: code_length: 0000000b
-        // .  .  .  .  
-           00 00 00 0b 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 3, h: 0001: ifeq 0007
-        // .  .  .  
-//@mod     99 00 05    
-           99 00 06 
-        // parsed:, offset 4, len 1, h: 0004: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 5, len 1, h: 0005: ireturn
-        // .  
-           ac 
-        // parsed:, offset 6, len 1, h: 0006: wide
-        // .  
-//@mod     00    
-           c4 
-        // parsed:, offset 7, len 2, h: 0007: iload 01
-        // .  .  
-           15 01 
-        // parsed:, offset 9, len 1, h: 0009: nop
-        // .  
-           00 
-        // parsed:, offset 10, len 1, h: 000a: ireturn
-        // .  
-           ac 
-        // parsed:, offset 222, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 224, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 226, len 0, h: end attributes[0] 
-// parsed:, offset 226, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (I)Z
-// parsed:, offset 226, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 228, len 0, h:  attributes[0]: 
-    // parsed:, offset 228, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 230, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 234, len 2, h: source: utf8{"T_ifeq_6.java"}
-    // .  .  
-       00 05 
-// parsed:, offset 236, len 0, h: end attributes[0] 
-// parsed:, offset 236, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_6.j b/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_6.j
deleted file mode 100644
index 03b9e49..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_6.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifeq_6.java
-.class public dxc/junit/opcodes/ifeq/jm/T_ifeq_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(I)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    ifeq Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    nop
-    iload 1
-    nop
-;    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_6.java b/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_6.java
deleted file mode 100644
index be53931..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifeq.jm;
-
-public class T_ifeq_6 {
-
-    public boolean run(int a) {
-        return a == 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_7.j b/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_7.j
deleted file mode 100644
index 44eb855..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_7.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifeq_7.java
-.class public dxc/junit/opcodes/ifeq/jm/T_ifeq_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)Z
-    .limit stack 1
-    .limit locals 2
-
-    aload_0
-    ifne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-
-    Label2:
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_7.java b/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_7.java
deleted file mode 100644
index 3bca0e1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifeq/jm/T_ifeq_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifeq.jm;
-
-public class T_ifeq_7 {
-    
-    public boolean run(int a) {
-        return a == 0;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifge/Test_ifge.java b/tools/dx-tests/src/dxc/junit/opcodes/ifge/Test_ifge.java
deleted file mode 100644
index f5ce7d4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifge/Test_ifge.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifge;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.ifge.jm.T_ifge_1;
-
-public class Test_ifge extends DxTestCase {
-
-    /**
-     * @title  Argument = 5
-     */
-    public void testN1() {
-        T_ifge_1 t = new T_ifge_1();
-        assertEquals(1, t.run(5));
-    }
-
-    /**
-     * @title  Argument = 0
-     */
-    public void testN2() {
-        T_ifge_1 t = new T_ifge_1();
-        assertEquals(1, t.run(0));
-    }
-
-    /**
-     * @title  Arguments = -5
-     */
-    public void testN3() {
-        T_ifge_1 t = new T_ifge_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));
-    }
-
-    /**
-     * @title  Arguments = Integer.MAX_VALUE
-     */
-    public void testB1() {
-        T_ifge_1 t = new T_ifge_1();
-        assertEquals(1, t.run(Integer.MAX_VALUE));
-    }
-
-    /**
-     * @title  Arguments = Integer.MIN_VALUE
-     */
-    public void testB2() {
-        T_ifge_1 t = new T_ifge_1();
-        assertEquals(1234, t.run(Integer.MIN_VALUE));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifge.jm.T_ifge_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifge.jm.T_ifge_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifge.jm.T_ifge_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall be inside the
-     * method
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifge.jm.T_ifge_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall not be "inside" wide
-     * instruction
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifge.jm.T_ifge_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifge.jm.T_ifge_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_1.j b/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_1.j
deleted file mode 100644
index 5e1064e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_1.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifge_1.java
-.class public dxc/junit/opcodes/ifge/jm/T_ifge_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-; this method returns 1234 in case of failed comparison to check that execution proceeds
-; at the address following if_acmpeq instruction
-.method public run(I)I
-    .limit stack 2
-    .limit locals 3
-    
-    iload_1
-   
-    ifge Label0
-    sipush 1234
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_1.java b/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_1.java
deleted file mode 100644
index f7f00c4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifge.jm;
-
-public class T_ifge_1 {
-
-    public int run(int a) {
-        return a >= 0 ? 1 : 1234;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_2.j b/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_2.j
deleted file mode 100644
index 2fa1d3b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_2.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifge_2.java
-.class public dxc/junit/opcodes/ifge/jm/T_ifge_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(I)Z
-    .limit stack 2
-    .limit locals 3
-
-;    iload_1
-    ifge Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_2.java b/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_2.java
deleted file mode 100644
index 3531b63..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifge.jm;
-
-public class T_ifge_2 {
-
-    public boolean run(int a) {
-        return a >= 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_3.j b/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_3.j
deleted file mode 100644
index ed463c0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_3.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifge_3.java
-.class public dxc/junit/opcodes/ifge/jm/T_ifge_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(I)Z
-    .limit stack 4
-    .limit locals 3
-
-;    iload_1
-    dconst_1
-    ifge Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_3.java b/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_3.java
deleted file mode 100644
index d41e72f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifge.jm;
-
-public class T_ifge_3 {
-
-    public boolean run(int a) {
-        return a >= 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_4.j b/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_4.j
deleted file mode 100644
index c8931a9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_4.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifge_4.java
-.class public dxc/junit/opcodes/ifge/jm/T_ifge_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(I)Z
-    .limit stack 3
-    .limit locals 3
-
-    lconst_1    
-;    iload_1
-
-    ifge Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_4.java b/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_4.java
deleted file mode 100644
index c2f54c3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifge.jm;
-
-public class T_ifge_4 {
-
-    public boolean run(int a) {
-        return a >= 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_5.cfh b/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_5.cfh
deleted file mode 100644
index 447a6d0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_5.cfh
+++ /dev/null
@@ -1,194 +0,0 @@
-//@class:dxc/junit/opcodes/ifge/jm/T_ifge_5
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 08 
-    // parsed:, offset 15, len 16, h: 0002: utf8{"T_ifge_5.java"}
-    // .  .  .  T  _  i  f  g  e  _  5  .  j  a  v  a  
-       01 00 0d 54 5f 69 66 67 65 5f 35 2e 6a 61 76 61 
-    // parsed:, offset 31, len 19, h: 0003: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 50, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 63, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 72, len 7, h: 0006: utf8{"(I)Z"}
-    // .  .  .  (  I  )  Z  
-       01 00 04 28 49 29 5a 
-    // parsed:, offset 79, len 6, h: 0007: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 85, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0b 
-    // parsed:, offset 90, len 37, h: 0009: utf8{"dxc/junit/opcodes/ifge/jm/T_ifge_5"}
-    // .  .  "  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  g  e  /  j  m  /  T  _  i  f  g  e  _  5  
-       01 00 22 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 67 65 2f 6a 6d 2f 54 5f 69 66 67 65 5f 35 
-    // parsed:, offset 127, len 7, h: 000a: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 134, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 140, len 3, h: 000c: type{dxc.junit.opcodes.ifge.jm.T_ifge_5}
-    // .  .  .  
-       07 00 09 
-    // parsed:, offset 143, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 03 
-// parsed:, offset 146, len 0, h: end constant_pool
-// parsed:, offset 146, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 148, len 2, h: this_class: type{dxc.junit.opcodes.ifge.jm.T_ifge_5}
-// .  .  
-   00 0c 
-// parsed:, offset 150, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 152, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 154, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 156, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 158, len:75,desc: ()V
-// parsed:, offset 158, len 0, h:  methods[0]: 
-    // parsed:, offset 158, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 160, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 162, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 164, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 166, len 0, h:  attributes[0]: 
-        // parsed:, offset 166, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 168, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 172, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 174, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 176, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 185, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 187, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 189, len 0, h: end attributes[0] 
-// parsed:, offset 189, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 189, len:44,desc: (I)Z
-// parsed:, offset 189, len 0, h:  methods[1]: 
-    // parsed:, offset 189, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 191, len 2, h: name: run
-    // .  .  
-       00 07 
-    // parsed:, offset 193, len 2, h: descriptor: (I)Z
-    // .  .  
-       00 06 
-    // parsed:, offset 195, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 197, len 0, h:  attributes[0]: 
-        // parsed:, offset 197, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 199, len 4, h: length: 00000014
-        // .  .  .  .  
-           00 00 00 14 
-        // parsed:, offset 203, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 205, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 207, len 4, h: code_length: 00000008
-        // .  .  .  .  
-           00 00 00 08 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 3, h: 0001: ifge 00ff
-        // .  .  .  
-//@mod     9c 00 05    
-           9c 00 ff 
-        // parsed:, offset 4, len 1, h: 0004: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 5, len 1, h: 0005: ireturn
-        // .  
-           ac 
-        // parsed:, offset 6, len 1, h: 0006: iconst_1 // #+01
-        // .  
-           04 
-        // parsed:, offset 7, len 1, h: 0007: ireturn
-        // .  
-           ac 
-        // parsed:, offset 219, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 221, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 223, len 0, h: end attributes[0] 
-// parsed:, offset 223, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (I)Z
-// parsed:, offset 223, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 225, len 0, h:  attributes[0]: 
-    // parsed:, offset 225, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 227, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 231, len 2, h: source: utf8{"T_ifge_5.java"}
-    // .  .  
-       00 02 
-// parsed:, offset 233, len 0, h: end attributes[0] 
-// parsed:, offset 233, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_5.j b/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_5.j
deleted file mode 100644
index fa04b63..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_5.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifge_5.java
-.class public dxc/junit/opcodes/ifge/jm/T_ifge_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(I)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    ifge Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_5.java b/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_5.java
deleted file mode 100644
index 51b8426..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifge.jm;
-
-public class T_ifge_5 {
-
-    public boolean run(int a) {
-        return a >= 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_6.cfh b/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_6.cfh
deleted file mode 100644
index ed3e960..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_6.cfh
+++ /dev/null
@@ -1,201 +0,0 @@
-//@class:dxc/junit/opcodes/ifge/jm/T_ifge_6
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 09 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 7, h: 0005: utf8{"(I)Z"}
-    // .  .  .  (  I  )  Z  
-       01 00 04 28 49 29 5a 
-    // parsed:, offset 63, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 69, len 37, h: 0007: utf8{"dxc/junit/opcodes/ifge/jm/T_ifge_6"}
-    // .  .  "  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  g  e  /  j  m  /  T  _  i  f  g  e  _  6  
-       01 00 22 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 67 65 2f 6a 6d 2f 54 5f 69 66 67 65 5f 36 
-    // parsed:, offset 106, len 16, h: 0008: utf8{"T_ifge_6.java"}
-    // .  .  .  T  _  i  f  g  e  _  6  .  j  a  v  a  
-       01 00 0d 54 5f 69 66 67 65 5f 36 2e 6a 61 76 61 
-    // parsed:, offset 122, len 5, h: 0009: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 0b 
-    // parsed:, offset 127, len 7, h: 000a: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 134, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 140, len 3, h: 000c: type{dxc.junit.opcodes.ifge.jm.T_ifge_6}
-    // .  .  .  
-       07 00 07 
-    // parsed:, offset 143, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 146, len 0, h: end constant_pool
-// parsed:, offset 146, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 148, len 2, h: this_class: type{dxc.junit.opcodes.ifge.jm.T_ifge_6}
-// .  .  
-   00 0c 
-// parsed:, offset 150, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 152, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 154, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 156, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 158, len:78,desc: ()V
-// parsed:, offset 158, len 0, h:  methods[0]: 
-    // parsed:, offset 158, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 160, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 162, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 164, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 166, len 0, h:  attributes[0]: 
-        // parsed:, offset 166, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 168, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 172, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 174, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 176, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 185, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 187, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 189, len 0, h: end attributes[0] 
-// parsed:, offset 189, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 189, len:47,desc: (I)Z
-// parsed:, offset 189, len 0, h:  methods[1]: 
-    // parsed:, offset 189, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 191, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 193, len 2, h: descriptor: (I)Z
-    // .  .  
-       00 05 
-    // parsed:, offset 195, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 197, len 0, h:  attributes[0]: 
-        // parsed:, offset 197, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 199, len 4, h: length: 00000017
-        // .  .  .  .  
-           00 00 00 17 
-        // parsed:, offset 203, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 205, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 207, len 4, h: code_length: 0000000b
-        // .  .  .  .  
-           00 00 00 0b 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 3, h: 0001: ifge 0007
-        // .  .  .  
-//@mod     9c 00 05    
-           9c 00 06 
-        // parsed:, offset 4, len 1, h: 0004: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 5, len 1, h: 0005: ireturn
-        // .  
-           ac 
-        // parsed:, offset 6, len 1, h: 0006: wide
-        // .  
-//@mod     00    
-           c4 
-        // parsed:, offset 7, len 2, h: 0007: iload 01
-        // .  .  
-           15 01 
-        // parsed:, offset 9, len 1, h: 0009: nop
-        // .  
-           00 
-        // parsed:, offset 10, len 1, h: 000a: ireturn
-        // .  
-           ac 
-        // parsed:, offset 222, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 224, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 226, len 0, h: end attributes[0] 
-// parsed:, offset 226, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (I)Z
-// parsed:, offset 226, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 228, len 0, h:  attributes[0]: 
-    // parsed:, offset 228, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 230, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 234, len 2, h: source: utf8{"T_ifge_6.java"}
-    // .  .  
-       00 08 
-// parsed:, offset 236, len 0, h: end attributes[0] 
-// parsed:, offset 236, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_6.j b/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_6.j
deleted file mode 100644
index be4599c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_6.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifge_6.java
-.class public dxc/junit/opcodes/ifge/jm/T_ifge_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(I)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    ifge Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    nop
-    iload 1
-    nop
-;    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_6.java b/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_6.java
deleted file mode 100644
index fef5eda..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifge.jm;
-
-public class T_ifge_6 {
-
-    public boolean run(int a) {
-        return a >= 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_7.j b/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_7.j
deleted file mode 100644
index 90f73f7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_7.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifge_7.java
-.class public dxc/junit/opcodes/ifge/jm/T_ifge_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)Z
-    .limit stack 1
-    .limit locals 2
-
-    aload_0
-    iflt Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-
-    Label2:
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_7.java b/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_7.java
deleted file mode 100644
index 045dd72..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifge/jm/T_ifge_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifge.jm;
-
-public class T_ifge_7 {
-    
-    public boolean run(int a) {
-        return a >= 0;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/Test_ifgt.java b/tools/dx-tests/src/dxc/junit/opcodes/ifgt/Test_ifgt.java
deleted file mode 100644
index a23c719..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/Test_ifgt.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifgt;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.ifgt.jm.T_ifgt_1;
-
-public class Test_ifgt extends DxTestCase {
-
-    /**
-     * @title  Argument = 5
-     */
-    public void testN1() {
-        T_ifgt_1 t = new T_ifgt_1();
-        assertEquals(1, t.run(5));
-    }
-
-    /**
-     * @title  Argument = 0
-     */
-    public void testN2() {
-        T_ifgt_1 t = new T_ifgt_1();
-        assertEquals(1234, t.run(0));
-    }
-
-    /**
-     * @title  Arguments = -5
-     */
-    public void testN3() {
-        T_ifgt_1 t = new T_ifgt_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));
-    }
-
-    /**
-     * @title  Arguments = Integer.MAX_VALUE
-     */
-    public void testB1() {
-        T_ifgt_1 t = new T_ifgt_1();
-        assertEquals(1, t.run(Integer.MAX_VALUE));
-    }
-
-    /**
-     * @title  Arguments = Integer.MIN_VALUE
-     */
-    public void testB2() {
-        T_ifgt_1 t = new T_ifgt_1();
-        assertEquals(1234, t.run(Integer.MIN_VALUE));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifgt.jm.T_ifgt_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifgt.jm.T_ifgt_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifgt.jm.T_ifgt_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall be inside the
-     * method
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifgt.jm.T_ifgt_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall not be "inside" wide
-     * instruction
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifgt.jm.T_ifgt_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifgt.jm.T_ifgt_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_1.j b/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_1.j
deleted file mode 100644
index b259343..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_1.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifgt_1.java
-.class public dxc/junit/opcodes/ifgt/jm/T_ifgt_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-; this method returns 1234 in case of failed comparison to check that execution proceeds
-; at the address following if_acmpeq instruction
-.method public run(I)I
-    .limit stack 2
-    .limit locals 3
-    
-    iload_1
-   
-    ifgt Label0
-    sipush 1234
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_1.java b/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_1.java
deleted file mode 100644
index 5578ce0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifgt.jm;
-
-public class T_ifgt_1 {
-
-    public int run(int a) {
-        return a > 0 ? 1 : 1234;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_2.j b/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_2.j
deleted file mode 100644
index 16cd6de..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_2.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifgt_2.java
-.class public dxc/junit/opcodes/ifgt/jm/T_ifgt_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(I)Z
-    .limit stack 2
-    .limit locals 3
-
-;    iload_1
-    ifgt Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_2.java b/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_2.java
deleted file mode 100644
index 6b130b9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifgt.jm;
-
-public class T_ifgt_2 {
-
-    public boolean run(int a) {
-        return a > 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_3.j b/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_3.j
deleted file mode 100644
index 986ac04..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_3.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifgt_3.java
-.class public dxc/junit/opcodes/ifgt/jm/T_ifgt_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(I)Z
-    .limit stack 4
-    .limit locals 3
-
-;    iload_1
-    dconst_1
-    ifgt Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_3.java b/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_3.java
deleted file mode 100644
index 3e76835..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifgt.jm;
-
-public class T_ifgt_3 {
-
-    public boolean run(int a) {
-        return a > 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_4.j b/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_4.j
deleted file mode 100644
index 78a8221..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_4.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifgt_4.java
-.class public dxc/junit/opcodes/ifgt/jm/T_ifgt_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(I)Z
-    .limit stack 3
-    .limit locals 3
-
-    lconst_1    
-;    iload_1
-
-    ifgt Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_4.java b/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_4.java
deleted file mode 100644
index 5b65155..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifgt.jm;
-
-public class T_ifgt_4 {
-
-    public boolean run(int a) {
-        return a > 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_5.cfh b/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_5.cfh
deleted file mode 100644
index 4ce7be3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_5.cfh
+++ /dev/null
@@ -1,194 +0,0 @@
-//@class:dxc/junit/opcodes/ifgt/jm/T_ifgt_5
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 09 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 7, h: 0005: utf8{"(I)Z"}
-    // .  .  .  (  I  )  Z  
-       01 00 04 28 49 29 5a 
-    // parsed:, offset 63, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 69, len 37, h: 0007: utf8{"dxc/junit/opcodes/ifgt/jm/T_ifgt_5"}
-    // .  .  "  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  g  t  /  j  m  /  T  _  i  f  g  t  _  5  
-       01 00 22 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 67 74 2f 6a 6d 2f 54 5f 69 66 67 74 5f 35 
-    // parsed:, offset 106, len 16, h: 0008: utf8{"T_ifgt_5.java"}
-    // .  .  .  T  _  i  f  g  t  _  5  .  j  a  v  a  
-       01 00 0d 54 5f 69 66 67 74 5f 35 2e 6a 61 76 61 
-    // parsed:, offset 122, len 5, h: 0009: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 0b 
-    // parsed:, offset 127, len 7, h: 000a: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 134, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 140, len 3, h: 000c: type{dxc.junit.opcodes.ifgt.jm.T_ifgt_5}
-    // .  .  .  
-       07 00 07 
-    // parsed:, offset 143, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 146, len 0, h: end constant_pool
-// parsed:, offset 146, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 148, len 2, h: this_class: type{dxc.junit.opcodes.ifgt.jm.T_ifgt_5}
-// .  .  
-   00 0c 
-// parsed:, offset 150, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 152, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 154, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 156, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 158, len:75,desc: ()V
-// parsed:, offset 158, len 0, h:  methods[0]: 
-    // parsed:, offset 158, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 160, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 162, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 164, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 166, len 0, h:  attributes[0]: 
-        // parsed:, offset 166, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 168, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 172, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 174, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 176, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 185, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 187, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 189, len 0, h: end attributes[0] 
-// parsed:, offset 189, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 189, len:44,desc: (I)Z
-// parsed:, offset 189, len 0, h:  methods[1]: 
-    // parsed:, offset 189, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 191, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 193, len 2, h: descriptor: (I)Z
-    // .  .  
-       00 05 
-    // parsed:, offset 195, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 197, len 0, h:  attributes[0]: 
-        // parsed:, offset 197, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 199, len 4, h: length: 00000014
-        // .  .  .  .  
-           00 00 00 14 
-        // parsed:, offset 203, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 205, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 207, len 4, h: code_length: 00000008
-        // .  .  .  .  
-           00 00 00 08 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 3, h: 0001: ifgt 00ff
-        // .  .  .  
-//@mod     9d 00 05    
-           9d 00 ff 
-        // parsed:, offset 4, len 1, h: 0004: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 5, len 1, h: 0005: ireturn
-        // .  
-           ac 
-        // parsed:, offset 6, len 1, h: 0006: iconst_1 // #+01
-        // .  
-           04 
-        // parsed:, offset 7, len 1, h: 0007: ireturn
-        // .  
-           ac 
-        // parsed:, offset 219, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 221, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 223, len 0, h: end attributes[0] 
-// parsed:, offset 223, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (I)Z
-// parsed:, offset 223, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 225, len 0, h:  attributes[0]: 
-    // parsed:, offset 225, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 227, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 231, len 2, h: source: utf8{"T_ifgt_5.java"}
-    // .  .  
-       00 08 
-// parsed:, offset 233, len 0, h: end attributes[0] 
-// parsed:, offset 233, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_5.j b/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_5.j
deleted file mode 100644
index ec5cb22..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_5.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifgt_5.java
-.class public dxc/junit/opcodes/ifgt/jm/T_ifgt_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(I)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    ifgt Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_5.java b/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_5.java
deleted file mode 100644
index 5153975..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifgt.jm;
-
-public class T_ifgt_5 {
-
-    public boolean run(int a) {
-        return a > 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_6.cfh b/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_6.cfh
deleted file mode 100644
index 0b9b936..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_6.cfh
+++ /dev/null
@@ -1,201 +0,0 @@
-//@class:dxc/junit/opcodes/ifgt/jm/T_ifgt_6
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 08 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 7, h: 0005: utf8{"(I)Z"}
-    // .  .  .  (  I  )  Z  
-       01 00 04 28 49 29 5a 
-    // parsed:, offset 63, len 37, h: 0006: utf8{"dxc/junit/opcodes/ifgt/jm/T_ifgt_6"}
-    // .  .  "  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  g  t  /  j  m  /  T  _  i  f  g  t  _  6  
-       01 00 22 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 67 74 2f 6a 6d 2f 54 5f 69 66 67 74 5f 36 
-    // parsed:, offset 100, len 6, h: 0007: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 106, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 0c 
-    // parsed:, offset 111, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 118, len 16, h: 000a: utf8{"T_ifgt_6.java"}
-    // .  .  .  T  _  i  f  g  t  _  6  .  j  a  v  a  
-       01 00 0d 54 5f 69 66 67 74 5f 36 2e 6a 61 76 61 
-    // parsed:, offset 134, len 3, h: 000b: type{dxc.junit.opcodes.ifgt.jm.T_ifgt_6}
-    // .  .  .  
-       07 00 06 
-    // parsed:, offset 137, len 6, h: 000c: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 143, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 146, len 0, h: end constant_pool
-// parsed:, offset 146, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 148, len 2, h: this_class: type{dxc.junit.opcodes.ifgt.jm.T_ifgt_6}
-// .  .  
-   00 0b 
-// parsed:, offset 150, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 152, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 154, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 156, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 158, len:78,desc: ()V
-// parsed:, offset 158, len 0, h:  methods[0]: 
-    // parsed:, offset 158, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 160, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 162, len 2, h: descriptor: ()V
-    // .  .  
-       00 0c 
-    // parsed:, offset 164, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 166, len 0, h:  attributes[0]: 
-        // parsed:, offset 166, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 168, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 172, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 174, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 176, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 185, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 187, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 189, len 0, h: end attributes[0] 
-// parsed:, offset 189, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 189, len:47,desc: (I)Z
-// parsed:, offset 189, len 0, h:  methods[1]: 
-    // parsed:, offset 189, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 191, len 2, h: name: run
-    // .  .  
-       00 07 
-    // parsed:, offset 193, len 2, h: descriptor: (I)Z
-    // .  .  
-       00 05 
-    // parsed:, offset 195, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 197, len 0, h:  attributes[0]: 
-        // parsed:, offset 197, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 199, len 4, h: length: 00000017
-        // .  .  .  .  
-           00 00 00 17 
-        // parsed:, offset 203, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 205, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 207, len 4, h: code_length: 0000000b
-        // .  .  .  .  
-           00 00 00 0b 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 3, h: 0001: ifgt 0007
-        // .  .  .  
-//@mod     9d 00 05    
-           9d 00 06 
-        // parsed:, offset 4, len 1, h: 0004: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 5, len 1, h: 0005: ireturn
-        // .  
-           ac 
-        // parsed:, offset 6, len 1, h: 0006: wide
-        // .  
-//@mod     00    
-           c4 
-        // parsed:, offset 7, len 2, h: 0007: iload 01
-        // .  .  
-           15 01 
-        // parsed:, offset 9, len 1, h: 0009: nop
-        // .  
-           00 
-        // parsed:, offset 10, len 1, h: 000a: ireturn
-        // .  
-           ac 
-        // parsed:, offset 222, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 224, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 226, len 0, h: end attributes[0] 
-// parsed:, offset 226, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (I)Z
-// parsed:, offset 226, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 228, len 0, h:  attributes[0]: 
-    // parsed:, offset 228, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 230, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 234, len 2, h: source: utf8{"T_ifgt_6.java"}
-    // .  .  
-       00 0a 
-// parsed:, offset 236, len 0, h: end attributes[0] 
-// parsed:, offset 236, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_6.j b/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_6.j
deleted file mode 100644
index 80abe2d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_6.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifgt_6.java
-.class public dxc/junit/opcodes/ifgt/jm/T_ifgt_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(I)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    ifgt Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    nop
-    iload 1
-    nop
-;    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_6.java b/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_6.java
deleted file mode 100644
index f56d5e0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifgt.jm;
-
-public class T_ifgt_6 {
-
-    public boolean run(int a) {
-        return a > 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_7.j b/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_7.j
deleted file mode 100644
index 175e006..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_7.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifgt_7.java
-.class public dxc/junit/opcodes/ifgt/jm/T_ifgt_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)Z
-    .limit stack 1
-    .limit locals 2
-
-    aload_0
-    ifle Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_7.java b/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_7.java
deleted file mode 100644
index 4572fbf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifgt/jm/T_ifgt_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifgt.jm;
-
-public class T_ifgt_7 {
-    
-    public boolean run(int a) {
-        return a > 0;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifle/Test_ifle.java b/tools/dx-tests/src/dxc/junit/opcodes/ifle/Test_ifle.java
deleted file mode 100644
index 9e722fb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifle/Test_ifle.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifle;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.ifle.jm.T_ifle_1;
-
-public class Test_ifle extends DxTestCase {
-
-    /**
-     * @title  Argument = 5
-     */
-    public void testN1() {
-        T_ifle_1 t = new T_ifle_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));
-    }
-
-    /**
-     * @title  Argument = 0
-     */
-    public void testN2() {
-        T_ifle_1 t = new T_ifle_1();
-        assertEquals(1, t.run(0));
-    }
-
-    /**
-     * @title  Arguments = -5
-     */
-    public void testN3() {
-        T_ifle_1 t = new T_ifle_1();
-        assertEquals(1, t.run(-5));
-    }
-
-    /**
-     * @title  Arguments = Integer.MAX_VALUE
-     */
-    public void testB1() {
-        T_ifle_1 t = new T_ifle_1();
-        assertEquals(1234, t.run(Integer.MAX_VALUE));
-    }
-
-    /**
-     * @title  Arguments = Integer.MIN_VALUE
-     */
-    public void testB2() {
-        T_ifle_1 t = new T_ifle_1();
-        assertEquals(1, t.run(Integer.MIN_VALUE));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifle.jm.T_ifle_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifle.jm.T_ifle_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifle.jm.T_ifle_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall be inside the
-     * method
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifle.jm.T_ifle_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall not be "inside" wide
-     * instruction
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifle.jm.T_ifle_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifle.jm.T_ifle_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_1.j b/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_1.j
deleted file mode 100644
index 19942fd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_1.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifle_1.java
-.class public dxc/junit/opcodes/ifle/jm/T_ifle_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-; this method returns 1234 in case of failed comparison to check that execution proceeds
-; at the address following if_acmpeq instruction
-.method public run(I)I
-    .limit stack 2
-    .limit locals 3
-    
-    iload_1
-   
-    ifle Label0
-    sipush 1234
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_1.java b/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_1.java
deleted file mode 100644
index bef4888..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifle.jm;
-
-public class T_ifle_1 {
-
-    public int run(int a) {
-        return a <= 0 ? 1 : 1234;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_2.j b/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_2.j
deleted file mode 100644
index 21916f4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_2.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifle_2.java
-.class public dxc/junit/opcodes/ifle/jm/T_ifle_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(I)Z
-    .limit stack 2
-    .limit locals 3
-
-;    iload_1
-    ifle Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_2.java b/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_2.java
deleted file mode 100644
index f5b592b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifle.jm;
-
-public class T_ifle_2 {
-
-    public boolean run(int a) {
-        return a <= 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_3.j b/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_3.j
deleted file mode 100644
index ce3bacb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_3.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifle_3.java
-.class public dxc/junit/opcodes/ifle/jm/T_ifle_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(I)Z
-    .limit stack 4
-    .limit locals 3
-
-;    iload_1
-    dconst_1
-    ifle Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_3.java b/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_3.java
deleted file mode 100644
index 5c5ea8a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifle.jm;
-
-public class T_ifle_3 {
-
-    public boolean run(int a) {
-        return a <= 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_4.j b/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_4.j
deleted file mode 100644
index 1d09835..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_4.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifle_4.java
-.class public dxc/junit/opcodes/ifle/jm/T_ifle_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(I)Z
-    .limit stack 3
-    .limit locals 3
-
-    lconst_1    
-;    iload_1
-
-    ifle Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_4.java b/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_4.java
deleted file mode 100644
index 14731b3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifle.jm;
-
-public class T_ifle_4 {
-
-    public boolean run(int a) {
-        return a <= 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_5.cfh b/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_5.cfh
deleted file mode 100644
index 1d1f660..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_5.cfh
+++ /dev/null
@@ -1,194 +0,0 @@
-//@class:dxc/junit/opcodes/ifle/jm/T_ifle_5
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 09 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 3, h: 0004: type{dxc.junit.opcodes.ifle.jm.T_ifle_5}
-    // .  .  .  
-       07 00 0c 
-    // parsed:, offset 50, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 59, len 7, h: 0006: utf8{"(I)Z"}
-    // .  .  .  (  I  )  Z  
-       01 00 04 28 49 29 5a 
-    // parsed:, offset 66, len 16, h: 0007: utf8{"T_ifle_5.java"}
-    // .  .  .  T  _  i  f  l  e  _  5  .  j  a  v  a  
-       01 00 0d 54 5f 69 66 6c 65 5f 35 2e 6a 61 76 61 
-    // parsed:, offset 82, len 6, h: 0008: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 88, len 5, h: 0009: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0b 
-    // parsed:, offset 93, len 7, h: 000a: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 100, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 106, len 37, h: 000c: utf8{"dxc/junit/opcodes/ifle/jm/T_ifle_5"}
-    // .  .  "  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  l  e  /  j  m  /  T  _  i  f  l  e  _  5  
-       01 00 22 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 6c 65 2f 6a 6d 2f 54 5f 69 66 6c 65 5f 35 
-    // parsed:, offset 143, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 146, len 0, h: end constant_pool
-// parsed:, offset 146, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 148, len 2, h: this_class: type{dxc.junit.opcodes.ifle.jm.T_ifle_5}
-// .  .  
-   00 04 
-// parsed:, offset 150, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 152, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 154, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 156, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 158, len:75,desc: ()V
-// parsed:, offset 158, len 0, h:  methods[0]: 
-    // parsed:, offset 158, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 160, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 162, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 164, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 166, len 0, h:  attributes[0]: 
-        // parsed:, offset 166, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 168, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 172, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 174, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 176, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 185, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 187, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 189, len 0, h: end attributes[0] 
-// parsed:, offset 189, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 189, len:44,desc: (I)Z
-// parsed:, offset 189, len 0, h:  methods[1]: 
-    // parsed:, offset 189, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 191, len 2, h: name: run
-    // .  .  
-       00 08 
-    // parsed:, offset 193, len 2, h: descriptor: (I)Z
-    // .  .  
-       00 06 
-    // parsed:, offset 195, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 197, len 0, h:  attributes[0]: 
-        // parsed:, offset 197, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 199, len 4, h: length: 00000014
-        // .  .  .  .  
-           00 00 00 14 
-        // parsed:, offset 203, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 205, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 207, len 4, h: code_length: 00000008
-        // .  .  .  .  
-           00 00 00 08 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 3, h: 0001: ifle 00ff
-        // .  .  .  
-//@mod     9e 00 05    
-           9e 00 ff 
-        // parsed:, offset 4, len 1, h: 0004: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 5, len 1, h: 0005: ireturn
-        // .  
-           ac 
-        // parsed:, offset 6, len 1, h: 0006: iconst_1 // #+01
-        // .  
-           04 
-        // parsed:, offset 7, len 1, h: 0007: ireturn
-        // .  
-           ac 
-        // parsed:, offset 219, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 221, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 223, len 0, h: end attributes[0] 
-// parsed:, offset 223, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (I)Z
-// parsed:, offset 223, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 225, len 0, h:  attributes[0]: 
-    // parsed:, offset 225, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 227, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 231, len 2, h: source: utf8{"T_ifle_5.java"}
-    // .  .  
-       00 07 
-// parsed:, offset 233, len 0, h: end attributes[0] 
-// parsed:, offset 233, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_5.j b/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_5.j
deleted file mode 100644
index 8005cf8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_5.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifle_5.java
-.class public dxc/junit/opcodes/ifle/jm/T_ifle_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(I)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    ifle Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_5.java b/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_5.java
deleted file mode 100644
index bec3678..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifle.jm;
-
-public class T_ifle_5 {
-
-    public boolean run(int a) {
-        return a <= 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_6.cfh b/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_6.cfh
deleted file mode 100644
index d7097b9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_6.cfh
+++ /dev/null
@@ -1,201 +0,0 @@
-//@class:dxc/junit/opcodes/ifle/jm/T_ifle_6
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 08 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 3, h: 0003: type{dxc.junit.opcodes.ifle.jm.T_ifle_6}
-    // .  .  .  
-       07 00 0b 
-    // parsed:, offset 37, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 50, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 59, len 7, h: 0006: utf8{"(I)Z"}
-    // .  .  .  (  I  )  Z  
-       01 00 04 28 49 29 5a 
-    // parsed:, offset 66, len 6, h: 0007: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 72, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0c 
-    // parsed:, offset 77, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 84, len 16, h: 000a: utf8{"T_ifle_6.java"}
-    // .  .  .  T  _  i  f  l  e  _  6  .  j  a  v  a  
-       01 00 0d 54 5f 69 66 6c 65 5f 36 2e 6a 61 76 61 
-    // parsed:, offset 100, len 37, h: 000b: utf8{"dxc/junit/opcodes/ifle/jm/T_ifle_6"}
-    // .  .  "  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  l  e  /  j  m  /  T  _  i  f  l  e  _  6  
-       01 00 22 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 6c 65 2f 6a 6d 2f 54 5f 69 66 6c 65 5f 36 
-    // parsed:, offset 137, len 6, h: 000c: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 143, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 146, len 0, h: end constant_pool
-// parsed:, offset 146, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 148, len 2, h: this_class: type{dxc.junit.opcodes.ifle.jm.T_ifle_6}
-// .  .  
-   00 03 
-// parsed:, offset 150, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 152, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 154, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 156, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 158, len:78,desc: ()V
-// parsed:, offset 158, len 0, h:  methods[0]: 
-    // parsed:, offset 158, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 160, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 162, len 2, h: descriptor: ()V
-    // .  .  
-       00 0c 
-    // parsed:, offset 164, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 166, len 0, h:  attributes[0]: 
-        // parsed:, offset 166, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 168, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 172, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 174, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 176, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 185, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 187, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 189, len 0, h: end attributes[0] 
-// parsed:, offset 189, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 189, len:47,desc: (I)Z
-// parsed:, offset 189, len 0, h:  methods[1]: 
-    // parsed:, offset 189, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 191, len 2, h: name: run
-    // .  .  
-       00 07 
-    // parsed:, offset 193, len 2, h: descriptor: (I)Z
-    // .  .  
-       00 06 
-    // parsed:, offset 195, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 197, len 0, h:  attributes[0]: 
-        // parsed:, offset 197, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 199, len 4, h: length: 00000017
-        // .  .  .  .  
-           00 00 00 17 
-        // parsed:, offset 203, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 205, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 207, len 4, h: code_length: 0000000b
-        // .  .  .  .  
-           00 00 00 0b 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 3, h: 0001: ifle 0007
-        // .  .  .  
-//@mod     9e 00 05    
-           9e 00 06 
-        // parsed:, offset 4, len 1, h: 0004: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 5, len 1, h: 0005: ireturn
-        // .  
-           ac 
-        // parsed:, offset 6, len 1, h: 0006: wide
-        // .  
-//@mod     00    
-           c4 
-        // parsed:, offset 7, len 2, h: 0007: iload 01
-        // .  .  
-           15 01 
-        // parsed:, offset 9, len 1, h: 0009: nop
-        // .  
-           00 
-        // parsed:, offset 10, len 1, h: 000a: ireturn
-        // .  
-           ac 
-        // parsed:, offset 222, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 224, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 226, len 0, h: end attributes[0] 
-// parsed:, offset 226, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (I)Z
-// parsed:, offset 226, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 228, len 0, h:  attributes[0]: 
-    // parsed:, offset 228, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 230, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 234, len 2, h: source: utf8{"T_ifle_6.java"}
-    // .  .  
-       00 0a 
-// parsed:, offset 236, len 0, h: end attributes[0] 
-// parsed:, offset 236, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_6.j b/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_6.j
deleted file mode 100644
index e6d9d8a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_6.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifle_6.java
-.class public dxc/junit/opcodes/ifle/jm/T_ifle_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(I)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    ifle Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    nop
-    iload 1
-    nop
-;    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_6.java b/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_6.java
deleted file mode 100644
index f3abc61..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifle.jm;
-
-public class T_ifle_6 {
-
-    public boolean run(int a) {
-        return a <= 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_7.j b/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_7.j
deleted file mode 100644
index 649773f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_7.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifle_7.java
-.class public dxc/junit/opcodes/ifle/jm/T_ifle_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)Z
-    .limit stack 1
-    .limit locals 2
-
-    aload_0
-    ifgt Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-
-    Label2:
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_7.java b/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_7.java
deleted file mode 100644
index 02ca988f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifle/jm/T_ifle_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifle.jm;
-
-public class T_ifle_7 {
-    
-    public boolean run(int a) {
-        return a <= 0;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iflt/Test_iflt.java b/tools/dx-tests/src/dxc/junit/opcodes/iflt/Test_iflt.java
deleted file mode 100644
index edd37e6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iflt/Test_iflt.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iflt;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.iflt.jm.T_iflt_1;
-
-public class Test_iflt extends DxTestCase {
-
-    /**
-     * @title  Argument = 5
-     */
-    public void testN1() {
-        T_iflt_1 t = new T_iflt_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));
-    }
-
-    /**
-     * @title  Argument = 0
-     */
-    public void testN2() {
-        T_iflt_1 t = new T_iflt_1();
-        assertEquals(1234, t.run(0));
-    }
-
-    /**
-     * @title  Arguments = -5
-     */
-    public void testN3() {
-        T_iflt_1 t = new T_iflt_1();
-        assertEquals(1, t.run(-5));
-    }
-
-    /**
-     * @title  Arguments = Integer.MAX_VALUE
-     */
-    public void testB1() {
-        T_iflt_1 t = new T_iflt_1();
-        assertEquals(1234, t.run(Integer.MAX_VALUE));
-    }
-
-    /**
-     * @title  Arguments = Integer.MIN_VALUE
-     */
-    public void testB2() {
-        T_iflt_1 t = new T_iflt_1();
-        assertEquals(1, t.run(Integer.MIN_VALUE));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.iflt.jm.T_iflt_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.iflt.jm.T_iflt_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.iflt.jm.T_iflt_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall be inside the
-     * method
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.iflt.jm.T_iflt_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall not be "inside" wide
-     * instruction
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.iflt.jm.T_iflt_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.iflt.jm.T_iflt_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_1.j b/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_1.j
deleted file mode 100644
index c10806b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_1.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iflt_1.java
-.class public dxc/junit/opcodes/iflt/jm/T_iflt_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-; this method returns 1234 in case of failed comparison to check that execution proceeds
-; at the address following if_acmpeq instruction
-.method public run(I)I
-    .limit stack 2
-    .limit locals 3
-    
-    iload_1
-   
-    iflt Label0
-    sipush 1234
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_1.java b/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_1.java
deleted file mode 100644
index 2bc2aff..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iflt.jm;
-
-public class T_iflt_1 {
-
-    public int run(int a) {
-        return a < 0 ? 1 : 1234;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_2.j b/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_2.j
deleted file mode 100644
index b9d0b34..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_2.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iflt_2.java
-.class public dxc/junit/opcodes/iflt/jm/T_iflt_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(I)Z
-    .limit stack 2
-    .limit locals 3
-
-;    iload_1
-    iflt Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_2.java b/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_2.java
deleted file mode 100644
index 9f48304..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iflt.jm;
-
-public class T_iflt_2 {
-
-    public boolean run(int a) {
-        return a < 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_3.j b/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_3.j
deleted file mode 100644
index eec66c2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_3.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iflt_3.java
-.class public dxc/junit/opcodes/iflt/jm/T_iflt_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(I)Z
-    .limit stack 4
-    .limit locals 3
-
-;    iload_1
-    dconst_1
-    iflt Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_3.java b/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_3.java
deleted file mode 100644
index a238c05..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iflt.jm;
-
-public class T_iflt_3 {
-
-    public boolean run(int a) {
-        return a < 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_4.j b/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_4.j
deleted file mode 100644
index ba405a2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_4.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iflt_4.java
-.class public dxc/junit/opcodes/iflt/jm/T_iflt_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(I)Z
-    .limit stack 3
-    .limit locals 3
-
-    lconst_1    
-;    iload_1
-
-    iflt Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_4.java b/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_4.java
deleted file mode 100644
index 38e2c68..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iflt.jm;
-
-public class T_iflt_4 {
-
-    public boolean run(int a) {
-        return a < 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_5.cfh b/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_5.cfh
deleted file mode 100644
index e2301a7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_5.cfh
+++ /dev/null
@@ -1,194 +0,0 @@
-//@class:dxc/junit/opcodes/iflt/jm/T_iflt_5
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 08 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 3, h: 0003: type{dxc.junit.opcodes.iflt.jm.T_iflt_5}
-    // .  .  .  
-       07 00 09 
-    // parsed:, offset 37, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 50, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 59, len 7, h: 0006: utf8{"(I)Z"}
-    // .  .  .  (  I  )  Z  
-       01 00 04 28 49 29 5a 
-    // parsed:, offset 66, len 6, h: 0007: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 72, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0c 
-    // parsed:, offset 77, len 37, h: 0009: utf8{"dxc/junit/opcodes/iflt/jm/T_iflt_5"}
-    // .  .  "  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  l  t  /  j  m  /  T  _  i  f  l  t  _  5  
-       01 00 22 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 6c 74 2f 6a 6d 2f 54 5f 69 66 6c 74 5f 35 
-    // parsed:, offset 114, len 7, h: 000a: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 121, len 16, h: 000b: utf8{"T_iflt_5.java"}
-    // .  .  .  T  _  i  f  l  t  _  5  .  j  a  v  a  
-       01 00 0d 54 5f 69 66 6c 74 5f 35 2e 6a 61 76 61 
-    // parsed:, offset 137, len 6, h: 000c: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 143, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 146, len 0, h: end constant_pool
-// parsed:, offset 146, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 148, len 2, h: this_class: type{dxc.junit.opcodes.iflt.jm.T_iflt_5}
-// .  .  
-   00 03 
-// parsed:, offset 150, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 152, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 154, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 156, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 158, len:75,desc: ()V
-// parsed:, offset 158, len 0, h:  methods[0]: 
-    // parsed:, offset 158, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 160, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 162, len 2, h: descriptor: ()V
-    // .  .  
-       00 0c 
-    // parsed:, offset 164, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 166, len 0, h:  attributes[0]: 
-        // parsed:, offset 166, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 168, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 172, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 174, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 176, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 185, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 187, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 189, len 0, h: end attributes[0] 
-// parsed:, offset 189, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 189, len:44,desc: (I)Z
-// parsed:, offset 189, len 0, h:  methods[1]: 
-    // parsed:, offset 189, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 191, len 2, h: name: run
-    // .  .  
-       00 07 
-    // parsed:, offset 193, len 2, h: descriptor: (I)Z
-    // .  .  
-       00 06 
-    // parsed:, offset 195, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 197, len 0, h:  attributes[0]: 
-        // parsed:, offset 197, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 199, len 4, h: length: 00000014
-        // .  .  .  .  
-           00 00 00 14 
-        // parsed:, offset 203, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 205, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 207, len 4, h: code_length: 00000008
-        // .  .  .  .  
-           00 00 00 08 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 3, h: 0001: iflt 00ff
-        // .  .  .  
-//@mod     9b 00 05    
-           9b 00 ff 
-        // parsed:, offset 4, len 1, h: 0004: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 5, len 1, h: 0005: ireturn
-        // .  
-           ac 
-        // parsed:, offset 6, len 1, h: 0006: iconst_1 // #+01
-        // .  
-           04 
-        // parsed:, offset 7, len 1, h: 0007: ireturn
-        // .  
-           ac 
-        // parsed:, offset 219, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 221, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 223, len 0, h: end attributes[0] 
-// parsed:, offset 223, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (I)Z
-// parsed:, offset 223, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 225, len 0, h:  attributes[0]: 
-    // parsed:, offset 225, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 227, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 231, len 2, h: source: utf8{"T_iflt_5.java"}
-    // .  .  
-       00 0b 
-// parsed:, offset 233, len 0, h: end attributes[0] 
-// parsed:, offset 233, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_5.j b/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_5.j
deleted file mode 100644
index 329d205..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_5.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iflt_5.java
-.class public dxc/junit/opcodes/iflt/jm/T_iflt_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(I)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    iflt Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_5.java b/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_5.java
deleted file mode 100644
index 519a973..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iflt.jm;
-
-public class T_iflt_5 {
-
-    public boolean run(int a) {
-        return a < 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_6.cfh b/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_6.cfh
deleted file mode 100644
index ee7a8f3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_6.cfh
+++ /dev/null
@@ -1,201 +0,0 @@
-//@class:dxc/junit/opcodes/iflt/jm/T_iflt_6
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 09 
-    // parsed:, offset 15, len 3, h: 0002: type{dxc.junit.opcodes.iflt.jm.T_iflt_6}
-    // .  .  .  
-       07 00 08 
-    // parsed:, offset 18, len 19, h: 0003: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 37, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 50, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 59, len 7, h: 0006: utf8{"(I)Z"}
-    // .  .  .  (  I  )  Z  
-       01 00 04 28 49 29 5a 
-    // parsed:, offset 66, len 6, h: 0007: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 72, len 37, h: 0008: utf8{"dxc/junit/opcodes/iflt/jm/T_iflt_6"}
-    // .  .  "  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  l  t  /  j  m  /  T  _  i  f  l  t  _  6  
-       01 00 22 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 6c 74 2f 6a 6d 2f 54 5f 69 66 6c 74 5f 36 
-    // parsed:, offset 109, len 5, h: 0009: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0b 
-    // parsed:, offset 114, len 7, h: 000a: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 121, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 127, len 16, h: 000c: utf8{"T_iflt_6.java"}
-    // .  .  .  T  _  i  f  l  t  _  6  .  j  a  v  a  
-       01 00 0d 54 5f 69 66 6c 74 5f 36 2e 6a 61 76 61 
-    // parsed:, offset 143, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 03 
-// parsed:, offset 146, len 0, h: end constant_pool
-// parsed:, offset 146, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 148, len 2, h: this_class: type{dxc.junit.opcodes.iflt.jm.T_iflt_6}
-// .  .  
-   00 02 
-// parsed:, offset 150, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 152, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 154, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 156, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 158, len:78,desc: ()V
-// parsed:, offset 158, len 0, h:  methods[0]: 
-    // parsed:, offset 158, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 160, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 162, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 164, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 166, len 0, h:  attributes[0]: 
-        // parsed:, offset 166, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 168, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 172, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 174, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 176, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 185, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 187, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 189, len 0, h: end attributes[0] 
-// parsed:, offset 189, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 189, len:47,desc: (I)Z
-// parsed:, offset 189, len 0, h:  methods[1]: 
-    // parsed:, offset 189, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 191, len 2, h: name: run
-    // .  .  
-       00 07 
-    // parsed:, offset 193, len 2, h: descriptor: (I)Z
-    // .  .  
-       00 06 
-    // parsed:, offset 195, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 197, len 0, h:  attributes[0]: 
-        // parsed:, offset 197, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 199, len 4, h: length: 00000017
-        // .  .  .  .  
-           00 00 00 17 
-        // parsed:, offset 203, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 205, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 207, len 4, h: code_length: 0000000b
-        // .  .  .  .  
-           00 00 00 0b 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 3, h: 0001: iflt 0007
-        // .  .  .  
-//@mod     9b 00 05    
-           9b 00 06 
-        // parsed:, offset 4, len 1, h: 0004: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 5, len 1, h: 0005: ireturn
-        // .  
-           ac 
-        // parsed:, offset 6, len 1, h: 0006: wide
-        // .  
-//@mod     00    
-           c4 
-        // parsed:, offset 7, len 2, h: 0007: iload 01
-        // .  .  
-           15 01 
-        // parsed:, offset 9, len 1, h: 0009: nop
-        // .  
-           00 
-        // parsed:, offset 10, len 1, h: 000a: ireturn
-        // .  
-           ac 
-        // parsed:, offset 222, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 224, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 226, len 0, h: end attributes[0] 
-// parsed:, offset 226, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (I)Z
-// parsed:, offset 226, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 228, len 0, h:  attributes[0]: 
-    // parsed:, offset 228, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 230, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 234, len 2, h: source: utf8{"T_iflt_6.java"}
-    // .  .  
-       00 0c 
-// parsed:, offset 236, len 0, h: end attributes[0] 
-// parsed:, offset 236, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_6.j b/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_6.j
deleted file mode 100644
index 69fa9a6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_6.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iflt_6.java
-.class public dxc/junit/opcodes/iflt/jm/T_iflt_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(I)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    iflt Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    nop
-    iload 1
-    nop
-;    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_6.java b/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_6.java
deleted file mode 100644
index 5d36ee1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iflt.jm;
-
-public class T_iflt_6 {
-
-    public boolean run(int a) {
-        return a < 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_7.j b/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_7.j
deleted file mode 100644
index 2e985e9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_7.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iflt_7.java
-.class public dxc/junit/opcodes/iflt/jm/T_iflt_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)Z
-    .limit stack 1
-    .limit locals 2
-
-    aload_0
-    ifge Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_7.java b/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_7.java
deleted file mode 100644
index ecbf595..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iflt/jm/T_iflt_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iflt.jm;
-
-public class T_iflt_7 {
-    
-    public boolean run(int a) {
-        return a < 0;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifne/Test_ifne.java b/tools/dx-tests/src/dxc/junit/opcodes/ifne/Test_ifne.java
deleted file mode 100644
index fc4551e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifne/Test_ifne.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifne;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.ifne.jm.T_ifne_1;
-
-public class Test_ifne extends DxTestCase {
-
-    /**
-     * @title  Argument = 5
-     */
-    public void testN1() {
-        T_ifne_1 t = new T_ifne_1();
-        assertEquals(1, t.run(5));
-    }
-
-    /**
-     * @title  Argument = 0
-     */
-    public void testN2() {
-        T_ifne_1 t = new T_ifne_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(0));
-    }
-
-    /**
-     * @title  Arguments = -5
-     */
-    public void testN3() {
-        T_ifne_1 t = new T_ifne_1();
-        assertEquals(1, t.run(-5));
-    }
-
-    /**
-     * @title  Arguments = Integer.MAX_VALUE
-     */
-    public void testB1() {
-        T_ifne_1 t = new T_ifne_1();
-        assertEquals(1, t.run(Integer.MAX_VALUE));
-    }
-
-    /**
-     * @title  Arguments = Integer.MIN_VALUE
-     */
-    public void testB2() {
-        T_ifne_1 t = new T_ifne_1();
-        assertEquals(1, t.run(Integer.MIN_VALUE));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifne.jm.T_ifne_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifne.jm.T_ifne_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifne.jm.T_ifne_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall be inside the
-     * method
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifne.jm.T_ifne_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall not be "inside" wide
-     * instruction
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifne.jm.T_ifne_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifne.jm.T_ifne_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_1.j b/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_1.j
deleted file mode 100644
index 34204a8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_1.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifne_1.java
-.class public dxc/junit/opcodes/ifne/jm/T_ifne_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-; this method returns 1234 in case of failed comparison to check that execution proceeds
-; at the address following if_acmpeq instruction
-.method public run(I)I
-    .limit stack 2
-    .limit locals 3
-    
-    iload_1
-   
-    ifne Label0
-    sipush 1234
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_1.java b/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_1.java
deleted file mode 100644
index 732a1a0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifne.jm;
-
-public class T_ifne_1 {
-
-    public int run(int a) {
-        return a != 0 ? 1 : 1234;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_2.j b/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_2.j
deleted file mode 100644
index f5c9b87..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_2.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifne_2.java
-.class public dxc/junit/opcodes/ifne/jm/T_ifne_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(I)Z
-    .limit stack 2
-    .limit locals 3
-
-;    iload_1
-    ifne Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_2.java b/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_2.java
deleted file mode 100644
index ae1a1d5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifne.jm;
-
-public class T_ifne_2 {
-
-    public boolean run(int a) {
-        return a != 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_3.j b/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_3.j
deleted file mode 100644
index 7fb2fa9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_3.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifne_3.java
-.class public dxc/junit/opcodes/ifne/jm/T_ifne_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(I)Z
-    .limit stack 4
-    .limit locals 3
-
-;    iload_1
-    dconst_1
-    ifne Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_3.java b/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_3.java
deleted file mode 100644
index 20722fd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifne.jm;
-
-public class T_ifne_3 {
-
-    public boolean run(int a) {
-        return a != 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_4.j b/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_4.j
deleted file mode 100644
index 5149438..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_4.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifne_4.java
-.class public dxc/junit/opcodes/ifne/jm/T_ifne_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(I)Z
-    .limit stack 3
-    .limit locals 3
-
-    lconst_1    
-;    iload_1
-
-    ifne Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_4.java b/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_4.java
deleted file mode 100644
index 8dd3ad5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifne.jm;
-
-public class T_ifne_4 {
-
-    public boolean run(int a) {
-        return a != 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_5.cfh b/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_5.cfh
deleted file mode 100644
index d29f6ff..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_5.cfh
+++ /dev/null
@@ -1,194 +0,0 @@
-//@class:dxc/junit/opcodes/ifne/jm/T_ifne_5
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 08 
-    // parsed:, offset 15, len 16, h: 0002: utf8{"T_ifne_5.java"}
-    // .  .  .  T  _  i  f  n  e  _  5  .  j  a  v  a  
-       01 00 0d 54 5f 69 66 6e 65 5f 35 2e 6a 61 76 61 
-    // parsed:, offset 31, len 19, h: 0003: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 50, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 63, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 72, len 7, h: 0006: utf8{"(I)Z"}
-    // .  .  .  (  I  )  Z  
-       01 00 04 28 49 29 5a 
-    // parsed:, offset 79, len 6, h: 0007: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 85, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0b 
-    // parsed:, offset 90, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 97, len 37, h: 000a: utf8{"dxc/junit/opcodes/ifne/jm/T_ifne_5"}
-    // .  .  "  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  n  e  /  j  m  /  T  _  i  f  n  e  _  5  
-       01 00 22 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 6e 65 2f 6a 6d 2f 54 5f 69 66 6e 65 5f 35 
-    // parsed:, offset 134, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 140, len 3, h: 000c: type{dxc.junit.opcodes.ifne.jm.T_ifne_5}
-    // .  .  .  
-       07 00 0a 
-    // parsed:, offset 143, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 03 
-// parsed:, offset 146, len 0, h: end constant_pool
-// parsed:, offset 146, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 148, len 2, h: this_class: type{dxc.junit.opcodes.ifne.jm.T_ifne_5}
-// .  .  
-   00 0c 
-// parsed:, offset 150, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 152, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 154, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 156, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 158, len:75,desc: ()V
-// parsed:, offset 158, len 0, h:  methods[0]: 
-    // parsed:, offset 158, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 160, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 162, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 164, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 166, len 0, h:  attributes[0]: 
-        // parsed:, offset 166, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 168, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 172, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 174, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 176, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 185, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 187, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 189, len 0, h: end attributes[0] 
-// parsed:, offset 189, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 189, len:44,desc: (I)Z
-// parsed:, offset 189, len 0, h:  methods[1]: 
-    // parsed:, offset 189, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 191, len 2, h: name: run
-    // .  .  
-       00 07 
-    // parsed:, offset 193, len 2, h: descriptor: (I)Z
-    // .  .  
-       00 06 
-    // parsed:, offset 195, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 197, len 0, h:  attributes[0]: 
-        // parsed:, offset 197, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 199, len 4, h: length: 00000014
-        // .  .  .  .  
-           00 00 00 14 
-        // parsed:, offset 203, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 205, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 207, len 4, h: code_length: 00000008
-        // .  .  .  .  
-           00 00 00 08 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 3, h: 0001: ifne 00ff
-        // .  .  .  
-//@mod     9a 00 05    
-           9a 00 ff 
-        // parsed:, offset 4, len 1, h: 0004: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 5, len 1, h: 0005: ireturn
-        // .  
-           ac 
-        // parsed:, offset 6, len 1, h: 0006: iconst_1 // #+01
-        // .  
-           04 
-        // parsed:, offset 7, len 1, h: 0007: ireturn
-        // .  
-           ac 
-        // parsed:, offset 219, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 221, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 223, len 0, h: end attributes[0] 
-// parsed:, offset 223, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (I)Z
-// parsed:, offset 223, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 225, len 0, h:  attributes[0]: 
-    // parsed:, offset 225, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 227, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 231, len 2, h: source: utf8{"T_ifne_5.java"}
-    // .  .  
-       00 02 
-// parsed:, offset 233, len 0, h: end attributes[0] 
-// parsed:, offset 233, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_5.j b/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_5.j
deleted file mode 100644
index 96b5869..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_5.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifne_5.java
-.class public dxc/junit/opcodes/ifne/jm/T_ifne_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(I)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    ifne Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_5.java b/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_5.java
deleted file mode 100644
index 13dac02..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifne.jm;
-
-public class T_ifne_5 {
-
-    public boolean run(int a) {
-        return a != 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_6.cfh b/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_6.cfh
deleted file mode 100644
index d195942..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_6.cfh
+++ /dev/null
@@ -1,201 +0,0 @@
-//@class:dxc/junit/opcodes/ifne/jm/T_ifne_6
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 08 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 7, h: 0005: utf8{"(I)Z"}
-    // .  .  .  (  I  )  Z  
-       01 00 04 28 49 29 5a 
-    // parsed:, offset 63, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 69, len 16, h: 0007: utf8{"T_ifne_6.java"}
-    // .  .  .  T  _  i  f  n  e  _  6  .  j  a  v  a  
-       01 00 0d 54 5f 69 66 6e 65 5f 36 2e 6a 61 76 61 
-    // parsed:, offset 85, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 0b 
-    // parsed:, offset 90, len 37, h: 0009: utf8{"dxc/junit/opcodes/ifne/jm/T_ifne_6"}
-    // .  .  "  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  n  e  /  j  m  /  T  _  i  f  n  e  _  6  
-       01 00 22 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 6e 65 2f 6a 6d 2f 54 5f 69 66 6e 65 5f 36 
-    // parsed:, offset 127, len 7, h: 000a: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 134, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 140, len 3, h: 000c: type{dxc.junit.opcodes.ifne.jm.T_ifne_6}
-    // .  .  .  
-       07 00 09 
-    // parsed:, offset 143, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 146, len 0, h: end constant_pool
-// parsed:, offset 146, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 148, len 2, h: this_class: type{dxc.junit.opcodes.ifne.jm.T_ifne_6}
-// .  .  
-   00 0c 
-// parsed:, offset 150, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 152, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 154, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 156, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 158, len:78,desc: ()V
-// parsed:, offset 158, len 0, h:  methods[0]: 
-    // parsed:, offset 158, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 160, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 162, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 164, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 166, len 0, h:  attributes[0]: 
-        // parsed:, offset 166, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 168, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 172, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 174, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 176, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 185, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 187, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 189, len 0, h: end attributes[0] 
-// parsed:, offset 189, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 189, len:47,desc: (I)Z
-// parsed:, offset 189, len 0, h:  methods[1]: 
-    // parsed:, offset 189, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 191, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 193, len 2, h: descriptor: (I)Z
-    // .  .  
-       00 05 
-    // parsed:, offset 195, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 197, len 0, h:  attributes[0]: 
-        // parsed:, offset 197, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 199, len 4, h: length: 00000017
-        // .  .  .  .  
-           00 00 00 17 
-        // parsed:, offset 203, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 205, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 207, len 4, h: code_length: 0000000b
-        // .  .  .  .  
-           00 00 00 0b 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 3, h: 0001: ifne 0007
-        // .  .  .  
-//@mod     9a 00 05    
-           9a 00 06 
-        // parsed:, offset 4, len 1, h: 0004: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 5, len 1, h: 0005: ireturn
-        // .  
-           ac 
-        // parsed:, offset 6, len 1, h: 0006: wide
-        // .  
-//@mod     00
-           c4 
-        // parsed:, offset 7, len 2, h: 0007: iload 01
-        // .  .  
-           15 01 
-        // parsed:, offset 9, len 1, h: 0009: nop
-        // .  
-           00 
-        // parsed:, offset 10, len 1, h: 000a: ireturn
-        // .  
-           ac 
-        // parsed:, offset 222, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 224, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 226, len 0, h: end attributes[0] 
-// parsed:, offset 226, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (I)Z
-// parsed:, offset 226, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 228, len 0, h:  attributes[0]: 
-    // parsed:, offset 228, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 230, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 234, len 2, h: source: utf8{"T_ifne_6.java"}
-    // .  .  
-       00 07 
-// parsed:, offset 236, len 0, h: end attributes[0] 
-// parsed:, offset 236, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_6.j b/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_6.j
deleted file mode 100644
index 9ac3dfc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_6.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifne_6.java
-.class public dxc/junit/opcodes/ifne/jm/T_ifne_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(I)Z
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    ifne Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    nop
-    iload 1
-    nop
-;    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_6.java b/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_6.java
deleted file mode 100644
index 4c1f04a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifne.jm;
-
-public class T_ifne_6 {
-
-    public boolean run(int a) {
-        return a != 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_7.j b/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_7.j
deleted file mode 100644
index 4c55236..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_7.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifne_7.java
-.class public dxc/junit/opcodes/ifne/jm/T_ifne_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)Z
-    .limit stack 1
-    .limit locals 2
-
-    aload_0
-    ifeq Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_7.java b/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_7.java
deleted file mode 100644
index 29af909..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifne/jm/T_ifne_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifne.jm;
-
-public class T_ifne_7 {
-    
-    public boolean run(int a) {
-        return a != 0;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/Test_ifnonnull.java b/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/Test_ifnonnull.java
deleted file mode 100644
index d8b5c71..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/Test_ifnonnull.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifnonnull;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.ifnonnull.jm.T_ifnonnull_1;
-
-public class Test_ifnonnull extends DxTestCase {
-
-    /**
-     * @title  Argument = this
-     */
-    public void testN1() {
-        T_ifnonnull_1 t = new T_ifnonnull_1();
-        assertEquals(1, t.run(this));
-    }
-
-    /**
-     * @title  Argument = null
-     */
-    public void testN2() {
-        T_ifnonnull_1 t = new T_ifnonnull_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(null));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifnonnull.jm.T_ifnonnull_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifnonnull.jm.T_ifnonnull_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifnonnull.jm.T_ifnonnull_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall be inside the
-     * method
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifnonnull.jm.T_ifnonnull_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall not be "inside" wide
-     * instruction
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifnonnull.jm.T_ifnonnull_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_1.j b/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_1.j
deleted file mode 100644
index 2eb0c73..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_1.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifne_1.java
-.class public dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-; this method returns 1234 in case of failed comparison to check that execution proceeds
-; at the address following if_acmpeq instruction
-.method public run(Ljava/lang/Object;)I
-    .limit stack 2
-    .limit locals 3
-    
-    aload_1
-   
-    ifnonnull Label0
-    sipush 1234
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_1.java b/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_1.java
deleted file mode 100644
index 014b4f9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifnonnull.jm;
-
-public class T_ifnonnull_1 {
-
-    public int run(Object o) {
-        return o != null ? 1 : 1234;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_2.j b/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_2.j
deleted file mode 100644
index 813c5aa..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_2.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifnonnull_2.java
-.class public dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(Ljava/lang/Object;)Z
-    .limit stack 2
-    .limit locals 3
-
-;    aload_1
-    ifnonnull Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_2.java b/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_2.java
deleted file mode 100644
index 9285306..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifnonnull.jm;
-
-public class T_ifnonnull_2 {
-
-    public boolean run(Object o) {
-        return o != null;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_3.j b/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_3.j
deleted file mode 100644
index ab9f3ee..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_3.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifnonnull_3.java
-.class public dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(Ljava/lang/Object;)Z
-    .limit stack 4
-    .limit locals 3
-
-;    aload_1
-    dconst_1
-    ifnonnull Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_3.java b/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_3.java
deleted file mode 100644
index ae1407f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifnonnull.jm;
-
-public class T_ifnonnull_3 {
-
-    public boolean run(Object o) {
-        return o != null;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_4.j b/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_4.j
deleted file mode 100644
index 396a721..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_4.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifnonnull_4.java
-.class public dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(Ljava/lang/Object;)Z
-    .limit stack 3
-    .limit locals 3
-
-    lconst_1    
-;    aload_1
-
-    ifnonnull Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_4.java b/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_4.java
deleted file mode 100644
index adba24a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifnonnull.jm;
-
-public class T_ifnonnull_4 {
-
-    public boolean run(Object o) {
-        return o != null;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_5.cfh b/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_5.cfh
deleted file mode 100644
index b430047..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_5.cfh
+++ /dev/null
@@ -1,194 +0,0 @@
-//@class:dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_5
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 08 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 47, h: 0003: utf8{"dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_5"}
-    // .  .  ,  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  n  o  n  n  u  l  l  /  j  m  /  T  _  i  f  n  o  n  n  u  l  l  _  5  
-       01 00 2c 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 6e 6f 6e 6e 75 6c 6c 2f 6a 6d 2f 54 5f 69 66 6e 6f 6e 6e 75 6c 6c 5f 35 
-    // parsed:, offset 81, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 94, len 24, h: 0005: utf8{"(Ljava/lang/Object;)Z"}
-    // .  .  .  (  L  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  ;  )  Z  
-       01 00 15 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 3b 29 5a 
-    // parsed:, offset 118, len 9, h: 0006: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 127, len 6, h: 0007: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 133, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 06 00 0c 
-    // parsed:, offset 138, len 21, h: 0009: utf8{"T_ifnonnull_5.java"}
-    // .  .  .  T  _  i  f  n  o  n  n  u  l  l  _  5  .  j  a  v  a  
-       01 00 12 54 5f 69 66 6e 6f 6e 6e 75 6c 6c 5f 35 2e 6a 61 76 61 
-    // parsed:, offset 159, len 7, h: 000a: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 166, len 3, h: 000b: type{dxc.junit.opcodes.ifnonnull.jm.T_ifnonnull_5}
-    // .  .  .  
-       07 00 03 
-    // parsed:, offset 169, len 6, h: 000c: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 175, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 178, len 0, h: end constant_pool
-// parsed:, offset 178, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 180, len 2, h: this_class: type{dxc.junit.opcodes.ifnonnull.jm.T_ifnonnull_5}
-// .  .  
-   00 0b 
-// parsed:, offset 182, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 184, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 186, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 188, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 190, len:75,desc: ()V
-// parsed:, offset 190, len 0, h:  methods[0]: 
-    // parsed:, offset 190, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 192, len 2, h: name: <init>
-    // .  .  
-       00 06 
-    // parsed:, offset 194, len 2, h: descriptor: ()V
-    // .  .  
-       00 0c 
-    // parsed:, offset 196, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 198, len 0, h:  attributes[0]: 
-        // parsed:, offset 198, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 200, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 204, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 206, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 208, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 217, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 219, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 221, len 0, h: end attributes[0] 
-// parsed:, offset 221, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 221, len:44,desc: (Ljava/lang/Object;)Z
-// parsed:, offset 221, len 0, h:  methods[1]: 
-    // parsed:, offset 221, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 223, len 2, h: name: run
-    // .  .  
-       00 07 
-    // parsed:, offset 225, len 2, h: descriptor: (Ljava/lang/Object;)Z
-    // .  .  
-       00 05 
-    // parsed:, offset 227, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 229, len 0, h:  attributes[0]: 
-        // parsed:, offset 229, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 231, len 4, h: length: 00000014
-        // .  .  .  .  
-           00 00 00 14 
-        // parsed:, offset 235, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 237, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 239, len 4, h: code_length: 00000008
-        // .  .  .  .  
-           00 00 00 08 
-        // parsed:, offset 0, len 1, h: 0000: aload_1 // 01
-        // +  
-           2b 
-        // parsed:, offset 1, len 3, h: 0001: ifnonnull 00ff
-        // .  .  .  
-//@mod     c7 00 05    
-           c7 00 ff 
-        // parsed:, offset 4, len 1, h: 0004: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 5, len 1, h: 0005: ireturn
-        // .  
-           ac 
-        // parsed:, offset 6, len 1, h: 0006: iconst_1 // #+01
-        // .  
-           04 
-        // parsed:, offset 7, len 1, h: 0007: ireturn
-        // .  
-           ac 
-        // parsed:, offset 251, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 253, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 255, len 0, h: end attributes[0] 
-// parsed:, offset 255, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (Ljava/lang/Object;)Z
-// parsed:, offset 255, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 257, len 0, h:  attributes[0]: 
-    // parsed:, offset 257, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 259, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 263, len 2, h: source: utf8{"T_ifnonnull_5.java"}
-    // .  .  
-       00 09 
-// parsed:, offset 265, len 0, h: end attributes[0] 
-// parsed:, offset 265, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_5.j b/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_5.j
deleted file mode 100644
index 087febb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_5.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifnonnull_5.java
-.class public dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(Ljava/lang/Object;)Z
-    .limit stack 2
-    .limit locals 3
-
-    aload_1
-    ifnonnull Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_5.java b/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_5.java
deleted file mode 100644
index 8d400cf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifnonnull.jm;
-
-public class T_ifnonnull_5 {
-
-    public boolean run(Object o) {
-        return o != null;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_6.cfh b/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_6.cfh
deleted file mode 100644
index 913fcfc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_6.cfh
+++ /dev/null
@@ -1,201 +0,0 @@
-//@class:dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_6
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 08 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 47, h: 0003: utf8{"dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_6"}
-    // .  .  ,  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  n  o  n  n  u  l  l  /  j  m  /  T  _  i  f  n  o  n  n  u  l  l  _  6  
-       01 00 2c 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 6e 6f 6e 6e 75 6c 6c 2f 6a 6d 2f 54 5f 69 66 6e 6f 6e 6e 75 6c 6c 5f 36 
-    // parsed:, offset 81, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 94, len 24, h: 0005: utf8{"(Ljava/lang/Object;)Z"}
-    // .  .  .  (  L  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  ;  )  Z  
-       01 00 15 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 3b 29 5a 
-    // parsed:, offset 118, len 9, h: 0006: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 127, len 6, h: 0007: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 133, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 06 00 0b 
-    // parsed:, offset 138, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 145, len 3, h: 000a: type{dxc.junit.opcodes.ifnonnull.jm.T_ifnonnull_6}
-    // .  .  .  
-       07 00 03 
-    // parsed:, offset 148, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 154, len 21, h: 000c: utf8{"T_ifnonnull_6.java"}
-    // .  .  .  T  _  i  f  n  o  n  n  u  l  l  _  6  .  j  a  v  a  
-       01 00 12 54 5f 69 66 6e 6f 6e 6e 75 6c 6c 5f 36 2e 6a 61 76 61 
-    // parsed:, offset 175, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 178, len 0, h: end constant_pool
-// parsed:, offset 178, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 180, len 2, h: this_class: type{dxc.junit.opcodes.ifnonnull.jm.T_ifnonnull_6}
-// .  .  
-   00 0a 
-// parsed:, offset 182, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 184, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 186, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 188, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 190, len:78,desc: ()V
-// parsed:, offset 190, len 0, h:  methods[0]: 
-    // parsed:, offset 190, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 192, len 2, h: name: <init>
-    // .  .  
-       00 06 
-    // parsed:, offset 194, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 196, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 198, len 0, h:  attributes[0]: 
-        // parsed:, offset 198, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 200, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 204, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 206, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 208, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 217, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 219, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 221, len 0, h: end attributes[0] 
-// parsed:, offset 221, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 221, len:47,desc: (Ljava/lang/Object;)Z
-// parsed:, offset 221, len 0, h:  methods[1]: 
-    // parsed:, offset 221, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 223, len 2, h: name: run
-    // .  .  
-       00 07 
-    // parsed:, offset 225, len 2, h: descriptor: (Ljava/lang/Object;)Z
-    // .  .  
-       00 05 
-    // parsed:, offset 227, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 229, len 0, h:  attributes[0]: 
-        // parsed:, offset 229, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 231, len 4, h: length: 00000017
-        // .  .  .  .  
-           00 00 00 17 
-        // parsed:, offset 235, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 237, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 239, len 4, h: code_length: 0000000b
-        // .  .  .  .  
-           00 00 00 0b 
-        // parsed:, offset 0, len 1, h: 0000: aload_1 // 01
-        // +  
-           2b 
-        // parsed:, offset 1, len 3, h: 0001: ifnonnull 0007
-        // .  .  .  
-//@mod     c7 00 05    
-           c7 00 06 
-        // parsed:, offset 4, len 1, h: 0004: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 5, len 1, h: 0005: ireturn
-        // .  
-           ac 
-        // parsed:, offset 6, len 1, h: 0006: wide
-        // .  
-//@mod     00    
-           c4 
-        // parsed:, offset 7, len 2, h: 0007: iload 01
-        // .  .  
-           15 01 
-        // parsed:, offset 9, len 1, h: 0009: nop
-        // .  
-           00 
-        // parsed:, offset 10, len 1, h: 000a: ireturn
-        // .  
-           ac 
-        // parsed:, offset 254, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 256, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 258, len 0, h: end attributes[0] 
-// parsed:, offset 258, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (Ljava/lang/Object;)Z
-// parsed:, offset 258, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 260, len 0, h:  attributes[0]: 
-    // parsed:, offset 260, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 262, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 266, len 2, h: source: utf8{"T_ifnonnull_6.java"}
-    // .  .  
-       00 0c 
-// parsed:, offset 268, len 0, h: end attributes[0] 
-// parsed:, offset 268, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_6.j b/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_6.j
deleted file mode 100644
index 10daa6c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_6.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifnonnull_6.java
-.class public dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(Ljava/lang/Object;)Z
-    .limit stack 2
-    .limit locals 3
-
-    aload_1
-    ifnonnull Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    nop
-    iload 1
-    nop
-;    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_6.java b/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_6.java
deleted file mode 100644
index 062b42a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifnonnull/jm/T_ifnonnull_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifnonnull.jm;
-
-public class T_ifnonnull_6 {
-
-    public boolean run(Object o) {
-        return o != null;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifnull/Test_ifnull.java b/tools/dx-tests/src/dxc/junit/opcodes/ifnull/Test_ifnull.java
deleted file mode 100644
index a7b5eac..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifnull/Test_ifnull.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifnull;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.ifnull.jm.T_ifnull_1;
-
-public class Test_ifnull extends DxTestCase {
-
-    /**
-     * @title  Argument = this
-     */
-    public void testN1() {
-        T_ifnull_1 t = new T_ifnull_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(this));
-    }
-
-    /**
-     * @title  Argument = null
-     */
-    public void testN2() {
-        T_ifnull_1 t = new T_ifnull_1();
-        assertEquals(1, t.run(null));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifnull.jm.T_ifnull_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifnull.jm.T_ifnull_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifnull.jm.T_ifnull_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall be inside the
-     * method
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifnull.jm.T_ifnull_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall not be "inside" wide
-     * instruction
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.ifnull.jm.T_ifnull_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_1.j b/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_1.j
deleted file mode 100644
index e95e9f4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_1.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifne_1.java
-.class public dxc/junit/opcodes/ifnull/jm/T_ifnull_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-; this method returns 1234 in case of failed comparison to check that execution proceeds
-; at the address following if_acmpeq instruction
-.method public run(Ljava/lang/Object;)I
-    .limit stack 2
-    .limit locals 3
-    
-    aload_1
-   
-    ifnull Label0
-    sipush 1234
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_1.java b/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_1.java
deleted file mode 100644
index 73d7b4a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifnull.jm;
-
-public class T_ifnull_1 {
-
-    public int run(Object o) {
-        return o == null ? 1 : 1234;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_2.j b/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_2.j
deleted file mode 100644
index 77cbbd3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_2.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifnull_2.java
-.class public dxc/junit/opcodes/ifnull/jm/T_ifnull_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(Ljava/lang/Object;)Z
-    .limit stack 2
-    .limit locals 3
-
-;    aload_1
-    ifnull Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_2.java b/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_2.java
deleted file mode 100644
index 2efb995..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifnull.jm;
-
-public class T_ifnull_2 {
-
-    public boolean run(Object o) {
-        return o == null;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_3.j b/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_3.j
deleted file mode 100644
index 04c94b2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_3.j
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifnull_3.java
-.class public dxc/junit/opcodes/ifnull/jm/T_ifnull_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(Ljava/lang/Object;)Z
-    .limit stack 4
-    .limit locals 3
-
-    dconst_1
-    ifnull Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_3.java b/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_3.java
deleted file mode 100644
index 44c32e9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifnull.jm;
-
-public class T_ifnull_3 {
-
-    public boolean run(Object o) {
-        return o == null;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_4.j b/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_4.j
deleted file mode 100644
index 780f5bd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_4.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifnull_4.java
-.class public dxc/junit/opcodes/ifnull/jm/T_ifnull_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(Ljava/lang/Object;)Z
-    .limit stack 3
-    .limit locals 3
-
-    lconst_1    
-;    aload_1
-
-    ifnull Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_4.java b/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_4.java
deleted file mode 100644
index 0a59962..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifnull.jm;
-
-public class T_ifnull_4 {
-
-    public boolean run(Object o) {
-        return o == null;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_5.cfh b/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_5.cfh
deleted file mode 100644
index b507146..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_5.cfh
+++ /dev/null
@@ -1,194 +0,0 @@
-//@class:dxc/junit/opcodes/ifnull/jm/T_ifnull_5
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 07 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 24, h: 0004: utf8{"(Ljava/lang/Object;)Z"}
-    // .  .  .  (  L  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  ;  )  Z  
-       01 00 15 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 3b 29 5a 
-    // parsed:, offset 71, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 80, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 86, len 5, h: 0007: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0b 
-    // parsed:, offset 91, len 41, h: 0008: utf8{"dxc/junit/opcodes/ifnull/jm/T_ifnull_5"}
-    // .  .  &  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  n  u  l  l  /  j  m  /  T  _  i  f  n  u  l  l  _  5  
-       01 00 26 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 6e 75 6c 6c 2f 6a 6d 2f 54 5f 69 66 6e 75 6c 6c 5f 35 
-    // parsed:, offset 132, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 139, len 3, h: 000a: type{dxc.junit.opcodes.ifnull.jm.T_ifnull_5}
-    // .  .  .  
-       07 00 08 
-    // parsed:, offset 142, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 148, len 18, h: 000c: utf8{"T_ifnull_5.java"}
-    // .  .  .  T  _  i  f  n  u  l  l  _  5  .  j  a  v  a  
-       01 00 0f 54 5f 69 66 6e 75 6c 6c 5f 35 2e 6a 61 76 61 
-    // parsed:, offset 166, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 169, len 0, h: end constant_pool
-// parsed:, offset 169, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 171, len 2, h: this_class: type{dxc.junit.opcodes.ifnull.jm.T_ifnull_5}
-// .  .  
-   00 0a 
-// parsed:, offset 173, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 175, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 177, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 179, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 181, len:75,desc: ()V
-// parsed:, offset 181, len 0, h:  methods[0]: 
-    // parsed:, offset 181, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 183, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 185, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 187, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 189, len 0, h:  attributes[0]: 
-        // parsed:, offset 189, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 191, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 195, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 197, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 199, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 208, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 210, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 212, len 0, h: end attributes[0] 
-// parsed:, offset 212, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 212, len:44,desc: (Ljava/lang/Object;)Z
-// parsed:, offset 212, len 0, h:  methods[1]: 
-    // parsed:, offset 212, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 214, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 216, len 2, h: descriptor: (Ljava/lang/Object;)Z
-    // .  .  
-       00 04 
-    // parsed:, offset 218, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 220, len 0, h:  attributes[0]: 
-        // parsed:, offset 220, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 222, len 4, h: length: 00000014
-        // .  .  .  .  
-           00 00 00 14 
-        // parsed:, offset 226, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 228, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 230, len 4, h: code_length: 00000008
-        // .  .  .  .  
-           00 00 00 08 
-        // parsed:, offset 0, len 1, h: 0000: aload_1 // 01
-        // +  
-           2b 
-        // parsed:, offset 1, len 3, h: 0001: ifnull 00ff
-        // .  .  .  
-//@mod     c6 00 05    
-           c6 00 ff 
-        // parsed:, offset 4, len 1, h: 0004: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 5, len 1, h: 0005: ireturn
-        // .  
-           ac 
-        // parsed:, offset 6, len 1, h: 0006: iconst_1 // #+01
-        // .  
-           04 
-        // parsed:, offset 7, len 1, h: 0007: ireturn
-        // .  
-           ac 
-        // parsed:, offset 242, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 244, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 246, len 0, h: end attributes[0] 
-// parsed:, offset 246, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (Ljava/lang/Object;)Z
-// parsed:, offset 246, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 248, len 0, h:  attributes[0]: 
-    // parsed:, offset 248, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 250, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 254, len 2, h: source: utf8{"T_ifnull_5.java"}
-    // .  .  
-       00 0c 
-// parsed:, offset 256, len 0, h: end attributes[0] 
-// parsed:, offset 256, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_5.j b/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_5.j
deleted file mode 100644
index bf01958..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_5.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifnull_5.java
-.class public dxc/junit/opcodes/ifnull/jm/T_ifnull_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(Ljava/lang/Object;)Z
-    .limit stack 2
-    .limit locals 3
-
-    aload_1
-    ifnull Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_5.java b/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_5.java
deleted file mode 100644
index 4a67ef1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifnull.jm;
-
-public class T_ifnull_5 {
-
-    public boolean run(Object o) {
-        return o == null;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_6.cfh b/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_6.cfh
deleted file mode 100644
index faf3fcd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_6.cfh
+++ /dev/null
@@ -1,201 +0,0 @@
-//@class:dxc/junit/opcodes/ifnull/jm/T_ifnull_6
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 09 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 18, h: 0003: utf8{"T_ifnull_6.java"}
-    // .  .  .  T  _  i  f  n  u  l  l  _  6  .  j  a  v  a  
-       01 00 0f 54 5f 69 66 6e 75 6c 6c 5f 36 2e 6a 61 76 61 
-    // parsed:, offset 52, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 65, len 24, h: 0005: utf8{"(Ljava/lang/Object;)Z"}
-    // .  .  .  (  L  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  ;  )  Z  
-       01 00 15 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 3b 29 5a 
-    // parsed:, offset 89, len 9, h: 0006: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 98, len 6, h: 0007: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 104, len 41, h: 0008: utf8{"dxc/junit/opcodes/ifnull/jm/T_ifnull_6"}
-    // .  .  &  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  f  n  u  l  l  /  j  m  /  T  _  i  f  n  u  l  l  _  6  
-       01 00 26 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 66 6e 75 6c 6c 2f 6a 6d 2f 54 5f 69 66 6e 75 6c 6c 5f 36 
-    // parsed:, offset 145, len 5, h: 0009: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 06 00 0c 
-    // parsed:, offset 150, len 7, h: 000a: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 157, len 3, h: 000b: type{dxc.junit.opcodes.ifnull.jm.T_ifnull_6}
-    // .  .  .  
-       07 00 08 
-    // parsed:, offset 160, len 6, h: 000c: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 166, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 169, len 0, h: end constant_pool
-// parsed:, offset 169, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 171, len 2, h: this_class: type{dxc.junit.opcodes.ifnull.jm.T_ifnull_6}
-// .  .  
-   00 0b 
-// parsed:, offset 173, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 175, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 177, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 179, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 181, len:78,desc: ()V
-// parsed:, offset 181, len 0, h:  methods[0]: 
-    // parsed:, offset 181, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 183, len 2, h: name: <init>
-    // .  .  
-       00 06 
-    // parsed:, offset 185, len 2, h: descriptor: ()V
-    // .  .  
-       00 0c 
-    // parsed:, offset 187, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 189, len 0, h:  attributes[0]: 
-        // parsed:, offset 189, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 191, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 195, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 197, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 199, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 208, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 210, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 212, len 0, h: end attributes[0] 
-// parsed:, offset 212, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 212, len:47,desc: (Ljava/lang/Object;)Z
-// parsed:, offset 212, len 0, h:  methods[1]: 
-    // parsed:, offset 212, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 214, len 2, h: name: run
-    // .  .  
-       00 07 
-    // parsed:, offset 216, len 2, h: descriptor: (Ljava/lang/Object;)Z
-    // .  .  
-       00 05 
-    // parsed:, offset 218, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 220, len 0, h:  attributes[0]: 
-        // parsed:, offset 220, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 222, len 4, h: length: 00000017
-        // .  .  .  .  
-           00 00 00 17 
-        // parsed:, offset 226, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 228, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 230, len 4, h: code_length: 0000000b
-        // .  .  .  .  
-           00 00 00 0b 
-        // parsed:, offset 0, len 1, h: 0000: aload_1 // 01
-        // +  
-           2b 
-        // parsed:, offset 1, len 3, h: 0001: ifnull 0007
-        // .  .  .  
-//@mod     c6 00 05    
-           c6 00 06 
-        // parsed:, offset 4, len 1, h: 0004: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 5, len 1, h: 0005: ireturn
-        // .  
-           ac 
-        // parsed:, offset 6, len 1, h: 0006: nop
-        // .  
-//@mod     00    
-           c4 
-        // parsed:, offset 7, len 2, h: 0007: iload 01
-        // .  .  
-           15 01 
-        // parsed:, offset 9, len 1, h: 0009: nop
-        // .  
-           00 
-        // parsed:, offset 10, len 1, h: 000a: ireturn
-        // .  
-           ac 
-        // parsed:, offset 245, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 247, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 249, len 0, h: end attributes[0] 
-// parsed:, offset 249, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (Ljava/lang/Object;)Z
-// parsed:, offset 249, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 251, len 0, h:  attributes[0]: 
-    // parsed:, offset 251, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 253, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 257, len 2, h: source: utf8{"T_ifnull_6.java"}
-    // .  .  
-       00 03 
-// parsed:, offset 259, len 0, h: end attributes[0] 
-// parsed:, offset 259, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_6.j b/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_6.j
deleted file mode 100644
index 26ed54c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_6.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ifnull_6.java
-.class public dxc/junit/opcodes/ifnull/jm/T_ifnull_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(Ljava/lang/Object;)Z
-    .limit stack 2
-    .limit locals 3
-
-    aload_1
-    ifnull Label0
-    iconst_0
-    ireturn
-
-    Label0:
-    nop
-    iload 1
-    nop
-;    iconst_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_6.java b/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_6.java
deleted file mode 100644
index 8429521..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ifnull/jm/T_ifnull_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ifnull.jm;
-
-public class T_ifnull_6 {
-
-    public boolean run(Object o) {
-        return o == null;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/Test_iinc.java b/tools/dx-tests/src/dxc/junit/opcodes/iinc/Test_iinc.java
deleted file mode 100644
index f512026..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/Test_iinc.java
+++ /dev/null
@@ -1,309 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iinc;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.iinc.jm.T_iinc_1;
-import dxc.junit.opcodes.iinc.jm.T_iinc_1_w;
-import dxc.junit.opcodes.iinc.jm.T_iinc_2;
-import dxc.junit.opcodes.iinc.jm.T_iinc_2_w;
-import dxc.junit.opcodes.iinc.jm.T_iinc_3;
-import dxc.junit.opcodes.iinc.jm.T_iinc_3_w;
-import dxc.junit.opcodes.iinc.jm.T_iinc_4;
-import dxc.junit.opcodes.iinc.jm.T_iinc_4_w;
-import dxc.junit.opcodes.iinc.jm.T_iinc_5;
-import dxc.junit.opcodes.iinc.jm.T_iinc_5_w;
-import dxc.junit.opcodes.iinc.jm.T_iinc_6;
-import dxc.junit.opcodes.iinc.jm.T_iinc_6_w;
-
-public class Test_iinc extends DxTestCase {
-
-    /*
-     * NORMAL IINC VERSION
-     */
-
-    /**
-     * @title  Increment by 1
-     */
-    public void testN1() {
-        T_iinc_1 t = new T_iinc_1();
-        assertEquals(5, t.run(4));
-    }
-
-    /**
-     * @title  Increment by -1
-     */
-    public void testN2() {
-        T_iinc_2 t = new T_iinc_2();
-        assertEquals(3, t.run(4));
-    }
-
-    /**
-     * @title  Increment by 63
-     */
-    public void testN3() {
-        T_iinc_3 t = new T_iinc_3();
-        assertEquals(67, t.run(4));
-    }
-
-    /**
-     * @title  Increment by 0
-     */
-    public void testB1() {
-        T_iinc_4 t = new T_iinc_4();
-        assertEquals(Integer.MAX_VALUE, t.run(Integer.MAX_VALUE));
-    }
-
-    /**
-     * @title  Increment by 0
-     */
-    public void testB2() {
-        T_iinc_4 t = new T_iinc_4();
-        assertEquals(Integer.MIN_VALUE, t.run(Integer.MIN_VALUE));
-    }
-
-    /**
-     * @title  Increment by 127
-     */
-    public void testB3() {
-        T_iinc_5 t = new T_iinc_5();
-        assertEquals(128, t.run(1));
-    }
-
-    /**
-     * @title  Increment by 127
-     */
-    public void testB4() {
-        T_iinc_5 t = new T_iinc_5();
-        assertEquals(126, t.run(-1));
-    }
-
-    /**
-     * @title  Increment by 127
-     */
-    public void testB5() {
-        T_iinc_5 t = new T_iinc_5();
-        assertEquals(-2147483521, t.run(Integer.MIN_VALUE));
-    }
-
-    /**
-     * @title  Increment by -128
-     */
-    public void testB6() {
-        T_iinc_6 t = new T_iinc_6();
-        assertEquals(-127, t.run(1));
-    }
-
-    /**
-     * @title  Increment by -128
-     */
-    public void testB7() {
-        T_iinc_6 t = new T_iinc_6();
-        assertEquals(-128, t.run(0));
-    }
-
-    /**
-     * @constraint 4.8.1.21
-     * @title index must be no greater than
-     * max_locals-1.
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.iinc.jm.T_iinc_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.21
-     * @title index must be a nonnegative integer.
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.iinc.jm.T_iinc_8");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - double
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.iinc.jm.T_iinc_9");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - long
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.iinc.jm.T_iinc_10");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /*
-     * WIDE IINC VERSION
-     */
-
-    /**
-     * @title  Increment by 1
-     */
-    public void testN4() {
-        T_iinc_1_w t = new T_iinc_1_w();
-        assertEquals(5, t.run(4));
-    }
-
-    /**
-     * @title  Increment by -1
-     */
-    public void testN5() {
-        T_iinc_2_w t = new T_iinc_2_w();
-        assertEquals(3, t.run(4));
-    }
-
-    /**
-     * @title  Increment by 7763
-     */
-    public void testN6() {
-        T_iinc_3_w t = new T_iinc_3_w();
-        assertEquals(7767, t.run(4));
-    }
-
-    /**
-     * @title  Increment by 0
-     */
-    public void testB8() {
-        T_iinc_4_w t = new T_iinc_4_w();
-        assertEquals(Integer.MAX_VALUE, t.run(Integer.MAX_VALUE));
-    }
-
-    /**
-     * @title  Increment by 0
-     */
-    public void testB9() {
-        T_iinc_4_w t = new T_iinc_4_w();
-        assertEquals(Integer.MIN_VALUE, t.run(Integer.MIN_VALUE));
-    }
-
-    /**
-     * @title  Increment by 32767
-     */
-    public void testB10() {
-        T_iinc_5_w t = new T_iinc_5_w();
-        assertEquals(32768, t.run(1));
-    }
-
-    /**
-     * @title  Increment by 32767
-     */
-    public void testB11() {
-        T_iinc_5_w t = new T_iinc_5_w();
-        assertEquals(32766, t.run(-1));
-    }
-
-    /**
-     * @title  Increment by 32767
-     */
-    public void testB12() {
-        T_iinc_5_w t = new T_iinc_5_w();
-        assertEquals(-2147450881, t.run(Integer.MIN_VALUE));
-    }
-
-    /**
-     * @title  Increment by -32768
-     */
-    public void testB13() {
-        T_iinc_6_w t = new T_iinc_6_w();
-        assertEquals(-32767, t.run(1));
-    }
-
-    /**
-     * @title  Increment by -32768
-     */
-    public void testB14() {
-        T_iinc_6_w t = new T_iinc_6_w();
-        assertEquals(-32768, t.run(0));
-    }
-
-    /**
-     * @constraint 4.8.1.25
-     * @title index must be no greater than
-     * max_locals-1.
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.iinc.jm.T_iinc_7_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.25
-     * @title index must be a nonnegative integer.
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.iinc.jm.T_iinc_8_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - double
-     */
-    public void testVFE7() {
-        try {
-            Class.forName("dxc.junit.opcodes.iinc.jm.T_iinc_9_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - long
-     */
-    public void testVFE8() {
-        try {
-            Class.forName("dxc.junit.opcodes.iinc.jm.T_iinc_10_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_1.j b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_1.j
deleted file mode 100644
index 403078c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_1.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iinc_1.java
-.class public dxc/junit/opcodes/iinc/jm/T_iinc_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-    iinc 1 1
-    iload_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_1.java b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_1.java
deleted file mode 100644
index 9bcfb92..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iinc.jm;
-
-public class T_iinc_1 {
-
-    public int run(int a) {
-        return ++a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_10.j b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_10.j
deleted file mode 100644
index 9d0dfed..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_10.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iinc_10.java
-.class public dxc/junit/opcodes/iinc/jm/T_iinc_10
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 2
-    .limit locals 4
-
-    lconst_1
-    lstore 2
-    iinc 2 1
-    iload_2
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_10.java b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_10.java
deleted file mode 100644
index 6e0f42b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_10.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iinc.jm;
-
-public class T_iinc_10 {
-
-    public int run(int a) {
-        return ++a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_10_w.j b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_10_w.j
deleted file mode 100644
index 82129ac..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_10_w.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iinc_10_w.java
-.class public dxc/junit/opcodes/iinc/jm/T_iinc_10_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 2
-    .limit locals 300
-
-    lconst_1
-    lstore 260
-    iinc 260 1
-    iload 260
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_10_w.java b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_10_w.java
deleted file mode 100644
index cedfff7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_10_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iinc.jm;
-
-public class T_iinc_10_w {
-
-    public int run(int a) {
-        return ++a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_1_w.j b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_1_w.j
deleted file mode 100644
index 5c88a81..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_1_w.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iinc_1.java
-.class public dxc/junit/opcodes/iinc/jm/T_iinc_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 300
-    
-    iload_1
-    istore 270
-    iinc 270 1
-    iload 270
-    
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_1_w.java b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_1_w.java
deleted file mode 100644
index 1f2348e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_1_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iinc.jm;
-
-public class T_iinc_1_w {
-
-    public int run(int a) {
-        return ++a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_2.j b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_2.j
deleted file mode 100644
index 3faa1ce..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iinc_2.java
-.class public dxc/junit/opcodes/iinc/jm/T_iinc_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-
-    iinc 1 -1
-    iload_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_2.java b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_2.java
deleted file mode 100644
index e4b3725..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iinc.jm;
-
-public class T_iinc_2 {
-
-    public int run(int a) {
-        return --a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_2_w.j b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_2_w.j
deleted file mode 100644
index 63ed027..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_2_w.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iinc_2_w.java
-.class public dxc/junit/opcodes/iinc/jm/T_iinc_2_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 300
-
-    iload_1
-    istore 270
-    iinc 270 -1
-    iload 270
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_2_w.java b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_2_w.java
deleted file mode 100644
index 952321f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_2_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iinc.jm;
-
-public class T_iinc_2_w {
-
-    public int run(int a) {
-        return --a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_3.j b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_3.j
deleted file mode 100644
index f22fe25..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_3.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iinc_3.java
-.class public dxc/junit/opcodes/iinc/jm/T_iinc_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-
-    iinc 1 63
-    iload_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_3.java b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_3.java
deleted file mode 100644
index 8b3f2e6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_3.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iinc.jm;
-
-public class T_iinc_3 {
-
-    public int run(int a) {
-        a += 63;
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_3_w.j b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_3_w.j
deleted file mode 100644
index 69d795f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_3_w.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iinc_3_w.java
-.class public dxc/junit/opcodes/iinc/jm/T_iinc_3_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-
-    iinc 1 7763
-    iload_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_3_w.java b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_3_w.java
deleted file mode 100644
index 4da58fe..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_3_w.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iinc.jm;
-
-public class T_iinc_3_w {
-
-    public int run(int a) {
-        a += 7763;
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_4.j b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_4.j
deleted file mode 100644
index e944fa3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_4.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iinc_4.java
-.class public dxc/junit/opcodes/iinc/jm/T_iinc_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-
-    iinc 1 0
-    iload_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_4.java b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_4.java
deleted file mode 100644
index 33b93ea..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_4.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iinc.jm;
-
-public class T_iinc_4 {
-
-    public int run(int a) {
-        a += 0;
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_4_w.j b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_4_w.j
deleted file mode 100644
index cb5907e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_4_w.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iinc_4_w.java
-.class public dxc/junit/opcodes/iinc/jm/T_iinc_4_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 3000
-
-    iload_1
-    istore 2500
-    iinc 2500 0
-    iload 2500
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_4_w.java b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_4_w.java
deleted file mode 100644
index ea02795..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_4_w.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iinc.jm;
-
-public class T_iinc_4_w {
-
-    public int run(int a) {
-        a += 0;
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_5.j b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_5.j
deleted file mode 100644
index 4371611..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_5.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iinc_5.java
-.class public dxc/junit/opcodes/iinc/jm/T_iinc_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 30
-
-    iload_1
-    istore 25
-    iinc 25 127
-    iload 25
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_5.java b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_5.java
deleted file mode 100644
index bbeef43..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iinc.jm;
-
-public class T_iinc_5 {
-
-    public int run(int a) {
-        a += 127;
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_5_w.j b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_5_w.j
deleted file mode 100644
index f3b9b52..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_5_w.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iinc_5_w.java
-.class public dxc/junit/opcodes/iinc/jm/T_iinc_5_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 300
-
-    iload_1
-    istore 257
-    iinc 257 32767
-    iload 257
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_5_w.java b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_5_w.java
deleted file mode 100644
index b80fab8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_5_w.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iinc.jm;
-
-public class T_iinc_5_w {
-
-    public int run(int a) {
-        a += 32767;
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_6.j b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_6.j
deleted file mode 100644
index caaf6ab..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_6.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iinc_6.java
-.class public dxc/junit/opcodes/iinc/jm/T_iinc_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-
-    iinc 1 -128
-    iload_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_6.java b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_6.java
deleted file mode 100644
index f04d664..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_6.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iinc.jm;
-
-public class T_iinc_6 {
-
-     public int run(int a) {
-         a += -128;
-         return a;
-     }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_6_w.j b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_6_w.j
deleted file mode 100644
index 5b004ac..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_6_w.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iinc_6_w.java
-.class public dxc/junit/opcodes/iinc/jm/T_iinc_6_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 300
-    
-    iload_1
-    istore 260
-
-    iinc 260 -32768
-    iload 260
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_6_w.java b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_6_w.java
deleted file mode 100644
index 47a9fd1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_6_w.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iinc.jm;
-
-public class T_iinc_6_w {
-
-     public int run(int a) {
-         a += -32768;
-         return a;
-     }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_7.j b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_7.j
deleted file mode 100644
index acd3e81..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_7.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iinc_7.java
-.class public dxc/junit/opcodes/iinc/jm/T_iinc_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-
-    iinc 2 1
-    iload_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_7.java b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_7.java
deleted file mode 100644
index 8915c15..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iinc.jm;
-
-public class T_iinc_7 {
-
-    public int run(int a) {
-        return ++a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_7_w.j b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_7_w.j
deleted file mode 100644
index a885b87..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_7_w.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iinc_7_w.java
-.class public dxc/junit/opcodes/iinc/jm/T_iinc_7_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 300
-
-    iinc 300 1
-    iload_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_7_w.java b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_7_w.java
deleted file mode 100644
index dcdc59e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_7_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iinc.jm;
-
-public class T_iinc_7_w {
-
-    public int run(int a) {
-        return ++a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_8.j b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_8.j
deleted file mode 100644
index 9af573f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_8.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iinc_8.java
-.class public dxc/junit/opcodes/iinc/jm/T_iinc_8
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-
-    iinc -2 1
-    iload_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_8.java b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_8.java
deleted file mode 100644
index 90b3421..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iinc.jm;
-
-public class T_iinc_8 {
-
-    public int run(int a) {
-        return ++a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_8_w.j b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_8_w.j
deleted file mode 100644
index 6ba8c0a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_8_w.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iinc_8_w.java
-.class public dxc/junit/opcodes/iinc/jm/T_iinc_8_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-
-    iinc -2 32001
-    iload_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_8_w.java b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_8_w.java
deleted file mode 100644
index 2d4fd16..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_8_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iinc.jm;
-
-public class T_iinc_8_w {
-
-    public int run(int a) {
-        return ++a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_9.j b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_9.j
deleted file mode 100644
index d41db14..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_9.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iinc_9.java
-.class public dxc/junit/opcodes/iinc/jm/T_iinc_9
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 2
-    .limit locals 4
-
-    dconst_1
-    dstore 2
-    iinc 2 1
-    iload_2
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_9.java b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_9.java
deleted file mode 100644
index 64c04d9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iinc.jm;
-
-public class T_iinc_9 {
-
-    public int run(int a) {
-        return ++a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_9_w.j b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_9_w.j
deleted file mode 100644
index 09efab5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_9_w.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iinc_9_w.java
-.class public dxc/junit/opcodes/iinc/jm/T_iinc_9_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 2
-    .limit locals 300
-
-    dconst_1
-    dstore 260
-    iinc 260 1
-    iload 260
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_9_w.java b/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_9_w.java
deleted file mode 100644
index f2f6934..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iinc/jm/T_iinc_9_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iinc.jm;
-
-public class T_iinc_9_w {
-
-    public int run(int a) {
-        return ++a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload/Test_iload.java b/tools/dx-tests/src/dxc/junit/opcodes/iload/Test_iload.java
deleted file mode 100644
index 71cf115..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload/Test_iload.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.iload.jm.T_iload_1;
-import dxc.junit.opcodes.iload.jm.T_iload_1_w;
-import dxc.junit.opcodes.iload.jm.T_iload_2;
-import dxc.junit.opcodes.iload.jm.T_iload_2_w;
-
-public class Test_iload extends DxTestCase {
-
-    /*
-     * NORMAL ILOAD VERSION
-     */
-
-    /**
-     * @title  Test iload 1
-     */
-    public void testN1() {
-        T_iload_1 t = new T_iload_1();
-        assertEquals(4, t.run());
-    }
-
-    /**
-     * @title  Test iload 255
-     */
-    public void testN2() {
-        T_iload_2 t = new T_iload_2();
-        assertEquals(3, t.run());
-    }
-
-    /**
-     * @constraint 4.8.1.21
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.iload.jm.T_iload_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.iload.jm.T_iload_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.iload.jm.T_iload_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.iload.jm.T_iload_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /*
-     * WIDE ILOAD VERSION
-     */
-
-    /**
-     * @title  Test iload 257
-     */
-    public void testN3() {
-        T_iload_1_w t = new T_iload_1_w();
-        assertEquals(4, t.run());
-    }
-
-    /**
-     * @title  Test iload_w 1
-     */
-    public void testN4() {
-        T_iload_2_w t = new T_iload_2_w();
-        assertEquals(3, t.run());
-    }
-
-    /**
-     * @constraint 4.8.1.25
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.iload.jm.T_iload_3_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.iload.jm.T_iload_4_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE7() {
-        try {
-            Class.forName("dxc.junit.opcodes.iload.jm.T_iload_5_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE8() {
-        try {
-            Class.forName("dxc.junit.opcodes.iload.jm.T_iload_6_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_1.j b/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_1.j
deleted file mode 100644
index 3083ee0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_1.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_1.java
-.class public dxc/junit/opcodes/iload/jm/T_iload_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()I
-    .limit stack 2
-    .limit locals 6
-    
-    iconst_4
-    istore 4
-    iconst_3
-    iload 4
-    
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_1.java b/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_1.java
deleted file mode 100644
index 9bef2f2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload.jm;
-
-public class T_iload_1 {
-
-    public int run() {
-        return 4;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_1_w.j b/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_1_w.j
deleted file mode 100644
index 9e31e93..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_1_w.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_1_w.java
-.class public dxc/junit/opcodes/iload/jm/T_iload_1_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()I
-    .limit stack 2
-    .limit locals 300
-    
-    iconst_4
-    istore 257
-    iconst_3
-    iload 257
-    
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_1_w.java b/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_1_w.java
deleted file mode 100644
index 57842b5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_1_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload.jm;
-
-public class T_iload_1_w {
-
-    public int run() {
-        return 4;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_2.j b/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_2.j
deleted file mode 100644
index dfbad28..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_2.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_2.java
-.class public dxc/junit/opcodes/iload/jm/T_iload_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()I
-    .limit stack 2
-    .limit locals 300
-    
-    iconst_3
-    istore 255
-    iconst_2
-    iload 255
-    
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_2.java b/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_2.java
deleted file mode 100644
index c75bf95..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload.jm;
-
-public class T_iload_2 {
-
-      public int run() {
-            return 3;
-        }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_2_w.j b/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_2_w.j
deleted file mode 100644
index d11251f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_2_w.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_2_w.java
-.class public dxc/junit/opcodes/iload/jm/T_iload_2_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()I
-    .limit stack 2
-    .limit locals 2
-    
-    iconst_3
-    istore 1
-    iconst_2
-    iload_w 1
-    
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_2_w.java b/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_2_w.java
deleted file mode 100644
index fe5b114..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_2_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload.jm;
-
-public class T_iload_2_w {
-
-      public int run() {
-            return 3;
-        }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_3.j b/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_3.j
deleted file mode 100644
index eaa2990..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_3.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_3.java
-.class public dxc/junit/opcodes/iload/jm/T_iload_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    iload 0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_3.java b/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_3.java
deleted file mode 100644
index 36e8376..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload.jm;
-
-public class T_iload_3 {
-
-    public void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_3_w.j b/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_3_w.j
deleted file mode 100644
index 9e892c3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_3_w.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_3_w.java
-.class public dxc/junit/opcodes/iload/jm/T_iload_3_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 300
-
-    iload 300
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_3_w.java b/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_3_w.java
deleted file mode 100644
index 6bf6191..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_3_w.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload.jm;
-
-public class T_iload_3_w {
-
-    public void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_4.j b/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_4.j
deleted file mode 100644
index 318a2a3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_4.java
-.class public dxc/junit/opcodes/iload/jm/T_iload_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    dconst_1
-    dstore_0
-    
-    iload 0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_4.java b/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_4.java
deleted file mode 100644
index 1fe18fa..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload.jm;
-
-public class T_iload_4 {
-
-    public void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_4_w.j b/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_4_w.j
deleted file mode 100644
index 541c077..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_4_w.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_4_w.java
-.class public dxc/junit/opcodes/iload/jm/T_iload_4_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 300
-
-    dconst_1
-    dstore 260
-    
-    iload_w 260
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_4_w.java b/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_4_w.java
deleted file mode 100644
index c293b5a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_4_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload.jm;
-
-public class T_iload_4_w {
-
-    public void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_5.j b/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_5.j
deleted file mode 100644
index 7bf6e93..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_5.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_5.java
-.class public dxc/junit/opcodes/iload/jm/T_iload_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    lstore_0
-    
-    iload 0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_5.java b/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_5.java
deleted file mode 100644
index 67cb0a2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload.jm;
-
-public class T_iload_5 {
-
-    public void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_5_w.j b/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_5_w.j
deleted file mode 100644
index 91208fd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_5_w.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_5_w.java
-.class public dxc/junit/opcodes/iload/jm/T_iload_5_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 300
-
-    lconst_1
-    lstore 260
-    
-    iload_w 260
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_5_w.java b/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_5_w.java
deleted file mode 100644
index 78882d0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_5_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload.jm;
-
-public class T_iload_5_w {
-
-    public void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_6.j b/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_6.j
deleted file mode 100644
index 9363f54..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_6.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_6.java
-.class public dxc/junit/opcodes/iload/jm/T_iload_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 2
-
-    iconst_1
-    istore_0
-    
-    iload 0
-    iload 0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_6.java b/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_6.java
deleted file mode 100644
index 4b0ca5e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload.jm;
-
-public class T_iload_6 {
-
-    public void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_6_w.j b/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_6_w.j
deleted file mode 100644
index dd93b27..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_6_w.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_6_w.java
-.class public dxc/junit/opcodes/iload/jm/T_iload_6_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 300
-
-    iconst_1
-    istore 260
-    
-    iload_w 260
-    iload_w 260
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_6_w.java b/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_6_w.java
deleted file mode 100644
index f5e118b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload/jm/T_iload_6_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload.jm;
-
-public class T_iload_6_w {
-
-    public void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_0/Test_iload_0.java b/tools/dx-tests/src/dxc/junit/opcodes/iload_0/Test_iload_0.java
deleted file mode 100644
index ffb8684..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_0/Test_iload_0.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload_0;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.iload_0.jm.T_iload_0_1;
-import dxc.junit.opcodes.iload_0.jm.T_iload_0_6;
-
-public class Test_iload_0 extends DxTestCase {
-
-    /**
-     * @title value is pushed onto the operand stack
-     */
-    public void testN1() {
-        assertEquals(3, T_iload_0_1.run());
-    }
-
-    /**
-     * @title  equality of iload_<n> and iload <n>
-     */
-    public void testN2() {
-        assertTrue(T_iload_0_6.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.iload_0.jm.T_iload_0_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.iload_0.jm.T_iload_0_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.iload_0.jm.T_iload_0_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.iload_0.jm.T_iload_0_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_1.j b/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_1.j
deleted file mode 100644
index 3aa9a54..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_0_1.java
-.class public dxc/junit/opcodes/iload_0/jm/T_iload_0_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()I
-    .limit stack 2
-    .limit locals 1
-    
-    iconst_3
-    istore_0
-    iconst_4
-    iload_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_1.java b/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_1.java
deleted file mode 100644
index 1cb2ba3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload_0.jm;
-
-public class T_iload_0_1 {
-
-    public static int run() {
-        return 3;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_2.j b/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_2.j
deleted file mode 100644
index 703b886..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_0_2.java
-.class public dxc/junit/opcodes/iload_0/jm/T_iload_0_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    iload_0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_2.java b/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_2.java
deleted file mode 100644
index c3c2c76..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload_0.jm;
-
-public class T_iload_0_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_3.j b/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_3.j
deleted file mode 100644
index 2b1af46..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_3.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_0_3.java
-.class public dxc/junit/opcodes/iload_0/jm/T_iload_0_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    dconst_1
-    dstore_0
-    
-    iload_0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_3.java b/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_3.java
deleted file mode 100644
index 801d3ba..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload_0.jm;
-
-public class T_iload_0_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_4.j b/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_4.j
deleted file mode 100644
index 3df46a9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_0_4.java
-.class public dxc/junit/opcodes/iload_0/jm/T_iload_0_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    lstore_0
-    
-    iload_0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_4.java b/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_4.java
deleted file mode 100644
index c92ee08..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload_0.jm;
-
-public class T_iload_0_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_5.j b/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_5.j
deleted file mode 100644
index 9505ede..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_5.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_0_5.java
-.class public dxc/junit/opcodes/iload_0/jm/T_iload_0_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 2
-
-    iconst_1
-    istore_0
-    
-    iload_0
-    iload_0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_5.java b/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_5.java
deleted file mode 100644
index b86d61f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_5.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload_0.jm;
-
-public class T_iload_0_5 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_6.j b/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_6.j
deleted file mode 100644
index 8029a62..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_6.j
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_0_6.java
-.class public dxc/junit/opcodes/iload_0/jm/T_iload_0_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()Z
-    .limit stack 2
-    .limit locals 1
-
-    iconst_4
-    istore_0
-
-    iload_0
-    iload 0
-    if_icmpne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_6.java b/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_6.java
deleted file mode 100644
index 9c12736..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_0/jm/T_iload_0_6.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload_0.jm;
-
-public class T_iload_0_6 {
-
-    public static boolean run() {
-        int i = 4;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_1/Test_iload_1.java b/tools/dx-tests/src/dxc/junit/opcodes/iload_1/Test_iload_1.java
deleted file mode 100644
index a41ed26..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_1/Test_iload_1.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload_1;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.iload_1.jm.T_iload_1_1;
-import dxc.junit.opcodes.iload_1.jm.T_iload_1_6;
-
-public class Test_iload_1 extends DxTestCase {
-
-    /**
-     * @title value is pushed onto the operand stack
-     */
-    public void testN1() {
-        assertEquals(3, T_iload_1_1.run());
-    }
-
-    /**
-     * @title equality of iload_<n> and iload <n>
-     */
-    public void testN2() {
-        assertTrue(T_iload_1_6.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.iload_1.jm.T_iload_1_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.iload_1.jm.T_iload_1_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.iload_1.jm.T_iload_1_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.iload_1.jm.T_iload_1_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_1.j b/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_1.j
deleted file mode 100644
index 79c23dc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_1_1.java
-.class public dxc/junit/opcodes/iload_1/jm/T_iload_1_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()I
-    .limit stack 2
-    .limit locals 2
-    
-    iconst_3
-    istore_1
-    iconst_4
-    iload_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_1.java b/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_1.java
deleted file mode 100644
index 2ecc1ea..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload_1.jm;
-
-public class T_iload_1_1 {
-
-    public static int run() {
-        return 3;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_2.j b/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_2.j
deleted file mode 100644
index 8b5e52f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_1_2.java
-.class public dxc/junit/opcodes/iload_1/jm/T_iload_1_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    iload_1
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_2.java b/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_2.java
deleted file mode 100644
index f7fcd5e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload_1.jm;
-
-public class T_iload_1_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_3.j b/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_3.j
deleted file mode 100644
index 63d1216..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_3.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_1_3.java
-.class public dxc/junit/opcodes/iload_1/jm/T_iload_1_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    dconst_1
-    dstore_1
-    
-    iload_1
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_3.java b/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_3.java
deleted file mode 100644
index 48dc77c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload_1.jm;
-
-public class T_iload_1_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_4.j b/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_4.j
deleted file mode 100644
index aebcb4a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_1_4.java
-.class public dxc/junit/opcodes/iload_1/jm/T_iload_1_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    lstore_1
-    
-    iload_1
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_4.java b/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_4.java
deleted file mode 100644
index a7fc0d1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload_1.jm;
-
-public class T_iload_1_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_5.j b/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_5.j
deleted file mode 100644
index 9dc1a4f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_5.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_1_5.java
-.class public dxc/junit/opcodes/iload_1/jm/T_iload_1_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 2
-
-    iconst_1
-    istore_1
-    
-    iload_1
-    iload_1
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_5.java b/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_5.java
deleted file mode 100644
index e9bd6c4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_5.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload_1.jm;
-
-public class T_iload_1_5 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_6.j b/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_6.j
deleted file mode 100644
index 019b7a1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_6.j
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_1_6.java
-.class public dxc/junit/opcodes/iload_1/jm/T_iload_1_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()Z
-    .limit stack 2
-    .limit locals 2
-
-    iconst_4
-    istore_1
-
-    iload_1
-    iload 1
-    if_icmpne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_6.java b/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_6.java
deleted file mode 100644
index 37f65c2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_1/jm/T_iload_1_6.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload_1.jm;
-
-public class T_iload_1_6 {
-
-    public static boolean run() {
-        int i = 4;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_2/Test_iload_2.java b/tools/dx-tests/src/dxc/junit/opcodes/iload_2/Test_iload_2.java
deleted file mode 100644
index b42cc97..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_2/Test_iload_2.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload_2;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.iload_2.jm.T_iload_2_1;
-import dxc.junit.opcodes.iload_2.jm.T_iload_2_6;
-
-public class Test_iload_2 extends DxTestCase {
-
-    /**
-     * @title value is pushed onto the operand stack
-     */
-    public void testN1() {
-        assertEquals(3, T_iload_2_1.run());
-    }
-
-    /**
-     * @title equality of iload_<n> and iload <n>
-     */
-    public void testN2() {
-        assertTrue(T_iload_2_6.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.iload_2.jm.T_iload_2_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.iload_2.jm.T_iload_2_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.iload_2.jm.T_iload_2_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.iload_2.jm.T_iload_2_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_1.j b/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_1.j
deleted file mode 100644
index 4b4acb6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_2_1.java
-.class public dxc/junit/opcodes/iload_2/jm/T_iload_2_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()I
-    .limit stack 2
-    .limit locals 3
-    
-    iconst_3
-    istore_2
-    iconst_4
-    iload_2
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_1.java b/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_1.java
deleted file mode 100644
index a348490..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload_2.jm;
-
-public class T_iload_2_1 {
-
-    public static int run() {
-        return 3;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_2.j b/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_2.j
deleted file mode 100644
index aea12fc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_2_2.java
-.class public dxc/junit/opcodes/iload_2/jm/T_iload_2_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    iload_2
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_2.java b/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_2.java
deleted file mode 100644
index 5ebd62f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload_2.jm;
-
-public class T_iload_2_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_3.j b/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_3.j
deleted file mode 100644
index e3731cc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_3.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_2_3.java
-.class public dxc/junit/opcodes/iload_2/jm/T_iload_2_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 6
-
-    dconst_1
-    dstore_2
-    
-    iload_2
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_3.java b/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_3.java
deleted file mode 100644
index 72149ef..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload_2.jm;
-
-public class T_iload_2_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_4.j b/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_4.j
deleted file mode 100644
index 18b80f1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_2_4.java
-.class public dxc/junit/opcodes/iload_2/jm/T_iload_2_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 6
-
-    lconst_1
-    lstore_2
-    
-    iload_2
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_4.java b/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_4.java
deleted file mode 100644
index 904c14c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload_2.jm;
-
-public class T_iload_2_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_5.j b/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_5.j
deleted file mode 100644
index 4390cbb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_5.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_2_5.java
-.class public dxc/junit/opcodes/iload_2/jm/T_iload_2_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 4
-
-    iconst_1
-    istore_2
-    
-    iload_2
-    iload_2
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_5.java b/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_5.java
deleted file mode 100644
index db95cae..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_5.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload_2.jm;
-
-public class T_iload_2_5 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_6.j b/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_6.j
deleted file mode 100644
index 8ca7a9e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_6.j
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_2_6.java
-.class public dxc/junit/opcodes/iload_2/jm/T_iload_2_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()Z
-    .limit stack 2
-    .limit locals 3
-
-    iconst_4
-    istore_2
-
-    iload_2
-    iload 2
-    if_icmpne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_6.java b/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_6.java
deleted file mode 100644
index 737eb18..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_2/jm/T_iload_2_6.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload_2.jm;
-
-public class T_iload_2_6 {
-
-    public static boolean run() {
-        int i = 4;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_3/Test_iload_3.java b/tools/dx-tests/src/dxc/junit/opcodes/iload_3/Test_iload_3.java
deleted file mode 100644
index ac47b59..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_3/Test_iload_3.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload_3;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.iload_3.jm.T_iload_3_1;
-import dxc.junit.opcodes.iload_3.jm.T_iload_3_6;
-
-public class Test_iload_3 extends DxTestCase {
-
-    /**
-     * @title value is pushed onto the operand stack
-     */
-    public void testN1() {
-        assertEquals(3, T_iload_3_1.run());
-    }
-
-    /**
-     * @title equality of iload_<n> and iload <n>
-     */
-    public void testN2() {
-        assertTrue(T_iload_3_6.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.iload_3.jm.T_iload_3_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.iload_3.jm.T_iload_3_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.iload_3.jm.T_iload_3_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.iload_3.jm.T_iload_3_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_1.j b/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_1.j
deleted file mode 100644
index 8b18818..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_3_1.java
-.class public dxc/junit/opcodes/iload_3/jm/T_iload_3_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()I
-    .limit stack 2
-    .limit locals 4
-    
-    iconst_3
-    istore_3
-    iconst_4
-    iload_3
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_1.java b/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_1.java
deleted file mode 100644
index 88b4b61..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload_3.jm;
-
-public class T_iload_3_1 {
-
-    public static int run() {
-        return 3;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_2.j b/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_2.j
deleted file mode 100644
index 6e75ed3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_3_2.java
-.class public dxc/junit/opcodes/iload_3/jm/T_iload_3_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    iload_3
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_2.java b/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_2.java
deleted file mode 100644
index 4ad7106..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload_3.jm;
-
-public class T_iload_3_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_3.j b/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_3.j
deleted file mode 100644
index 8bc3a02..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_3.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_3_3.java
-.class public dxc/junit/opcodes/iload_3/jm/T_iload_3_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 6
-
-    dconst_1
-    dstore_3
-    
-    iload_3
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_3.java b/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_3.java
deleted file mode 100644
index 8660cab..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload_3.jm;
-
-public class T_iload_3_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_4.j b/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_4.j
deleted file mode 100644
index cdd2fa8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_3_4.java
-.class public dxc/junit/opcodes/iload_3/jm/T_iload_3_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 6
-
-    lconst_1
-    lstore_3
-    
-    iload_3
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_4.java b/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_4.java
deleted file mode 100644
index 86fe370..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload_3.jm;
-
-public class T_iload_3_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_5.j b/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_5.j
deleted file mode 100644
index 94aeec4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_5.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_3_5.java
-.class public dxc/junit/opcodes/iload_3/jm/T_iload_3_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 3
-
-    iconst_1
-    istore_3
-    
-    iload_3
-    iload_3
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_5.java b/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_5.java
deleted file mode 100644
index 8604dce..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_5.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload_3.jm;
-
-public class T_iload_3_5 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_6.j b/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_6.j
deleted file mode 100644
index 9267b43..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_6.j
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iload_3_6.java
-.class public dxc/junit/opcodes/iload_3/jm/T_iload_3_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()Z
-    .limit stack 2
-    .limit locals 4
-
-    iconst_4
-    istore_3
-
-    iload_3
-    iload 3
-    if_icmpne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_6.java b/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_6.java
deleted file mode 100644
index 28d17a2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iload_3/jm/T_iload_3_6.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iload_3.jm;
-
-public class T_iload_3_6 {
-
-    public static boolean run() {
-        int i = 4;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/imul/Test_imul.java b/tools/dx-tests/src/dxc/junit/opcodes/imul/Test_imul.java
deleted file mode 100644
index 2db80b6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/imul/Test_imul.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.imul;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.imul.jm.T_imul_1;
-
-public class Test_imul extends DxTestCase {
-
-    /**
-     * @title Arguments = 8, 4
-     */
-    public void testN1() {
-        T_imul_1 t = new T_imul_1();
-        assertEquals(32, t.run(8, 4));
-    }
-
-    /**
-     * @title Arguments = -2, 255
-     */
-    public void testN2() {
-        T_imul_1 t = new T_imul_1();
-        assertEquals(-510, t.run(-2, 255));
-    }
-
-    /**
-     * @title Arguments = 0x7ffffffe, 2
-     */
-    public void testN3() {
-        T_imul_1 t = new T_imul_1();
-        assertEquals(-4, t.run(0x7ffffffe, 2));
-    }
-
-    /**
-     * @title Arguments = 4, 0x80000001
-     */
-    public void testN4() {
-        T_imul_1 t = new T_imul_1();
-        assertEquals(4, t.run(4, 0x80000001));
-    }
-
-    /**
-     * @title Arguments = 0, Integer.MAX_VALUE
-     */
-    public void testB1() {
-        T_imul_1 t = new T_imul_1();
-        assertEquals(0, t.run(0, Integer.MAX_VALUE));
-    }
-
-    /**
-     * @title Arguments = Integer.MAX_VALUE, 1
-     */
-    public void testB2() {
-        T_imul_1 t = new T_imul_1();
-        assertEquals(Integer.MAX_VALUE, t.run(Integer.MAX_VALUE, 1));
-    }
-
-    /**
-     * @title Arguments = Integer.MIN_VALUE, 1
-     */
-    public void testB3() {
-        T_imul_1 t = new T_imul_1();
-        assertEquals(Integer.MIN_VALUE, t.run(Integer.MIN_VALUE, 1));
-    }
-
-    /**
-     * @title Arguments = Integer.MAX_VALUE, Integer.MIN_VALUE
-     */
-    public void testB4() {
-        T_imul_1 t = new T_imul_1();
-        assertEquals(Integer.MIN_VALUE, t.run(Integer.MAX_VALUE,
-                Integer.MIN_VALUE));
-    }
-
-    /**
-     * @title Arguments = 0, 0
-     */
-    public void testB5() {
-        T_imul_1 t = new T_imul_1();
-        assertEquals(0, t.run(0, 0));
-    }
-
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.imul.jm.T_imul_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int / double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.imul.jm.T_imul_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long / int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.imul.jm.T_imul_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference / int
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.imul.jm.T_imul_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/imul/jm/T_imul_1.j b/tools/dx-tests/src/dxc/junit/opcodes/imul/jm/T_imul_1.j
deleted file mode 100644
index b3ba15a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/imul/jm/T_imul_1.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_imul_1.java
-.class public dxc/junit/opcodes/imul/jm/T_imul_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-    iload_1
-    iload_2
-    imul
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/imul/jm/T_imul_1.java b/tools/dx-tests/src/dxc/junit/opcodes/imul/jm/T_imul_1.java
deleted file mode 100644
index 38b1298..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/imul/jm/T_imul_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.imul.jm;
-
-public class T_imul_1 {
-
-    public int run(int a, int b) {
-        return a+b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/imul/jm/T_imul_2.j b/tools/dx-tests/src/dxc/junit/opcodes/imul/jm/T_imul_2.j
deleted file mode 100644
index d00f4e0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/imul/jm/T_imul_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_imul_2.java
-.class public dxc/junit/opcodes/imul/jm/T_imul_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-    iload_1
-    ; iload_2    
-    imul
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/imul/jm/T_imul_2.java b/tools/dx-tests/src/dxc/junit/opcodes/imul/jm/T_imul_2.java
deleted file mode 100644
index 123e230..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/imul/jm/T_imul_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.imul.jm;
-
-public class T_imul_2 {
-
-    public int run(int a, int b) {
-        return a+b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/imul/jm/T_imul_3.j b/tools/dx-tests/src/dxc/junit/opcodes/imul/jm/T_imul_3.j
deleted file mode 100644
index 960c58c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/imul/jm/T_imul_3.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_imul_3.java
-.class public dxc/junit/opcodes/imul/jm/T_imul_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(ID)I
-    .limit stack 3
-    .limit locals 5
-    iload_1
-    dload_2    
-    imul
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/imul/jm/T_imul_3.java b/tools/dx-tests/src/dxc/junit/opcodes/imul/jm/T_imul_3.java
deleted file mode 100644
index cad2df6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/imul/jm/T_imul_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.imul.jm;
-
-public class T_imul_3 {
-
-    public int run(int a, double b) {
-        return a+(int)b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/imul/jm/T_imul_4.j b/tools/dx-tests/src/dxc/junit/opcodes/imul/jm/T_imul_4.j
deleted file mode 100644
index 73d7440..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/imul/jm/T_imul_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_imul_4.java
-.class public dxc/junit/opcodes/imul/jm/T_imul_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(JI)I
-    .limit stack 3
-    .limit locals 4
-
-    lload_1
-;    l2i
-    iload_3
-    imul
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/imul/jm/T_imul_4.java b/tools/dx-tests/src/dxc/junit/opcodes/imul/jm/T_imul_4.java
deleted file mode 100644
index d2da8b7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/imul/jm/T_imul_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.imul.jm;
-
-public class T_imul_4 {
-
-    public int run(long a, int b) {
-        return (int)a+b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/imul/jm/T_imul_5.j b/tools/dx-tests/src/dxc/junit/opcodes/imul/jm/T_imul_5.j
deleted file mode 100644
index aa3a81a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/imul/jm/T_imul_5.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_imul_5.java
-.class public dxc/junit/opcodes/imul/jm/T_imul_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-
-    aload_0
-    iload_2
-    iadd
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/imul/jm/T_imul_5.java b/tools/dx-tests/src/dxc/junit/opcodes/imul/jm/T_imul_5.java
deleted file mode 100644
index e4aa8e9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/imul/jm/T_imul_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.imul.jm;
-
-public class T_imul_5 {
-    
-    public int run(int a, int b) {
-        return a+b;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ineg/Test_ineg.java b/tools/dx-tests/src/dxc/junit/opcodes/ineg/Test_ineg.java
deleted file mode 100644
index 366a8a1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ineg/Test_ineg.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ineg;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.ineg.jm.T_ineg_1;
-import dxc.junit.opcodes.ineg.jm.T_ineg_2;
-
-public class Test_ineg extends DxTestCase {
-
-    /**
-     * @title  Argument = 1
-     */
-    public void testN1() {
-        T_ineg_1 t = new T_ineg_1();
-        assertEquals(-1, t.run(1));
-    }
-
-    /**
-     * @title  Argument = -1
-     */
-    public void testN2() {
-        T_ineg_1 t = new T_ineg_1();
-        assertEquals(1, t.run(-1));
-    }
-
-    /**
-     * @title  Argument = 32768
-     */
-    public void testN3() {
-        T_ineg_1 t = new T_ineg_1();
-        assertEquals(-32768, t.run(32768));
-    }
-
-    /**
-     * @title  Argument = 0
-     */
-    public void testN4() {
-        T_ineg_1 t = new T_ineg_1();
-        assertEquals(0, t.run(0));
-    }
-
-    /**
-     * @title  Check that -x == (~x + 1)
-     */
-    public void testN5() {
-        T_ineg_2 t = new T_ineg_2();
-        assertTrue(t.run(12345));
-    }
-
-    /**
-     * @title  Argument = Integer.MAX_VALUE
-     */
-    public void testB1() {
-        T_ineg_1 t = new T_ineg_1();
-        assertEquals(0x80000001, t.run(Integer.MAX_VALUE));
-    }
-
-    /**
-     * @title  Argument = Integer.MIN_VALUE
-     */
-    public void testB2() {
-        T_ineg_1 t = new T_ineg_1();
-        assertEquals(Integer.MIN_VALUE, t.run(Integer.MIN_VALUE));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.ineg.jm.T_ineg_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.ineg.jm.T_ineg_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.ineg.jm.T_ineg_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - reference
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.ineg.jm.T_ineg_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_1.j b/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_1.j
deleted file mode 100644
index e124957..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_1.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ineg_1.java
-.class public dxc/junit/opcodes/ineg/jm/T_ineg_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-    iload_1
-    ineg
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_1.java b/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_1.java
deleted file mode 100644
index 3db9480..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ineg.jm;
-
-public class T_ineg_1 {
-
-    public int run(int d) {
-        return -d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_2.j b/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_2.j
deleted file mode 100644
index b4f2140..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_2.j
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ineg_2.java
-.class public dxc/junit/opcodes/ineg/jm/T_ineg_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)Z
-    .limit stack 3
-    .limit locals 2
-
-    iload_1
-    ineg
-
-    iload_1
-    iconst_m1
-    ixor
-    iconst_1
-    iadd
-    if_icmpne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_2.java b/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_2.java
deleted file mode 100644
index b9ee0b0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ineg.jm;
-
-public class T_ineg_2 {
-
-     public boolean run(int d) {
-         return -d == (~d + 1);
-     }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_3.j b/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_3.j
deleted file mode 100644
index e850c19..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_3.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ineg_3.java
-.class public dxc/junit/opcodes/ineg/jm/T_ineg_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-    ;iload_1
-    ineg
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_3.java b/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_3.java
deleted file mode 100644
index 306154b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ineg.jm;
-
-public class T_ineg_3 {
-
-    public int run(int d) {
-        return -d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_4.j b/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_4.j
deleted file mode 100644
index 7f1d704..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_4.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ineg_4.java
-.class public dxc/junit/opcodes/ineg/jm/T_ineg_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 2
-    .limit locals 3
-    ;iload_1
-    dconst_1
-    ineg
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_4.java b/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_4.java
deleted file mode 100644
index 8285cbd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ineg.jm;
-
-public class T_ineg_4 {
-
-    public int run(int d) {
-        return -d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_5.j b/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_5.j
deleted file mode 100644
index 8ec653d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_5.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ineg_5.java
-.class public dxc/junit/opcodes/ineg/jm/T_ineg_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 2
-    .limit locals 3
-    ;iload_1
-    lconst_1
-    ineg
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_5.java b/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_5.java
deleted file mode 100644
index 48d4b14..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ineg.jm;
-
-public class T_ineg_5 {
-
-    public int run(int d) {
-        return -d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_6.j b/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_6.j
deleted file mode 100644
index 8aa2e44..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_6.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ineg_6.java
-.class public dxc/junit/opcodes/ineg/jm/T_ineg_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-
-    aload_0
-    ineg
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_6.java b/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_6.java
deleted file mode 100644
index 901bcf4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ineg/jm/T_ineg_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ineg.jm;
-
-public class T_ineg_6 {
-    
-    public int run(int d) {
-        return -d;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/Test_invokeinterface.java b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/Test_invokeinterface.java
deleted file mode 100644
index 9d27718..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/Test_invokeinterface.java
+++ /dev/null
@@ -1,361 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokeinterface;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.invokeinterface.jm.ITestImpl;
-import dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_1;
-import dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_11;
-import dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_12;
-import dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_13;
-import dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_14;
-import dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_15;
-import dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_16;
-import dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_17;
-import dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_19;
-import dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_3;
-import dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_7;
-
-public class Test_invokeinterface extends DxTestCase {
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_invokeinterface_1 t = new T_invokeinterface_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 invokeinterface and
-     * arguments are passed to method
-     */
-    public void testN2() {
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITest
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITestImpl
-        T_invokeinterface_14 t = new T_invokeinterface_14();
-        ITestImpl impl = new ITestImpl();
-        assertEquals(1, t.run(impl));
-    }
-
-    /**
-     * @title  Check that monitor is acquired if method is synchronized
-     */
-    public void testN3() {
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITest
-        assertTrue(T_invokeinterface_19.execute());
-    }
-
-
-    /**
-     * @title  method doesn't exist
-     */
-    public void testE1() {
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITest
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITestImpl
-        try {
-            T_invokeinterface_7 t = new T_invokeinterface_7();
-            ITestImpl impl = new ITestImpl();
-            t.run(impl);
-            fail("expected NoSuchMethodError");
-        } catch (NoSuchMethodError e) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title  method has different signature
-     */
-    public void testE2() {
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITest
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITestImpl
-        try {
-            T_invokeinterface_16 t = new T_invokeinterface_16();
-            ITestImpl impl = new ITestImpl();
-            t.run(impl);
-            fail("expected NoSuchMethodError");
-        } catch (NoSuchMethodError e) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title expected NullPointerException
-     */
-    public void testE3() {
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITest        
-        try {
-            new T_invokeinterface_3(null);
-            fail("expected NullPointerException");
-        } catch (NullPointerException npe) {
-            // expected
-        }
-    }
-
-    /**
-     * @title  object doesn't implement interface
-     */
-    public void testE4() {
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITest
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITestImpl
-        T_invokeinterface_11 t = new T_invokeinterface_11();
-        ITestImpl impl = new ITestImpl();
-        try {
-            t.run(impl);
-            fail("expected IncompatibleClassChangeError");
-        } catch (IncompatibleClassChangeError e) {
-            // expected
-        }
-    }
-
-    /**
-     * @title  Native method can't be linked
-     */
-    public void testE5() {
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITest
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITestImpl
-        T_invokeinterface_12 t = new T_invokeinterface_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 dxc.junit.opcodes.invokeinterface.jm.ITest
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITestImplAbstract
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITestImpl
-        try {
-            T_invokeinterface_13 t = new T_invokeinterface_13();
-            ITestImpl impl = new ITestImpl();
-            t.run(impl);
-            fail("expected AbstractMethodError");
-        } catch (AbstractMethodError e) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title  Attempt to invoke static method
-     */
-    public void testE7() {
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITest
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITestImplAbstract
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITestImpl
-        try {
-            T_invokeinterface_15 t = new T_invokeinterface_15();
-            ITestImpl impl = new ITestImpl();
-            t.run(impl);
-            fail("expected AbstractMethodError");
-        } catch (AbstractMethodError e) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title  Attempt to invoke non-public interface method
-     */
-    public void testE8() {
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITest
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITestImplAbstract
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITestImpl
-        try {
-            T_invokeinterface_17 t = new T_invokeinterface_17();
-            ITestImpl impl = new ITestImpl();
-            t.run(impl);
-            fail("expected IllegalAccessError");
-        } catch (IllegalAccessError e) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.15 
-     * @title valid index into constant pool table
-     */
-    public void testVFE1() {
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITest
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.15 
-     * @title invalid index into constant pool table
-     */
-    public void testVFE2() {
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITest
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_23");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1 
-     * @title number of arguments
-     */
-    public void testVFE5() {
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITest
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1 
-     * @title type of argument - int
-     */
-    public void testVFE6() {
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITest        
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_10");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.15 
-     * @title args_size value must match number of arguments
-     */
-    public void testVFE7() {
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITest
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_8");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.15 
-     * @title 4th operand must be zero
-     */
-    public void testVFE8() {
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITest
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1 
-     * @title number of arguments passed to method
-     */
-    public void testVFE9() {
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITest
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_9");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.14 
-     * @title only invokespecial may be used to call <init>
-     */
-    public void testVFE10() {
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITest
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITestImplAbstract        
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_18");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.14 
-     * @title only invokespecial may be used to call <clinit>
-     */
-    public void testVFE11() {
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITest
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_20");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.12 
-     * @title types of arguments passed to method
-     */
-    public void testVFE12() {
-        //@uses dxc.junit.opcodes.invokeinterface.jm.ITest
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_21");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/ITest.java b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/ITest.java
deleted file mode 100644
index 080199a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/ITest.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokeinterface.jm;
-
-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/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/ITestImpl.java b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/ITestImpl.java
deleted file mode 100644
index fb20ecc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/ITestImpl.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokeinterface.jm;
-
-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/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/ITestImplAbstract.j b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/ITestImplAbstract.j
deleted file mode 100644
index 6ebe8bd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/ITestImplAbstract.j
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source ITestImplAbstract.java
-.class public dxc/junit/opcodes/invokeinterface/jm/ITestImplAbstract
-.super java/lang/Object
-.implements dxc/junit/opcodes/invokeinterface/jm/ITest
-
-.method  <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public abstract doit()V
-.end method
-
-
-
-.method public static doit(I)V
-    .limit locals 2
-    return
-.end method
-
-
-
-.method public native doitNative()V
-.end method
-
-.method protected test(I)I
-    .limit locals 2
-    .limit stack 1
-    iconst_0
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/ITestImplAbstract.java b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/ITestImplAbstract.java
deleted file mode 100644
index fdabd89..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/ITestImplAbstract.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokeinterface.jm;
-
-abstract class ITestImplAbstract implements ITest {
-    abstract public void doit();
-    abstract public void doit(int i);
-    public native void doitNative();
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_1.j b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_1.j
deleted file mode 100644
index ca88c6c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_1.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokeinterface_1.java
-.class public dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/Comparable;Ljava/lang/Object;)I
-    .limit stack 2
-    .limit locals 3
-    aload_1
-    aload_2
-    invokeinterface java/lang/Comparable/compareTo(Ljava/lang/Object;)I 2
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_1.java b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_1.java
deleted file mode 100644
index bb3a112..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokeinterface.jm;
-
-public class T_invokeinterface_1 {
-
-    public int run(Comparable c, Object o) {
-        return c.compareTo(o);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_10.j b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_10.j
deleted file mode 100644
index 786446d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_10.j
+++ /dev/null
@@ -1,30 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokeinterface_10.java
-.class public dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_10
-.super java/lang/Object
-
-.method public <init>(Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V
-    .limit stack 1
-    .limit locals 2
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-;    aload_1
-    iconst_1
-    invokeinterface dxc/junit/opcodes/invokeinterface/jm/ITest/doit()V 1
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_10.java b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_10.java
deleted file mode 100644
index 5fe6f68..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_10.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokeinterface.jm;
-
-public class T_invokeinterface_10 {
-
-    public T_invokeinterface_10 (ITest test) {
-        test.doit();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_11.j b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_11.j
deleted file mode 100644
index e4c7a8b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_11.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokeinterface_11.java
-.class public dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_11
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V
-    .limit stack 1
-    .limit locals 2
-
-;    aload_1
-    aload_0
-    invokeinterface dxc/junit/opcodes/invokeinterface/jm/ITest/doit()V 1
-
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_11.java b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_11.java
deleted file mode 100644
index 916eeb3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokeinterface.jm;
-
-public class T_invokeinterface_11 {
-
-    public void run(ITest test) {
-        test.doit();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_12.j b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_12.j
deleted file mode 100644
index fbd7d7e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_12.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokeinterface_12.java
-.class public dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_12
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V
-    .limit stack 1
-    .limit locals 2
-
-    aload_1
-    invokeinterface dxc/junit/opcodes/invokeinterface/jm/ITest/doitNative()V 1
-
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_12.java b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_12.java
deleted file mode 100644
index 3418fce..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_12.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokeinterface.jm;
-
-public class T_invokeinterface_12 {
-
-    public void run(ITest test) {
-        test.doitNative();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_13.j b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_13.j
deleted file mode 100644
index 7feb097..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_13.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokeinterface_13.java
-.class public dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_13
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V
-    .limit stack 2
-    .limit locals 2
-
-    new dxc/junit/opcodes/invokeinterface/jm/ITestImplAbstract
-    dup
-    invokespecial dxc/junit/opcodes/invokeinterface/jm/ITestImplAbstract/<init>()V
-    
-    invokeinterface dxc/junit/opcodes/invokeinterface/jm/ITest/doit()V 1
-
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_13.java b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_13.java
deleted file mode 100644
index e11df1f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_13.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokeinterface.jm;
-
-public class T_invokeinterface_13 {
-
-    public void run(ITest test) {
-        test.doit();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_14.j b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_14.j
deleted file mode 100644
index 94a2710..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_14.j
+++ /dev/null
@@ -1,58 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokeinterface_14.java
-.class public dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_14
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(Ldxc/junit/opcodes/invokeinterface/jm/ITest;)I
-    .limit stack 3
-    .limit locals 4
-
-    bipush 123
-    istore_2
-
-    sipush 345
-    istore_3
-
-    aload_1
-    sipush 64
-    sipush 2
-    invokeinterface dxc/junit/opcodes/invokeinterface/jm/ITest/testArgsOrder(II)I 3
-    sipush 32
-    if_icmpne Label0
-
-    iload_2
-    bipush 123
-    if_icmpne Label0
-
-    iload_3
-    sipush 345
-    if_icmpne Label0
-
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_14.java b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_14.java
deleted file mode 100644
index 4ebf2f7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_14.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokeinterface.jm;
-
-public class T_invokeinterface_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/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_15.j b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_15.j
deleted file mode 100644
index 67f5ffb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_15.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokeinterface_15.java
-.class public dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_15
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V
-    .limit stack 2
-    .limit locals 2
-
-    new dxc/junit/opcodes/invokeinterface/jm/ITestImplAbstract
-    dup
-    invokespecial dxc/junit/opcodes/invokeinterface/jm/ITestImplAbstract/<init>()V
-    
-    iconst_1
-    invokeinterface dxc/junit/opcodes/invokeinterface/jm/ITest/doit(I)V 2
-
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_15.java b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_15.java
deleted file mode 100644
index c4aba4c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_15.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokeinterface.jm;
-
-public class T_invokeinterface_15 {
-
-    public void run(ITest test) {
-        test.doit();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_16.j b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_16.j
deleted file mode 100644
index 796696a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_16.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokeinterface_16.java
-.class public dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_16
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V
-    .limit stack 2
-    .limit locals 2
-
-    aload_1
-    fconst_1
-    invokeinterface dxc/junit/opcodes/invokeinterface/jm/ITest/doit(F)V 2
-
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_16.java b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_16.java
deleted file mode 100644
index 161aafe..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_16.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokeinterface.jm;
-
-public class T_invokeinterface_16 {
-
-    public void run(ITest test) {
-        test.doit();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_17.j b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_17.j
deleted file mode 100644
index 38133af..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_17.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokeinterface_17.java
-.class public dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_17
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V
-    .limit stack 2
-    .limit locals 2
-
-    new dxc/junit/opcodes/invokeinterface/jm/ITestImplAbstract
-    dup
-    invokespecial dxc/junit/opcodes/invokeinterface/jm/ITestImplAbstract/<init>()V
-    
-    iconst_1
-    invokeinterface dxc/junit/opcodes/invokeinterface/jm/ITest/test(I)I 2
-
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_17.java b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_17.java
deleted file mode 100644
index c7754ea..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_17.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokeinterface.jm;
-
-public class T_invokeinterface_17 {
-
-    public void run(ITest test) {
-        test.test(1);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_18.j b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_18.j
deleted file mode 100644
index 674e491..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_18.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokeinterface_18.java
-.class public dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_18
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V
-    .limit stack 2
-    .limit locals 2
-    
-    new dxc/junit/opcodes/invokeinterface/jm/ITestImplAbstract
-    dup
-    invokeinterface dxc/junit/opcodes/invokeinterface/jm/ITestImplAbstract/<init>()V 1
-    
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_18.java b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_18.java
deleted file mode 100644
index 12462fb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_18.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokeinterface.jm;
-
-public class T_invokeinterface_18 {
-
-    public void run(ITest test) {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_19.j b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_19.j
deleted file mode 100644
index f5a89a7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_19.j
+++ /dev/null
@@ -1,182 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokeinterface_19.java
-.class public dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_19
-.super java/lang/Object
-.implements java/lang/Runnable
-.implements dxc/junit/opcodes/invokeinterface/jm/ITest
-
-.field  value I
-.field  failed Z
-
-
-.method public <init>()V
-    .limit stack 2
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    aload_0
-    iconst_0
-    putfield dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_19.value I
-
-    aload_0
-    iconst_0
-    putfield dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_19.failed Z
-
-    return
-.end method
-
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 2
-
-    iconst_0
-    istore_1
-
-Label1:
-
-    aload_0
-    invokeinterface dxc/junit/opcodes/invokeinterface/jm/ITest/doit()V 1
-
-    iinc 1 1
-
-    iload_1
-    sipush 1000
-    if_icmplt Label1
-
-    return
-.end method
-
-
-
-.method public synchronized doit()V
-    .limit stack 3
-    .limit locals 2
-
-    
-    aload_0
-    dup
-    getfield dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_19.value I
-    iconst_1
-    iadd
-    putfield dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_19.value I
-
-    aload_0
-    getfield dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_19.value I
-    istore_1
-
-    invokestatic java/lang/Thread/yield()V
-
-    iload_1
-    aload_0
-    getfield dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_19.value I
-    if_icmpeq Label0
-
-    aload_0
-    iconst_1
-    putfield dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_19.failed Z
-
-    Label0:
-    return
-.end method
-
-
-
-.method public doit(I)V
-    .limit stack 0
-    .limit locals 2
-    return
-.end method
-
-.method public doitNative()V
-    .limit stack 0
-    .limit locals 1
-    return
-.end method
-
-.method public test(I)I
-    .limit stack 1
-    .limit locals 2
-    iconst_0
-    ireturn
-.end method
-
-
-
-.method public static execute()Z
-    .limit stack 3
-    .limit locals 4
-
-    new dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_19
-    dup
-    invokespecial dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_19/<init>()V
-    astore_0
-
-    new java/lang/Thread
-    dup
-    aload_0
-    invokespecial java/lang/Thread/<init>(Ljava/lang/Runnable;)V
-    astore_1
-
-    new java/lang/Thread
-    dup
-    aload_0
-    invokespecial java/lang/Thread/<init>(Ljava/lang/Runnable;)V
-    astore_2
-
-    aload_1
-    invokevirtual java/lang/Thread/start()V
-
-    aload_2
-    invokevirtual java/lang/Thread/start()V
-
-Label12:
-    ldc2_w 5000
-    invokestatic java/lang/Thread/sleep(J)V
-
-Label13:
-    goto Label0
-
-Label14:
-    astore_3
-    iconst_0
-    ireturn
-
-Label0:
-    aload_0
-    getfield dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_19.value I
-    sipush 2000
-    if_icmpeq Label1
-
-    iconst_0
-    ireturn
-
-Label1:
-    aload_0
-    getfield dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_19.failed Z
-    ifeq Label2
-    iconst_0
-    ireturn
-
-Label2:
-    iconst_1
-    ireturn
-
-.catch java/lang/InterruptedException from Label12 to Label13 using Label14
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_19.java b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_19.java
deleted file mode 100644
index 1aec95b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_19.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokeinterface.jm;
-
-
-public class T_invokeinterface_19 implements Runnable, ITest {
-    public final static int CNT = 1000;
-    int value = 0;
-    boolean failed = false;
-    
-    public void run() {
-        for(int i = 0; i < CNT; i++) {
-            doit();
-        }
-    }
-    
-    public synchronized void doit(){
-        value++;
-        int c = value;
-        Thread.yield();
-        if(c != value)
-            failed = true;
-    }
-    public void doit(int i){
-    }
-    public void doitNative(){
-    }
-    public  int test(int a) {
-        return 0;
-    }
-    public int testArgsOrder(int a, int b){
-        return 0;
-    }
-    
-    public static boolean execute() {
-        T_invokeinterface_19 test = new T_invokeinterface_19();
-        Thread t1 = new Thread(test);
-        Thread t2 = new Thread(test);
-        
-        t1.start();
-        t2.start();
-        
-        try
-        {
-            Thread.sleep(5000);
-        }
-        catch(InterruptedException ie) {
-            return false;
-        }
-        
-        if(test.value != CNT * 2)
-            return false;
-        return !test.failed;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_2.cfh b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_2.cfh
deleted file mode 100644
index b91b025..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_2.cfh
+++ /dev/null
@@ -1,155 +0,0 @@
-//@class:dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_2
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0012
-// .  .  
-   00 12 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: ifaceMethod{dxc.junit.opcodes.invokeinterface.jm.ITest.doit:()V}
-    // .  .  .  .  .  
-       0b 00 08 00 0f 
-    // parsed:, offset 15, len 5, h: 0002: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 11 00 09 
-    // parsed:, offset 20, len 19, h: 0003: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 39, len 3, h: 0004: type{dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_2}
-    // .  .  .  
-       07 00 10 
-    // parsed:, offset 42, len 13, h: 0005: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 55, len 27, h: 0006: utf8{"T_invokeinterface_2.java"}
-    // .  .  .  T  _  i  n  v  o  k  e  i  n  t  e  r  f  a  c  e  _  2  .  j  a  v  a  
-       01 00 18 54 5f 69 6e 76 6f 6b 65 69 6e 74 65 72 66 61 63 65 5f 32 2e 6a 61 76 61 
-    // parsed:, offset 82, len 9, h: 0007: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 91, len 3, h: 0008: type{dxc.junit.opcodes.invokeinterface.jm.ITest}
-    // .  .  .  
-       07 00 0b 
-    // parsed:, offset 94, len 5, h: 0009: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 07 00 0e 
-    // parsed:, offset 99, len 7, h: 000a: utf8{"doit"}
-    // .  .  .  d  o  i  t  
-       01 00 04 64 6f 69 74 
-    // parsed:, offset 106, len 45, h: 000b: utf8{"dxc/junit/opcodes/invokeinterface/jm/ITest"}
-    // .  .  *  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  n  v  o  k  e  i  n  t  e  r  f  a  c  e  /  j  m  /  I  T  e  s  t  
-       01 00 2a 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 6e 76 6f 6b 65 69 6e 74 65 72 66 61 63 65 2f 6a 6d 2f 49 54 65 73 74 
-    // parsed:, offset 151, len 7, h: 000c: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 158, len 50, h: 000d: utf8{"(Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V"}
-    // .  .  /  (  L  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  n  v  o  k  e  i  n  t  e  r  f  a  c  e  /  j  m  /  I  T  e  s  t  ;  )  V  
-       01 00 2f 28 4c 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 6e 76 6f 6b 65 69 6e 74 65 72 66 61 63 65 2f 6a 6d 2f 49 54 65 73 74 3b 29 56 
-    // parsed:, offset 208, len 6, h: 000e: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 214, len 5, h: 000f: nat{doit:()V}
-    // .  .  .  .  .  
-       0c 00 0a 00 0e 
-    // parsed:, offset 219, len 59, h: 0010: utf8{"dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_2"}
-    // .  .  8  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  n  v  o  k  e  i  n  t  e  r  f  a  c  e  /  j  m  /  T  _  i  n  v  o  k  e  i  n  t  e  r  f  a  c  e  _  2  
-       01 00 38 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 6e 76 6f 6b 65 69 6e 74 65 72 66 61 63 65 2f 6a 6d 2f 54 5f 69 6e 76 6f 6b 65 69 6e 74 65 72 66 61 63 65 5f 32 
-    // parsed:, offset 278, len 3, h: 0011: type{java.lang.Object}
-    // .  .  .  
-       07 00 03 
-// parsed:, offset 281, len 0, h: end constant_pool
-// parsed:, offset 281, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 283, len 2, h: this_class: type{dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_2}
-// .  .  
-   00 04 
-// parsed:, offset 285, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 11 
-// parsed:, offset 287, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 289, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 291, len 2, h: methods_count: 0001
-// .  .  
-   00 01 
-// ========== start-ParseMember:<init>, offset 293, len:47,desc: (Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V
-// parsed:, offset 293, len 0, h:  methods[0]: 
-    // parsed:, offset 293, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 295, len 2, h: name: <init>
-    // .  .  
-       00 07 
-    // parsed:, offset 297, len 2, h: descriptor: (Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V
-    // .  .  
-       00 0d 
-    // parsed:, offset 299, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 301, len 0, h:  attributes[0]: 
-        // parsed:, offset 301, len 2, h: name: Code
-        // .  .  
-           00 0c 
-        // parsed:, offset 303, len 4, h: length: 00000017
-        // .  .  .  .  
-           00 00 00 17 
-        // parsed:, offset 307, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 309, len 2, h: max_locals: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 311, len 4, h: code_length: 0000000b
-        // .  .  .  .  
-           00 00 00 0b 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 02 
-        // parsed:, offset 4, len 1, h: 0004: aload_1 // 01
-        // +  
-           2b 
-        // parsed:, offset 5, len 5, h: 0005: invokeinterface ifaceMethod{dxc.junit.opcodes.invokeinterface.jm.ITest.doit:()V}, 0001
-        // .  .  .  .  .  
-//@mod:    b9 00 01 01 00 
-           b9 00 02 01 00 
-        // parsed:, offset 10, len 1, h: 000a: return
-        // .  
-           b1 
-        // parsed:, offset 326, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 328, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 330, len 0, h: end attributes[0] 
-// parsed:, offset 330, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: (Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V
-// parsed:, offset 330, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 332, len 0, h:  attributes[0]: 
-    // parsed:, offset 332, len 2, h: name: SourceFile
-    // .  .  
-       00 05 
-    // parsed:, offset 334, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 338, len 2, h: source: utf8{"T_invokeinterface_2.java"}
-    // .  .  
-       00 06 
-// parsed:, offset 340, len 0, h: end attributes[0] 
-// parsed:, offset 340, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_2.j b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_2.j
deleted file mode 100644
index 2d3fafc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_2.j
+++ /dev/null
@@ -1,29 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokeinterface_2.java
-.class public dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_2
-.super java/lang/Object
-
-.method public <init>(Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V
-    .limit stack 1
-    .limit locals 2
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    aload_1
-    invokeinterface dxc/junit/opcodes/invokeinterface/jm/ITest/doit()V 1
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_2.java b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_2.java
deleted file mode 100644
index 6fe011f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokeinterface.jm;
-
-public class T_invokeinterface_2 {
-
-    public T_invokeinterface_2 (ITest test) {
-        test.doit();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_20.j b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_20.j
deleted file mode 100644
index 6da973f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_20.j
+++ /dev/null
@@ -1,48 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokeinterface_20.java
-.class public dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_20
-.super java/lang/Object
-
-.field public static i I
-
-.method static <clinit>()V
-    .limit stack 1
-    iconst_0
-    putstatic dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_20.i I
-    return
-.end method
-
-
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V
-    .limit stack 1
-    .limit locals 2
-    
-    aload_0
-    invokeinterface dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_20/<clinit>()V 1
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_20.java b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_20.java
deleted file mode 100644
index 4487726..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_20.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokeinterface.jm;
-
-public class T_invokeinterface_20 {
-
-    public static int i = 0;
-    
-    public void run(ITest test) {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_21.j b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_21.j
deleted file mode 100644
index 9d28bbf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_21.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokeinterface_21.java
-.class public dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_21
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V
-    .limit stack 3
-    .limit locals 2
-
-    aload_1
-    lconst_1
-    invokeinterface dxc/junit/opcodes/invokeinterface/jm/ITest/doit(I)V 2
-
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_21.java b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_21.java
deleted file mode 100644
index 0897987..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_21.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokeinterface.jm;
-
-public class T_invokeinterface_21 {
-
-    public void run(ITest test) {
-        test.doit(1);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_23.cfh b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_23.cfh
deleted file mode 100644
index 57b9e09..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_23.cfh
+++ /dev/null
@@ -1,155 +0,0 @@
-//@class:dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_23
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0012
-// .  .  
-   00 12 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: ifaceMethod{dxc.junit.opcodes.invokeinterface.jm.ITest.doit:()V}
-    // .  .  .  .  .  
-       0b 00 06 00 10 
-    // parsed:, offset 15, len 5, h: 0002: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 11 00 07 
-    // parsed:, offset 20, len 19, h: 0003: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 39, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 52, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 61, len 3, h: 0006: type{dxc.junit.opcodes.invokeinterface.jm.ITest}
-    // .  .  .  
-       07 00 09 
-    // parsed:, offset 64, len 5, h: 0007: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0d 
-    // parsed:, offset 69, len 7, h: 0008: utf8{"doit"}
-    // .  .  .  d  o  i  t  
-       01 00 04 64 6f 69 74 
-    // parsed:, offset 76, len 45, h: 0009: utf8{"dxc/junit/opcodes/invokeinterface/jm/ITest"}
-    // .  .  *  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  n  v  o  k  e  i  n  t  e  r  f  a  c  e  /  j  m  /  I  T  e  s  t  
-       01 00 2a 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 6e 76 6f 6b 65 69 6e 74 65 72 66 61 63 65 2f 6a 6d 2f 49 54 65 73 74 
-    // parsed:, offset 121, len 3, h: 000a: type{dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_23}
-    // .  .  .  
-       07 00 0e 
-    // parsed:, offset 124, len 7, h: 000b: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 131, len 50, h: 000c: utf8{"(Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V"}
-    // .  .  /  (  L  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  n  v  o  k  e  i  n  t  e  r  f  a  c  e  /  j  m  /  I  T  e  s  t  ;  )  V  
-       01 00 2f 28 4c 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 6e 76 6f 6b 65 69 6e 74 65 72 66 61 63 65 2f 6a 6d 2f 49 54 65 73 74 3b 29 56 
-    // parsed:, offset 181, len 6, h: 000d: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 187, len 60, h: 000e: utf8{"dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_23"}
-    // .  .  9  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  n  v  o  k  e  i  n  t  e  r  f  a  c  e  /  j  m  /  T  _  i  n  v  o  k  e  i  n  t  e  r  f  a  c  e  _  2  3  
-       01 00 39 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 6e 76 6f 6b 65 69 6e 74 65 72 66 61 63 65 2f 6a 6d 2f 54 5f 69 6e 76 6f 6b 65 69 6e 74 65 72 66 61 63 65 5f 32 33 
-    // parsed:, offset 247, len 28, h: 000f: utf8{"T_invokeinterface_23.java"}
-    // .  .  .  T  _  i  n  v  o  k  e  i  n  t  e  r  f  a  c  e  _  2  3  .  j  a  v  a  
-       01 00 19 54 5f 69 6e 76 6f 6b 65 69 6e 74 65 72 66 61 63 65 5f 32 33 2e 6a 61 76 61 
-    // parsed:, offset 275, len 5, h: 0010: nat{doit:()V}
-    // .  .  .  .  .  
-       0c 00 08 00 0d 
-    // parsed:, offset 280, len 3, h: 0011: type{java.lang.Object}
-    // .  .  .  
-       07 00 03 
-// parsed:, offset 283, len 0, h: end constant_pool
-// parsed:, offset 283, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 285, len 2, h: this_class: type{dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_23}
-// .  .  
-   00 0a 
-// parsed:, offset 287, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 11 
-// parsed:, offset 289, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 291, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 293, len 2, h: methods_count: 0001
-// .  .  
-   00 01 
-// ========== start-ParseMember:<init>, offset 295, len:47,desc: (Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V
-// parsed:, offset 295, len 0, h:  methods[0]: 
-    // parsed:, offset 295, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 297, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 299, len 2, h: descriptor: (Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V
-    // .  .  
-       00 0c 
-    // parsed:, offset 301, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 303, len 0, h:  attributes[0]: 
-        // parsed:, offset 303, len 2, h: name: Code
-        // .  .  
-           00 0b 
-        // parsed:, offset 305, len 4, h: length: 00000017
-        // .  .  .  .  
-           00 00 00 17 
-        // parsed:, offset 309, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 311, len 2, h: max_locals: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 313, len 4, h: code_length: 0000000b
-        // .  .  .  .  
-           00 00 00 0b 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 02 
-        // parsed:, offset 4, len 1, h: 0004: aload_1 // 01
-        // +  
-           2b 
-        // parsed:, offset 5, len 5, h: 0005: invokeinterface ifaceMethod{dxc.junit.opcodes.invokeinterface.jm.ITest.doit:()V}, 0001
-        // .  .  .  .  .  
-//@mod           b9 00 01 01 00 
-           b9 01 01 01 00 
-        // parsed:, offset 10, len 1, h: 000a: return
-        // .  
-           b1 
-        // parsed:, offset 328, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 330, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 332, len 0, h: end attributes[0] 
-// parsed:, offset 332, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: (Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V
-// parsed:, offset 332, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 334, len 0, h:  attributes[0]: 
-    // parsed:, offset 334, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 336, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 340, len 2, h: source: utf8{"T_invokeinterface_23.java"}
-    // .  .  
-       00 0f 
-// parsed:, offset 342, len 0, h: end attributes[0] 
-// parsed:, offset 342, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_23.j b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_23.j
deleted file mode 100644
index 6aa596f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_23.j
+++ /dev/null
@@ -1,29 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokeinterface_23.java
-.class public dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_23
-.super java/lang/Object
-
-.method public <init>(Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V
-    .limit stack 1
-    .limit locals 2
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    aload_1
-    invokeinterface dxc/junit/opcodes/invokeinterface/jm/ITest/doit()V 1
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_23.java b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_23.java
deleted file mode 100644
index da54e21..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_23.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokeinterface.jm;
-
-public class T_invokeinterface_23 {
-
-    public T_invokeinterface_23 (ITest test) {
-        test.doit();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_3.j b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_3.j
deleted file mode 100644
index d1d46c1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_3.j
+++ /dev/null
@@ -1,28 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokeinterface_3.java
-.class public dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_3
-.super java/lang/Object
-
-.method public <init>(Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V
-    .limit locals 2
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    aload_1
-    invokeinterface dxc/junit/opcodes/invokeinterface/jm/ITest/doit()V 1
-
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_3.java b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_3.java
deleted file mode 100644
index 5d85c5a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokeinterface.jm;
-
-public class T_invokeinterface_3 {
-
-    public T_invokeinterface_3 (ITest test) {
-        test.doit();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_4.java b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_4.java
deleted file mode 100644
index fa92a23..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokeinterface.jm;
-
-public class T_invokeinterface_4 {
-
-    public void run() {
-        // TODO
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_5.j b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_5.j
deleted file mode 100644
index b3d3d59..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_5.j
+++ /dev/null
@@ -1,29 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokeinterface_5.java
-.class public dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_5
-.super java/lang/Object
-
-.method public <init>(Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V
-    .limit stack 1
-    .limit locals 2
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-;    aload_1
-    invokeinterface dxc/junit/opcodes/invokeinterface/jm/ITest/doit()V 1
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_5.java b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_5.java
deleted file mode 100644
index e80580d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokeinterface.jm;
-
-public class T_invokeinterface_5 {
-
-    public T_invokeinterface_5 (ITest test) {
-        test.doit();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_6.cfh b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_6.cfh
deleted file mode 100644
index 9d6c6f5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_6.cfh
+++ /dev/null
@@ -1,206 +0,0 @@
-//@class:dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_6
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0014
-// .  .  
-   00 14 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 19, h: 0001: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 29, len 5, h: 0002: ifaceMethod{dxc.junit.opcodes.invokeinterface.jm.ITest.doit:(I)V}
-    // .  .  .  .  .  
-       0b 00 06 00 0a 
-    // parsed:, offset 34, len 9, h: 0003: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 43, len 3, h: 0004: type{java.lang.Object}
-    // .  .  .  
-       07 00 01 
-    // parsed:, offset 46, len 5, h: 0005: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 03 00 07 
-    // parsed:, offset 51, len 3, h: 0006: type{dxc.junit.opcodes.invokeinterface.jm.ITest}
-    // .  .  .  
-       07 00 0b 
-    // parsed:, offset 54, len 6, h: 0007: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 60, len 7, h: 0008: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 67, len 59, h: 0009: utf8{"dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_6"}
-    // .  .  8  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  n  v  o  k  e  i  n  t  e  r  f  a  c  e  /  j  m  /  T  _  i  n  v  o  k  e  i  n  t  e  r  f  a  c  e  _  6  
-       01 00 38 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 6e 76 6f 6b 65 69 6e 74 65 72 66 61 63 65 2f 6a 6d 2f 54 5f 69 6e 76 6f 6b 65 69 6e 74 65 72 66 61 63 65 5f 36 
-    // parsed:, offset 126, len 5, h: 000a: nat{doit:(I)V}
-    // .  .  .  .  .  
-       0c 00 0f 00 0d 
-    // parsed:, offset 131, len 45, h: 000b: utf8{"dxc/junit/opcodes/invokeinterface/jm/ITest"}
-    // .  .  *  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  n  v  o  k  e  i  n  t  e  r  f  a  c  e  /  j  m  /  I  T  e  s  t  
-       01 00 2a 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 6e 76 6f 6b 65 69 6e 74 65 72 66 61 63 65 2f 6a 6d 2f 49 54 65 73 74 
-    // parsed:, offset 176, len 13, h: 000c: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 189, len 7, h: 000d: utf8{"(I)V"}
-    // .  .  .  (  I  )  V  
-       01 00 04 28 49 29 56 
-    // parsed:, offset 196, len 6, h: 000e: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 202, len 7, h: 000f: utf8{"doit"}
-    // .  .  .  d  o  i  t  
-       01 00 04 64 6f 69 74 
-    // parsed:, offset 209, len 5, h: 0010: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 04 00 05 
-    // parsed:, offset 214, len 27, h: 0011: utf8{"T_invokeinterface_6.java"}
-    // .  .  .  T  _  i  n  v  o  k  e  i  n  t  e  r  f  a  c  e  _  6  .  j  a  v  a  
-       01 00 18 54 5f 69 6e 76 6f 6b 65 69 6e 74 65 72 66 61 63 65 5f 36 2e 6a 61 76 61 
-    // parsed:, offset 241, len 3, h: 0012: type{dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_6}
-    // .  .  .  
-       07 00 09 
-    // parsed:, offset 244, len 50, h: 0013: utf8{"(Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V"}
-    // .  .  /  (  L  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  n  v  o  k  e  i  n  t  e  r  f  a  c  e  /  j  m  /  I  T  e  s  t  ;  )  V  
-       01 00 2f 28 4c 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 6e 76 6f 6b 65 69 6e 74 65 72 66 61 63 65 2f 6a 6d 2f 49 54 65 73 74 3b 29 56 
-// parsed:, offset 294, len 0, h: end constant_pool
-// parsed:, offset 294, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 296, len 2, h: this_class: type{dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_6}
-// .  .  
-   00 12 
-// parsed:, offset 298, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 04 
-// parsed:, offset 300, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 302, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 304, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 306, len:75,desc: ()V
-// parsed:, offset 306, len 0, h:  methods[0]: 
-    // parsed:, offset 306, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 308, len 2, h: name: <init>
-    // .  .  
-       00 03 
-    // parsed:, offset 310, len 2, h: descriptor: ()V
-    // .  .  
-       00 07 
-    // parsed:, offset 312, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 314, len 0, h:  attributes[0]: 
-        // parsed:, offset 314, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 316, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 320, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 322, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 324, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 10 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 333, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 335, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 337, len 0, h: end attributes[0] 
-// parsed:, offset 337, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 337, len:44,desc: (Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V
-// parsed:, offset 337, len 0, h:  methods[1]: 
-    // parsed:, offset 337, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 339, len 2, h: name: run
-    // .  .  
-       00 0e 
-    // parsed:, offset 341, len 2, h: descriptor: (Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V
-    // .  .  
-       00 13 
-    // parsed:, offset 343, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 345, len 0, h:  attributes[0]: 
-        // parsed:, offset 345, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 347, len 4, h: length: 00000014
-        // .  .  .  .  
-           00 00 00 14 
-        // parsed:, offset 351, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 353, len 2, h: max_locals: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 355, len 4, h: code_length: 00000008
-        // .  .  .  .  
-           00 00 00 08 
-        // parsed:, offset 0, len 1, h: 0000: aload_1 // 01
-        // +  
-           2b 
-        // parsed:, offset 1, len 1, h: 0001: iconst_1 // #+01
-        // .  
-           04 
-        // parsed:, offset 2, len 5, h: 0002: invokeinterface ifaceMethod{dxc.junit.opcodes.invokeinterface.jm.ITest.doit:(I)V}, 0002
-        // .  .  .  .  .  
-//@mod           b9 00 02 02 00 
-           b9 00 02 02 01 
-        // parsed:, offset 7, len 1, h: 0007: return
-        // .  
-           b1 
-        // parsed:, offset 367, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 369, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 371, len 0, h: end attributes[0] 
-// parsed:, offset 371, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V
-// parsed:, offset 371, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 373, len 0, h:  attributes[0]: 
-    // parsed:, offset 373, len 2, h: name: SourceFile
-    // .  .  
-       00 0c 
-    // parsed:, offset 375, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 379, len 2, h: source: utf8{"T_invokeinterface_6.java"}
-    // .  .  
-       00 11 
-// parsed:, offset 381, len 0, h: end attributes[0] 
-// parsed:, offset 381, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_6.j b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_6.j
deleted file mode 100644
index 8fff18f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_6.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokeinterface_6.java
-.class public dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V
-    .limit stack 2
-    .limit locals 2
-
-    aload_1
-    iconst_1
-    invokeinterface dxc/junit/opcodes/invokeinterface/jm/ITest/doit(I)V 2
-
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_6.java b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_6.java
deleted file mode 100644
index b2a7846..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokeinterface.jm;
-
-public class T_invokeinterface_6 {
-
-    public void run(ITest test) {
-        test.doit(1);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_7.j b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_7.j
deleted file mode 100644
index 3001e7d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_7.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokeinterface_7.java
-.class public dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V
-    .limit stack 1
-    .limit locals 2
-
-    aload_1
-    invokeinterface dxc/junit/opcodes/invokeinterface/jm/ITest/doit1()V 1
-
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_7.java b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_7.java
deleted file mode 100644
index 2a04c77..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokeinterface.jm;
-
-public class T_invokeinterface_7 {
-
-    public void run(ITest test) {
-        test.doit();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_8.cfh b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_8.cfh
deleted file mode 100644
index 7305c39..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_8.cfh
+++ /dev/null
@@ -1,206 +0,0 @@
-//@class:dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_8
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0014
-// .  .  
-   00 14 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 19, h: 0001: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 29, len 27, h: 0002: utf8{"T_invokeinterface_8.java"}
-    // .  .  .  T  _  i  n  v  o  k  e  i  n  t  e  r  f  a  c  e  _  8  .  j  a  v  a  
-       01 00 18 54 5f 69 6e 76 6f 6b 65 69 6e 74 65 72 66 61 63 65 5f 38 2e 6a 61 76 61 
-    // parsed:, offset 56, len 5, h: 0003: ifaceMethod{dxc.junit.opcodes.invokeinterface.jm.ITest.doit:(I)V}
-    // .  .  .  .  .  
-       0b 00 07 00 0b 
-    // parsed:, offset 61, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 70, len 3, h: 0005: type{java.lang.Object}
-    // .  .  .  
-       07 00 01 
-    // parsed:, offset 73, len 5, h: 0006: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 08 
-    // parsed:, offset 78, len 3, h: 0007: type{dxc.junit.opcodes.invokeinterface.jm.ITest}
-    // .  .  .  
-       07 00 0c 
-    // parsed:, offset 81, len 6, h: 0008: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 87, len 59, h: 0009: utf8{"dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_8"}
-    // .  .  8  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  n  v  o  k  e  i  n  t  e  r  f  a  c  e  /  j  m  /  T  _  i  n  v  o  k  e  i  n  t  e  r  f  a  c  e  _  8  
-       01 00 38 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 6e 76 6f 6b 65 69 6e 74 65 72 66 61 63 65 2f 6a 6d 2f 54 5f 69 6e 76 6f 6b 65 69 6e 74 65 72 66 61 63 65 5f 38 
-    // parsed:, offset 146, len 7, h: 000a: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 153, len 5, h: 000b: nat{doit:(I)V}
-    // .  .  .  .  .  
-       0c 00 10 00 0e 
-    // parsed:, offset 158, len 45, h: 000c: utf8{"dxc/junit/opcodes/invokeinterface/jm/ITest"}
-    // .  .  *  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  n  v  o  k  e  i  n  t  e  r  f  a  c  e  /  j  m  /  I  T  e  s  t  
-       01 00 2a 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 6e 76 6f 6b 65 69 6e 74 65 72 66 61 63 65 2f 6a 6d 2f 49 54 65 73 74 
-    // parsed:, offset 203, len 13, h: 000d: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 216, len 7, h: 000e: utf8{"(I)V"}
-    // .  .  .  (  I  )  V  
-       01 00 04 28 49 29 56 
-    // parsed:, offset 223, len 6, h: 000f: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 229, len 7, h: 0010: utf8{"doit"}
-    // .  .  .  d  o  i  t  
-       01 00 04 64 6f 69 74 
-    // parsed:, offset 236, len 5, h: 0011: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 05 00 06 
-    // parsed:, offset 241, len 3, h: 0012: type{dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_8}
-    // .  .  .  
-       07 00 09 
-    // parsed:, offset 244, len 50, h: 0013: utf8{"(Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V"}
-    // .  .  /  (  L  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  n  v  o  k  e  i  n  t  e  r  f  a  c  e  /  j  m  /  I  T  e  s  t  ;  )  V  
-       01 00 2f 28 4c 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 6e 76 6f 6b 65 69 6e 74 65 72 66 61 63 65 2f 6a 6d 2f 49 54 65 73 74 3b 29 56 
-// parsed:, offset 294, len 0, h: end constant_pool
-// parsed:, offset 294, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 296, len 2, h: this_class: type{dxc.junit.opcodes.invokeinterface.jm.T_invokeinterface_8}
-// .  .  
-   00 12 
-// parsed:, offset 298, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 05 
-// parsed:, offset 300, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 302, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 304, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 306, len:75,desc: ()V
-// parsed:, offset 306, len 0, h:  methods[0]: 
-    // parsed:, offset 306, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 308, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 310, len 2, h: descriptor: ()V
-    // .  .  
-       00 08 
-    // parsed:, offset 312, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 314, len 0, h:  attributes[0]: 
-        // parsed:, offset 314, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 316, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 320, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 322, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 324, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 11 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 333, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 335, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 337, len 0, h: end attributes[0] 
-// parsed:, offset 337, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 337, len:44,desc: (Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V
-// parsed:, offset 337, len 0, h:  methods[1]: 
-    // parsed:, offset 337, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 339, len 2, h: name: run
-    // .  .  
-       00 0f 
-    // parsed:, offset 341, len 2, h: descriptor: (Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V
-    // .  .  
-       00 13 
-    // parsed:, offset 343, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 345, len 0, h:  attributes[0]: 
-        // parsed:, offset 345, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 347, len 4, h: length: 00000014
-        // .  .  .  .  
-           00 00 00 14 
-        // parsed:, offset 351, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 353, len 2, h: max_locals: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 355, len 4, h: code_length: 00000008
-        // .  .  .  .  
-           00 00 00 08 
-        // parsed:, offset 0, len 1, h: 0000: aload_1 // 01
-        // +  
-           2b 
-        // parsed:, offset 1, len 1, h: 0001: iconst_1 // #+01
-        // .  
-           04 
-        // parsed:, offset 2, len 5, h: 0002: invokeinterface ifaceMethod{dxc.junit.opcodes.invokeinterface.jm.ITest.doit:(I)V}, 0002
-        // .  .  .  .  .  
-//@mod           b9 00 03 02 00 
-           b9 00 03 01 00 
-        // parsed:, offset 7, len 1, h: 0007: return
-        // .  
-           b1 
-        // parsed:, offset 367, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 369, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 371, len 0, h: end attributes[0] 
-// parsed:, offset 371, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V
-// parsed:, offset 371, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 373, len 0, h:  attributes[0]: 
-    // parsed:, offset 373, len 2, h: name: SourceFile
-    // .  .  
-       00 0d 
-    // parsed:, offset 375, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 379, len 2, h: source: utf8{"T_invokeinterface_8.java"}
-    // .  .  
-       00 02 
-// parsed:, offset 381, len 0, h: end attributes[0] 
-// parsed:, offset 381, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_8.j b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_8.j
deleted file mode 100644
index f96c46b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_8.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokeinterface_8.java
-.class public dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_8
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V
-    .limit stack 2
-    .limit locals 2
-
-    aload_1
-    iconst_1
-    invokeinterface dxc/junit/opcodes/invokeinterface/jm/ITest/doit(I)V 2
-
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_8.java b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_8.java
deleted file mode 100644
index f64dd1f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokeinterface.jm;
-
-public class T_invokeinterface_8 {
-
-    public void run(ITest test) {
-        test.doit(1);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_9.j b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_9.j
deleted file mode 100644
index a324d42..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_9.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokeinterface_9.java
-.class public dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_9
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(Ldxc/junit/opcodes/invokeinterface/jm/ITest;)V
-    .limit stack 2
-    .limit locals 2
-
-    aload_1
-;    iconst_1
-    invokeinterface dxc/junit/opcodes/invokeinterface/jm/ITest/doit(I)V 2
-
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_9.java b/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_9.java
deleted file mode 100644
index 8438b83..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokeinterface/jm/T_invokeinterface_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokeinterface.jm;
-
-public class T_invokeinterface_9 {
-
-    public void run(ITest test) {
-        test.doit(1);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/Test_invokespecial.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/Test_invokespecial.java
deleted file mode 100644
index 3413c3d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/Test_invokespecial.java
+++ /dev/null
@@ -1,393 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokespecial;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.invokespecial.jm.T_invokespecial_1;
-import dxc.junit.opcodes.invokespecial.jm.T_invokespecial_11;
-import dxc.junit.opcodes.invokespecial.jm.T_invokespecial_12;
-import dxc.junit.opcodes.invokespecial.jm.T_invokespecial_13;
-import dxc.junit.opcodes.invokespecial.jm.T_invokespecial_15;
-import dxc.junit.opcodes.invokespecial.jm.T_invokespecial_16;
-import dxc.junit.opcodes.invokespecial.jm.T_invokespecial_17;
-import dxc.junit.opcodes.invokespecial.jm.T_invokespecial_18;
-import dxc.junit.opcodes.invokespecial.jm.T_invokespecial_19;
-import dxc.junit.opcodes.invokespecial.jm.T_invokespecial_2;
-import dxc.junit.opcodes.invokespecial.jm.T_invokespecial_21;
-import dxc.junit.opcodes.invokespecial.jm.T_invokespecial_22;
-import dxc.junit.opcodes.invokespecial.jm.T_invokespecial_7;
-import dxc.junit.opcodes.invokespecial.jm.T_invokespecial_8;
-import dxc.junit.opcodes.invokespecial.jm.T_invokespecial_9;
-
-public class Test_invokespecial extends DxTestCase {
-    /**
-     * @title  Superclass' method call
-     */
-    public void testN1() {
-        //@uses dxc.junit.opcodes.invokespecial.jm.TSuper
-        T_invokespecial_1 t = new T_invokespecial_1();
-        assertEquals(5, t.run());
-    }
-
-    /**
-     * @title  private method call
-     */
-    public void testN2() {
-        T_invokespecial_2 t = new T_invokespecial_2();
-        assertEquals(345, t.run());
-    }
-
-    /**
-     * @title  Invoke method of superclass of superclass
-     */
-    public void testN3() {
-        //@uses dxc.junit.opcodes.invokespecial.jm.TSuper
-        //@uses dxc.junit.opcodes.invokespecial.jm.TSuper2
-        T_invokespecial_15 t = new T_invokespecial_15();
-        assertEquals(5, t.run());
-    }
-
-    /**
-     * @title  Invoke protected method of superclass specifying "this"
-     * class
-     */
-    public void testN4() {
-        //@uses dxc.junit.opcodes.invokespecial.jm.TSuper
-        try {
-            T_invokespecial_17 t = new T_invokespecial_17();
-            assertEquals(5, t.run());
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title  Invoke protected method of superclass if method with the
-     * same name exists in "this" class
-     */
-    public void testN5() {
-        //@uses dxc.junit.opcodes.invokespecial.jm.TSuper
-        T_invokespecial_18 t = new T_invokespecial_18();
-        assertEquals(5, t.run());
-    }
-
-    /**
-     * @title  Check that method's arguments are popped from stack
-     */
-    public void testN6() {
-        //@uses dxc.junit.opcodes.invokespecial.jm.TSuper
-        T_invokespecial_19 t = new T_invokespecial_19();
-        assertEquals(2, t.run());
-    }
-
-    /**
-     * @title  Check that new frame is created by invokespecial
-     */
-    public void testN7() {
-        //@uses dxc.junit.opcodes.invokespecial.jm.TSuper
-        T_invokespecial_21 t = new T_invokespecial_21();
-        assertEquals(1, t.run());
-    }
-
-    /**
-     * @title  Check that monitor is acquired if method is synchronized
-     */
-    public void testN8() {
-        assertTrue(T_invokespecial_22.execute());
-    }
-
-
-
-    /**
-     * @title  method doesn't exist in "this" and superclass
-     */
-    public void testE1() {
-        //@uses dxc.junit.opcodes.invokespecial.jm.TSuper
-        try {
-            T_invokespecial_7 t = new T_invokespecial_7();
-            assertEquals(5, t.run());
-            fail("expected NoSuchMethodError");
-        } catch (NoSuchMethodError e) {
-            // expected
-        } catch (VerifyError vfe) {
-            // ok for dalvikvm; early resolution
-            System.out.print("dvmvfe:");
-        }
-    }
-
-    /**
-     * @title  method has different signature
-     */
-    public void testE2() {
-        //@uses dxc.junit.opcodes.invokespecial.jm.TSuper
-        try {
-            T_invokespecial_16 t = new T_invokespecial_16();
-            assertEquals(5, t.run());
-            fail("expected NoSuchMethodError");
-        } catch (NoSuchMethodError e) {
-            // expected
-        } catch (VerifyError vfe) {
-            // ok for dalvikvm; early resolution
-            System.out.print("dvmvfe:");
-        }
-    }
-
-    /**
-     * @title expected NullPointerException
-     */
-    public void testE3() {
-        //@uses dxc.junit.opcodes.invokespecial.jm.TSuper
-        T_invokespecial_8 t = new T_invokespecial_8();
-        try {
-            assertEquals(5, t.run());
-            fail("expected NullPointerException");
-        } catch (NullPointerException e) {
-            // expected
-        }
-    }
-
-    /**
-     * @title  Attempt to invoke static method
-     */
-    public void testE4() {
-        //@uses dxc.junit.opcodes.invokespecial.jm.TSuper
-        try {
-            T_invokespecial_11 t = new T_invokespecial_11();
-            assertEquals(5, t.run());
-            fail("expected IncompatibleClassChangeError");
-        } catch (IncompatibleClassChangeError e) {
-            // expected
-        } catch (VerifyError vfe) {
-            // ok for dalvikvm;
-            System.out.print("dvmvfe:");
-        }
-    }
-
-    /**
-     * @title  Native method can't be linked
-     */
-    public void testE5() {
-        //@uses dxc.junit.opcodes.invokespecial.jm.TSuper
-        T_invokespecial_9 t = new T_invokespecial_9();
-        try {
-            assertEquals(5, t.run());
-            fail("expected UnsatisfiedLinkError");
-        } catch (UnsatisfiedLinkError e) {
-            // expected
-        }
-    }
-
-    /**
-     * @title  Attempt to invoke private method of superclass
-     */
-    public void testE6() {
-        //@uses dxc.junit.opcodes.invokespecial.jm.TSuper
-        try {
-            T_invokespecial_12 t = new T_invokespecial_12();
-            assertEquals(5, t.run());
-            fail("expected IllegalAccessError");
-        } catch (IllegalAccessError e) {
-            // expected
-        } catch (VerifyError vfe) {
-            // ok for dalvikvm;
-            System.out.print("dvmvfe:");
-        }
-    }
-
-    /**
-     * @title  Attempt to invoke abstract method
-     */
-    public void testE7() {
-        //@uses dxc.junit.opcodes.invokespecial.jm.TAbstract
-        T_invokespecial_13 t = new T_invokespecial_13();
-        try {
-            assertEquals(5, t.run());
-            fail("expected AbstractMethodError");
-        } catch (AbstractMethodError e) {
-            // expected
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.13 
-     * @title valid index into constant pool table
-     */
-    public void testVFE1() {
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokespecial.jm.T_invokespecial_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.13 
-     * @title invalid index into constant pool table
-     */
-    public void testVFE2() {
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokespecial.jm.T_invokespecial_23");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.14 
-     * @title only &lt;init&gt; may be called
-     */
-    public void testVFE3() {
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokespecial.jm.T_invokespecial_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.7 
-     * @title invokespecial target must be in self or superclass
-     */
-    public void testVFE4() {
-        //@uses dxc.junit.opcodes.invokespecial.jm.TPlain
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokespecial.jm.T_invokespecial_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1 
-     * @title number of arguments
-     */
-    public void testVFE5() {
-        //@uses dxc.junit.opcodes.invokespecial.jm.TSuper
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokespecial.jm.T_invokespecial_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1 
-     * @title type of argument - int
-     */
-    public void testVFE6() {
-        //@uses dxc.junit.opcodes.invokespecial.jm.TSuper
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokespecial.jm.T_invokespecial_10");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.7 
-     * @title invokespecial must name method of "this" class or
-     *                 superclass
-     */
-    public void testVFE7() {
-        //@uses dxc.junit.opcodes.invokespecial.jm.TSuper
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokespecial.jm.T_invokespecial_20");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.7 
-     * @title number of arguments passed to method
-     */
-    public void testVFE8() {
-        //@uses dxc.junit.opcodes.invokespecial.jm.TSuper
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokespecial.jm.T_invokespecial_14");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.12 
-     * @title types of arguments passed to method
-     */
-    public void testVFE9() {
-        //@uses dxc.junit.opcodes.invokespecial.jm.TSuper
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokespecial.jm.T_invokespecial_24");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.13 
-     * @title assignment incompatible references when accessing
-     *                  protected method
-     */
-    public void testVFE10() {
-        //@uses dxc.junit.opcodes.invokespecial.jm.TSuper
-        //@uses dxc.junit.opcodes.invokespecial.jm.TPlain
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokespecial.jm.T_invokespecial_25");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.13 
-     * @title assignment incompatible references when accessing
-     *                  public method
-     */
-    public void testVFE11() {
-        //@uses dxc.junit.opcodes.invokespecial.jm.TSuper
-        //@uses dxc.junit.opcodes.invokespecial.jm.TSuper2
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokespecial.jm.T_invokespecial_26");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/TAbstract.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/TAbstract.java
deleted file mode 100644
index b37a275..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/TAbstract.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokespecial.jm;
-
-public abstract class TAbstract {
-    public abstract int toInt();
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/TPlain.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/TPlain.java
deleted file mode 100644
index 166c91a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/TPlain.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokespecial.jm;
-
-public class TPlain {
-    public int toInt() {
-        return 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/TSuper.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/TSuper.java
deleted file mode 100644
index 3abf06f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/TSuper.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/** Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package dxc.junit.opcodes.invokespecial.jm;
-
-/**
- * @author fjost
- *
- */
-public class TSuper {
-    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/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/TSuper2.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/TSuper2.java
deleted file mode 100644
index 049cedd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/TSuper2.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/** Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package dxc.junit.opcodes.invokespecial.jm;
-
-/**
- * @author fjost
- *
- */
-public class TSuper2 extends TSuper {
-    
-    public int test() {
-        return 13;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_1.j b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_1.j
deleted file mode 100644
index b2bbe6f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_1.j
+++ /dev/null
@@ -1,29 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokespecial_1.java
-.class public dxc/junit/opcodes/invokespecial/jm/T_invokespecial_1
-.super dxc/junit/opcodes/invokespecial/jm/TSuper
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper/<init>()V
-    return
-.end method
-
-.method public run()I
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper/toInt()I
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_1.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_1.java
deleted file mode 100644
index 865d81f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokespecial.jm;
-
-public class T_invokespecial_1 extends TSuper {
-
-    public int run() {
-        return super.toInt();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_10.j b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_10.j
deleted file mode 100644
index ece1dfc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_10.j
+++ /dev/null
@@ -1,30 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokespecial_10.java
-.class public dxc/junit/opcodes/invokespecial/jm/T_invokespecial_10
-.super dxc/junit/opcodes/invokespecial/jm/TSuper
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper/<init>()V
-    return
-.end method
-
-.method public run()I
-;    aload_0
-    iconst_1
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper/toInt()I
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_10.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_10.java
deleted file mode 100644
index 82226b1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_10.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokespecial.jm;
-
-public class T_invokespecial_10 extends TSuper {
-
-    public int run() {
-        return super.toInt();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_11.j b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_11.j
deleted file mode 100644
index 7be1c31..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_11.j
+++ /dev/null
@@ -1,29 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokespecial_11.java
-.class public dxc/junit/opcodes/invokespecial/jm/T_invokespecial_11
-.super dxc/junit/opcodes/invokespecial/jm/TSuper
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper/<init>()V
-    return
-.end method
-
-.method public run()I
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper/toIntStatic()I
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_11.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_11.java
deleted file mode 100644
index da69e2f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokespecial.jm;
-
-public class T_invokespecial_11 extends TSuper {
-
-    public int run() {
-        return super.toIntStatic();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_12.j b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_12.j
deleted file mode 100644
index 3396e82..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_12.j
+++ /dev/null
@@ -1,29 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokespecial_12.java
-.class public dxc/junit/opcodes/invokespecial/jm/T_invokespecial_12
-.super dxc/junit/opcodes/invokespecial/jm/TSuper
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper/<init>()V
-    return
-.end method
-
-.method public run()I
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper/toIntPvt()I
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_12.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_12.java
deleted file mode 100644
index 3ad0f09..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_12.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokespecial.jm;
-
-public class T_invokespecial_12 extends TSuper {
-
-    public int run() {
-        return super.toInt();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_13.j b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_13.j
deleted file mode 100644
index 1e639e1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_13.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokespecial_13.java
-.class public dxc/junit/opcodes/invokespecial/jm/T_invokespecial_13
-.super dxc/junit/opcodes/invokespecial/jm/TAbstract
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TAbstract/<init>()V
-    return
-.end method
-
-
-.method public run()I
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TAbstract/toInt()I
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_13.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_13.java
deleted file mode 100644
index 9c43cdc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_13.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokespecial.jm;
-
-public class T_invokespecial_13 extends TAbstract {
-    
-    public int toInt() {
-        return 5;
-    }
-
-    public int run() {
-        return toInt();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_14.j b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_14.j
deleted file mode 100644
index 983792e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_14.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokespecial_14.java
-.class public dxc/junit/opcodes/invokespecial/jm/T_invokespecial_14
-.super dxc/junit/opcodes/invokespecial/jm/TSuper
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 2
-    aload_0
-;    ldc 5.0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper/toInt(F)I
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_14.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_14.java
deleted file mode 100644
index 619f75f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_14.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokespecial.jm;
-
-public class T_invokespecial_14 extends TSuper {
-
-    public int run() {
-        return super.toInt(5f);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_15.j b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_15.j
deleted file mode 100644
index 51650d9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_15.j
+++ /dev/null
@@ -1,29 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokespecial_15.java
-.class public dxc/junit/opcodes/invokespecial/jm/T_invokespecial_15
-.super dxc/junit/opcodes/invokespecial/jm/TSuper2
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper2/<init>()V
-    return
-.end method
-
-.method public run()I
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper2/toInt()I
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_15.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_15.java
deleted file mode 100644
index cabb444..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_15.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokespecial.jm;
-
-public class T_invokespecial_15 extends TSuper2 {
-
-    public int run() {
-        return super.toInt();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_16.j b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_16.j
deleted file mode 100644
index 76c397c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_16.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokespecial_16.java
-.class public dxc/junit/opcodes/invokespecial/jm/T_invokespecial_16
-.super dxc/junit/opcodes/invokespecial/jm/TSuper
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper/<init>()V
-    return
-.end method
-
-.method public run()I
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper/toInt()F
-    pop
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_16.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_16.java
deleted file mode 100644
index 7cdb15a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_16.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokespecial.jm;
-
-public class T_invokespecial_16 extends TSuper {
-
-    public int run() {
-        return super.toInt();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_17.j b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_17.j
deleted file mode 100644
index 6a02a3c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_17.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokespecial_17.java
-.class public dxc/junit/opcodes/invokespecial/jm/T_invokespecial_17
-.super dxc/junit/opcodes/invokespecial/jm/TSuper
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper/<init>()V
-    return
-.end method
-
-.method public run()I
-
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/T_invokespecial_17/toIntP()I
-    ireturn
-    
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_17.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_17.java
deleted file mode 100644
index 6c9a6da..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_17.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokespecial.jm;
-
-public class T_invokespecial_17 extends TSuper {
-
-    public int run() {
-        return super.toInt();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_18.j b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_18.j
deleted file mode 100644
index c12833b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_18.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokespecial_18.java
-.class public dxc/junit/opcodes/invokespecial/jm/T_invokespecial_18
-.super dxc/junit/opcodes/invokespecial/jm/TSuper
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper/<init>()V
-    return
-.end method
-
-.method public run()I
-
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper/toIntP()I
-    ireturn
-    
-.end method
-
-.method protected toIntP()I
-
-    sipush 10
-    ireturn
-   
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_18.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_18.java
deleted file mode 100644
index 7821f26..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_18.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokespecial.jm;
-
-public class T_invokespecial_18 extends TSuper {
-
-    protected int toIntP() {
-        return 10;
-    }
-    
-    public int run() {
-        return super.toIntP();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_19.j b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_19.j
deleted file mode 100644
index bcbee9b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_19.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokespecial_19.java
-.class public dxc/junit/opcodes/invokespecial/jm/T_invokespecial_19
-.super dxc/junit/opcodes/invokespecial/jm/TSuper
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 4
-    .limit locals 2
-    iconst_1
-    aload_0
-    sipush 128
-    sipush 64
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper/testArgsOrder(II)I
-    istore_1
-    iconst_1
-    if_icmpeq Label1
-    iinc 1 1
-Label1:
-    iload_1    
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_19.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_19.java
deleted file mode 100644
index c828ff1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_19.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokespecial.jm;
-
-public class T_invokespecial_19 extends TSuper {
-
-    public int run() {
-        return super.testArgsOrder(128, 64);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_2.j b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_2.j
deleted file mode 100644
index 4dbda7f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokespecial_2.java
-.class public dxc/junit/opcodes/invokespecial/jm/T_invokespecial_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/T_invokespecial_2/getInt()I
-    ireturn
-.end method
-
-.method private getInt()I
-    sipush 345
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_2.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_2.java
deleted file mode 100644
index d7e604e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_2.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokespecial.jm;
-
-public class T_invokespecial_2 {
-
-    public int run() {
-        return getInt();
-    }
-
-    private int getInt() {
-        return 345;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_20.j b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_20.j
deleted file mode 100644
index b7e0b34..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_20.j
+++ /dev/null
@@ -1,29 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokespecial_20.java
-.class public dxc/junit/opcodes/invokespecial/jm/T_invokespecial_20
-.super dxc/junit/opcodes/invokespecial/jm/TSuper
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper/<init>()V
-    return
-.end method
-
-.method public run()I
-    aload_0
-    invokespecial toInt()I
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_20.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_20.java
deleted file mode 100644
index 48df5d2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_20.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokespecial.jm;
-
-public class T_invokespecial_20 extends TSuper {
-
-    public int run() {
-        return toInt();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_21.j b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_21.j
deleted file mode 100644
index 961b329..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_21.j
+++ /dev/null
@@ -1,67 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokespecial_21.java
-.class public dxc/junit/opcodes/invokespecial/jm/T_invokespecial_21
-.super dxc/junit/opcodes/invokespecial/jm/TSuper
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit locals 3
-    .limit stack 5
-    
-    sipush 123
-    istore_1
-    sipush 456
-    istore_2
-    
-    aload_0
-    iconst_1
-    iconst_2
-    invokespecial dxc/junit/opcodes/invokespecial/jm/T_invokespecial_21/test(II)I
-    
-    sipush 5
-    if_icmpne Label0
-    
-    iload_1
-    sipush 123
-    if_icmpne Label0
-
-    iload_2
-    sipush 456
-    if_icmpne Label0    
-    
-    iconst_1
-    ireturn
-    
-Label0:    
-    iconst_0
-    ireturn
-.end method
-
-.method private test(II)I
-    .limit locals 3
-    sipush 987
-    istore_1
-    sipush 765
-    istore_2
-    
-    sipush 5
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_21.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_21.java
deleted file mode 100644
index 2e3ab91..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_21.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokespecial.jm;
-
-public class T_invokespecial_21 extends TSuper {
-
-    
-    private int test(int a, int b) {
-        int i = 0;
-        int j = 0;
-        return 5;
-    }
-    
-    public int run() {
-        int i = 123;
-        int j = 456;
-        test(0, 1);
-        
-        return 1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_22.j b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_22.j
deleted file mode 100644
index e2bdcbb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_22.j
+++ /dev/null
@@ -1,159 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokespecial_22.java
-.class public dxc/junit/opcodes/invokespecial/jm/T_invokespecial_22
-.super java/lang/Object
-.implements java/lang/Runnable
-
-.field  value I
-.field  failed Z
-
-.method public <init>()V
-    .limit stack 3
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    aload_0
-    iconst_0
-    putfield dxc.junit.opcodes.invokespecial.jm.T_invokespecial_22.value I
-
-    aload_0
-    iconst_0
-    putfield dxc.junit.opcodes.invokespecial.jm.T_invokespecial_22.failed Z
-
-    return
-
-.end method
-
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 2
-   
-    iconst_0
-    istore_1
-
-Label4:
-    iload_1
-    sipush 1000
-    if_icmpge Label3
-
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/T_invokespecial_22/test()V
-
-    iinc 1 1
-
-    goto Label4
-
-
-Label3:
-    return
-
-.end method
-
-
-
-.method private synchronized test()V
-    .limit stack 3
-    .limit locals 2
-    
-.line 16
-    aload_0
-    dup
-    getfield dxc.junit.opcodes.invokespecial.jm.T_invokespecial_22.value I
-    dup
-    istore_1
-
-    iconst_1
-    iadd
-    putfield dxc.junit.opcodes.invokespecial.jm.T_invokespecial_22.value I
-
-    iinc 1 1
-
-    invokestatic java/lang/Thread/yield()V
-
-    iload_1
-    aload_0
-    getfield dxc.junit.opcodes.invokespecial.jm.T_invokespecial_22.value I
-    if_icmpeq Label0
-
-    aload_0
-    iconst_1
-    putfield dxc.junit.opcodes.invokespecial.jm.T_invokespecial_22.failed Z
-
-Label0:
-    return
-.end method
-
-
-
-.method public static execute()Z
-    .limit stack 3
-    .limit locals 4
-
-    new dxc/junit/opcodes/invokespecial/jm/T_invokespecial_22
-    dup
-    invokespecial dxc/junit/opcodes/invokespecial/jm/T_invokespecial_22/<init>()V
-    astore_0
-
-    new java/lang/Thread
-    dup
-    aload_0
-    invokespecial java/lang/Thread/<init>(Ljava/lang/Runnable;)V
-    astore_1
-
-    new java/lang/Thread
-    dup
-    aload_0
-    invokespecial java/lang/Thread/<init>(Ljava/lang/Runnable;)V
-    astore_2
-
-    aload_1
-    invokevirtual java/lang/Thread/start()V
-
-    aload_2
-    invokevirtual java/lang/Thread/start()V
-
-Label12:
-    ldc2_w 5000
-    invokestatic java/lang/Thread/sleep(J)V
-
-Label13:
-    goto Label0
-
-Label14:            ; exception handler
-    astore_3
-    goto Label3
-
-Label0:
-    aload_0
-    getfield dxc.junit.opcodes.invokespecial.jm.T_invokespecial_22.value I
-    sipush 2000
-    if_icmpne Label3
-
-    aload_0
-    getfield dxc.junit.opcodes.invokespecial.jm.T_invokespecial_22.failed Z
-    ifne Label3
-
-    iconst_1
-    ireturn
-
-Label3:
-    iconst_0
-    ireturn
-
-.catch java/lang/InterruptedException from Label12 to Label13 using Label14
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_22.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_22.java
deleted file mode 100644
index b9cb14f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_22.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokespecial.jm;
-
-public class T_invokespecial_22 implements Runnable {
-    public final static int CNT = 1000;
-    int value = 0;
-    boolean failed = false;
-    
-    public void run() {
-        for(int i = 0; i < CNT; i++) {
-            test();
-        }
-    }
-    
-    private synchronized void test()    {
-        value++;
-        int c = value;
-        Thread.yield();
-        if(c != value)
-            failed = true;
-    }
-    
-    public static boolean execute() {
-        T_invokespecial_22 test = new T_invokespecial_22();
-        Thread t1 = new Thread(test);
-        Thread t2 = new Thread(test);
-        
-        t1.start();
-        t2.start();
-        
-        try
-        {
-            Thread.sleep(5000);
-        }
-        catch(InterruptedException ie) {
-            return false;
-        }
-        
-        if(test.value != CNT * 2)
-            return false;
-        return !test.failed;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_23.cfh b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_23.cfh
deleted file mode 100644
index feb9dcb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_23.cfh
+++ /dev/null
@@ -1,131 +0,0 @@
-//@class:dxc/junit/opcodes/invokespecial/jm/T_invokespecial_23
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000c
-// .  .  
-   00 0c 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0b 00 05 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 5, h: 0005: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 09 
-    // parsed:, offset 61, len 56, h: 0006: utf8{"dxc/junit/opcodes/invokespecial/jm/T_invokespecial_23"}
-    // .  .  5  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  n  v  o  k  e  s  p  e  c  i  a  l  /  j  m  /  T  _  i  n  v  o  k  e  s  p  e  c  i  a  l  _  2  3  
-       01 00 35 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 6e 76 6f 6b 65 73 70 65 63 69 61 6c 2f 6a 6d 2f 54 5f 69 6e 76 6f 6b 65 73 70 65 63 69 61 6c 5f 32 33 
-    // parsed:, offset 117, len 7, h: 0007: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 124, len 26, h: 0008: utf8{"T_invokespecial_23.java"}
-    // .  .  .  T  _  i  n  v  o  k  e  s  p  e  c  i  a  l  _  2  3  .  j  a  v  a  
-       01 00 17 54 5f 69 6e 76 6f 6b 65 73 70 65 63 69 61 6c 5f 32 33 2e 6a 61 76 61 
-    // parsed:, offset 150, len 6, h: 0009: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 156, len 3, h: 000a: type{dxc.junit.opcodes.invokespecial.jm.T_invokespecial_23}
-    // .  .  .  
-       07 00 06 
-    // parsed:, offset 159, len 3, h: 000b: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 162, len 0, h: end constant_pool
-// parsed:, offset 162, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 164, len 2, h: this_class: type{dxc.junit.opcodes.invokespecial.jm.T_invokespecial_23}
-// .  .  
-   00 0a 
-// parsed:, offset 166, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0b 
-// parsed:, offset 168, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 170, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 172, len 2, h: methods_count: 0001
-// .  .  
-   00 01 
-// ========== start-ParseMember:<init>, offset 174, len:41,desc: ()V
-// parsed:, offset 174, len 0, h:  methods[0]: 
-    // parsed:, offset 174, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 176, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 178, len 2, h: descriptor: ()V
-    // .  .  
-       00 09 
-    // parsed:, offset 180, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 182, len 0, h:  attributes[0]: 
-        // parsed:, offset 182, len 2, h: name: Code
-        // .  .  
-           00 07 
-        // parsed:, offset 184, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 188, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 190, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 192, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-//@mod           b7 00 01 
-           b7 01 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 201, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 203, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 205, len 0, h: end attributes[0] 
-// parsed:, offset 205, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// parsed:, offset 205, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 207, len 0, h:  attributes[0]: 
-    // parsed:, offset 207, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 209, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 213, len 2, h: source: utf8{"T_invokespecial_23.java"}
-    // .  .  
-       00 08 
-// parsed:, offset 215, len 0, h: end attributes[0] 
-// parsed:, offset 215, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_23.j b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_23.j
deleted file mode 100644
index 4e92d44..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_23.j
+++ /dev/null
@@ -1,23 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokespecial_23.java
-.class public dxc/junit/opcodes/invokespecial/jm/T_invokespecial_23
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_23.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_23.java
deleted file mode 100644
index c4b048e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_23.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokespecial.jm;
-
-public class T_invokespecial_23 {
-
-    public T_invokespecial_23() {
-        // only constructor        
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_24.j b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_24.j
deleted file mode 100644
index 487c7c6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_24.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokespecial_24.java
-.class public dxc/junit/opcodes/invokespecial/jm/T_invokespecial_24
-.super dxc/junit/opcodes/invokespecial/jm/TSuper
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 3
-    aload_0
-    dconst_1
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper/toInt(F)I
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_24.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_24.java
deleted file mode 100644
index ef62353..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_24.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokespecial.jm;
-
-public class T_invokespecial_24 extends TSuper {
-
-    public int run() {
-        return super.toInt(5f);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_25.j b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_25.j
deleted file mode 100644
index 764c322..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_25.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokespecial_25.java
-.class public dxc/junit/opcodes/invokespecial/jm/T_invokespecial_25
-.super dxc/junit/opcodes/invokespecial/jm/TSuper
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper/<init>()V
-
-    return
-.end method
-
-
-.method public run()I
-    .limit stack 2
-    .limit locals 2
-
-    new dxc/junit/opcodes/invokespecial/jm/TPlain
-    dup
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TPlain/<init>()V
-    astore_1
-
-    aload_1
-    invokevirtual dxc/junit/opcodes/invokespecial/jm/TSuper/toIntP()I
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_25.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_25.java
deleted file mode 100644
index 9f2a005..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_25.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokespecial.jm;
-
-public class T_invokespecial_25 extends TSuper {
-
-    public int run() {
-        TPlain p = new TPlain();
-        return p.toInt();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_26.j b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_26.j
deleted file mode 100644
index ba28332..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_26.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokespecial_26.java
-.class public dxc/junit/opcodes/invokespecial/jm/T_invokespecial_26
-.super dxc/junit/opcodes/invokespecial/jm/TSuper2
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper2/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 2
-    .limit locals 1
-    
-    new dxc/junit/opcodes/invokespecial/jm/TSuper
-    dup
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper/<init>()V
-    
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper2/test()I
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_26.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_26.java
deleted file mode 100644
index ffd72f3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_26.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokespecial.jm;
-
-public class T_invokespecial_26 extends TSuper2 {
-    
-    public int run() {
-        return super.test();
-    }   
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_3.cfh b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_3.cfh
deleted file mode 100644
index 89ebfae..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_3.cfh
+++ /dev/null
@@ -1,132 +0,0 @@
-//@class:dxc/junit/opcodes/invokespecial/jm/T_invokespecial_3
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000c
-// .  .  
-   00 0c 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0b 00 07 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 55, h: 0003: utf8{"dxc/junit/opcodes/invokespecial/jm/T_invokespecial_3"}
-    // .  .  4  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  n  v  o  k  e  s  p  e  c  i  a  l  /  j  m  /  T  _  i  n  v  o  k  e  s  p  e  c  i  a  l  _  3  
-       01 00 34 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 6e 76 6f 6b 65 73 70 65 63 69 61 6c 2f 6a 6d 2f 54 5f 69 6e 76 6f 6b 65 73 70 65 63 69 61 6c 5f 33 
-    // parsed:, offset 89, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 102, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 111, len 25, h: 0006: utf8{"T_invokespecial_3.java"}
-    // .  .  .  T  _  i  n  v  o  k  e  s  p  e  c  i  a  l  _  3  .  j  a  v  a  
-       01 00 16 54 5f 69 6e 76 6f 6b 65 73 70 65 63 69 61 6c 5f 33 2e 6a 61 76 61 
-    // parsed:, offset 136, len 5, h: 0007: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0a 
-    // parsed:, offset 141, len 3, h: 0008: type{dxc.junit.opcodes.invokespecial.jm.T_invokespecial_3}
-    // .  .  .  
-       07 00 03 
-    // parsed:, offset 144, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 151, len 6, h: 000a: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 157, len 3, h: 000b: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 160, len 0, h: end constant_pool
-// parsed:, offset 160, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 162, len 2, h: this_class: type{dxc.junit.opcodes.invokespecial.jm.T_invokespecial_3}
-// .  .  
-   00 08 
-// parsed:, offset 164, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0b 
-// parsed:, offset 166, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 168, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 170, len 2, h: methods_count: 0001
-// .  .  
-   00 01 
-// ========== start-ParseMember:<init>, offset 172, len:41,desc: ()V
-// parsed:, offset 172, len 0, h:  methods[0]: 
-    // parsed:, offset 172, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 174, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 176, len 2, h: descriptor: ()V
-    // .  .  
-       00 0a 
-    // parsed:, offset 178, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 180, len 0, h:  attributes[0]: 
-        // parsed:, offset 180, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 182, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 186, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 188, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 190, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-    //@mod:b7 00 01 
-           b7 00 02 
-           
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 199, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 201, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 203, len 0, h: end attributes[0] 
-// parsed:, offset 203, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// parsed:, offset 203, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 205, len 0, h:  attributes[0]: 
-    // parsed:, offset 205, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 207, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 211, len 2, h: source: utf8{"T_invokespecial_3.java"}
-    // .  .  
-       00 06 
-// parsed:, offset 213, len 0, h: end attributes[0] 
-// parsed:, offset 213, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_3.j b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_3.j
deleted file mode 100644
index f62d537..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_3.j
+++ /dev/null
@@ -1,23 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokespecial_3.java
-.class public dxc/junit/opcodes/invokespecial/jm/T_invokespecial_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_3.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_3.java
deleted file mode 100644
index bd1a34e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokespecial.jm;
-
-public class T_invokespecial_3 {
-
-    public T_invokespecial_3() {
-        // only constructor        
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_4.j b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_4.j
deleted file mode 100644
index 072e67d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_4.j
+++ /dev/null
@@ -1,23 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokespecial_4.java
-.class public dxc/junit/opcodes/invokespecial/jm/T_invokespecial_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<clinit>()V
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_4.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_4.java
deleted file mode 100644
index 04b907f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokespecial.jm;
-
-public class T_invokespecial_4 {
-
-    public void run() {
-        // TODO
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_5.j b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_5.j
deleted file mode 100644
index 1a6a6a7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_5.j
+++ /dev/null
@@ -1,29 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokespecial_5.java
-.class public dxc/junit/opcodes/invokespecial/jm/T_invokespecial_5
-.super dxc/junit/opcodes/invokespecial/jm/TSuper
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper/<init>()V
-    return
-.end method
-
-.method public run()I
-;    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper/toInt()I
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_5.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_5.java
deleted file mode 100644
index 40b961e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokespecial.jm;
-
-public class T_invokespecial_5 extends TSuper {
-
-    public int run() {
-        return super.toInt();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_6.j b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_6.j
deleted file mode 100644
index 14db5c5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_6.j
+++ /dev/null
@@ -1,23 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokespecial_6.java
-.class public dxc/junit/opcodes/invokespecial/jm/T_invokespecial_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TPlain/doit()V
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_6.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_6.java
deleted file mode 100644
index eed67c7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_6.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokespecial.jm;
-
-public class T_invokespecial_6 {
-
-    public void run() {
-        pri();
-        pro();
-    }
-
-    protected void pro() {
-        // TODO Auto-generated method stub
-        
-    }
-
-    private void pri() {
-        // TODO Auto-generated method stub
-        
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_7.j b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_7.j
deleted file mode 100644
index c1d5d80..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_7.j
+++ /dev/null
@@ -1,29 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokespecial_7.java
-.class public dxc/junit/opcodes/invokespecial/jm/T_invokespecial_7
-.super dxc/junit/opcodes/invokespecial/jm/TSuper
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper/<init>()V
-    return
-.end method
-
-.method public run()I
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/T_invokespecial_7/toInt1()I
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_7.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_7.java
deleted file mode 100644
index b62ed8f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokespecial.jm;
-
-public class T_invokespecial_7 extends TSuper {
-
-    public int run() {
-        return super.toInt();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_8.j b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_8.j
deleted file mode 100644
index e832660..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_8.j
+++ /dev/null
@@ -1,30 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokespecial_8.java
-.class public dxc/junit/opcodes/invokespecial/jm/T_invokespecial_8
-.super dxc/junit/opcodes/invokespecial/jm/TSuper
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper/<init>()V
-    return
-.end method
-
-.method public run()I
-;    aload_0
-    aconst_null
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper/toInt()I
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_8.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_8.java
deleted file mode 100644
index e11e638..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokespecial.jm;
-
-public class T_invokespecial_8 extends TSuper {
-
-    public int run() {
-        return super.toInt();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_9.j b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_9.j
deleted file mode 100644
index 244fb4b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_9.j
+++ /dev/null
@@ -1,29 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokespecial_9.java
-.class public dxc/junit/opcodes/invokespecial/jm/T_invokespecial_9
-.super dxc/junit/opcodes/invokespecial/jm/TSuper
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper/<init>()V
-    return
-.end method
-
-.method public run()I
-    aload_0
-    invokespecial dxc/junit/opcodes/invokespecial/jm/TSuper/toIntNative()I
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_9.java b/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_9.java
deleted file mode 100644
index 4a0b27a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokespecial/jm/T_invokespecial_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokespecial.jm;
-
-public class T_invokespecial_9 extends TSuper {
-
-    public int run() {
-        return super.toInt();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/TestStubs.java b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/TestStubs.java
deleted file mode 100644
index 9d5cfea..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/TestStubs.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokestatic;
-
-public class TestStubs {
-
-    protected void TestStub() {
-        // used by testE9
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/Test_invokestatic.java b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/Test_invokestatic.java
deleted file mode 100644
index e506a30..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/Test_invokestatic.java
+++ /dev/null
@@ -1,302 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokestatic;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.invokestatic.jm.T_invokestatic_1;
-import dxc.junit.opcodes.invokestatic.jm.T_invokestatic_12;
-import dxc.junit.opcodes.invokestatic.jm.T_invokestatic_13;
-import dxc.junit.opcodes.invokestatic.jm.T_invokestatic_14;
-import dxc.junit.opcodes.invokestatic.jm.T_invokestatic_15;
-import dxc.junit.opcodes.invokestatic.jm.T_invokestatic_16;
-import dxc.junit.opcodes.invokestatic.jm.T_invokestatic_17;
-import dxc.junit.opcodes.invokestatic.jm.T_invokestatic_18;
-import dxc.junit.opcodes.invokestatic.jm.T_invokestatic_2;
-import dxc.junit.opcodes.invokestatic.jm.T_invokestatic_4;
-import dxc.junit.opcodes.invokestatic.jm.T_invokestatic_5;
-import dxc.junit.opcodes.invokestatic.jm.T_invokestatic_6;
-import dxc.junit.opcodes.invokestatic.jm.T_invokestatic_7;
-import dxc.junit.opcodes.invokestatic.jm.T_invokestatic_8;
-
-public class Test_invokestatic extends DxTestCase {
-
-    /**
-     * @title  Static method from library class Math
-     */
-    public void testN1() {
-        T_invokestatic_1 t = new T_invokestatic_1();
-        assertEquals(1234567, t.run());
-    }
-
-    /**
-     * @title  Static method from user class
-     */
-    public void testN2() {
-        // @uses dxc.junit.opcodes.invokestatic.jm.TestClass
-        T_invokestatic_2 t = new T_invokestatic_2();
-        assertEquals(777, t.run());
-    }
-
-    /**
-     * @title  Check that <clinit> is called
-     */
-    public void testN3() {
-        assertEquals(123456789l, T_invokestatic_4.run());
-    }
-
-    /**
-     * @title  Check that monitor is acquired if method is synchronized
-     */
-    public void testN4() {
-        assertTrue(T_invokestatic_12.execute());
-    }
-
-    /**
-     * @title  Check that new frame is created by invokestatic and
-     * arguments are passed to method
-     */
-    public void testN5() {
-        // @uses dxc.junit.opcodes.invokestatic.jm.TestClass
-        T_invokestatic_15 t = new T_invokestatic_15();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @title  Static protected method from other class in the same package
-     */
-    public void testN6() {
-        // @uses dxc.junit.opcodes.invokestatic.jm.TestClass
-        T_invokestatic_18 t = new T_invokestatic_18();
-        assertEquals(888, t.run());
-    }
-
-    /**
-     * @title  attempt to call non-static method
-     * 
-     */
-    public void testE1() {
-        try {
-            T_invokestatic_5 t = new T_invokestatic_5();
-            t.run();
-            fail("expected IncompatibleClassChangeError");
-        } catch (IncompatibleClassChangeError icce) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title  Native method can't be linked
-     * 
-     */
-    public void testE2() {
-        T_invokestatic_6 t = new T_invokestatic_6();
-        try {
-            t.run();
-            fail("expected UnsatisfiedLinkError");
-        } catch (UnsatisfiedLinkError ule) {
-            // expected
-        }
-    }
-
-    /**
-     * @title  NoSuchMethodError
-     */
-    public void testE3() {
-        try {
-            T_invokestatic_7 t = new T_invokestatic_7();
-            t.run();
-            fail("expected NoSuchMethodError");
-        } catch (NoSuchMethodError nsme) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title  Attempt to call private method of other class
-     * 
-     */
-    public void testE5() {
-        // @uses dxc.junit.opcodes.invokestatic.jm.TestClass
-        try {
-            T_invokestatic_8 t = new T_invokestatic_8();
-            t.run();
-            fail("expected IllegalAccessError");
-        } catch (IllegalAccessError iae) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title  method has different signature
-     */
-    public void testE6() {
-        // @uses dxc.junit.opcodes.invokestatic.jm.TestClass
-        try {
-               T_invokestatic_13 t = new T_invokestatic_13();
-            t.run();
-            fail("expected NoSuchMethodError");
-        } catch (NoSuchMethodError nsme) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title  initialization of referenced class throws exception
-     */
-    public void testE7() {
-        // @uses dxc.junit.opcodes.invokestatic.jm.TestClassInitError
-        T_invokestatic_14 t = new T_invokestatic_14();
-        try {
-            t.run();
-            fail("expected Error");
-        } catch (Error e) {
-            // expected
-        }
-    }
-
-    /**
-     * @title  Attempt to call abstract method of other class
-     * 
-     */
-    public void testE8() {
-        // @uses dxc.junit.opcodes.invokestatic.jm.TestClassAbstract
-        try {
-            T_invokestatic_16 t = new T_invokestatic_16();
-            t.run();
-            fail("expected IncompatibleClassChangeError");
-        } catch (IncompatibleClassChangeError iae) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title  Attempt to call protected method of unrelated class
-     * 
-     */
-    public void testE9() {
-        // @uses dxc.junit.opcodes.invokestatic.TestStubs
-        try {
-            T_invokestatic_17 t = new T_invokestatic_17();
-            t.run();
-            fail("expected IllegalAccessError");
-        } catch (IllegalAccessError iae) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.13
-     * @title invalid type into constant pool
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.invokestatic.jm.T_invokestatic_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.13
-     * @title invalid index into constant pool table
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.invokestatic.jm.T_invokestatic_9");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.14 
-     * @title &lt;clinit&gt; may not be called using invokestatic
-     */
-    public void testVFE3() {
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokestatic.jm.T_invokestatic_10");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1 
-     * @title number of arguments passed to method
-     */
-    public void testVFE4() {
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokestatic.jm.T_invokestatic_11");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.14 
-     * @title &lt;init&gt; may not be called using invokestatic
-     */
-    public void testVFE5() {
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokestatic.jm.T_invokestatic_19");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.12 
-     * @title types of arguments passed to method
-     */
-    public void testVFE6() {
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokestatic.jm.T_invokestatic_20");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_1.j b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_1.j
deleted file mode 100644
index 59b7ab8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_1.j
+++ /dev/null
@@ -1,29 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokestatic_1.java
-.class public dxc/junit/opcodes/invokestatic/jm/T_invokestatic_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    ldc -1234567
-    invokestatic java/lang/Math/abs(I)I
-    ireturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_1.java b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_1.java
deleted file mode 100644
index c145a8e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokestatic.jm;
-
-public class T_invokestatic_1 {
-
-    public int run() {
-        return Math.abs(-1234567);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_10.j b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_10.j
deleted file mode 100644
index 4a82b56..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_10.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokestatic_10.java
-.class public dxc/junit/opcodes/invokestatic/jm/T_invokestatic_10
-.super java/lang/Object
-
-.field static v I
-
-.method static <clinit>()V
-    .limit stack 2
-    .limit locals 0
-
-    ldc 1
-    putstatic dxc.junit.opcodes.invokestatic.jm.T_invokestatic_10.v I
-    return
-.end method
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    invokestatic dxc/junit/opcodes/invokestatic/jm/T_invokestatic_10/<clinit>()V
-    ireturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_10.java b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_10.java
deleted file mode 100644
index aeabf23..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_10.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokestatic.jm;
-
-public class T_invokestatic_10 {
-    
-    public int run() {
-        return Math.abs(-1234567);
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_11.j b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_11.j
deleted file mode 100644
index 49f3b5c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_11.j
+++ /dev/null
@@ -1,29 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokestatic_11.java
-.class public dxc/junit/opcodes/invokestatic/jm/T_invokestatic_11
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-;    ldc -1234567
-    invokestatic java/lang/Math/abs(I)I
-    ireturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_11.java b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_11.java
deleted file mode 100644
index 89cf798..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokestatic.jm;
-
-public class T_invokestatic_11 {
-    
-    public int run() {
-        return Math.abs(-1234567);
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_12.j b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_12.j
deleted file mode 100644
index 1b1ab55..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_12.j
+++ /dev/null
@@ -1,146 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokestatic_12.java
-.class public dxc/junit/opcodes/invokestatic/jm/T_invokestatic_12
-.super java/lang/Object
-.implements java/lang/Runnable
-
-.field static value I
-.field static failed Z
-
-.method static <clinit>()V
-    .limit stack 1
-    iconst_0
-    putstatic dxc.junit.opcodes.invokestatic.jm.T_invokestatic_12.value I
-
-    iconst_0
-    putstatic dxc.junit.opcodes.invokestatic.jm.T_invokestatic_12.failed Z
-
-    return
-.end method
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 2
-
-    iconst_0
-    istore_1
-
-    Label1:
-    invokestatic dxc/junit/opcodes/invokestatic/jm/T_invokestatic_12/test()V
-
-    iinc 1 1
-
-    iload_1
-    sipush 1000
-    if_icmplt Label1
-
-    return
-
-.end method
-
-
-.method private static synchronized test()V
-    .limit stack 2
-    .limit locals 1
-
-    getstatic dxc.junit.opcodes.invokestatic.jm.T_invokestatic_12.value I
-    iconst_1
-    iadd
-    putstatic dxc.junit.opcodes.invokestatic.jm.T_invokestatic_12.value I
-
-    getstatic dxc.junit.opcodes.invokestatic.jm.T_invokestatic_12.value I
-    istore_0
-
-    invokestatic java/lang/Thread/yield()V
-
-    iload_0
-    getstatic dxc.junit.opcodes.invokestatic.jm.T_invokestatic_12.value I
-    if_icmpeq Label0
-
-    iconst_1
-    putstatic dxc.junit.opcodes.invokestatic.jm.T_invokestatic_12.failed Z
-
-Label0:
-    return
-.end method
-
-.method public static execute()Z
-    .limit stack 3
-    .limit locals 4
-
-    new dxc/junit/opcodes/invokestatic/jm/T_invokestatic_12
-    dup
-    invokespecial dxc/junit/opcodes/invokestatic/jm/T_invokestatic_12/<init>()V
-    astore_0
-
-    new java/lang/Thread
-    dup
-    aload_0
-    invokespecial java/lang/Thread/<init>(Ljava/lang/Runnable;)V
-    astore_1
-
-    new java/lang/Thread
-    dup
-    aload_0
-    invokespecial java/lang/Thread/<init>(Ljava/lang/Runnable;)V
-    astore_2
-
-    aload_1
-    invokevirtual java/lang/Thread/start()V
-
-    aload_2
-    invokevirtual java/lang/Thread/start()V
-
-Label12:
-    ldc2_w 5000
-    invokestatic java/lang/Thread/sleep(J)V
-
-Label13:
-    goto Label0
-
-Label14:
-    astore_3
-    iconst_0
-    ireturn
-
-Label0:
-    getstatic dxc.junit.opcodes.invokestatic.jm.T_invokestatic_12.value I
-    sipush 2000
-    if_icmpeq Label1
-
-    iconst_0
-    ireturn
-
-Label1:
-    getstatic dxc.junit.opcodes.invokestatic.jm.T_invokestatic_12.failed Z
-    ifeq Label2
-    iconst_0
-    ireturn
-
-Label2:
-    iconst_1
-    ireturn
-
-.catch java/lang/InterruptedException from Label12 to Label13 using Label14
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_12.java b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_12.java
deleted file mode 100644
index 11fc236..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_12.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokestatic.jm;
-
-public class T_invokestatic_12 implements Runnable {
-    public final static int CNT = 1000;
-    static int value = 0;
-    static boolean failed = false;
-    
-    public void run() {
-        for(int i = 0; i < CNT; i++) {
-            test();
-        }
-    }
-    
-    private synchronized static void test()    {
-        value++;
-        int c = value;
-        Thread.yield();
-        if(c != value)
-            failed = true;
-    }
-    
-    public static boolean execute() {
-        T_invokestatic_12 test = new T_invokestatic_12();
-        Thread t1 = new Thread(test);
-        Thread t2 = new Thread(test);
-        
-        t1.start();
-        t2.start();
-        
-        try
-        {
-            Thread.sleep(5000);
-        }
-        catch(InterruptedException ie) {
-            return false;
-        }
-        
-        if(value != CNT * 2)
-            return false;
-        return !failed;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_13.j b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_13.j
deleted file mode 100644
index 9b008f7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_13.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokestatic_13.java
-.class public dxc/junit/opcodes/invokestatic/jm/T_invokestatic_13
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    .limit stack 1
-    .limit locals 1
-
-    fconst_1
-    invokestatic dxc/junit/opcodes/invokestatic/jm/TestClass/test1(F)I
-    pop
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_13.java b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_13.java
deleted file mode 100644
index e265d15..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_13.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokestatic.jm;
-
-public class T_invokestatic_13 {
-    
-    public void run(){
-        TestClass.test1(1);
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_14.j b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_14.j
deleted file mode 100644
index ce3423c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_14.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokestatic_14.java
-.class public dxc/junit/opcodes/invokestatic/jm/T_invokestatic_14
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()V
-    .limit stack 0
-    .limit locals 1
-
-    invokestatic dxc/junit/opcodes/invokestatic/jm/TestClassInitError/test()V
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_14.java b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_14.java
deleted file mode 100644
index c003d15..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_14.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokestatic.jm;
-
-public class T_invokestatic_14 {
-    
-    public void run(){
-        TestClassInitError.test();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_15.j b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_15.j
deleted file mode 100644
index dfbf896..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_15.j
+++ /dev/null
@@ -1,60 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokestatic_15.java
-.class public dxc/junit/opcodes/invokestatic/jm/T_invokestatic_15
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()Z
-    .limit stack 2
-    .limit locals 3
-
-    bipush 123
-    istore_1
-
-    sipush 345
-    istore_2
-
-    sipush 12
-    sipush 6
-    
-    invokestatic dxc/junit/opcodes/invokestatic/jm/TestClass/testArgsOrder(II)I
-
-    iconst_2
-    if_icmpne Label0
-
-    iload_1
-    bipush 123
-    if_icmpne Label0
-
-    iload_2
-    sipush 345
-    if_icmpne Label0
-
-    iconst_1
-    ireturn
-
-Label0:
-    iconst_0
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_15.java b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_15.java
deleted file mode 100644
index 26dfe06..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_15.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokestatic.jm;
-
-public class T_invokestatic_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/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_16.j b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_16.j
deleted file mode 100644
index 4b88c39..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_16.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokestatic_16.java
-.class public dxc/junit/opcodes/invokestatic/jm/T_invokestatic_16
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()V
-    .limit stack 0
-    .limit locals 1
-
-    invokestatic dxc/junit/opcodes/invokestatic/jm/TestClassAbstract/test()V
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_16.java b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_16.java
deleted file mode 100644
index e59ad78..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_16.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokestatic.jm;
-
-public class T_invokestatic_16 {
-    
-    public void run(){
-       // TestClassAbstract.test();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_17.j b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_17.j
deleted file mode 100644
index ce62483..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_17.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokestatic_17.java
-.class public dxc/junit/opcodes/invokestatic/jm/T_invokestatic_17
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()V
-    .limit stack 0
-    .limit locals 1
-
-    invokestatic dxc/junit/opcodes/invokestatic/TestStubs/TestStub()V
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_17.java b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_17.java
deleted file mode 100644
index 995e4da..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_17.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokestatic.jm;
-
-public class T_invokestatic_17 {
-    
-    public void run(){
-       // TestStubs.TestStub();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_18.j b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_18.j
deleted file mode 100644
index 1089e35..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_18.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokestatic_18.java
-.class public dxc/junit/opcodes/invokestatic/jm/T_invokestatic_18
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 1
-    .limit locals 1
-
-    invokestatic dxc/junit/opcodes/invokestatic/jm/TestClass/testP()I
-    ireturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_18.java b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_18.java
deleted file mode 100644
index 7a168c6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_18.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokestatic.jm;
-
-import dxc.junit.opcodes.invokestatic.jm.TestClass;
-
-public class T_invokestatic_18  {
-    
-    public int run() {
-        return TestClass.testP();
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_19.j b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_19.j
deleted file mode 100644
index 70b7401..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_19.j
+++ /dev/null
@@ -1,29 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokestatic_19.java
-.class public dxc/junit/opcodes/invokestatic/jm/T_invokestatic_19
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokestatic java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 1
-    iconst_0
-    ireturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_19.java b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_19.java
deleted file mode 100644
index 0c712c1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_19.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokestatic.jm;
-
-public class T_invokestatic_19 {
-    
-    public int run() {
-        return Math.abs(-1234567);
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_2.j b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_2.j
deleted file mode 100644
index 7eb5362..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_2.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokestatic_2.java
-.class public dxc/junit/opcodes/invokestatic/jm/T_invokestatic_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 1
-    .limit locals 1
-
-    invokestatic dxc/junit/opcodes/invokestatic/jm/TestClass/test()I
-    ireturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_2.java b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_2.java
deleted file mode 100644
index 3ca965e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_2.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokestatic.jm;
-
-import dxc.junit.opcodes.invokestatic.jm.TestClass;
-
-public class T_invokestatic_2  {
-    
-    public int run() {
-        return TestClass.test();
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_20.j b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_20.j
deleted file mode 100644
index 638d7a8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_20.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokestatic_20.java
-.class public dxc/junit/opcodes/invokestatic/jm/T_invokestatic_20
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 2
-;    ldc -1234567
-    ldc2_w 1
-    invokestatic java/lang/Math/abs(I)I
-    ireturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_20.java b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_20.java
deleted file mode 100644
index 7aabdc0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_20.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokestatic.jm;
-
-public class T_invokestatic_20 {
-    
-    public int run() {
-        return Math.abs(-1234567);
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_3.cfh b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_3.cfh
deleted file mode 100644
index d3cdaf8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_3.cfh
+++ /dev/null
@@ -1,206 +0,0 @@
-//@class:dxc/junit/opcodes/invokestatic/jm/T_invokestatic_3
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0015
-// .  .  
-   00 15 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 19, h: 0001: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 29, len 9, h: 0002: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 38, len 3, h: 0003: type{java.lang.Object}
-    // .  .  .  
-       07 00 01 
-    // parsed:, offset 41, len 5, h: 0004: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 02 00 05 
-    // parsed:, offset 46, len 6, h: 0005: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 52, len 7, h: 0006: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 59, len 13, h: 0007: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 72, len 6, h: 0008: utf8{"()I"}
-    // .  .  .  (  )  I  
-       01 00 03 28 29 49 
-    // parsed:, offset 78, len 6, h: 0009: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 84, len 3, h: 000a: type{java.lang.Math}
-    // .  .  .  
-       07 00 11 
-    // parsed:, offset 87, len 6, h: 000b: utf8{"abs"}
-    // .  .  .  a  b  s  
-       01 00 03 61 62 73 
-    // parsed:, offset 93, len 5, h: 000c: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 03 00 04 
-    // parsed:, offset 98, len 5, h: 000d: method{java.lang.Math.abs:(I)I}
-    // .  .  .  .  .  
-       0a 00 0a 00 13 
-    // parsed:, offset 103, len 53, h: 000e: utf8{"dxc/junit/opcodes/invokestatic/jm/T_invokestatic_3"}
-    // .  .  2  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  n  v  o  k  e  s  t  a  t  i  c  /  j  m  /  T  _  i  n  v  o  k  e  s  t  a  t  i  c  _  3  
-       01 00 32 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 6e 76 6f 6b 65 73 74 61 74 69 63 2f 6a 6d 2f 54 5f 69 6e 76 6f 6b 65 73 74 61 74 69 63 5f 33 
-    // parsed:, offset 156, len 7, h: 000f: utf8{"(I)I"}
-    // .  .  .  (  I  )  I  
-       01 00 04 28 49 29 49 
-    // parsed:, offset 163, len 3, h: 0010: type{dxc.junit.opcodes.invokestatic.jm.T_invokestatic_3}
-    // .  .  .  
-       07 00 0e 
-    // parsed:, offset 166, len 17, h: 0011: utf8{"java/lang/Math"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  M  a  t  h  
-       01 00 0e 6a 61 76 61 2f 6c 61 6e 67 2f 4d 61 74 68 
-    // parsed:, offset 183, len 5, h: 0012: int{0xffed2979 / -1234567}
-    // .  .  .  )  y  
-       03 ff ed 29 79 
-    // parsed:, offset 188, len 5, h: 0013: nat{abs:(I)I}
-    // .  .  .  .  .  
-       0c 00 0b 00 0f 
-    // parsed:, offset 193, len 24, h: 0014: utf8{"T_invokestatic_3.java"}
-    // .  .  .  T  _  i  n  v  o  k  e  s  t  a  t  i  c  _  3  .  j  a  v  a  
-       01 00 15 54 5f 69 6e 76 6f 6b 65 73 74 61 74 69 63 5f 33 2e 6a 61 76 61 
-// parsed:, offset 217, len 0, h: end constant_pool
-// parsed:, offset 217, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 219, len 2, h: this_class: type{dxc.junit.opcodes.invokestatic.jm.T_invokestatic_3}
-// .  .  
-   00 10 
-// parsed:, offset 221, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 03 
-// parsed:, offset 223, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 225, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 227, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 229, len:73,desc: ()V
-// parsed:, offset 229, len 0, h:  methods[0]: 
-    // parsed:, offset 229, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 231, len 2, h: name: <init>
-    // .  .  
-       00 02 
-    // parsed:, offset 233, len 2, h: descriptor: ()V
-    // .  .  
-       00 05 
-    // parsed:, offset 235, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 237, len 0, h:  attributes[0]: 
-        // parsed:, offset 237, len 2, h: name: Code
-        // .  .  
-           00 06 
-        // parsed:, offset 239, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 243, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 245, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 247, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 0c 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 256, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 258, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 260, len 0, h: end attributes[0] 
-// parsed:, offset 260, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 260, len:42,desc: ()I
-// parsed:, offset 260, len 0, h:  methods[1]: 
-    // parsed:, offset 260, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 262, len 2, h: name: run
-    // .  .  
-       00 09 
-    // parsed:, offset 264, len 2, h: descriptor: ()I
-    // .  .  
-       00 08 
-    // parsed:, offset 266, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 268, len 0, h:  attributes[0]: 
-        // parsed:, offset 268, len 2, h: name: Code
-        // .  .  
-           00 06 
-        // parsed:, offset 270, len 4, h: length: 00000012
-        // .  .  .  .  
-           00 00 00 12 
-        // parsed:, offset 274, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 276, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 278, len 4, h: code_length: 00000006
-        // .  .  .  .  
-           00 00 00 06 
-        // parsed:, offset 0, len 2, h: 0000: ldc #-0012d687
-        // .  .  
-           12 12 
-        // parsed:, offset 2, len 3, h: 0002: invokestatic method{java.lang.Math.abs:(I)I}
-        // .  .  .  
-//@mod           b8 00 0d           
-           b8 00 0e 
-        // parsed:, offset 5, len 1, h: 0005: ireturn
-        // .  
-           ac 
-        // parsed:, offset 288, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 290, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 292, len 0, h: end attributes[0] 
-// parsed:, offset 292, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()I
-// parsed:, offset 292, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 294, len 0, h:  attributes[0]: 
-    // parsed:, offset 294, len 2, h: name: SourceFile
-    // .  .  
-       00 07 
-    // parsed:, offset 296, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 300, len 2, h: source: utf8{"T_invokestatic_3.java"}
-    // .  .  
-       00 14 
-// parsed:, offset 302, len 0, h: end attributes[0] 
-// parsed:, offset 302, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_3.j b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_3.j
deleted file mode 100644
index 271a935..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_3.j
+++ /dev/null
@@ -1,29 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokestatic_3.java
-.class public dxc/junit/opcodes/invokestatic/jm/T_invokestatic_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    ldc -1234567
-    invokestatic java/lang/Math/abs(I)I
-    ireturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_3.java b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_3.java
deleted file mode 100644
index e6fb064..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokestatic.jm;
-
-public class T_invokestatic_3 {
-
-    public int run() {
-        return Math.abs(-1234567);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_4.j b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_4.j
deleted file mode 100644
index f8c2bb1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_4.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokestatic_4.java
-.class public dxc/junit/opcodes/invokestatic/jm/T_invokestatic_4
-.super java/lang/Object
-
-.field static v2 J
-
-.method static <clinit>()V
-    .limit stack 2
-    .limit locals 0
-
-    ldc2_w 123456789
-    putstatic dxc.junit.opcodes.invokestatic.jm.T_invokestatic_4.v2 J
-    return
-.end method
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()J
-    .limit stack 2
-    .limit locals 2
-
-    getstatic dxc.junit.opcodes.invokestatic.jm.T_invokestatic_4.v2 J
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_4.java b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_4.java
deleted file mode 100644
index d87b044..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_4.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokestatic.jm;
-
-public class T_invokestatic_4 {
-
-    static long v2 = 123456789l;
-
-    public static long run() {
-        return v2;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_5.j b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_5.j
deleted file mode 100644
index c75484f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_5.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokestatic_5.java
-.class public dxc/junit/opcodes/invokestatic/jm/T_invokestatic_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 2
-    .limit locals 1
-
-    aload_0
-    iconst_5
-    invokestatic dxc/junit/opcodes/invokestatic/jm/T_invokestatic_5/test(I)I
-    ireturn
-
-.end method
-
-.method public test(I)I
-    .limit stack 1
-    .limit locals 2
-
-    iload_1
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_5.java b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_5.java
deleted file mode 100644
index c9448c1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_5.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokestatic.jm;
-
-public class T_invokestatic_5 {
-    
-    public int run() {
-        return test(5);
-    }
-    
-    public int test(int i1) {
-        return i1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_6.j b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_6.j
deleted file mode 100644
index 3ad06d8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_6.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokestatic_6.java
-.class public dxc/junit/opcodes/invokestatic/jm/T_invokestatic_6
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static native test()V
-.end method
-
-.method public run()V
-    .limit stack 0
-    .limit locals 1
-
-    invokestatic dxc/junit/opcodes/invokestatic/jm/T_invokestatic_6/test()V
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_6.java b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_6.java
deleted file mode 100644
index 4d38858..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_6.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokestatic.jm;
-
-public class T_invokestatic_6 {
-
-    public static native void test();
-    
-    public void run() {
-        test();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_7.j b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_7.j
deleted file mode 100644
index 97d9b7b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_7.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokestatic_7.java
-.class public dxc/junit/opcodes/invokestatic/jm/T_invokestatic_7
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static test()V
-    .limit stack 0
-    .limit locals 0
-    return
-.end method
-
-.method public run()V
-    .limit stack 0
-    .limit locals 1
-
-    invokestatic dxc/junit/opcodes/invokestatic/jm/T_invokestatic_7/test1()V
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_7.java b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_7.java
deleted file mode 100644
index 187b33d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_7.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokestatic.jm;
-
-public class T_invokestatic_7 {
-    
-    public static void test(){
-    }
-    
-    public void run(){
-        test();
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_8.j b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_8.j
deleted file mode 100644
index fdc33e2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_8.j
+++ /dev/null
@@ -1,30 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokestatic_8.java
-.class public dxc/junit/opcodes/invokestatic/jm/T_invokestatic_8
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    invokestatic dxc/junit/opcodes/invokestatic/jm/TestClass/testPvt()V
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_8.java b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_8.java
deleted file mode 100644
index 35a3157..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokestatic.jm;
-
-public class T_invokestatic_8 {
-    
-    public void run(){
-        TestClass.test();
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_9.cfh b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_9.cfh
deleted file mode 100644
index 7add6ce..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_9.cfh
+++ /dev/null
@@ -1,206 +0,0 @@
-//@class:dxc/junit/opcodes/invokestatic/jm/T_invokestatic_9
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0015
-// .  .  
-   00 15 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 19, h: 0001: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 29, len 9, h: 0002: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 38, len 3, h: 0003: type{java.lang.Object}
-    // .  .  .  
-       07 00 01 
-    // parsed:, offset 41, len 5, h: 0004: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 02 00 05 
-    // parsed:, offset 46, len 6, h: 0005: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 52, len 7, h: 0006: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 59, len 13, h: 0007: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 72, len 53, h: 0008: utf8{"dxc/junit/opcodes/invokestatic/jm/T_invokestatic_9"}
-    // .  .  2  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  n  v  o  k  e  s  t  a  t  i  c  /  j  m  /  T  _  i  n  v  o  k  e  s  t  a  t  i  c  _  9  
-       01 00 32 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 6e 76 6f 6b 65 73 74 61 74 69 63 2f 6a 6d 2f 54 5f 69 6e 76 6f 6b 65 73 74 61 74 69 63 5f 39 
-    // parsed:, offset 125, len 6, h: 0009: utf8{"()I"}
-    // .  .  .  (  )  I  
-       01 00 03 28 29 49 
-    // parsed:, offset 131, len 6, h: 000a: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 137, len 3, h: 000b: type{java.lang.Math}
-    // .  .  .  
-       07 00 12 
-    // parsed:, offset 140, len 6, h: 000c: utf8{"abs"}
-    // .  .  .  a  b  s  
-       01 00 03 61 62 73 
-    // parsed:, offset 146, len 5, h: 000d: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 03 00 04 
-    // parsed:, offset 151, len 5, h: 000e: method{java.lang.Math.abs:(I)I}
-    // .  .  .  .  .  
-       0a 00 0b 00 14 
-    // parsed:, offset 156, len 3, h: 000f: type{dxc.junit.opcodes.invokestatic.jm.T_invokestatic_9}
-    // .  .  .  
-       07 00 08 
-    // parsed:, offset 159, len 24, h: 0010: utf8{"T_invokestatic_9.java"}
-    // .  .  .  T  _  i  n  v  o  k  e  s  t  a  t  i  c  _  9  .  j  a  v  a  
-       01 00 15 54 5f 69 6e 76 6f 6b 65 73 74 61 74 69 63 5f 39 2e 6a 61 76 61 
-    // parsed:, offset 183, len 7, h: 0011: utf8{"(I)I"}
-    // .  .  .  (  I  )  I  
-       01 00 04 28 49 29 49 
-    // parsed:, offset 190, len 17, h: 0012: utf8{"java/lang/Math"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  M  a  t  h  
-       01 00 0e 6a 61 76 61 2f 6c 61 6e 67 2f 4d 61 74 68 
-    // parsed:, offset 207, len 5, h: 0013: int{0xffed2979 / -1234567}
-    // .  .  .  )  y  
-       03 ff ed 29 79 
-    // parsed:, offset 212, len 5, h: 0014: nat{abs:(I)I}
-    // .  .  .  .  .  
-       0c 00 0c 00 11 
-// parsed:, offset 217, len 0, h: end constant_pool
-// parsed:, offset 217, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 219, len 2, h: this_class: type{dxc.junit.opcodes.invokestatic.jm.T_invokestatic_9}
-// .  .  
-   00 0f 
-// parsed:, offset 221, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 03 
-// parsed:, offset 223, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 225, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 227, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 229, len:73,desc: ()V
-// parsed:, offset 229, len 0, h:  methods[0]: 
-    // parsed:, offset 229, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 231, len 2, h: name: <init>
-    // .  .  
-       00 02 
-    // parsed:, offset 233, len 2, h: descriptor: ()V
-    // .  .  
-       00 05 
-    // parsed:, offset 235, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 237, len 0, h:  attributes[0]: 
-        // parsed:, offset 237, len 2, h: name: Code
-        // .  .  
-           00 06 
-        // parsed:, offset 239, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 243, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 245, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 247, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 0d 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 256, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 258, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 260, len 0, h: end attributes[0] 
-// parsed:, offset 260, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 260, len:42,desc: ()I
-// parsed:, offset 260, len 0, h:  methods[1]: 
-    // parsed:, offset 260, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 262, len 2, h: name: run
-    // .  .  
-       00 0a 
-    // parsed:, offset 264, len 2, h: descriptor: ()I
-    // .  .  
-       00 09 
-    // parsed:, offset 266, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 268, len 0, h:  attributes[0]: 
-        // parsed:, offset 268, len 2, h: name: Code
-        // .  .  
-           00 06 
-        // parsed:, offset 270, len 4, h: length: 00000012
-        // .  .  .  .  
-           00 00 00 12 
-        // parsed:, offset 274, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 276, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 278, len 4, h: code_length: 00000006
-        // .  .  .  .  
-           00 00 00 06 
-        // parsed:, offset 0, len 2, h: 0000: ldc #-0012d687
-        // .  .  
-           12 13 
-        // parsed:, offset 2, len 3, h: 0002: invokestatic method{java.lang.Math.abs:(I)I}
-        // .  .  .  
-//@mod           b8 00 0e           
-           b8 01 0e 
-        // parsed:, offset 5, len 1, h: 0005: ireturn
-        // .  
-           ac 
-        // parsed:, offset 288, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 290, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 292, len 0, h: end attributes[0] 
-// parsed:, offset 292, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()I
-// parsed:, offset 292, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 294, len 0, h:  attributes[0]: 
-    // parsed:, offset 294, len 2, h: name: SourceFile
-    // .  .  
-       00 07 
-    // parsed:, offset 296, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 300, len 2, h: source: utf8{"T_invokestatic_9.java"}
-    // .  .  
-       00 10 
-// parsed:, offset 302, len 0, h: end attributes[0] 
-// parsed:, offset 302, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_9.j b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_9.j
deleted file mode 100644
index edcc8c6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_9.j
+++ /dev/null
@@ -1,29 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokestatic_9.java
-.class public dxc/junit/opcodes/invokestatic/jm/T_invokestatic_9
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    ldc -1234567
-    invokestatic java/lang/Math/abs(I)I
-    ireturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_9.java b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_9.java
deleted file mode 100644
index 4944efd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/T_invokestatic_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokestatic.jm;
-
-public class T_invokestatic_9 {
-    
-    public int run() {
-        return Math.abs(-1234567);
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/TestClass.java b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/TestClass.java
deleted file mode 100644
index ef8723f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/TestClass.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokestatic.jm;
-
-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 int testP(){
-        return 888;
-    }
-    
-    private static void testPvt(){
-        
-    }
-}
-
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/TestClassAbstract.java b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/TestClassAbstract.java
deleted file mode 100644
index 5d24d39..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/TestClassAbstract.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokestatic.jm;
-
-public abstract class TestClassAbstract {
-    
-    public abstract void test();
-}
-
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/TestClassInitError.java b/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/TestClassInitError.java
deleted file mode 100644
index c2d176e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokestatic/jm/TestClassInitError.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokestatic.jm;
-
-public class TestClassInitError {
-    static int a = 1 / 0;
-    public static void test() {
-        
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/TProtected.java b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/TProtected.java
deleted file mode 100644
index 78c0ddb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/TProtected.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokevirtual;
-
-public class TProtected {
-
-    @SuppressWarnings("unused")
-    private void TestStub() {
-        // used by testE6
-    }
-    
-
-    protected void TestStubP() {
-        // used by testE7
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/Test_invokevirtual.java b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/Test_invokevirtual.java
deleted file mode 100644
index 1726067..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/Test_invokevirtual.java
+++ /dev/null
@@ -1,352 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokevirtual;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_1;
-import dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_13;
-import dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_14;
-import dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_15;
-import dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_17;
-import dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_18;
-import dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_19;
-import dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_2;
-import dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_20;
-import dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_3;
-import dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_4;
-import dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_5;
-import dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_6;
-import dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_7;
-
-public class Test_invokevirtual extends DxTestCase {
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_invokevirtual_1 t = new T_invokevirtual_1();
-        int a = 1;
-        String sa = "a" + a;
-        String sb = "a1";
-        assertTrue(t.run(sa, sb));
-        assertFalse(t.run(this, sa));
-        assertFalse(t.run(sb, this));
-    }
-
-    /**
-     * @title  Check that monitor is acquired if method is synchronized
-     */
-    public void testN2() {
-        assertTrue(T_invokevirtual_2.execute());
-    }
-
-    /**
-     * @title  Invoke protected method of superclass
-     */
-    public void testN3() {
-        // @uses dxc.junit.opcodes.invokevirtual.jm.TSuper
-        T_invokevirtual_7 t = new T_invokevirtual_7();
-        assertEquals(5, t.run());
-    }
-
-    /**
-     * @title  Private method call
-     */
-    public void testN4() {
-        T_invokevirtual_13 t = new T_invokevirtual_13();
-        assertEquals(345, t.run());
-    }
-
-    /**
-     * @title  Check that new frame is created by invokevirtual and
-     * arguments are passed to method
-     */
-    public void testN5() {
-        // @uses dxc.junit.opcodes.invokevirtual.jm.TSuper
-        T_invokevirtual_14 t = new T_invokevirtual_14();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @title  Recursion of method lookup procedure
-     */
-    public void testN6() {
-        // @uses dxc.junit.opcodes.invokevirtual.jm.TSuper
-        T_invokevirtual_17 t = new T_invokevirtual_17();
-        assertEquals(5, t.run());
-    }
-
-    /**
-     * @title 
-     */
-    public void testE1() {
-        T_invokevirtual_3 t = new T_invokevirtual_3();
-        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_invokevirtual_4 t = new T_invokevirtual_4();
-        try {
-            t.run();
-            fail("expected UnsatisfiedLinkError");
-        } catch (UnsatisfiedLinkError ule) {
-            // expected
-        }
-    }
-
-    /**
-     * @title  Attempt to invoke static method
-     */
-    public void testE3() {
-        try {
-            T_invokevirtual_5 t = new T_invokevirtual_5();
-            t.run();
-            fail("expected IncompatibleClassChangeError");
-        } catch (IncompatibleClassChangeError icce) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title  Attempt to invoke abstract method
-     */
-    public void testE4() {
-        // @uses dxc.junit.opcodes.invokevirtual.jm.ATest
-        T_invokevirtual_6 t = new T_invokevirtual_6();
-        try {
-            t.run();
-            fail("expected AbstractMethodError");
-        } catch (AbstractMethodError iae) {
-            // expected
-        }
-    }
-
-    /**
-     * @title  Attempt to invoke non-existing method
-     */
-    public void testE5() {
-        try {
-            T_invokevirtual_15 t = new T_invokevirtual_15();
-            t.run();
-            fail("expected NoSuchMethodError");
-        } catch (NoSuchMethodError iae) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title  Attempt to invoke private method of other class
-     */
-    public void testE6() {
-        // @uses dxc.junit.opcodes.invokevirtual.jm.TSuper
-        // @uses dxc.junit.opcodes.invokevirtual.TProtected
-        try {
-            T_invokevirtual_18 t = new T_invokevirtual_18();
-            t.run(new TProtected());
-            fail("expected IllegalAccessError");
-        } catch (IllegalAccessError iae) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title  Attempt to invoke protected method of other class
-     */
-    public void testE7() {
-        // @uses dxc.junit.opcodes.invokevirtual.jm.TSuper
-        // @uses dxc.junit.opcodes.invokevirtual.TProtected
-        try {
-            T_invokevirtual_20 t = new T_invokevirtual_20();
-            t.run(new TProtected());
-            fail("expected IllegalAccessError");
-        } catch (IllegalAccessError iae) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title  method has different signature
-     */
-    public void testE8() {
-        // @uses dxc.junit.opcodes.invokevirtual.jm.TSuper
-        try {
-            T_invokevirtual_19 t = new T_invokevirtual_19();
-            t.run();
-            fail("expected NoSuchMethodError");
-        } catch (NoSuchMethodError iae) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.13 
-     * @title valid index into constant pool table
-     */
-    public void testVFE1() {
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_8");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.13
-     * @title invalid index into constant pool table
-     */
-    public void testVFE2() {
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_9");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.14 
-     * @title &lt;clinit&gt; may not be called using invokevirtual
-     */
-    public void testVFE3() {
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_10");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1 
-     * @title number of arguments passed to method
-     */
-    public void testVFE4() {
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_11");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1 
-     * @title type of argument - int
-     */
-    public void testVFE5() {
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_12");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.14 
-     * @title &lt;init&gt; may not be called using invokevirtual
-     */
-    public void testVFE6() {
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_16");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.12 
-     * @title types of arguments passed to method
-     */
-    public void testVFE7() {
-        // @uses dxc.junit.opcodes.invokevirtual.jm.TSuper
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_21");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.13 
-     * @title assignment incompatible references when accessing
-     *                  protected method
-     */
-    public void testVFE8() {
-        // @uses dxc.junit.opcodes.invokevirtual.jm.TSuper
-        // @uses dxc.junit.opcodes.invokevirtual.jm.TPlain
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_22");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.13 
-     * @title assignment incompatible references when accessing
-     *                  public method
-     */
-    public void testVFE9() {
-        // @uses dxc.junit.opcodes.invokevirtual.jm.TSuper
-        // @uses dxc.junit.opcodes.invokevirtual.jm.TSuper2
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_23");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/ATest.java b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/ATest.java
deleted file mode 100644
index d0189ac..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/ATest.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokevirtual.jm;
-
-public abstract class ATest {
-    
-    public abstract void test();       
-    
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/TPlain.java b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/TPlain.java
deleted file mode 100644
index 2939359..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/TPlain.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/** Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package dxc.junit.opcodes.invokevirtual.jm;
-
-/**
- * @author fjost
- *
- */
-public class TPlain {
-    public int toInt() {
-        return 1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/TSuper.java b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/TSuper.java
deleted file mode 100644
index cc198ab..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/TSuper.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/** Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package dxc.junit.opcodes.invokevirtual.jm;
-
-/**
- * @author fjost
- *
- */
-public class TSuper {
-    public int toInt() {
-        return 5;
-    }
-    
-    public int toInt(float v) {
-        return (int)v;
-    }
-    
-    public native int toIntNative();
-    
-    public static int toIntStatic() {
-        return 5;
-    }
-    
-    protected int toIntP() {
-        return 5;
-    }
-    
-    private int toIntPvt() {
-        return 5;
-    }
-    
-    public int testArgsOrder(int a, int b){
-        int i = 349;
-        int j = 344656;
-        return a / b;
-    }
-    
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/TSuper2.java b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/TSuper2.java
deleted file mode 100644
index 6fcbefe..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/TSuper2.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokevirtual.jm;
-
-import dxc.junit.opcodes.invokespecial.jm.TSuper;
-
-public class TSuper2 extends TSuper {
-    
-    public int test() {
-        return 13;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_1.j b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_1.j
deleted file mode 100644
index b64e0c7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_1.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokevirtual_1.java
-.class public dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/Object;Ljava/lang/Object;)Z
-    .limit stack 2
-    .limit locals 3
-    aload_1
-    aload_2
-    invokevirtual java/lang/Object/equals(Ljava/lang/Object;)Z
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_1.java b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_1.java
deleted file mode 100644
index 1bbaec3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokevirtual.jm;
-
-public class T_invokevirtual_1 {
-
-    public boolean run(Object x, Object y) {
-        return x.equals(y);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_10.j b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_10.j
deleted file mode 100644
index e12428b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_10.j
+++ /dev/null
@@ -1,23 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokevirtual_10.java
-.class public dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_10
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokevirtual java/lang/Object/<clinit>()V
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_10.java b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_10.java
deleted file mode 100644
index 0bdaf58..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_10.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokevirtual.jm;
-
-public class T_invokevirtual_10 {
-    
-    public void run() {
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_11.j b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_11.j
deleted file mode 100644
index 5fb634d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_11.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokevirtual_11.java
-.class public dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_11
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/Object;Ljava/lang/Object;)Z
-    .limit stack 2
-    .limit locals 3
-
-    aload_0
-;    aload_1
-    invokevirtual java/lang/Object/equals(Ljava/lang/Object;)Z
-    ireturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_11.java b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_11.java
deleted file mode 100644
index 7c28cae..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokevirtual.jm;
-
-public class T_invokevirtual_11 {
-    
-    public boolean run(Object x, Object y) {
-        return x.equals(y);
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_12.j b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_12.j
deleted file mode 100644
index 293a6e5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_12.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokevirtual_12.java
-.class public dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_12
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/Object;Ljava/lang/Object;)Z
-    .limit stack 2
-    .limit locals 3
-
-    iconst_1
-    aload_1
-    invokevirtual java/lang/Object/equals(Ljava/lang/Object;)Z
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_12.java b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_12.java
deleted file mode 100644
index 62e1971..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_12.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokevirtual.jm;
-
-public class T_invokevirtual_12 {
-
-    public boolean run(Object x, Object y) {
-        return x.equals(y);
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_13.j b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_13.j
deleted file mode 100644
index f7f0f0a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_13.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokevirtual_13.java
-.class public dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_13
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    aload_0
-    invokevirtual dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_13/getInt()I
-    ireturn
-.end method
-
-.method private getInt()I
-    sipush 345
-    ireturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_13.java b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_13.java
deleted file mode 100644
index dfa6179..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_13.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokevirtual.jm;
-
-public class T_invokevirtual_13 {
-    
-    public int run() {
-        return getInt();
-    }
-
-    private int getInt() {
-        return 345;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_14.j b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_14.j
deleted file mode 100644
index ebbad2c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_14.j
+++ /dev/null
@@ -1,59 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokevirtual_14.java
-.class public dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_14
-.super dxc/junit/opcodes/invokevirtual/jm/TSuper
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/invokevirtual/jm/TSuper/<init>()V
-    return
-.end method
-
-
-.method public run()Z
-    .limit stack 3
-    .limit locals 3
-
-    bipush 123
-    istore_1
-
-    sipush 659
-    istore_2
-
-    aload_0
-    sipush 300
-    iconst_3
-    invokevirtual dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_14/testArgsOrder(II)I
-
-    bipush 100
-    if_icmpne Label0
-
-    iload_1
-    bipush 123
-    if_icmpne Label0
-
-    iload_2
-    sipush 659
-    if_icmpne Label0
-
-    iconst_1
-    ireturn
-
-Label0:
-    iconst_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_14.java b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_14.java
deleted file mode 100644
index d039fbe..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_14.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokevirtual.jm;
-
-import dxc.junit.opcodes.invokevirtual.jm.TSuper;
-
-    
-public class T_invokevirtual_14 extends TSuper {
-
-    public boolean run() {
-        int a = 123;
-        int b = 659;
-        if(testArgsOrder(300, 3) == 100)
-            if(a == 123)
-                if(b == 659)
-                    return true;
-        return false;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_15.j b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_15.j
deleted file mode 100644
index 61a84e0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_15.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokevirtual_15.java
-.class public dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_15
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public test()V
-    .limit stack 0
-    .limit locals 1
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 1
-    .limit locals 1
-    aload_0
-    invokevirtual dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_15/test1()V
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_15.java b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_15.java
deleted file mode 100644
index fae4bba..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_15.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokevirtual.jm;
-
-public class T_invokevirtual_15 {
-    
-    public void test(){
-    }
-    
-    public void run() {
-        test();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_16.j b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_16.j
deleted file mode 100644
index fc2d18c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_16.j
+++ /dev/null
@@ -1,23 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokevirtual_16.java
-.class public dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_16
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokevirtual java/lang/Object/<init>()V
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_16.java b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_16.java
deleted file mode 100644
index c30e960..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_16.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokevirtual.jm;
-
-public class T_invokevirtual_16 {
-    
-    public void run() {
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_17.j b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_17.j
deleted file mode 100644
index ac29622..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_17.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokevirtual_17.java
-.class public dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_17
-.super dxc/junit/opcodes/invokevirtual/jm/TSuper
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/invokevirtual/jm/TSuper/<init>()V
-    return
-.end method
-
-
-.method public run()I
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokevirtual dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_17/toInt()I
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_17.java b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_17.java
deleted file mode 100644
index 639d499..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_17.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokevirtual.jm;
-
-import dxc.junit.opcodes.invokevirtual.jm.TSuper;
-
-    
-public class T_invokevirtual_17 extends TSuper {
-
-    public int run() {
-        return toInt();
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_18.j b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_18.j
deleted file mode 100644
index c38f212..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_18.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokevirtual_18.java
-.class public dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_18
-.super dxc/junit/opcodes/invokevirtual/jm/TSuper
-
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/invokevirtual/jm/TSuper/<init>()V
-    return
-.end method
-
-
-
-.method public run(Ldxc/junit/opcodes/invokevirtual/TProtected;)V
-    .limit stack 1
-    .limit locals 2
-
-    aload_1
-    invokevirtual dxc/junit/opcodes/invokevirtual/TProtected/TestStub()V
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_18.java b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_18.java
deleted file mode 100644
index d027bf2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_18.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokevirtual.jm;
-
-import dxc.junit.opcodes.invokevirtual.TProtected;
-
-
-    
-public class T_invokevirtual_18 extends TSuper {
-
-    public void run(TProtected obj) {
-        //obj.TestStub();
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_19.j b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_19.j
deleted file mode 100644
index 1214d1b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_19.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokevirtual_19.java
-.class public dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_19
-.super dxc/junit/opcodes/invokevirtual/jm/TSuper
-
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-    aload_0
-    invokespecial dxc/junit/opcodes/invokevirtual/jm/TSuper/<init>()V
-    return
-.end method
-
-
-
-.method public run()I
-    .limit stack 2
-    .limit locals 1
-
-    aload_0
-    iconst_1
-    invokevirtual dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_19/toInt(I)I
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_19.java b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_19.java
deleted file mode 100644
index 564c27f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_19.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokevirtual.jm;
-
-import dxc.junit.opcodes.invokevirtual.jm.TSuper;
-
-    
-public class T_invokevirtual_19 extends TSuper {
-
-    public int run() {
-        return toInt(3.14f);
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_2.j b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_2.j
deleted file mode 100644
index 0386883..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_2.j
+++ /dev/null
@@ -1,158 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokevirtual_2.java
-.class public dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_2
-.super java/lang/Object
-.implements java/lang/Runnable
-
-.field  value I
-.field  failed Z
-
-.method public <init>()V
-    .limit stack 2
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    aload_0
-    iconst_0
-    putfield dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_2.value I
-
-    aload_0
-    iconst_0
-    putfield dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_2.failed Z
-
-    return
-.end method
-
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 2
-
-    iconst_0
-    istore_1
-
-Label1:
-    aload_0
-    invokevirtual dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_2/test()V
-
-    iinc 1 1
-
-Label0:
-    iload_1
-    sipush 1000
-    if_icmplt Label1
-
-    return
-.end method
-
-
-
-.method public synchronized test()V
-    .limit stack 3
-    .limit locals 2
-
-    aload_0
-    dup
-    getfield dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_2.value I
-    iconst_1
-    iadd
-    putfield dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_2.value I
-
-    aload_0
-    getfield dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_2.value I
-    istore_1
-
-    invokestatic java/lang/Thread/yield()V
-
-    iload_1
-    aload_0
-    getfield dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_2.value I
-    if_icmpeq Label0
-
-    aload_0
-    iconst_1
-    putfield dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_2.failed Z
-
-Label0:
-    return
-.end method
-
-
-
-.method public static execute()Z
-    .limit stack 3
-    .limit locals 4
-
-    new dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_2
-    dup
-    invokespecial dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_2/<init>()V
-    astore_0
-
-    new java/lang/Thread
-    dup
-    aload_0
-    invokespecial java/lang/Thread/<init>(Ljava/lang/Runnable;)V
-    astore_1
-
-    new java/lang/Thread
-    dup
-    aload_0
-    invokespecial java/lang/Thread/<init>(Ljava/lang/Runnable;)V
-    astore_2
-
-    aload_1
-    invokevirtual java/lang/Thread/start()V
-
-    aload_2
-    invokevirtual java/lang/Thread/start()V
-
-Label12:
-    ldc2_w 5000
-    invokestatic java/lang/Thread/sleep(J)V
-
-Label13:
-    goto Label0
-
-Label14:
-    astore_3
-
-    iconst_0
-    ireturn
-
-Label0:
-    aload_0
-    getfield dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_2.value I
-    sipush 2000
-    if_icmpeq Label1
-
-    iconst_0
-    ireturn
-
-Label1:
-
-    aload_0
-    getfield dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_2.failed Z
-    ifeq Label2
-    iconst_0
-    ireturn
-
-Label2:
-    iconst_1
-    ireturn
-
-.catch java/lang/InterruptedException from Label12 to Label13 using Label14
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_2.java b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_2.java
deleted file mode 100644
index 92bb8a8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_2.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokevirtual.jm;
-
-public class T_invokevirtual_2 implements Runnable {
-    public final static int CNT = 1000;
-    int value = 0;
-    boolean failed = false;
-    
-    public void run() {
-        for(int i = 0; i < CNT; i++) {
-            test();
-        }
-    }
-    
-    public synchronized void test()    {
-        value++;
-        int c = value;
-        Thread.yield();
-        if(c != value)
-            failed = true;
-    }
-    
-    public static boolean execute() {
-        T_invokevirtual_2 test = new T_invokevirtual_2();
-        Thread t1 = new Thread(test);
-        Thread t2 = new Thread(test);
-        
-        t1.start();
-        t2.start();
-        
-        try
-        {
-            Thread.sleep(5000);
-        }
-        catch(InterruptedException ie) {
-            return false;
-        }
-        
-        if(test.value != CNT * 2)
-            return false;
-        return !test.failed;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_20.j b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_20.j
deleted file mode 100644
index e340162..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_20.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokevirtual_20.java
-.class public dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_20
-.super dxc/junit/opcodes/invokevirtual/jm/TSuper
-
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/invokevirtual/jm/TSuper/<init>()V
-    return
-.end method
-
-
-
-.method public run(Ldxc/junit/opcodes/invokevirtual/TProtected;)V
-    .limit stack 1
-    .limit locals 2
-
-    aload_1
-    invokevirtual dxc/junit/opcodes/invokevirtual/TProtected/TestStubP()V
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_20.java b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_20.java
deleted file mode 100644
index aa2c8d8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_20.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokevirtual.jm;
-
-import dxc.junit.opcodes.invokevirtual.TProtected;
-
-    
-public class T_invokevirtual_20 extends TSuper {
-
-    public void run(TProtected obj) {
-        //obj.TestStubP();
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_21.j b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_21.j
deleted file mode 100644
index af0a530..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_21.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokevirtual_21.java
-.class public dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_21
-.super dxc/junit/opcodes/invokevirtual/jm/TSuper
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/invokevirtual/jm/TSuper/<init>()V
-    return
-.end method
-
-
-.method public run()I
-    .limit stack 3
-    .limit locals 1
-
-    aload_0
-;    ldc 5.0
-    dconst_1
-    invokevirtual dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_21/toInt(F)I
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_21.java b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_21.java
deleted file mode 100644
index 50333e8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_21.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokevirtual.jm;
-
-public class T_invokevirtual_21 extends TSuper {
-
-    public int run() {
-        return toInt(5f);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_22.j b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_22.j
deleted file mode 100644
index d3c3164..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_22.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokevirtual_22.java
-.class public dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_22
-.super dxc/junit/opcodes/invokevirtual/jm/TSuper
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-    aload_0
-    invokespecial dxc/junit/opcodes/invokevirtual/jm/TSuper/<init>()V
-    return
-.end method
-
-
-.method public run()I
-    .limit stack 2
-    .limit locals 2
-
-    new dxc/junit/opcodes/invokevirtual/jm/TPlain
-    dup
-    invokespecial dxc/junit/opcodes/invokevirtual/jm/TPlain/<init>()V
-
-    invokevirtual dxc/junit/opcodes/invokevirtual/jm/TSuper/toIntP()I
-
-    Label1:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_22.java b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_22.java
deleted file mode 100644
index b002637..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_22.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokevirtual.jm;
-
-import dxc.junit.opcodes.invokevirtual.jm.TSuper;
-
-public class T_invokevirtual_22 extends TSuper {
-
-    public int run() {
-        TPlain p = new TPlain();
-        return p.toInt();
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_23.j b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_23.j
deleted file mode 100644
index 8c7eec8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_23.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokevirtual_23.java
-.class public dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_23
-.super dxc/junit/opcodes/invokevirtual/jm/TSuper2
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/invokevirtual/jm/TSuper2/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 2
-    .limit locals 2
-    
-    new dxc/junit/opcodes/invokevirtual/jm/TSuper
-    dup
-    invokespecial dxc/junit/opcodes/invokevirtual/jm/TSuper/<init>()V
-
-    invokevirtual dxc/junit/opcodes/invokevirtual/jm/TSuper2/test()I
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_23.java b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_23.java
deleted file mode 100644
index b2ef484..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_23.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokevirtual.jm;
-
-public class T_invokevirtual_23 extends TSuper2 {
-    
-    public int run() {
-        return super.test();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_3.j b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_3.j
deleted file mode 100644
index c1fd20f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_3.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokevirtual_3.java
-.class public dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/Object;Ljava/lang/Object;)Z
-    .limit stack 2
-    .limit locals 3
-    aload_1
-    aload_2
-    invokevirtual java/lang/Object/equals(Ljava/lang/Object;)Z
-    ireturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_3.java b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_3.java
deleted file mode 100644
index 8f0fb67..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokevirtual.jm;
-
-public class T_invokevirtual_3 {
-
-    public boolean run(Object x, Object y) {
-        return x.equals(y);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_4.j b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_4.j
deleted file mode 100644
index c4efa88..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokevirtual_4.java
-.class public dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public native test()V
-.end method
-
-.method public run()V
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokevirtual dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_4/test()V
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_4.java b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_4.java
deleted file mode 100644
index 08a969b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_4.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokevirtual.jm;
-
-public class T_invokevirtual_4 {
-    
-    public native void test();
-
-    public void run() {
-        test();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_5.j b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_5.j
deleted file mode 100644
index d751a75..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_5.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokevirtual_5.java
-.class public dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static test()V
-    .limit stack 0
-    .limit locals 1
-    return
-.end method
-
-.method public run()V
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokevirtual dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_5/test()V
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_5.java b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_5.java
deleted file mode 100644
index c931ce4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_5.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokevirtual.jm;
-
-public class T_invokevirtual_5 {
-    
-    public void test(){
-    }
-
-    public void run() {
-        test();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_6.j b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_6.j
deleted file mode 100644
index 56612ff..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_6.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokevirtual_6.java
-.class public dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_6
-.super dxc/junit/opcodes/invokevirtual/jm/ATest
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/invokevirtual/jm/ATest/<init>()V
-    return
-.end method
-
-.method public run()V
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokevirtual dxc/junit/opcodes/invokevirtual/jm/ATest/test()V
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_6.java b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_6.java
deleted file mode 100644
index 0d18e83..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_6.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokevirtual.jm;
-
-public class T_invokevirtual_6 extends ATest {
-    
-    public void test(){
-        int i = 2+5;
-    }
-
-    public void run() {
-        test();
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_7.j b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_7.j
deleted file mode 100644
index 07e6f88..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_7.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokevirtual_7.java
-.class public dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_7
-.super dxc/junit/opcodes/invokevirtual/jm/TSuper
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/invokevirtual/jm/TSuper/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 1
-    .limit locals 1
-    aload_0
-    invokevirtual dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_7/toIntP()I
-    ireturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_7.java b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_7.java
deleted file mode 100644
index abff1db..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_7.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokevirtual.jm;
-
-import dxc.junit.opcodes.invokevirtual.jm.TSuper;
-
-    
-public class T_invokevirtual_7 extends TSuper {
-
-    public int run() {
-        return toIntP();
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_8.cfh b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_8.cfh
deleted file mode 100644
index d8991a9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_8.cfh
+++ /dev/null
@@ -1,200 +0,0 @@
-//@class:dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_8
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0012
-// .  .  
-   00 12 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 25, h: 0001: utf8{"T_invokevirtual_8.java"}
-    // .  .  .  T  _  i  n  v  o  k  e  v  i  r  t  u  a  l  _  8  .  j  a  v  a  
-       01 00 16 54 5f 69 6e 76 6f 6b 65 76 69 72 74 75 61 6c 5f 38 2e 6a 61 76 61 
-    // parsed:, offset 35, len 5, h: 0002: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 11 00 09 
-    // parsed:, offset 40, len 19, h: 0003: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 59, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 72, len 24, h: 0005: utf8{"(Ljava/lang/Object;)Z"}
-    // .  .  .  (  L  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  ;  )  Z  
-       01 00 15 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 3b 29 5a 
-    // parsed:, offset 96, len 9, h: 0006: utf8{"equals"}
-    // .  .  .  e  q  u  a  l  s  
-       01 00 06 65 71 75 61 6c 73 
-    // parsed:, offset 105, len 9, h: 0007: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 114, len 6, h: 0008: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 120, len 5, h: 0009: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 07 00 0f 
-    // parsed:, offset 125, len 5, h: 000a: method{java.lang.Object.equals:(Ljava/lang/Object;)Z}
-    // .  .  .  .  .  
-       0a 00 11 00 0e 
-    // parsed:, offset 130, len 7, h: 000b: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 137, len 42, h: 000c: utf8{"(Ljava/lang/Object;Ljava/lang/Object;)Z"}
-    // .  .  '  (  L  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  ;  L  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  ;  )  Z  
-       01 00 27 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 3b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 3b 29 5a 
-    // parsed:, offset 179, len 55, h: 000d: utf8{"dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_8"}
-    // .  .  4  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  n  v  o  k  e  v  i  r  t  u  a  l  /  j  m  /  T  _  i  n  v  o  k  e  v  i  r  t  u  a  l  _  8  
-       01 00 34 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 6e 76 6f 6b 65 76 69 72 74 75 61 6c 2f 6a 6d 2f 54 5f 69 6e 76 6f 6b 65 76 69 72 74 75 61 6c 5f 38 
-    // parsed:, offset 234, len 5, h: 000e: nat{equals:(Ljava/lang/Object;)Z}
-    // .  .  .  .  .  
-       0c 00 06 00 05 
-    // parsed:, offset 239, len 6, h: 000f: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 245, len 3, h: 0010: type{dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_8}
-    // .  .  .  
-       07 00 0d 
-    // parsed:, offset 248, len 3, h: 0011: type{java.lang.Object}
-    // .  .  .  
-       07 00 03 
-// parsed:, offset 251, len 0, h: end constant_pool
-// parsed:, offset 251, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 253, len 2, h: this_class: type{dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_8}
-// .  .  
-   00 10 
-// parsed:, offset 255, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 11 
-// parsed:, offset 257, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 259, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 261, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 263, len:73,desc: ()V
-// parsed:, offset 263, len 0, h:  methods[0]: 
-    // parsed:, offset 263, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 265, len 2, h: name: <init>
-    // .  .  
-       00 07 
-    // parsed:, offset 267, len 2, h: descriptor: ()V
-    // .  .  
-       00 0f 
-    // parsed:, offset 269, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 271, len 0, h:  attributes[0]: 
-        // parsed:, offset 271, len 2, h: name: Code
-        // .  .  
-           00 0b 
-        // parsed:, offset 273, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 277, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 279, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 281, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 02 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 290, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 292, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 294, len 0, h: end attributes[0] 
-// parsed:, offset 294, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 294, len:42,desc: (Ljava/lang/Object;Ljava/lang/Object;)Z
-// parsed:, offset 294, len 0, h:  methods[1]: 
-    // parsed:, offset 294, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 296, len 2, h: name: run
-    // .  .  
-       00 08 
-    // parsed:, offset 298, len 2, h: descriptor: (Ljava/lang/Object;Ljava/lang/Object;)Z
-    // .  .  
-       00 0c 
-    // parsed:, offset 300, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 302, len 0, h:  attributes[0]: 
-        // parsed:, offset 302, len 2, h: name: Code
-        // .  .  
-           00 0b 
-        // parsed:, offset 304, len 4, h: length: 00000012
-        // .  .  .  .  
-           00 00 00 12 
-        // parsed:, offset 308, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 310, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 312, len 4, h: code_length: 00000006
-        // .  .  .  .  
-           00 00 00 06 
-        // parsed:, offset 0, len 1, h: 0000: aload_1 // 01
-        // +  
-           2b 
-        // parsed:, offset 1, len 1, h: 0001: aload_2 // 02
-        // ,  
-           2c 
-        // parsed:, offset 2, len 3, h: 0002: invokevirtual method{java.lang.Object.equals:(Ljava/lang/Object;)Z}
-        // .  .  .  
-//@mod           b6 00 0a
-           b6 00 0b 
-        // parsed:, offset 5, len 1, h: 0005: ireturn
-        // .  
-           ac 
-        // parsed:, offset 322, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 324, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 326, len 0, h: end attributes[0] 
-// parsed:, offset 326, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (Ljava/lang/Object;Ljava/lang/Object;)Z
-// parsed:, offset 326, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 328, len 0, h:  attributes[0]: 
-    // parsed:, offset 328, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 330, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 334, len 2, h: source: utf8{"T_invokevirtual_8.java"}
-    // .  .  
-       00 01 
-// parsed:, offset 336, len 0, h: end attributes[0] 
-// parsed:, offset 336, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_8.j b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_8.j
deleted file mode 100644
index 14fc66b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_8.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokevirtual_8.java
-.class public dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_8
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/Object;Ljava/lang/Object;)Z
-    .limit stack 2
-    .limit locals 3
-    
-    aload_1
-    aload_2
-    invokevirtual java/lang/Object/equals(Ljava/lang/Object;)Z
-    ireturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_8.java b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_8.java
deleted file mode 100644
index 4c9fac6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokevirtual.jm;
-
-public class T_invokevirtual_8 {
-    
-    public boolean run(Object x, Object y) {
-        return x.equals(y);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_9.cfh b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_9.cfh
deleted file mode 100644
index a98e1d7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_9.cfh
+++ /dev/null
@@ -1,200 +0,0 @@
-//@class:dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_9
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0012
-// .  .  
-   00 12 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 11 00 09 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 24, h: 0004: utf8{"(Ljava/lang/Object;)Z"}
-    // .  .  .  (  L  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  ;  )  Z  
-       01 00 15 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 3b 29 5a 
-    // parsed:, offset 71, len 9, h: 0005: utf8{"equals"}
-    // .  .  .  e  q  u  a  l  s  
-       01 00 06 65 71 75 61 6c 73 
-    // parsed:, offset 80, len 9, h: 0006: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 89, len 6, h: 0007: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 95, len 25, h: 0008: utf8{"T_invokevirtual_9.java"}
-    // .  .  .  T  _  i  n  v  o  k  e  v  i  r  t  u  a  l  _  9  .  j  a  v  a  
-       01 00 16 54 5f 69 6e 76 6f 6b 65 76 69 72 74 75 61 6c 5f 39 2e 6a 61 76 61 
-    // parsed:, offset 120, len 5, h: 0009: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 06 00 0f 
-    // parsed:, offset 125, len 5, h: 000a: method{java.lang.Object.equals:(Ljava/lang/Object;)Z}
-    // .  .  .  .  .  
-       0a 00 11 00 0e 
-    // parsed:, offset 130, len 7, h: 000b: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 137, len 42, h: 000c: utf8{"(Ljava/lang/Object;Ljava/lang/Object;)Z"}
-    // .  .  '  (  L  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  ;  L  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  ;  )  Z  
-       01 00 27 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 3b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 3b 29 5a 
-    // parsed:, offset 179, len 55, h: 000d: utf8{"dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_9"}
-    // .  .  4  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  i  n  v  o  k  e  v  i  r  t  u  a  l  /  j  m  /  T  _  i  n  v  o  k  e  v  i  r  t  u  a  l  _  9  
-       01 00 34 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 69 6e 76 6f 6b 65 76 69 72 74 75 61 6c 2f 6a 6d 2f 54 5f 69 6e 76 6f 6b 65 76 69 72 74 75 61 6c 5f 39 
-    // parsed:, offset 234, len 5, h: 000e: nat{equals:(Ljava/lang/Object;)Z}
-    // .  .  .  .  .  
-       0c 00 05 00 04 
-    // parsed:, offset 239, len 6, h: 000f: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 245, len 3, h: 0010: type{dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_9}
-    // .  .  .  
-       07 00 0d 
-    // parsed:, offset 248, len 3, h: 0011: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 251, len 0, h: end constant_pool
-// parsed:, offset 251, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 253, len 2, h: this_class: type{dxc.junit.opcodes.invokevirtual.jm.T_invokevirtual_9}
-// .  .  
-   00 10 
-// parsed:, offset 255, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 11 
-// parsed:, offset 257, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 259, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 261, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 263, len:73,desc: ()V
-// parsed:, offset 263, len 0, h:  methods[0]: 
-    // parsed:, offset 263, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 265, len 2, h: name: <init>
-    // .  .  
-       00 06 
-    // parsed:, offset 267, len 2, h: descriptor: ()V
-    // .  .  
-       00 0f 
-    // parsed:, offset 269, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 271, len 0, h:  attributes[0]: 
-        // parsed:, offset 271, len 2, h: name: Code
-        // .  .  
-           00 0b 
-        // parsed:, offset 273, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 277, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 279, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 281, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 290, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 292, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 294, len 0, h: end attributes[0] 
-// parsed:, offset 294, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 294, len:42,desc: (Ljava/lang/Object;Ljava/lang/Object;)Z
-// parsed:, offset 294, len 0, h:  methods[1]: 
-    // parsed:, offset 294, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 296, len 2, h: name: run
-    // .  .  
-       00 07 
-    // parsed:, offset 298, len 2, h: descriptor: (Ljava/lang/Object;Ljava/lang/Object;)Z
-    // .  .  
-       00 0c 
-    // parsed:, offset 300, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 302, len 0, h:  attributes[0]: 
-        // parsed:, offset 302, len 2, h: name: Code
-        // .  .  
-           00 0b 
-        // parsed:, offset 304, len 4, h: length: 00000012
-        // .  .  .  .  
-           00 00 00 12 
-        // parsed:, offset 308, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 310, len 2, h: max_locals: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 312, len 4, h: code_length: 00000006
-        // .  .  .  .  
-           00 00 00 06 
-        // parsed:, offset 0, len 1, h: 0000: aload_1 // 01
-        // +  
-           2b 
-        // parsed:, offset 1, len 1, h: 0001: aload_2 // 02
-        // ,  
-           2c 
-        // parsed:, offset 2, len 3, h: 0002: invokevirtual method{java.lang.Object.equals:(Ljava/lang/Object;)Z}
-        // .  .  .  
-//@mod           b6 00 0a 
-           b6 01 0a           
-        // parsed:, offset 5, len 1, h: 0005: ireturn
-        // .  
-           ac 
-        // parsed:, offset 322, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 324, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 326, len 0, h: end attributes[0] 
-// parsed:, offset 326, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (Ljava/lang/Object;Ljava/lang/Object;)Z
-// parsed:, offset 326, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 328, len 0, h:  attributes[0]: 
-    // parsed:, offset 328, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 330, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 334, len 2, h: source: utf8{"T_invokevirtual_9.java"}
-    // .  .  
-       00 08 
-// parsed:, offset 336, len 0, h: end attributes[0] 
-// parsed:, offset 336, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_9.j b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_9.j
deleted file mode 100644
index d72271b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_9.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_invokevirtual_9.java
-.class public dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_9
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/Object;Ljava/lang/Object;)Z
-    .limit stack 2
-    .limit locals 3
-
-    aload_1
-    aload_2
-    invokevirtual java/lang/Object/equals(Ljava/lang/Object;)Z
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_9.java b/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_9.java
deleted file mode 100644
index 22b9bb0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/invokevirtual/jm/T_invokevirtual_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.invokevirtual.jm;
-
-public class T_invokevirtual_9 {
-    
-    public boolean run(Object x, Object y) {
-        return x.equals(y);
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ior/Test_ior.java b/tools/dx-tests/src/dxc/junit/opcodes/ior/Test_ior.java
deleted file mode 100644
index e035cf3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ior/Test_ior.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ior;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.ior.jm.T_ior_1;
-
-public class Test_ior extends DxTestCase {
-
-    /**
-     * @title Arguments = 15, 8
-     */
-    public void testN1() {
-        T_ior_1 t = new T_ior_1();
-        assertEquals(15, t.run(15, 8));
-    }
-
-    /**
-     * @title Arguments = 0xfffffff8, 0xfffffff1 
-     */
-    public void testN2() {
-        T_ior_1 t = new T_ior_1();
-        assertEquals(0xfffffff9, t.run(0xfffffff8, 0xfffffff1));
-    }
-
-    /**
-     * @title  Arguments = 0xcafe & -1
-     */
-    public void testN3() {
-        T_ior_1 t = new T_ior_1();
-        assertEquals(-1, t.run(0xcafe, -1));
-    }
-
-    /**
-     * @title  Arguments = 0 & -1
-     */
-    public void testB1() {
-        T_ior_1 t = new T_ior_1();
-        assertEquals(-1, t.run(0, -1));
-    }
-
-    /**
-     * @title  Arguments = Integer.MAX_VALUE & Integer.MIN_VALUE
-     */
-    public void testB2() {
-        T_ior_1 t = new T_ior_1();
-        assertEquals(0xffffffff, t.run(Integer.MAX_VALUE, Integer.MIN_VALUE));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.ior.jm.T_ior_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double & int
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.ior.jm.T_ior_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long & int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.ior.jm.T_ior_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference & int
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.ior.jm.T_ior_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ior/jm/T_ior_1.j b/tools/dx-tests/src/dxc/junit/opcodes/ior/jm/T_ior_1.j
deleted file mode 100644
index 66611f1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ior/jm/T_ior_1.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ior_1.java
-.class public dxc/junit/opcodes/ior/jm/T_ior_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-    iload_1
-    iload_2
-    ior
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ior/jm/T_ior_1.java b/tools/dx-tests/src/dxc/junit/opcodes/ior/jm/T_ior_1.java
deleted file mode 100644
index 98f023e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ior/jm/T_ior_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ior.jm;
-
-public class T_ior_1 {
-
-    public int run(int a, int b) {
-        return a | b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ior/jm/T_ior_2.j b/tools/dx-tests/src/dxc/junit/opcodes/ior/jm/T_ior_2.j
deleted file mode 100644
index 39e9a3d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ior/jm/T_ior_2.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ior_2.java
-.class public dxc/junit/opcodes/ior/jm/T_ior_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-    iload_1
-;    iload_2
-    ior
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ior/jm/T_ior_2.java b/tools/dx-tests/src/dxc/junit/opcodes/ior/jm/T_ior_2.java
deleted file mode 100644
index db93a0b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ior/jm/T_ior_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ior.jm;
-
-public class T_ior_2 {
-
-    public int run(int a, int b) {
-        return a | b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ior/jm/T_ior_3.j b/tools/dx-tests/src/dxc/junit/opcodes/ior/jm/T_ior_3.j
deleted file mode 100644
index fea22c5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ior/jm/T_ior_3.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ior_3.java
-.class public dxc/junit/opcodes/ior/jm/T_ior_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(DI)I
-    .limit stack 3
-    .limit locals 4
-
-    dload_1
-    iload_3
-    ior
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ior/jm/T_ior_3.java b/tools/dx-tests/src/dxc/junit/opcodes/ior/jm/T_ior_3.java
deleted file mode 100644
index d000987..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ior/jm/T_ior_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ior.jm;
-
-public class T_ior_3 {
-
-    public int run(double a, int b) {
-        return (int)a | b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ior/jm/T_ior_4.j b/tools/dx-tests/src/dxc/junit/opcodes/ior/jm/T_ior_4.j
deleted file mode 100644
index 1d21407..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ior/jm/T_ior_4.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ior_4.java
-.class public dxc/junit/opcodes/ior/jm/T_ior_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(IJ)I
-    .limit stack 3
-    .limit locals 4
-
-    iload_1
-    lload_2
-    ior
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ior/jm/T_ior_4.java b/tools/dx-tests/src/dxc/junit/opcodes/ior/jm/T_ior_4.java
deleted file mode 100644
index c8cc013..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ior/jm/T_ior_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ior.jm;
-
-public class T_ior_4 {
-
-    public int run(int a, long b) {
-        return a | (int)b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ior/jm/T_ior_5.j b/tools/dx-tests/src/dxc/junit/opcodes/ior/jm/T_ior_5.j
deleted file mode 100644
index 7528958..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ior/jm/T_ior_5.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ior_5.java
-.class public dxc/junit/opcodes/ior/jm/T_ior_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-
-    aload_0
-    iload_2
-    ior
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ior/jm/T_ior_5.java b/tools/dx-tests/src/dxc/junit/opcodes/ior/jm/T_ior_5.java
deleted file mode 100644
index 6dfc5aa..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ior/jm/T_ior_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ior.jm;
-
-public class T_ior_5 {
-    
-    public int run(int a, int b) {
-        return a | b;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/irem/Test_irem.java b/tools/dx-tests/src/dxc/junit/opcodes/irem/Test_irem.java
deleted file mode 100644
index ce72810..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/irem/Test_irem.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.irem;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.irem.jm.T_irem_1;
-
-public class Test_irem extends DxTestCase {
-
-    /**
-     * @title Arguments = 8, 4
-     */
-    public void testN1() {
-        T_irem_1 t = new T_irem_1();
-        assertEquals(0, t.run(8, 4));
-    }
-
-    /**
-     * @title Arguments = 1073741823, 4
-     */
-    public void testN2() {
-        T_irem_1 t = new T_irem_1();
-        assertEquals(3, t.run(1073741823, 4));
-    }
-
-    /**
-     * @title  Dividend = 0
-     */
-    public void testN3() {
-        T_irem_1 t = new T_irem_1();
-        assertEquals(0, t.run(0, 4));
-    }
-
-    /**
-     * @title  Dividend is negative
-     */
-    public void testN4() {
-        T_irem_1 t = new T_irem_1();
-        assertEquals(-1, t.run(-10, 3));
-    }
-
-    /**
-     * @title  Divisor is negative
-     */
-    public void testN5() {
-        T_irem_1 t = new T_irem_1();
-        assertEquals(1, t.run(1073741824, -3));
-    }
-
-    /**
-     * @title  Both Dividend and divisor are negative
-     */
-    public void testN6() {
-        T_irem_1 t = new T_irem_1();
-        assertEquals(-697, t.run(-17895697, -3000));
-    }
-
-    /**
-     * @title Arguments = Integer.MIN_VALUE, -1
-     */
-    public void testB1() {
-        T_irem_1 t = new T_irem_1();
-        // result is MIN_VALUE because overflow occurs in this case
-        assertEquals(0, t.run(Integer.MIN_VALUE, -1));
-    }
-
-    /**
-     * @title Arguments = Integer.MIN_VALUE, 1
-     */
-    public void testB2() {
-        T_irem_1 t = new T_irem_1();
-        assertEquals(0, t.run(Integer.MIN_VALUE, 1));
-    }
-
-    /**
-     * @title Arguments = Integer.MAX_VALUE, 1
-     */
-    public void testB3() {
-        T_irem_1 t = new T_irem_1();
-        assertEquals(0, t.run(Integer.MAX_VALUE, 1));
-    }
-
-    /**
-     * @title Arguments = Integer.MIN_VALUE, Integer.MAX_VALUE
-     */
-    public void testB4() {
-        T_irem_1 t = new T_irem_1();
-        assertEquals(-1, t.run(Integer.MIN_VALUE, Integer.MAX_VALUE));
-    }
-
-    /**
-     * @title Arguments = 1, Integer.MAX_VALUE
-     */
-    public void testB5() {
-        T_irem_1 t = new T_irem_1();
-        assertEquals(1, t.run(1, Integer.MAX_VALUE));
-    }
-
-    /**
-     * @title Arguments = 1, Integer.MIN_VALUE
-     */
-    public void testB6() {
-        T_irem_1 t = new T_irem_1();
-        assertEquals(1, t.run(1, Integer.MIN_VALUE));
-    }
-
-    /**
-     * @title  Divisor is 0
-     */
-    public void testE1() {
-        T_irem_1 t = new T_irem_1();
-        try {
-            t.run(1, 0);
-            fail("expected ArithmeticException");
-        } catch (ArithmeticException ae) {
-            // expected
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.irem.jm.T_irem_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int / double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.irem.jm.T_irem_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long / int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.irem.jm.T_irem_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference / int
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.irem.jm.T_irem_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/irem/jm/T_irem_1.j b/tools/dx-tests/src/dxc/junit/opcodes/irem/jm/T_irem_1.j
deleted file mode 100644
index 2f13c91..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/irem/jm/T_irem_1.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_irem_1.java
-.class public dxc/junit/opcodes/irem/jm/T_irem_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-    iload_1
-    iload_2
-    irem
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/irem/jm/T_irem_1.java b/tools/dx-tests/src/dxc/junit/opcodes/irem/jm/T_irem_1.java
deleted file mode 100644
index e966dea..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/irem/jm/T_irem_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.irem.jm;
-
-public class T_irem_1 {
-
-    public int run(int a, int b) {
-        return a%b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/irem/jm/T_irem_2.j b/tools/dx-tests/src/dxc/junit/opcodes/irem/jm/T_irem_2.j
deleted file mode 100644
index 9c9bf8b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/irem/jm/T_irem_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_irem_2.java
-.class public dxc/junit/opcodes/irem/jm/T_irem_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-    iload_1
-    ; iload_2    
-    irem
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/irem/jm/T_irem_2.java b/tools/dx-tests/src/dxc/junit/opcodes/irem/jm/T_irem_2.java
deleted file mode 100644
index 4ab9d2d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/irem/jm/T_irem_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.irem.jm;
-
-public class T_irem_2 {
-
-    public int run(int a, int b) {
-        return a%b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/irem/jm/T_irem_3.j b/tools/dx-tests/src/dxc/junit/opcodes/irem/jm/T_irem_3.j
deleted file mode 100644
index e07bfea..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/irem/jm/T_irem_3.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_irem_3.java
-.class public dxc/junit/opcodes/irem/jm/T_irem_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(ID)I
-    .limit stack 3
-    .limit locals 5
-    iload_1
-    dload_2    
-    irem
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/irem/jm/T_irem_3.java b/tools/dx-tests/src/dxc/junit/opcodes/irem/jm/T_irem_3.java
deleted file mode 100644
index a7cbab2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/irem/jm/T_irem_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.irem.jm;
-
-public class T_irem_3 {
-
-    public int run(int a, double b) {
-        return a%(int)b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/irem/jm/T_irem_4.j b/tools/dx-tests/src/dxc/junit/opcodes/irem/jm/T_irem_4.j
deleted file mode 100644
index 7571e37..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/irem/jm/T_irem_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_irem_4.java
-.class public dxc/junit/opcodes/irem/jm/T_irem_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(JI)I
-    .limit stack 3
-    .limit locals 4
-
-    lload_1
-;    l2i
-    iload_3
-    irem
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/irem/jm/T_irem_4.java b/tools/dx-tests/src/dxc/junit/opcodes/irem/jm/T_irem_4.java
deleted file mode 100644
index 75b8831..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/irem/jm/T_irem_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.irem.jm;
-
-public class T_irem_4 {
-
-    public int run(long a, int b) {
-        return (int)a%b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/irem/jm/T_irem_5.j b/tools/dx-tests/src/dxc/junit/opcodes/irem/jm/T_irem_5.j
deleted file mode 100644
index 803b81f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/irem/jm/T_irem_5.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_irem_5.java
-.class public dxc/junit/opcodes/irem/jm/T_irem_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-
-    aload_0
-    iload_2
-    irem
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/irem/jm/T_irem_5.java b/tools/dx-tests/src/dxc/junit/opcodes/irem/jm/T_irem_5.java
deleted file mode 100644
index 397fb9c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/irem/jm/T_irem_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.irem.jm;
-
-public class T_irem_5 {
-    
-    public int run(int a, int b) {
-        return a%b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/Test_ireturn.java b/tools/dx-tests/src/dxc/junit/opcodes/ireturn/Test_ireturn.java
deleted file mode 100644
index cdb6450..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/Test_ireturn.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ireturn;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.ireturn.jm.T_ireturn_1;
-import dxc.junit.opcodes.ireturn.jm.T_ireturn_6;
-import dxc.junit.opcodes.ireturn.jm.T_ireturn_7;
-import dxc.junit.opcodes.ireturn.jm.T_ireturn_8;
-import dxc.junit.opcodes.ireturn.jm.T_ireturn_9;
-
-public class Test_ireturn extends DxTestCase {
-
-    /**
-     * @title  simple
-     */
-    public void testN1() {
-        T_ireturn_1 t = new T_ireturn_1();
-        assertEquals(123456, t.run());
-    }
-
-    /**
-     * @title  check that frames are discarded and reinstananted correctly
-     */
-    public void testN2() {
-        T_ireturn_6 t = new T_ireturn_6();
-        assertEquals(123456, t.run());
-    }
-
-    /**
-     * @title  check that monitor is released by ireturn
-     */
-    public void testN3() {
-        assertTrue(T_ireturn_7.execute());
-    }
-
-    /**
-     * @title  Method is synchronized but thread is not monitor owner
-     */
-    public void testE1() {
-        T_ireturn_8 t = new T_ireturn_8();
-        try {
-            assertTrue(t.run());
-            fail("expected IllegalMonitorStateException");
-        } catch (IllegalMonitorStateException imse) {
-            // expected
-        }
-    }
-
-    /**
-     * @title  Lock structural rule 1 is violated
-     */
-    public void testE2() {
-        T_ireturn_9 t = new T_ireturn_9();
-        try {
-            assertEquals(1, t.run());
-            // the JVM spec says that it is optional to implement the structural
-            // lock rules, see JVM spec 8.13 and monitorenter/exit opcodes.
-            System.out.print("dvmvfe:");
-            //fail("expected IllegalMonitorStateException");
-        } catch (IllegalMonitorStateException imse) {
-            // expected
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.14
-     * @title method's return type - void
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.ireturn.jm.T_ireturn_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.14
-     * @title method's return type - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.ireturn.jm.T_ireturn_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.ireturn.jm.T_ireturn_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.ireturn.jm.T_ireturn_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.ireturn.jm.T_ireturn_10");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - reference
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.ireturn.jm.T_ireturn_11");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_1.j b/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_1.j
deleted file mode 100644
index 8ba1daf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_1.j
+++ /dev/null
@@ -1,28 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ireturn_1.java
-.class public dxc/junit/opcodes/ireturn/jm/T_ireturn_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    ldc 123456
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_1.java b/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_1.java
deleted file mode 100644
index fe00032..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ireturn.jm;
-
-public class T_ireturn_1 {
-
-    public int run() {
-        return 123456;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_10.j b/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_10.j
deleted file mode 100644
index f8779af..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_10.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ireturn_10.java
-.class public dxc/junit/opcodes/ireturn/jm/T_ireturn_10
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method private static test()I
-    .limit stack 1
-    .limit locals 0
-
-    iconst_1
-    ireturn
-.end method
-
-
-
-.method public run()I
-    .limit stack 0
-    .limit locals 1
-
-    invokestatic dxc/junit/opcodes/ireturn/jm/T_ireturn_10/test()I
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_10.java b/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_10.java
deleted file mode 100644
index 929c22a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_10.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ireturn.jm;
-
-public class T_ireturn_10 {
-    
-    private static int test() {
-        return 1;
-    }
-    
-    public int run() {
-        return test();
-    }
-    
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_11.j b/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_11.j
deleted file mode 100644
index fa54cc5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_11.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ireturn_11.java
-.class public dxc/junit/opcodes/ireturn/jm/T_ireturn_11
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_11.java b/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_11.java
deleted file mode 100644
index a58a6ba..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ireturn.jm;
-
-public class T_ireturn_11 {
-    
-    public int run() {
-        return 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_2.j b/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_2.j
deleted file mode 100644
index c5d10b0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_2.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ireturn_2.java
-.class public dxc/junit/opcodes/ireturn/jm/T_ireturn_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 1
-    .limit locals 1
-
-    iconst_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_2.java b/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_2.java
deleted file mode 100644
index 074dfd8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ireturn.jm;
-
-public class T_ireturn_2 {
-
-    public int run() {
-        return 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_3.j b/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_3.j
deleted file mode 100644
index 7afc97d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_3.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ireturn_3.java
-.class public dxc/junit/opcodes/ireturn/jm/T_ireturn_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()D
-    .limit stack 1
-    .limit locals 1
-
-    iconst_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_3.java b/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_3.java
deleted file mode 100644
index dba74ee..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ireturn.jm;
-
-public class T_ireturn_3 {
-
-    public int run() {
-        return 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_4.j b/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_4.j
deleted file mode 100644
index 961ad40..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_4.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ireturn_4.java
-.class public dxc/junit/opcodes/ireturn/jm/T_ireturn_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()I
-    .limit stack 1
-    .limit locals 1
-
-    ;iconst_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_4.java b/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_4.java
deleted file mode 100644
index 9b0b1bc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ireturn.jm;
-
-public class T_ireturn_4 {
-
-    public int run() {
-        return 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_5.j b/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_5.j
deleted file mode 100644
index dbd1ac5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_5.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ireturn_5.java
-.class public dxc/junit/opcodes/ireturn/jm/T_ireturn_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()I
-    .limit stack 2
-    .limit locals 1
-
-    dconst_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_5.java b/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_5.java
deleted file mode 100644
index bdeba53..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ireturn.jm;
-
-public class T_ireturn_5 {
-
-    public int run() {
-        return 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_6.j b/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_6.j
deleted file mode 100644
index 3ed78c7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_6.j
+++ /dev/null
@@ -1,85 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ireturn_6.java
-.class public dxc/junit/opcodes/ireturn/jm/T_ireturn_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit locals 6
-    .limit stack 6
-    
-    iconst_1
-    istore_1
-    iconst_2
-    istore_2
-    iconst_3
-    istore 3
-    
-    iconst_4
-    
-    invokestatic dxc/junit/opcodes/ireturn/jm/T_ireturn_6/test()I
-    
-    ldc 0xcafe
-    if_icmpne Label1
-    
-    iconst_4
-    if_icmpne Label0
-    
-    iload_1
-    iconst_1
-    if_icmpne Label0
-    
-    iload_2
-    iconst_2
-    if_icmpne Label0
-    
-    iload_3
-    iconst_3
-    if_icmpne Label0    
-    
-    ldc 123456
-    ireturn
-
-Label1:
-    pop
-Label0:
-    iconst_0
-    ireturn
-
-.end method
-
-.method private static test()I
-    .limit locals 4
-    .limit stack 4
-    
-    ldc 0xaaa
-    istore_1
-    ldc 0xbbbb
-    istore_2
-    ldc 0xcccc
-    istore_3
-    
-    ldc 0xdddd
-    
-    ldc 0xcafe
-    ireturn
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_6.java b/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_6.java
deleted file mode 100644
index dbf7438..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_6.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ireturn.jm;
-
-public class T_ireturn_6 {
-
-    public int run() {
-        return 123456;
-    }
-    
-    private static int test() {
-        int a = 0xaaaa;
-        int b = 0xbbbb;
-        int c = 0xcccc;
-        return 0xcafe;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_7.j b/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_7.j
deleted file mode 100644
index d1b7909..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_7.j
+++ /dev/null
@@ -1,161 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ireturn_7.java
-.class public dxc/junit/opcodes/ireturn/jm/T_ireturn_7
-.super java/lang/Object
-.implements java/lang/Runnable
-
-.field  value I
-.field  failed Z
-
-.method public <init>()V
-    .limit stack 3
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    aload_0
-    iconst_0
-    putfield dxc.junit.opcodes.ireturn.jm.T_ireturn_7.value I
-
-    aload_0
-    iconst_0
-    putfield dxc.junit.opcodes.ireturn.jm.T_ireturn_7.failed Z
-
-    return
-
-.end method
-
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 2
-   
-    iconst_0
-    istore_1
-
-Label4:
-    iload_1
-    sipush 1000
-    if_icmpge Label3
-
-    aload_0
-    invokespecial dxc/junit/opcodes/ireturn/jm/T_ireturn_7/test()I
-    pop
-
-    iinc 1 1
-
-    goto Label4
-
-
-Label3:
-    return
-
-.end method
-
-
-
-.method private synchronized test()I
-    .limit stack 3
-    .limit locals 2
-    
-.line 16
-    aload_0
-    dup
-    getfield dxc.junit.opcodes.ireturn.jm.T_ireturn_7.value I
-    dup
-    istore_1
-
-    iconst_1
-    iadd
-    putfield dxc.junit.opcodes.ireturn.jm.T_ireturn_7.value I
-
-    iinc 1 1
-
-    invokestatic java/lang/Thread/yield()V
-
-    iload_1
-    aload_0
-    getfield dxc.junit.opcodes.ireturn.jm.T_ireturn_7.value I
-    if_icmpeq Label0
-
-    aload_0
-    iconst_1
-    putfield dxc.junit.opcodes.ireturn.jm.T_ireturn_7.failed Z
-
-Label0:
-    iload_1
-    ireturn
-.end method
-
-
-
-.method public static execute()Z
-    .limit stack 3
-    .limit locals 4
-
-    new dxc/junit/opcodes/ireturn/jm/T_ireturn_7
-    dup
-    invokespecial dxc/junit/opcodes/ireturn/jm/T_ireturn_7/<init>()V
-    astore_0
-
-    new java/lang/Thread
-    dup
-    aload_0
-    invokespecial java/lang/Thread/<init>(Ljava/lang/Runnable;)V
-    astore_1
-
-    new java/lang/Thread
-    dup
-    aload_0
-    invokespecial java/lang/Thread/<init>(Ljava/lang/Runnable;)V
-    astore_2
-
-    aload_1
-    invokevirtual java/lang/Thread/start()V
-
-    aload_2
-    invokevirtual java/lang/Thread/start()V
-
-Label12:
-    ldc2_w 5000
-    invokestatic java/lang/Thread/sleep(J)V
-
-Label13:
-    goto Label0
-
-Label14:            ; exception handler
-    astore_3
-    goto Label3
-
-Label0:
-    aload_0
-    getfield dxc.junit.opcodes.ireturn.jm.T_ireturn_7.value I
-    sipush 2000
-    if_icmpne Label3
-
-    aload_0
-    getfield dxc.junit.opcodes.ireturn.jm.T_ireturn_7.failed Z
-    ifne Label3
-
-    iconst_1
-    ireturn
-
-Label3:
-    iconst_0
-    ireturn
-
-.catch java/lang/InterruptedException from Label12 to Label13 using Label14
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_7.java b/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_7.java
deleted file mode 100644
index 3505f19..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_7.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ireturn.jm;
-
-public class T_ireturn_7 implements Runnable {
-    public final static int CNT = 1000;
-    int value = 0;
-    boolean failed = false;
-    
-    public void run() {
-        for(int i = 0; i < CNT; i++) {
-            test();
-        }
-    }
-    
-    private synchronized int test()    {
-        value++;
-        int c = value;
-        Thread.yield();
-        if(c != value)
-            failed = true;
-        return c;
-    }
-    
-    public static boolean execute() {
-        T_ireturn_7 test = new T_ireturn_7();
-        Thread t1 = new Thread(test);
-        Thread t2 = new Thread(test);
-        
-        t1.start();
-        t2.start();
-        
-        try
-        {
-            Thread.sleep(5000);
-        }
-        catch(InterruptedException ie) {
-            return false;
-        }
-        
-        if(test.value != CNT * 2)
-            return false;
-        return !test.failed;
-    }
-    
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_8.j b/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_8.j
deleted file mode 100644
index ad9d528..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_8.j
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ireturn_8.java
-.class public dxc/junit/opcodes/ireturn/jm/T_ireturn_8
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method private synchronized test()I
-    .limit stack 1
-    aload_0
-    monitorexit
-    iconst_0
-    ireturn
-.end method
-
-
-
-.method public run()Z
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokespecial dxc/junit/opcodes/ireturn/jm/T_ireturn_8/test()I
-    pop
-
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_8.java b/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_8.java
deleted file mode 100644
index 9ed48af..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_8.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ireturn.jm;
-
-public class T_ireturn_8 {
-    
-    private synchronized int test() {
-        return 0;
-    }
-    
-    public boolean run() {
-        test();
-        return true;
-    }
-    
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_9.j b/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_9.j
deleted file mode 100644
index 42230f3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_9.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ireturn_9.java
-.class public dxc/junit/opcodes/ireturn/jm/T_ireturn_9
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()I
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    monitorenter
-
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_9.java b/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_9.java
deleted file mode 100644
index 50bc299..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ireturn/jm/T_ireturn_9.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ireturn.jm;
-
-public class T_ireturn_9 {
-    
-    public int run() {
-        return 1;
-    }
-    
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ishl/Test_ishl.java b/tools/dx-tests/src/dxc/junit/opcodes/ishl/Test_ishl.java
deleted file mode 100644
index b433c89..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ishl/Test_ishl.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ishl;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.ishl.jm.T_ishl_1;
-
-public class Test_ishl extends DxTestCase {
-
-    /**
-     * @title  15 << 1
-     */
-    public void testN1() {
-        T_ishl_1 t = new T_ishl_1();
-        assertEquals(30, t.run(15, 1));
-    }
-
-    /**
-     * @title  33 << 2
-     */
-    public void testN2() {
-        T_ishl_1 t = new T_ishl_1();
-        assertEquals(132, t.run(33, 2));
-    }
-
-    /**
-     * @title  -15 << 1
-     */
-    public void testN3() {
-        T_ishl_1 t = new T_ishl_1();
-        assertEquals(-30, t.run(-15, 1));
-    }
-
-    /**
-     * @title  Arguments = 1 & -1
-     */
-    public void testN4() {
-        T_ishl_1 t = new T_ishl_1();
-        assertEquals(0x80000000, t.run(1, -1));
-    }
-
-    /**
-     * @title  Verify that shift distance is actually in range 0 to 32.
-     */
-    public void testN5() {
-        T_ishl_1 t = new T_ishl_1();
-        assertEquals(66, t.run(33, 33));
-    }
-
-    /**
-     * FIXME: do we need to check that all the shift distances (0..31) works
-     * fine?
-     */
-
-    /**
-     * @title  Arguments = 0 & -1
-     */
-    public void testB1() {
-        T_ishl_1 t = new T_ishl_1();
-        assertEquals(0, t.run(0, -1));
-    }
-
-    /**
-     * @title  Arguments = Integer.MAX_VALUE & 1
-     */
-    public void testB2() {
-        T_ishl_1 t = new T_ishl_1();
-        assertEquals(0xfffffffe, t.run(Integer.MAX_VALUE, 1));
-    }
-
-    /**
-     * @title  Arguments = Integer.MIN_VALUE & 1
-     */
-    public void testB3() {
-        T_ishl_1 t = new T_ishl_1();
-        assertEquals(0, t.run(Integer.MIN_VALUE, 1));
-    }
-
-    /**
-     * @title  Arguments = 1 & 0
-     */
-    public void testB4() {
-        T_ishl_1 t = new T_ishl_1();
-        assertEquals(1, t.run(1, 0));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.ishl.jm.T_ishl_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double & int
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.ishl.jm.T_ishl_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long & int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.ishl.jm.T_ishl_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference & int
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.ishl.jm.T_ishl_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ishl/jm/T_ishl_1.j b/tools/dx-tests/src/dxc/junit/opcodes/ishl/jm/T_ishl_1.j
deleted file mode 100644
index a703b28..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ishl/jm/T_ishl_1.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ishl_1.java
-.class public dxc/junit/opcodes/ishl/jm/T_ishl_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-    iload_1
-    iload_2
-    ishl
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ishl/jm/T_ishl_1.java b/tools/dx-tests/src/dxc/junit/opcodes/ishl/jm/T_ishl_1.java
deleted file mode 100644
index 179d4f8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ishl/jm/T_ishl_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ishl.jm;
-
-public class T_ishl_1 {
-
-    public int run(int a, int b) {
-        return a << b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ishl/jm/T_ishl_2.j b/tools/dx-tests/src/dxc/junit/opcodes/ishl/jm/T_ishl_2.j
deleted file mode 100644
index 015f57f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ishl/jm/T_ishl_2.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ishl_2.java
-.class public dxc/junit/opcodes/ishl/jm/T_ishl_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-    iload_1
-;    iload_2
-    ishl
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ishl/jm/T_ishl_2.java b/tools/dx-tests/src/dxc/junit/opcodes/ishl/jm/T_ishl_2.java
deleted file mode 100644
index 94479b4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ishl/jm/T_ishl_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ishl.jm;
-
-public class T_ishl_2 {
-
-    public int run(int a, int b) {
-        return a << b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ishl/jm/T_ishl_3.j b/tools/dx-tests/src/dxc/junit/opcodes/ishl/jm/T_ishl_3.j
deleted file mode 100644
index d1a4f05..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ishl/jm/T_ishl_3.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ishl_3.java
-.class public dxc/junit/opcodes/ishl/jm/T_ishl_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(DI)I
-    .limit stack 3
-    .limit locals 4
-
-    dload_1
-;    d2i
-    iload_3
-    ishl
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ishl/jm/T_ishl_3.java b/tools/dx-tests/src/dxc/junit/opcodes/ishl/jm/T_ishl_3.java
deleted file mode 100644
index e29bdcb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ishl/jm/T_ishl_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ishl.jm;
-
-public class T_ishl_3 {
-
-    public int run(double a, int b) {
-        return (int)a << b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ishl/jm/T_ishl_4.j b/tools/dx-tests/src/dxc/junit/opcodes/ishl/jm/T_ishl_4.j
deleted file mode 100644
index bf5cfb7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ishl/jm/T_ishl_4.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ishl_4.java
-.class public dxc/junit/opcodes/ishl/jm/T_ishl_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(IJ)I
-    .limit stack 3
-    .limit locals 4
-
-    iload_1
-    lload_2
-;    l2i
-    ishl
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ishl/jm/T_ishl_4.java b/tools/dx-tests/src/dxc/junit/opcodes/ishl/jm/T_ishl_4.java
deleted file mode 100644
index ea7a5ff..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ishl/jm/T_ishl_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ishl.jm;
-
-public class T_ishl_4 {
-
-    public int run(int a, long b) {
-        return a << (int)b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ishl/jm/T_ishl_5.j b/tools/dx-tests/src/dxc/junit/opcodes/ishl/jm/T_ishl_5.j
deleted file mode 100644
index f5af8bd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ishl/jm/T_ishl_5.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ishl_5.java
-.class public dxc/junit/opcodes/ishl/jm/T_ishl_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-
-    aload_0
-    iload_2
-    ishl
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ishl/jm/T_ishl_5.java b/tools/dx-tests/src/dxc/junit/opcodes/ishl/jm/T_ishl_5.java
deleted file mode 100644
index 6db63ce..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ishl/jm/T_ishl_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ishl.jm;
-
-public class T_ishl_5 {
-
-    public int run(int a, int b) {
-        return a << b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ishr/Test_ishr.java b/tools/dx-tests/src/dxc/junit/opcodes/ishr/Test_ishr.java
deleted file mode 100644
index eaed21c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ishr/Test_ishr.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ishr;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.ishr.jm.T_ishr_1;
-
-public class Test_ishr extends DxTestCase {
-
-    /**
-     * @title  15 >> 1
-     */
-    public void testN1() {
-        T_ishr_1 t = new T_ishr_1();
-        assertEquals(7, t.run(15, 1));
-    }
-
-    /**
-     * @title  33 >> 2
-     */
-    public void testN2() {
-        T_ishr_1 t = new T_ishr_1();
-        assertEquals(8, t.run(33, 2));
-    }
-
-    /**
-     * @title  -15 >> 1
-     */
-    public void testN3() {
-        T_ishr_1 t = new T_ishr_1();
-        assertEquals(-8, t.run(-15, 1));
-    }
-
-    /**
-     * @title  Arguments = 1 & -1
-     */
-    public void testN4() {
-        T_ishr_1 t = new T_ishr_1();
-        assertEquals(0, t.run(1, -1));
-    }
-
-    /**
-     * @title  Verify that shift distance is actually in range 0 to 32.
-     */
-    public void testN5() {
-        T_ishr_1 t = new T_ishr_1();
-        assertEquals(16, t.run(33, 33));
-    }
-
-    /**
-     * @title  Arguments = 0 & -1
-     */
-    public void testB1() {
-        T_ishr_1 t = new T_ishr_1();
-        assertEquals(0, t.run(0, -1));
-    }
-
-    /**
-     * @title  Arguments = Integer.MAX_VALUE & 1
-     */
-    public void testB2() {
-        T_ishr_1 t = new T_ishr_1();
-        assertEquals(0x3FFFFFFF, t.run(Integer.MAX_VALUE, 1));
-    }
-
-    /**
-     * @title  Arguments = Integer.MIN_VALUE & 1
-     */
-    public void testB3() {
-        T_ishr_1 t = new T_ishr_1();
-        assertEquals(0xc0000000, t.run(Integer.MIN_VALUE, 1));
-    }
-
-    /**
-     * @title  Arguments = 1 & 0
-     */
-    public void testB4() {
-        T_ishr_1 t = new T_ishr_1();
-        assertEquals(1, t.run(1, 0));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.ishr.jm.T_ishr_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double & int
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.ishr.jm.T_ishr_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long & int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.ishr.jm.T_ishr_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference & int
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.ishr.jm.T_ishr_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ishr/jm/T_ishr_1.j b/tools/dx-tests/src/dxc/junit/opcodes/ishr/jm/T_ishr_1.j
deleted file mode 100644
index 227936c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ishr/jm/T_ishr_1.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ishr_1.java
-.class public dxc/junit/opcodes/ishr/jm/T_ishr_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-    iload_1
-    iload_2
-    ishr
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ishr/jm/T_ishr_1.java b/tools/dx-tests/src/dxc/junit/opcodes/ishr/jm/T_ishr_1.java
deleted file mode 100644
index 388f28d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ishr/jm/T_ishr_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ishr.jm;
-
-public class T_ishr_1 {
-
-    public int run(int a, int b) {
-        return a >> b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ishr/jm/T_ishr_2.j b/tools/dx-tests/src/dxc/junit/opcodes/ishr/jm/T_ishr_2.j
deleted file mode 100644
index 21e352f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ishr/jm/T_ishr_2.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ishr_2.java
-.class public dxc/junit/opcodes/ishr/jm/T_ishr_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-    iload_1
-;    iload_2
-    ishr
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ishr/jm/T_ishr_2.java b/tools/dx-tests/src/dxc/junit/opcodes/ishr/jm/T_ishr_2.java
deleted file mode 100644
index 4e5a4aa..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ishr/jm/T_ishr_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ishr.jm;
-
-public class T_ishr_2 {
-
-    public int run(int a, int b) {
-        return a >> b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ishr/jm/T_ishr_3.j b/tools/dx-tests/src/dxc/junit/opcodes/ishr/jm/T_ishr_3.j
deleted file mode 100644
index 26d6bd5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ishr/jm/T_ishr_3.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ishr_3.java
-.class public dxc/junit/opcodes/ishr/jm/T_ishr_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(DI)I
-    .limit stack 3
-    .limit locals 4
-
-    dload_1
-;    d2i
-    iload_3
-    ishr
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ishr/jm/T_ishr_3.java b/tools/dx-tests/src/dxc/junit/opcodes/ishr/jm/T_ishr_3.java
deleted file mode 100644
index bee515f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ishr/jm/T_ishr_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ishr.jm;
-
-public class T_ishr_3 {
-
-    public int run(double a, int b) {
-        return (int)a >> b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ishr/jm/T_ishr_4.j b/tools/dx-tests/src/dxc/junit/opcodes/ishr/jm/T_ishr_4.j
deleted file mode 100644
index 78f5c70..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ishr/jm/T_ishr_4.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ishr_4.java
-.class public dxc/junit/opcodes/ishr/jm/T_ishr_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(IJ)I
-    .limit stack 3
-    .limit locals 4
-
-    iload_1
-    lload_2
-;    l2i
-    ishr
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ishr/jm/T_ishr_4.java b/tools/dx-tests/src/dxc/junit/opcodes/ishr/jm/T_ishr_4.java
deleted file mode 100644
index c8c90be..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ishr/jm/T_ishr_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ishr.jm;
-
-public class T_ishr_4 {
-
-    public int run(int a, long b) {
-        return a >> (int)b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ishr/jm/T_ishr_5.j b/tools/dx-tests/src/dxc/junit/opcodes/ishr/jm/T_ishr_5.j
deleted file mode 100644
index 8abb1ae..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ishr/jm/T_ishr_5.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ishr_5.java
-.class public dxc/junit/opcodes/ishr/jm/T_ishr_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-
-    aload_0
-    iload_2
-    ishr
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ishr/jm/T_ishr_5.java b/tools/dx-tests/src/dxc/junit/opcodes/ishr/jm/T_ishr_5.java
deleted file mode 100644
index 158f740..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ishr/jm/T_ishr_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ishr.jm;
-
-public class T_ishr_5 {
-    
-    public int run(int a, int b) {
-        return a >> b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore/Test_istore.java b/tools/dx-tests/src/dxc/junit/opcodes/istore/Test_istore.java
deleted file mode 100644
index 0bf0a72..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore/Test_istore.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.istore.jm.T_istore_1;
-import dxc.junit.opcodes.istore.jm.T_istore_1_w;
-import dxc.junit.opcodes.istore.jm.T_istore_5;
-import dxc.junit.opcodes.istore.jm.T_istore_5_w;
-
-public class Test_istore extends DxTestCase {
-
-    /*
-     * NORMAL ISTORE VERSION
-     */
-
-    /**
-     * @title  istore 0
-     */
-    public void testN1() {
-        assertEquals(3, T_istore_1.run());
-    }
-
-    /**
-     * @title  istore 255
-     */
-    public void testN2() {
-        assertEquals(3, T_istore_5.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.istore.jm.T_istore_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.istore.jm.T_istore_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.istore.jm.T_istore_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /*
-     * WIDE ISTORE VERSION
-     */
-
-    /**
-     * @title  istore_w 0
-     */
-    public void testN3() {
-        assertEquals(3, T_istore_1_w.run());
-    }
-
-    /**
-     * @title  istore 257
-     */
-    public void testN4() {
-        assertEquals(3, T_istore_5_w.run());
-    }
-
-    /**
-     * @constraint 4.8.1.25
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.istore.jm.T_istore_2_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.istore.jm.T_istore_3_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.istore.jm.T_istore_4_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_1.j b/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_1.j
deleted file mode 100644
index 2b56c03..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_istore_1.java
-.class public dxc/junit/opcodes/istore/jm/T_istore_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()I
-    .limit stack 2
-    .limit locals 1
-    
-    iconst_3
-    istore 0
-    iconst_4
-    iload 0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_1.java b/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_1.java
deleted file mode 100644
index 26bb424..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore.jm;
-
-public class T_istore_1 {
-
-    public static int run() {
-        return 3;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_1_w.j b/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_1_w.j
deleted file mode 100644
index fd4e415..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_1_w.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_istore_1_w.java
-.class public dxc/junit/opcodes/istore/jm/T_istore_1_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()I
-    .limit stack 2
-    .limit locals 1
-    
-    iconst_3
-    istore_w 0
-    iconst_4
-    iload 0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_1_w.java b/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_1_w.java
deleted file mode 100644
index 4de9c68..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_1_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore.jm;
-
-public class T_istore_1_w {
-
-    public static int run() {
-        return 3;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_2.j b/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_2.j
deleted file mode 100644
index c84ab6f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_istore_2.java
-.class public dxc/junit/opcodes/istore/jm/T_istore_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    istore 0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_2.java b/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_2.java
deleted file mode 100644
index 7c31a2f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore.jm;
-
-public class T_istore_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_2_w.j b/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_2_w.j
deleted file mode 100644
index 4366807..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_2_w.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_istore_2_w.java
-.class public dxc/junit/opcodes/istore/jm/T_istore_2_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    istore_w 0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_2_w.java b/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_2_w.java
deleted file mode 100644
index eea683b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_2_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore.jm;
-
-public class T_istore_2_w {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_3.j b/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_3.j
deleted file mode 100644
index d7bd3b6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_3.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_istore_3.java
-.class public dxc/junit/opcodes/istore/jm/T_istore_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    dconst_1
-    istore 0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_3.java b/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_3.java
deleted file mode 100644
index 094c6c6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore.jm;
-
-public class T_istore_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_3_w.j b/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_3_w.j
deleted file mode 100644
index dfac893..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_3_w.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_istore_3_w.java
-.class public dxc/junit/opcodes/istore/jm/T_istore_3_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    dconst_1
-    istore_w 0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_3_w.java b/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_3_w.java
deleted file mode 100644
index 9b2f312..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_3_w.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore.jm;
-
-public class T_istore_3_w {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_4.j b/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_4.j
deleted file mode 100644
index 6252b44..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_4.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_istore_4.java
-.class public dxc/junit/opcodes/istore/jm/T_istore_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    istore 0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_4.java b/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_4.java
deleted file mode 100644
index c7882a3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore.jm;
-
-public class T_istore_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_4_w.j b/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_4_w.j
deleted file mode 100644
index 7050afa..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_4_w.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_istore_4_w.java
-.class public dxc/junit/opcodes/istore/jm/T_istore_4_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    istore_w 0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_4_w.java b/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_4_w.java
deleted file mode 100644
index 79d0d0a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_4_w.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore.jm;
-
-public class T_istore_4_w {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_5.j b/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_5.j
deleted file mode 100644
index 41e7c1f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_5.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_istore_5.java
-.class public dxc/junit/opcodes/istore/jm/T_istore_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()I
-    .limit stack 2
-    .limit locals 300
-    
-    iconst_3
-    istore 255
-    iconst_4
-    iload 255
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_5.java b/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_5.java
deleted file mode 100644
index 51761df..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore.jm;
-
-public class T_istore_5 {
-
-    public static int run() {
-        return 3;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_5_w.j b/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_5_w.j
deleted file mode 100644
index 79ddbac..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_5_w.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_istore_5_w.java
-.class public dxc/junit/opcodes/istore/jm/T_istore_5_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()I
-    .limit stack 2
-    .limit locals 300
-    
-    iconst_3
-    istore_w 257
-    iconst_4
-    iload 257
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_5_w.java b/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_5_w.java
deleted file mode 100644
index 456e1c6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore/jm/T_istore_5_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore.jm;
-
-public class T_istore_5_w {
-
-    public static int run() {
-        return 3;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_0/Test_istore_0.java b/tools/dx-tests/src/dxc/junit/opcodes/istore_0/Test_istore_0.java
deleted file mode 100644
index 5db3ee1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_0/Test_istore_0.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore_0;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.istore_0.jm.T_istore_0_1;
-import dxc.junit.opcodes.istore_0.jm.T_istore_0_5;
-
-public class Test_istore_0 extends DxTestCase {
-
-    /**
-     * @title 
-     * "The value of local variable at <n> is pushed onto the operand stack."
-     */
-    public void testN1() {
-        assertEquals(3, T_istore_0_1.run());
-    }
-
-    /**
-     * @title 
-     * "Each of the istore_<n> instructions is the same as istore with an index of <n>"
-     */
-    public void testN2() {
-        assertTrue(T_istore_0_5.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.istore_0.jm.T_istore_0_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.istore_0.jm.T_istore_0_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.istore_0.jm.T_istore_0_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_0/jm/T_istore_0_1.j b/tools/dx-tests/src/dxc/junit/opcodes/istore_0/jm/T_istore_0_1.j
deleted file mode 100644
index 018b594..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_0/jm/T_istore_0_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_istore_0_1.java
-.class public dxc/junit/opcodes/istore_0/jm/T_istore_0_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()I
-    .limit stack 2
-    .limit locals 1
-    
-    iconst_3
-    istore_0
-    iconst_4
-    iload_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_0/jm/T_istore_0_1.java b/tools/dx-tests/src/dxc/junit/opcodes/istore_0/jm/T_istore_0_1.java
deleted file mode 100644
index 1674efd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_0/jm/T_istore_0_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore_0.jm;
-
-public class T_istore_0_1 {
-
-    public static int run() {
-        return 3;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_0/jm/T_istore_0_2.j b/tools/dx-tests/src/dxc/junit/opcodes/istore_0/jm/T_istore_0_2.j
deleted file mode 100644
index 72a9b7e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_0/jm/T_istore_0_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_istore_0_2.java
-.class public dxc/junit/opcodes/istore_0/jm/T_istore_0_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    istore_0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_0/jm/T_istore_0_2.java b/tools/dx-tests/src/dxc/junit/opcodes/istore_0/jm/T_istore_0_2.java
deleted file mode 100644
index 072ea72..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_0/jm/T_istore_0_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore_0.jm;
-
-public class T_istore_0_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_0/jm/T_istore_0_3.j b/tools/dx-tests/src/dxc/junit/opcodes/istore_0/jm/T_istore_0_3.j
deleted file mode 100644
index 8e48f0c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_0/jm/T_istore_0_3.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_istore_0_3.java
-.class public dxc/junit/opcodes/istore_0/jm/T_istore_0_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    dconst_1
-    istore_0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_0/jm/T_istore_0_3.java b/tools/dx-tests/src/dxc/junit/opcodes/istore_0/jm/T_istore_0_3.java
deleted file mode 100644
index 7b4b791..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_0/jm/T_istore_0_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore_0.jm;
-
-public class T_istore_0_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_0/jm/T_istore_0_4.j b/tools/dx-tests/src/dxc/junit/opcodes/istore_0/jm/T_istore_0_4.j
deleted file mode 100644
index 97a9b31..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_0/jm/T_istore_0_4.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_istore_0_4.java
-.class public dxc/junit/opcodes/istore_0/jm/T_istore_0_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    istore_0
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_0/jm/T_istore_0_4.java b/tools/dx-tests/src/dxc/junit/opcodes/istore_0/jm/T_istore_0_4.java
deleted file mode 100644
index afe4463..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_0/jm/T_istore_0_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore_0.jm;
-
-public class T_istore_0_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_0/jm/T_istore_0_5.j b/tools/dx-tests/src/dxc/junit/opcodes/istore_0/jm/T_istore_0_5.j
deleted file mode 100644
index 2d44529..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_0/jm/T_istore_0_5.j
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_istore_0_5.java
-.class public dxc/junit/opcodes/istore_0/jm/T_istore_0_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()Z
-    .limit stack 2
-    .limit locals 2
-
-    iconst_4
-    istore_0
-    iload_0
-
-    iconst_4
-    istore 0
-    iload_0
-    
-    if_icmpne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_0/jm/T_istore_0_5.java b/tools/dx-tests/src/dxc/junit/opcodes/istore_0/jm/T_istore_0_5.java
deleted file mode 100644
index f1de781..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_0/jm/T_istore_0_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore_0.jm;
-
-public class T_istore_0_5 {
-
-    public static boolean run() {
-        int i = 4;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_1/Test_istore_1.java b/tools/dx-tests/src/dxc/junit/opcodes/istore_1/Test_istore_1.java
deleted file mode 100644
index f19e001..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_1/Test_istore_1.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore_1;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.istore_1.jm.T_istore_1_1;
-import dxc.junit.opcodes.istore_1.jm.T_istore_1_5;
-
-public class Test_istore_1 extends DxTestCase {
-
-    /**
-     * @title value of local variable at <n> is pushed onto the operand stack
-     */
-    public void testN1() {
-        assertEquals(3, T_istore_1_1.run());
-    }
-
-    /**
-     * @title each of the istore_<n> instructions is the same as istore with an index of <n>
-     */
-    public void testN2() {
-        assertTrue(T_istore_1_5.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.istore_1.jm.T_istore_1_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.istore_1.jm.T_istore_1_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.istore_1.jm.T_istore_1_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_1.j b/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_1.j
deleted file mode 100644
index 19950d5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_istore_1_1.java
-.class public dxc/junit/opcodes/istore_1/jm/T_istore_1_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()I
-    .limit stack 2
-    .limit locals 2
-    
-    iconst_3
-    istore_1
-    iconst_4
-    iload_1
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_1.java b/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_1.java
deleted file mode 100644
index 862a5ee..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore_1.jm;
-
-public class T_istore_1_1 {
-
-    public static int run() {
-        return 3;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_2.j b/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_2.j
deleted file mode 100644
index 5e4ba56..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_istore_1_2.java
-.class public dxc/junit/opcodes/istore_1/jm/T_istore_1_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    istore_1
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_2.java b/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_2.java
deleted file mode 100644
index 914e29a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore_1.jm;
-
-public class T_istore_1_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_3.j b/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_3.j
deleted file mode 100644
index 46c9882..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_3.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_istore_1_3.java
-.class public dxc/junit/opcodes/istore_1/jm/T_istore_1_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    dconst_1
-    istore_1
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_3.java b/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_3.java
deleted file mode 100644
index 4e6c906..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore_1.jm;
-
-public class T_istore_1_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_4.j b/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_4.j
deleted file mode 100644
index f5d9dd6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_4.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_istore_1_4.java
-.class public dxc/junit/opcodes/istore_1/jm/T_istore_1_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    istore_1
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_4.java b/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_4.java
deleted file mode 100644
index ef863a0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore_1.jm;
-
-public class T_istore_1_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_5.j b/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_5.j
deleted file mode 100644
index 2f36d55..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_5.j
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_istore_1_5.java
-.class public dxc/junit/opcodes/istore_1/jm/T_istore_1_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()Z
-    .limit stack 2
-    .limit locals 2
-
-    iconst_4
-    istore_1
-    iload_1
-
-    iconst_4
-    istore 1
-    iload_1
-    
-    if_icmpne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_5.java b/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_5.java
deleted file mode 100644
index 1169514..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore_1.jm;
-
-public class T_istore_1_5 {
-
-    public static boolean run() {
-        int i = 4;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_6.java b/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_6.java
deleted file mode 100644
index 91d705a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_1/jm/T_istore_1_6.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore_1.jm;
-
-public class T_istore_1_6 {
-
-    public static boolean run() {
-        int i = 4;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_2/Test_istore_2.java b/tools/dx-tests/src/dxc/junit/opcodes/istore_2/Test_istore_2.java
deleted file mode 100644
index 5969a29..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_2/Test_istore_2.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore_2;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.istore_2.jm.T_istore_2_1;
-import dxc.junit.opcodes.istore_2.jm.T_istore_2_5;
-
-public class Test_istore_2 extends DxTestCase {
-
-    /**
-     * @title value of local variable at <n> is pushed onto the operand stack.
-     */
-    public void testN1() {
-        assertEquals(3, T_istore_2_1.run());
-    }
-
-    /**
-     * @title Each of the istore_<n> instructions is the same as istore with an index of <n>
-     */
-    public void testN2() {
-        assertTrue(T_istore_2_5.run());
-    }
-
-    /**
-     * /** @constraint 4.8.1.22
-     * @title index must be no greater than the
-     * value of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.istore_2.jm.T_istore_2_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.istore_2.jm.T_istore_2_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.istore_2.jm.T_istore_2_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_2/jm/T_istore_2_1.j b/tools/dx-tests/src/dxc/junit/opcodes/istore_2/jm/T_istore_2_1.j
deleted file mode 100644
index 08ecc36..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_2/jm/T_istore_2_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_istore_2_1.java
-.class public dxc/junit/opcodes/istore_2/jm/T_istore_2_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()I
-    .limit stack 2
-    .limit locals 4
-    
-    iconst_3
-    istore_2
-    iconst_4
-    iload_2
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_2/jm/T_istore_2_1.java b/tools/dx-tests/src/dxc/junit/opcodes/istore_2/jm/T_istore_2_1.java
deleted file mode 100644
index ee46237..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_2/jm/T_istore_2_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore_2.jm;
-
-public class T_istore_2_1 {
-
-    public static int run() {
-        return 3;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_2/jm/T_istore_2_2.j b/tools/dx-tests/src/dxc/junit/opcodes/istore_2/jm/T_istore_2_2.j
deleted file mode 100644
index a87b68b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_2/jm/T_istore_2_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_istore_2_2.java
-.class public dxc/junit/opcodes/istore_2/jm/T_istore_2_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    istore_2
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_2/jm/T_istore_2_2.java b/tools/dx-tests/src/dxc/junit/opcodes/istore_2/jm/T_istore_2_2.java
deleted file mode 100644
index 0bd11f7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_2/jm/T_istore_2_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore_2.jm;
-
-public class T_istore_2_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_2/jm/T_istore_2_3.j b/tools/dx-tests/src/dxc/junit/opcodes/istore_2/jm/T_istore_2_3.j
deleted file mode 100644
index c3a6c6f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_2/jm/T_istore_2_3.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_istore_2_3.java
-.class public dxc/junit/opcodes/istore_2/jm/T_istore_2_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    dconst_1
-    istore_2
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_2/jm/T_istore_2_3.java b/tools/dx-tests/src/dxc/junit/opcodes/istore_2/jm/T_istore_2_3.java
deleted file mode 100644
index 7b1052c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_2/jm/T_istore_2_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore_2.jm;
-
-public class T_istore_2_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_2/jm/T_istore_2_4.j b/tools/dx-tests/src/dxc/junit/opcodes/istore_2/jm/T_istore_2_4.j
deleted file mode 100644
index e78662a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_2/jm/T_istore_2_4.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_istore_2_4.java
-.class public dxc/junit/opcodes/istore_2/jm/T_istore_2_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    istore_2
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_2/jm/T_istore_2_4.java b/tools/dx-tests/src/dxc/junit/opcodes/istore_2/jm/T_istore_2_4.java
deleted file mode 100644
index ef0a44b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_2/jm/T_istore_2_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore_2.jm;
-
-public class T_istore_2_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_2/jm/T_istore_2_5.j b/tools/dx-tests/src/dxc/junit/opcodes/istore_2/jm/T_istore_2_5.j
deleted file mode 100644
index 65212ec..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_2/jm/T_istore_2_5.j
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_istore_2_5.java
-.class public dxc/junit/opcodes/istore_2/jm/T_istore_2_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()Z
-    .limit stack 2
-    .limit locals 3
-
-    iconst_4
-    istore_2
-    iload_2
-
-    iconst_4
-    istore 2
-    iload_2
-    
-    if_icmpne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_2/jm/T_istore_2_5.java b/tools/dx-tests/src/dxc/junit/opcodes/istore_2/jm/T_istore_2_5.java
deleted file mode 100644
index 3d852d3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_2/jm/T_istore_2_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore_2.jm;
-
-public class T_istore_2_5 {
-
-    public static boolean run() {
-        int i = 4;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_3/Test_istore_3.java b/tools/dx-tests/src/dxc/junit/opcodes/istore_3/Test_istore_3.java
deleted file mode 100644
index 3935338..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_3/Test_istore_3.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore_3;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.istore_3.jm.T_istore_3_1;
-import dxc.junit.opcodes.istore_3.jm.T_istore_3_5;
-
-public class Test_istore_3 extends DxTestCase {
-
-    /**
-     * @title value of local variable at <n> is pushed onto the operand stack.
-     */
-    public void testN1() {
-        assertEquals(3, T_istore_3_1.run());
-    }
-
-    /**
-     * @title Each of the istore_<n> instructions is the same as istore with an index of <n>
-     */
-    public void testN2() {
-        assertTrue(T_istore_3_5.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.istore_3.jm.T_istore_3_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.istore_3.jm.T_istore_3_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.istore_3.jm.T_istore_3_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_3/jm/T_istore_3_1.j b/tools/dx-tests/src/dxc/junit/opcodes/istore_3/jm/T_istore_3_1.j
deleted file mode 100644
index 4500a87..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_3/jm/T_istore_3_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_istore_3_1.java
-.class public dxc/junit/opcodes/istore_3/jm/T_istore_3_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()I
-    .limit stack 2
-    .limit locals 4
-    
-    iconst_3
-    istore_3
-    iconst_4
-    iload_3
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_3/jm/T_istore_3_1.java b/tools/dx-tests/src/dxc/junit/opcodes/istore_3/jm/T_istore_3_1.java
deleted file mode 100644
index 6e26dac..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_3/jm/T_istore_3_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore_3.jm;
-
-public class T_istore_3_1 {
-
-    public static int run() {
-        return 3;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_3/jm/T_istore_3_2.j b/tools/dx-tests/src/dxc/junit/opcodes/istore_3/jm/T_istore_3_2.j
deleted file mode 100644
index 0be8ae9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_3/jm/T_istore_3_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_istore_3_2.java
-.class public dxc/junit/opcodes/istore_3/jm/T_istore_3_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    istore_3
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_3/jm/T_istore_3_2.java b/tools/dx-tests/src/dxc/junit/opcodes/istore_3/jm/T_istore_3_2.java
deleted file mode 100644
index cd6cc2e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_3/jm/T_istore_3_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore_3.jm;
-
-public class T_istore_3_2 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_3/jm/T_istore_3_3.j b/tools/dx-tests/src/dxc/junit/opcodes/istore_3/jm/T_istore_3_3.j
deleted file mode 100644
index e481f78..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_3/jm/T_istore_3_3.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_istore_3_3.java
-.class public dxc/junit/opcodes/istore_3/jm/T_istore_3_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    dconst_1
-    istore_3
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_3/jm/T_istore_3_3.java b/tools/dx-tests/src/dxc/junit/opcodes/istore_3/jm/T_istore_3_3.java
deleted file mode 100644
index b51534a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_3/jm/T_istore_3_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore_3.jm;
-
-public class T_istore_3_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_3/jm/T_istore_3_4.j b/tools/dx-tests/src/dxc/junit/opcodes/istore_3/jm/T_istore_3_4.j
deleted file mode 100644
index 0c6e947..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_3/jm/T_istore_3_4.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_istore_3_4.java
-.class public dxc/junit/opcodes/istore_3/jm/T_istore_3_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    lconst_1
-    istore_3
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_3/jm/T_istore_3_4.java b/tools/dx-tests/src/dxc/junit/opcodes/istore_3/jm/T_istore_3_4.java
deleted file mode 100644
index 9eebda6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_3/jm/T_istore_3_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore_3.jm;
-
-public class T_istore_3_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_3/jm/T_istore_3_5.j b/tools/dx-tests/src/dxc/junit/opcodes/istore_3/jm/T_istore_3_5.j
deleted file mode 100644
index 6a10077..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_3/jm/T_istore_3_5.j
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_istore_3_5.java
-.class public dxc/junit/opcodes/istore_3/jm/T_istore_3_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public static run()Z
-    .limit stack 2
-    .limit locals 4
-
-    iconst_4
-    istore_3
-    iload_3
-
-    iconst_4
-    istore 3
-    iload_3
-    
-    if_icmpne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/istore_3/jm/T_istore_3_5.java b/tools/dx-tests/src/dxc/junit/opcodes/istore_3/jm/T_istore_3_5.java
deleted file mode 100644
index dc6c7ef..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/istore_3/jm/T_istore_3_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.istore_3.jm;
-
-public class T_istore_3_5 {
-
-    public static boolean run() {
-        int i = 4;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/isub/Test_isub.java b/tools/dx-tests/src/dxc/junit/opcodes/isub/Test_isub.java
deleted file mode 100644
index a31f856..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/isub/Test_isub.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.isub;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.isub.jm.T_isub_1;
-
-public class Test_isub extends DxTestCase {
-
-    /**
-     * @title Arguments = 8, 4
-     */
-    public void testN1() {
-        T_isub_1 t = new T_isub_1();
-        assertEquals(4, t.run(8, 4));
-    }
-
-    /**
-     * @title Arguments = 0, 255
-     */
-    public void testN2() {
-        T_isub_1 t = new T_isub_1();
-        assertEquals(-255, t.run(0, 255));
-    }
-
-    /**
-     * @title Arguments = 0, -65536
-     */
-    public void testN3() {
-        T_isub_1 t = new T_isub_1();
-        assertEquals(65536, t.run(0, -65536));
-    }
-
-    /**
-     * @title Arguments = 0, -2147483647
-     */
-    public void testN4() {
-        T_isub_1 t = new T_isub_1();
-        assertEquals(Integer.MAX_VALUE, t.run(0, -2147483647));
-    }
-
-    /**
-     * @title Arguments = 0, Integer.MAX_VALUE
-     */
-    public void testB1() {
-        T_isub_1 t = new T_isub_1();
-        assertEquals(-2147483647, t.run(0, Integer.MAX_VALUE));
-    }
-
-    /**
-     * @title Arguments = Integer.MAX_VALUE, Integer.MAX_VALUE
-     */
-    public void testB2() {
-        T_isub_1 t = new T_isub_1();
-        assertEquals(0, t.run(Integer.MAX_VALUE, Integer.MAX_VALUE));
-    }
-
-    /**
-     * @title Arguments = Integer.MAX_VALUE, -1
-     */
-    public void testB3() {
-        T_isub_1 t = new T_isub_1();
-        assertEquals(Integer.MIN_VALUE, t.run(Integer.MAX_VALUE, -1));
-    }
-
-    /**
-     * @title Arguments = Integer.MIN_VALUE, 1
-     */
-    public void testB4() {
-        T_isub_1 t = new T_isub_1();
-        assertEquals(Integer.MAX_VALUE, t.run(Integer.MIN_VALUE, 1));
-    }
-
-    /**
-     * @title Arguments = 0, 0
-     */
-    public void testB5() {
-        T_isub_1 t = new T_isub_1();
-        assertEquals(0, t.run(0, 0));
-    }
-
-    /**
-     * @title Arguments = 0, -Integer.MIN_VALUE
-     */
-    public void testB6() {
-        T_isub_1 t = new T_isub_1();
-        assertEquals(-2147483648, t.run(0, -Integer.MIN_VALUE));
-    }
-
-    /**
-     * @title Arguments = Integer.MAX_VALUE, 1
-     */
-    public void testB7() {
-        T_isub_1 t = new T_isub_1();
-        assertEquals(2147483646, t.run(Integer.MAX_VALUE, 1));
-    }
-
-    /**
-     * @title Arguments = 1, Integer.MIN_VALUE
-     */
-    public void testB8() {
-        T_isub_1 t = new T_isub_1();
-        assertEquals(-2147483647, t.run(1, Integer.MIN_VALUE));
-    }
-
-    /**
-     * @title Arguments = Integer.MAX_VALUE, Integer.MIN_VALUE
-     */
-    public void testB9() {
-        T_isub_1 t = new T_isub_1();
-        assertEquals(-1, t.run(Integer.MAX_VALUE, Integer.MIN_VALUE));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.isub.jm.T_isub_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int / double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.isub.jm.T_isub_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long / int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.isub.jm.T_isub_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference / int
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.isub.jm.T_isub_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/isub/jm/T_isub_1.j b/tools/dx-tests/src/dxc/junit/opcodes/isub/jm/T_isub_1.j
deleted file mode 100644
index d406038..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/isub/jm/T_isub_1.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_isub_1.java
-.class public dxc/junit/opcodes/isub/jm/T_isub_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-    iload_1
-    iload_2
-    isub
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/isub/jm/T_isub_1.java b/tools/dx-tests/src/dxc/junit/opcodes/isub/jm/T_isub_1.java
deleted file mode 100644
index bcb204e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/isub/jm/T_isub_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.isub.jm;
-
-public class T_isub_1 {
-
-    public int run(int a, int b) {
-        return a-b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/isub/jm/T_isub_2.j b/tools/dx-tests/src/dxc/junit/opcodes/isub/jm/T_isub_2.j
deleted file mode 100644
index d9c100a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/isub/jm/T_isub_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_isub_2.java
-.class public dxc/junit/opcodes/isub/jm/T_isub_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-    iload_1
-    ; iload_2    
-    isub
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/isub/jm/T_isub_2.java b/tools/dx-tests/src/dxc/junit/opcodes/isub/jm/T_isub_2.java
deleted file mode 100644
index b0c22d1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/isub/jm/T_isub_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.isub.jm;
-
-public class T_isub_2 {
-
-    public int run(int a, int b) {
-        return a-b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/isub/jm/T_isub_3.j b/tools/dx-tests/src/dxc/junit/opcodes/isub/jm/T_isub_3.j
deleted file mode 100644
index e8afde9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/isub/jm/T_isub_3.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_isub_3.java
-.class public dxc/junit/opcodes/isub/jm/T_isub_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(ID)I
-    .limit stack 3
-    .limit locals 5
-    iload_1
-    dload_2    
-    isub
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/isub/jm/T_isub_3.java b/tools/dx-tests/src/dxc/junit/opcodes/isub/jm/T_isub_3.java
deleted file mode 100644
index 0bfd571..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/isub/jm/T_isub_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.isub.jm;
-
-public class T_isub_3 {
-
-    public int run(int a, double b) {
-        return a-(int)b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/isub/jm/T_isub_4.j b/tools/dx-tests/src/dxc/junit/opcodes/isub/jm/T_isub_4.j
deleted file mode 100644
index 93d9f1d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/isub/jm/T_isub_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_isub_4.java
-.class public dxc/junit/opcodes/isub/jm/T_isub_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(JI)I
-    .limit stack 3
-    .limit locals 4
-
-    lload_1
-;    l2i
-    iload_3
-    isub
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/isub/jm/T_isub_4.java b/tools/dx-tests/src/dxc/junit/opcodes/isub/jm/T_isub_4.java
deleted file mode 100644
index 66b9274..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/isub/jm/T_isub_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.isub.jm;
-
-public class T_isub_4 {
-
-    public int run(long a, int b) {
-        return (int)a-b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/isub/jm/T_isub_5.j b/tools/dx-tests/src/dxc/junit/opcodes/isub/jm/T_isub_5.j
deleted file mode 100644
index 3ec22ff..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/isub/jm/T_isub_5.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_isub_5.java
-.class public dxc/junit/opcodes/isub/jm/T_isub_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-
-    aload_0
-    iload_2
-    isub
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/isub/jm/T_isub_5.java b/tools/dx-tests/src/dxc/junit/opcodes/isub/jm/T_isub_5.java
deleted file mode 100644
index f7660cb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/isub/jm/T_isub_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.isub.jm;
-
-public class T_isub_5 {
-    
-    public int run(int a, int b) {
-        return a-b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iushr/Test_iushr.java b/tools/dx-tests/src/dxc/junit/opcodes/iushr/Test_iushr.java
deleted file mode 100644
index 2f20baf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iushr/Test_iushr.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iushr;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.iushr.jm.T_iushr_1;
-
-public class Test_iushr extends DxTestCase {
-
-    /**
-     * @title  15 >> 1
-     */
-    public void testN1() {
-        T_iushr_1 t = new T_iushr_1();
-        assertEquals(7, t.run(15, 1));
-    }
-
-    /**
-     * @title  33 >> 2
-     */
-    public void testN2() {
-        T_iushr_1 t = new T_iushr_1();
-        assertEquals(8, t.run(33, 2));
-    }
-
-    /**
-     * @title  -15 >> 1
-     */
-    public void testN3() {
-        T_iushr_1 t = new T_iushr_1();
-        assertEquals(0x7FFFFFF8, t.run(-15, 1));
-    }
-
-    /**
-     * @title  Arguments = 1 & -1
-     */
-    public void testN4() {
-        T_iushr_1 t = new T_iushr_1();
-        assertEquals(0, t.run(1, -1));
-    }
-
-    /**
-     * @title  Verify that shift distance is actually in range 0 to 32.
-     */
-    public void testN5() {
-        T_iushr_1 t = new T_iushr_1();
-        assertEquals(16, t.run(33, 33));
-    }
-
-    /**
-     * @title  Arguments = 0 & -1
-     */
-    public void testB1() {
-        T_iushr_1 t = new T_iushr_1();
-        assertEquals(0, t.run(0, -1));
-    }
-
-    /**
-     * @title  Arguments = Integer.MAX_VALUE & 1
-     */
-    public void testB2() {
-        T_iushr_1 t = new T_iushr_1();
-        assertEquals(0x3FFFFFFF, t.run(Integer.MAX_VALUE, 1));
-    }
-
-    /**
-     * @title  Arguments = Integer.MIN_VALUE & 1
-     */
-    public void testB3() {
-        T_iushr_1 t = new T_iushr_1();
-        assertEquals(0x40000000, t.run(Integer.MIN_VALUE, 1));
-    }
-
-    /**
-     * @title  Arguments = 1 & 0
-     */
-    public void testB4() {
-        T_iushr_1 t = new T_iushr_1();
-        assertEquals(1, t.run(1, 0));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.iushr.jm.T_iushr_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double & int
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.iushr.jm.T_iushr_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long & int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.iushr.jm.T_iushr_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference & int
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.iushr.jm.T_iushr_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iushr/jm/T_iushr_1.j b/tools/dx-tests/src/dxc/junit/opcodes/iushr/jm/T_iushr_1.j
deleted file mode 100644
index d155b85..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iushr/jm/T_iushr_1.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iushr_1.java
-.class public dxc/junit/opcodes/iushr/jm/T_iushr_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-    iload_1
-    iload_2
-    iushr
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iushr/jm/T_iushr_1.java b/tools/dx-tests/src/dxc/junit/opcodes/iushr/jm/T_iushr_1.java
deleted file mode 100644
index bef0499..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iushr/jm/T_iushr_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iushr.jm;
-
-public class T_iushr_1 {
-
-    public int run(int a, int b) {
-        return a >>> b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iushr/jm/T_iushr_2.j b/tools/dx-tests/src/dxc/junit/opcodes/iushr/jm/T_iushr_2.j
deleted file mode 100644
index 211cd49..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iushr/jm/T_iushr_2.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iushr_2.java
-.class public dxc/junit/opcodes/iushr/jm/T_iushr_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-    iload_1
-;    iload_2
-    iushr
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iushr/jm/T_iushr_2.java b/tools/dx-tests/src/dxc/junit/opcodes/iushr/jm/T_iushr_2.java
deleted file mode 100644
index 951c9db..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iushr/jm/T_iushr_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iushr.jm;
-
-public class T_iushr_2 {
-
-    public int run(int a, int b) {
-        return a >> b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iushr/jm/T_iushr_3.j b/tools/dx-tests/src/dxc/junit/opcodes/iushr/jm/T_iushr_3.j
deleted file mode 100644
index 37f6b3c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iushr/jm/T_iushr_3.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iushr_3.java
-.class public dxc/junit/opcodes/iushr/jm/T_iushr_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(DI)I
-    .limit stack 3
-    .limit locals 4
-
-    dload_1
-;    d2i
-    iload_3
-    iushr
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iushr/jm/T_iushr_3.java b/tools/dx-tests/src/dxc/junit/opcodes/iushr/jm/T_iushr_3.java
deleted file mode 100644
index ede613c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iushr/jm/T_iushr_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iushr.jm;
-
-public class T_iushr_3 {
-
-    public int run(double a, int b) {
-        return (int)a >> b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iushr/jm/T_iushr_4.j b/tools/dx-tests/src/dxc/junit/opcodes/iushr/jm/T_iushr_4.j
deleted file mode 100644
index c6e4744..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iushr/jm/T_iushr_4.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iushr_4.java
-.class public dxc/junit/opcodes/iushr/jm/T_iushr_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(IJ)I
-    .limit stack 3
-    .limit locals 4
-
-    iload_1
-    lload_2
-;    l2i
-    iushr
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iushr/jm/T_iushr_4.java b/tools/dx-tests/src/dxc/junit/opcodes/iushr/jm/T_iushr_4.java
deleted file mode 100644
index 41c7829..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iushr/jm/T_iushr_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iushr.jm;
-
-public class T_iushr_4 {
-
-    public int run(int a, long b) {
-        return a >> (int)b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iushr/jm/T_iushr_5.j b/tools/dx-tests/src/dxc/junit/opcodes/iushr/jm/T_iushr_5.j
deleted file mode 100644
index 4e4ae33..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iushr/jm/T_iushr_5.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_iushr_5.java
-.class public dxc/junit/opcodes/iushr/jm/T_iushr_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-
-    aload_0
-    iload_2
-    iushr
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/iushr/jm/T_iushr_5.java b/tools/dx-tests/src/dxc/junit/opcodes/iushr/jm/T_iushr_5.java
deleted file mode 100644
index beb152c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/iushr/jm/T_iushr_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.iushr.jm;
-
-public class T_iushr_5 {
-    
-    public int run(int a, int b) {
-        return a >>> b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ixor/Test_ixor.java b/tools/dx-tests/src/dxc/junit/opcodes/ixor/Test_ixor.java
deleted file mode 100644
index 5425b9e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ixor/Test_ixor.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ixor;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.ixor.jm.T_ixor_1;
-
-public class Test_ixor extends DxTestCase {
-
-    /**
-     * @title Arguments = 15, 8
-     */
-    public void testN1() {
-        T_ixor_1 t = new T_ixor_1();
-        assertEquals(7, t.run(15, 8));
-    }
-
-    /**
-     * @title Arguments = 0xfffffff8, 0xfffffff1
-     */
-    public void testN2() {
-        T_ixor_1 t = new T_ixor_1();
-        assertEquals(9, t.run(0xfffffff8, 0xfffffff1));
-    }
-
-    /**
-     * @title  Arguments = 0xcafe & -1
-     */
-    public void testN3() {
-        T_ixor_1 t = new T_ixor_1();
-        assertEquals(0xFFFF3501, t.run(0xcafe, -1));
-    }
-
-    /**
-     * @title  Arguments = 0 & -1
-     */
-    public void testB1() {
-        T_ixor_1 t = new T_ixor_1();
-        assertEquals(-1, t.run(0, -1));
-    }
-
-    /**
-     * @title  Arguments = Integer.MAX_VALUE & Integer.MIN_VALUE
-     */
-    public void testB2() {
-        T_ixor_1 t = new T_ixor_1();
-        assertEquals(0xffffffff, t.run(Integer.MAX_VALUE, Integer.MIN_VALUE));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.ixor.jm.T_ixor_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double & int
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.ixor.jm.T_ixor_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long & int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.ixor.jm.T_ixor_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference & int
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.ixor.jm.T_ixor_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ixor/jm/T_ixor_1.j b/tools/dx-tests/src/dxc/junit/opcodes/ixor/jm/T_ixor_1.j
deleted file mode 100644
index 56ae3a0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ixor/jm/T_ixor_1.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ixor_1.java
-.class public dxc/junit/opcodes/ixor/jm/T_ixor_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-    iload_1
-    iload_2
-    ixor
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ixor/jm/T_ixor_1.java b/tools/dx-tests/src/dxc/junit/opcodes/ixor/jm/T_ixor_1.java
deleted file mode 100644
index c4ae6bb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ixor/jm/T_ixor_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ixor.jm;
-
-public class T_ixor_1 {
-
-    public int run(int a, int b) {
-        return a ^ b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ixor/jm/T_ixor_2.j b/tools/dx-tests/src/dxc/junit/opcodes/ixor/jm/T_ixor_2.j
deleted file mode 100644
index 5d80b38..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ixor/jm/T_ixor_2.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ixor_2.java
-.class public dxc/junit/opcodes/ixor/jm/T_ixor_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-    iload_1
-;    iload_2
-    ixor
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ixor/jm/T_ixor_2.java b/tools/dx-tests/src/dxc/junit/opcodes/ixor/jm/T_ixor_2.java
deleted file mode 100644
index 57fbb22..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ixor/jm/T_ixor_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ixor.jm;
-
-public class T_ixor_2 {
-
-    public int run(int a, int b) {
-        return a ^ b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ixor/jm/T_ixor_3.j b/tools/dx-tests/src/dxc/junit/opcodes/ixor/jm/T_ixor_3.j
deleted file mode 100644
index 5773388..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ixor/jm/T_ixor_3.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ixor_3.java
-.class public dxc/junit/opcodes/ixor/jm/T_ixor_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(DI)I
-    .limit stack 3
-    .limit locals 4
-
-    dload_1
-;    d2i
-    iload_3
-    ixor
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ixor/jm/T_ixor_3.java b/tools/dx-tests/src/dxc/junit/opcodes/ixor/jm/T_ixor_3.java
deleted file mode 100644
index 8b968ed..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ixor/jm/T_ixor_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ixor.jm;
-
-public class T_ixor_3 {
-
-    public int run(double a, int b) {
-        return (int)a ^ b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ixor/jm/T_ixor_4.j b/tools/dx-tests/src/dxc/junit/opcodes/ixor/jm/T_ixor_4.j
deleted file mode 100644
index 68649a2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ixor/jm/T_ixor_4.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ixor_4.java
-.class public dxc/junit/opcodes/ixor/jm/T_ixor_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(IJ)I
-    .limit stack 3
-    .limit locals 4
-
-    iload_1
-    lload_2
-;    l2i
-    ixor
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ixor/jm/T_ixor_4.java b/tools/dx-tests/src/dxc/junit/opcodes/ixor/jm/T_ixor_4.java
deleted file mode 100644
index 6406bc9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ixor/jm/T_ixor_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ixor.jm;
-
-public class T_ixor_4 {
-
-    public int run(int a, long b) {
-        return a ^ (int)b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ixor/jm/T_ixor_5.j b/tools/dx-tests/src/dxc/junit/opcodes/ixor/jm/T_ixor_5.j
deleted file mode 100644
index 53c64f4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ixor/jm/T_ixor_5.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ixor_5.java
-.class public dxc/junit/opcodes/ixor/jm/T_ixor_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-
-    aload_0
-    iload_2
-    ixor
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ixor/jm/T_ixor_5.java b/tools/dx-tests/src/dxc/junit/opcodes/ixor/jm/T_ixor_5.java
deleted file mode 100644
index 3b52886..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ixor/jm/T_ixor_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ixor.jm;
-
-public class T_ixor_5 {
-    
-    public int run(int a, int b) {
-        return a ^ b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/jsr/Test_jsr.java b/tools/dx-tests/src/dxc/junit/opcodes/jsr/Test_jsr.java
deleted file mode 100644
index 5a737a9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/jsr/Test_jsr.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.jsr;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.jsr.jm.T_jsr_1;
-import dxc.junit.opcodes.jsr.jm.T_jsr_2;
-
-public class Test_jsr extends DxTestCase {
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_jsr_1 t = new T_jsr_1();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @title  nested jsrs
-     */
-    public void testN2() {
-        T_jsr_2 t = new T_jsr_2();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @constraint 4.8.2.23
-     * @title recursion of jsr
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.jsr.jm.T_jsr_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall be inside the
-     * method
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.jsr.jm.T_jsr_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target inside wide instruction
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.jsr.jm.T_jsr_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_1.j b/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_1.j
deleted file mode 100644
index 5e97c77..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_1.j
+++ /dev/null
@@ -1,51 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_jsr_1.java
-.class public dxc/junit/opcodes/jsr/jm/T_jsr_1
-.super java/lang/Object
-
-.field public i1 I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 2
-    .limit locals 2
-    
-    jsr SetField
-
-    aload_0
-    getfield dxc.junit.opcodes.jsr.jm.T_jsr_1.i1 I
-    sipush 1000
-    if_icmpne Label0
-    
-    iconst_1
-    ireturn
-    
-Label0:
-    iconst_0    
-    ireturn
-
-SetField:
-    astore_1
-    aload_0
-    sipush 1000
-    putfield dxc.junit.opcodes.jsr.jm.T_jsr_1.i1 I
-    ret 1
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_1.java b/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_1.java
deleted file mode 100644
index d148104..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_1.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.jsr.jm;
-
-public class T_jsr_1 {
-    public int i1;
-    
-    private void setfield() {
-        i1 = 1000;
-    }
-    
-    public boolean run() {
-       setfield();
-       if(i1 == 1000)
-           return true;
-       return false;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_2.j b/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_2.j
deleted file mode 100644
index ee1ffac..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_2.j
+++ /dev/null
@@ -1,61 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_jsr_2.java
-.class public dxc/junit/opcodes/jsr/jm/T_jsr_2
-.super java/lang/Object
-
-.field public i1 I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 2
-    .limit locals 3
-    
-    jsr SetField
-
-    aload_0
-    getfield dxc.junit.opcodes.jsr.jm.T_jsr_2.i1 I
-    sipush 1000
-    if_icmpne Label0
-    
-    iconst_1
-    ireturn
-    
-Label0:
-    iconst_0    
-    ireturn
-
-SetField:
-    astore_1
-    aload_0
-    sipush 500
-    putfield dxc.junit.opcodes.jsr.jm.T_jsr_2.i1 I
-    
-    jsr SetField1
-    
-    ret 1
-    
-SetField1:
-    astore_2
-    aload_0
-    sipush 1000
-    putfield dxc.junit.opcodes.jsr.jm.T_jsr_2.i1 I
-    ret 2
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_2.java b/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_2.java
deleted file mode 100644
index 10e4303..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_2.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.jsr.jm;
-
-public class T_jsr_2 {
-    public int i1;
-    
-    private void setfield() {
-        i1 = 500;
-        setfield1();
-    }
-    
-    private void setfield1() {
-        i1 = 1000;
-    }
-    
-    public boolean run() {
-       setfield();
-       if(i1 == 1000)
-           return true;
-       return false;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_3.cfh b/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_3.cfh
deleted file mode 100644
index 6deff56..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_3.cfh
+++ /dev/null
@@ -1,219 +0,0 @@
-//@class:dxc/junit/opcodes/jsr/jm/T_jsr_3
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0010
-// .  .  
-   00 10 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0f 00 08 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 3, h: 0005: type{dxc.junit.opcodes.jsr.jm.T_jsr_3}
-    // .  .  .  
-       07 00 0d 
-    // parsed:, offset 59, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 65, len 5, h: 0007: utf8{"i1"}
-    // .  .  .  i  1  
-       01 00 02 69 31 
-    // parsed:, offset 70, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 0c 
-    // parsed:, offset 75, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 82, len 6, h: 000a: utf8{"()Z"}
-    // .  .  .  (  )  Z  
-       01 00 03 28 29 5a 
-    // parsed:, offset 88, len 15, h: 000b: utf8{"T_jsr_3.java"}
-    // .  .  .  T  _  j  s  r  _  3  .  j  a  v  a  
-       01 00 0c 54 5f 6a 73 72 5f 33 2e 6a 61 76 61 
-    // parsed:, offset 103, len 6, h: 000c: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 109, len 35, h: 000d: utf8{"dxc/junit/opcodes/jsr/jm/T_jsr_3"}
-    // .  .     d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  j  s  r  /  j  m  /  T  _  j  s  r  _  3  
-       01 00 20 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 6a 73 72 2f 6a 6d 2f 54 5f 6a 73 72 5f 33 
-    // parsed:, offset 144, len 4, h: 000e: utf8{"I"}
-    // .  .  .  I  
-       01 00 01 49 
-    // parsed:, offset 148, len 3, h: 000f: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 151, len 0, h: end constant_pool
-// parsed:, offset 151, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 153, len 2, h: this_class: type{dxc.junit.opcodes.jsr.jm.T_jsr_3}
-// .  .  
-   00 05 
-// parsed:, offset 155, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0f 
-// parsed:, offset 157, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 159, len 2, h: fields_count: 0001
-// .  .  
-   00 01 
-// ========== start-ParseMember:i1, offset 161, len:90,desc: I
-// parsed:, offset 161, len 0, h:  fields[0]: 
-    // parsed:, offset 161, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 163, len 2, h: name: i1
-    // .  .  
-       00 07 
-    // parsed:, offset 165, len 2, h: descriptor: I
-    // .  .  
-       00 0e 
-    // parsed:, offset 167, len 2, h: attributes_count: 0000
-    // .  .  
-       00 00 
-// parsed:, offset 169, len 0, h: end fields[0] 
-// ========== end-ParseMember:i1, desc: I
-// parsed:, offset 169, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 171, len:80,desc: ()V
-// parsed:, offset 171, len 0, h:  methods[0]: 
-    // parsed:, offset 171, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 173, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 175, len 2, h: descriptor: ()V
-    // .  .  
-       00 0c 
-    // parsed:, offset 177, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 179, len 0, h:  attributes[0]: 
-        // parsed:, offset 179, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 181, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 185, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 187, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 189, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 198, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 200, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 202, len 0, h: end attributes[0] 
-// parsed:, offset 202, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 202, len:49,desc: ()Z
-// parsed:, offset 202, len 0, h:  methods[1]: 
-    // parsed:, offset 202, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 204, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 206, len 2, h: descriptor: ()Z
-    // .  .  
-       00 0a 
-    // parsed:, offset 208, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 210, len 0, h:  attributes[0]: 
-        // parsed:, offset 210, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 212, len 4, h: length: 00000019
-        // .  .  .  .  
-           00 00 00 19 
-        // parsed:, offset 216, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 218, len 2, h: max_locals: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 220, len 4, h: code_length: 0000000d
-        // .  .  .  .  
-           00 00 00 0d 
-        // parsed:, offset 0, len 3, h: 0000: jsr 0007
-        // .  .  .  
-//@mod           a8 00 07 
-           a8 00 08 
-        // parsed:, offset 3, len 1, h: 0003: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 4, len 1, h: 0004: ireturn
-        // .  
-           ac 
-        // parsed:, offset 5, len 1, h: 0005: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 6, len 1, h: 0006: ireturn
-        // .  
-           ac 
-        // parsed:, offset 7, len 4, h: 0007: wide astore 0001
-        // .  :  .  .  
-           c4 3a 00 01 
-        // parsed:, offset 11, len 2, h: 000b: ret 01
-        // .  .  
-           a9 01 
-        // parsed:, offset 237, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 239, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 241, len 0, h: end attributes[0] 
-// parsed:, offset 241, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()Z
-// parsed:, offset 241, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 243, len 0, h:  attributes[0]: 
-    // parsed:, offset 243, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 245, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 249, len 2, h: source: utf8{"T_jsr_3.java"}
-    // .  .  
-       00 0b 
-// parsed:, offset 251, len 0, h: end attributes[0] 
-// parsed:, offset 251, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_3.j b/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_3.j
deleted file mode 100644
index f0f987a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_3.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_jsr_3.java
-.class public dxc/junit/opcodes/jsr/jm/T_jsr_3
-.super java/lang/Object
-
-.field public i1 I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 2
-    .limit locals 2
-    
-    jsr SetField
-
-    iconst_0
-    ireturn
-    
-Label0:
-    iconst_0    
-    ireturn
-
-SetField:
-    astore_w 1
-    ret 1
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_3.java b/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_3.java
deleted file mode 100644
index 2d5b6a5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_3.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.jsr.jm;
-
-public class T_jsr_3 {
-
-    public int i1;
-    
-    private void setfield() {
-        i1 = 1000;
-    }
-    
-    public boolean run() {
-       setfield();
-       if(i1 == 1000)
-           return true;
-       return false;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_4.j b/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_4.j
deleted file mode 100644
index 3282061..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_4.j
+++ /dev/null
@@ -1,53 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_jsr_4.java
-.class public dxc/junit/opcodes/jsr/jm/T_jsr_4
-.super java/lang/Object
-
-.field public i1 I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 2
-    .limit locals 2
-    
-    jsr SetField
-    aload_0
-    getfield dxc.junit.opcodes.jsr.jm.T_jsr_4.i1 I
-    sipush 1000
-    if_icmpne Label0
-    
-    iconst_1
-    ireturn
-    
-Label0:
-    iconst_0    
-    ireturn
-
-SetField:
-    astore_1
-    aload_0
-    sipush 1000
-    putfield dxc.junit.opcodes.jsr.jm.T_jsr_4.i1 I
- 
-    jsr SetField
-  
-    ret 1
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_4.java b/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_4.java
deleted file mode 100644
index ec13147..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_4.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.jsr.jm;
-
-public class T_jsr_4 {
-
-    public int i1;
-    
-    private void setfield() {
-        i1 = 1000;
-    }
-    
-    public boolean run() {
-       setfield();
-       if(i1 == 1000)
-           return true;
-       return false;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_5.cfh b/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_5.cfh
deleted file mode 100644
index 6ecea6a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_5.cfh
+++ /dev/null
@@ -1,246 +0,0 @@
-//@class:dxc/junit/opcodes/jsr/jm/T_jsr_5
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0012
-// .  .  
-   00 12 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0f 00 07 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 3, h: 0004: type{dxc.junit.opcodes.jsr.jm.T_jsr_5}
-    // .  .  .  
-       07 00 0e 
-    // parsed:, offset 50, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 59, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 65, len 5, h: 0007: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0d 
-    // parsed:, offset 70, len 5, h: 0008: utf8{"i1"}
-    // .  .  .  i  1  
-       01 00 02 69 31 
-    // parsed:, offset 75, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 82, len 15, h: 000a: utf8{"T_jsr_5.java"}
-    // .  .  .  T  _  j  s  r  _  5  .  j  a  v  a  
-       01 00 0c 54 5f 6a 73 72 5f 35 2e 6a 61 76 61 
-    // parsed:, offset 97, len 6, h: 000b: utf8{"()Z"}
-    // .  .  .  (  )  Z  
-       01 00 03 28 29 5a 
-    // parsed:, offset 103, len 5, h: 000c: field{dxc.junit.opcodes.jsr.jm.T_jsr_5.i1:I}
-    // .  .  .  .  .  
-       09 00 04 00 11 
-    // parsed:, offset 108, len 6, h: 000d: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 114, len 35, h: 000e: utf8{"dxc/junit/opcodes/jsr/jm/T_jsr_5"}
-    // .  .     d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  j  s  r  /  j  m  /  T  _  j  s  r  _  5  
-       01 00 20 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 6a 73 72 2f 6a 6d 2f 54 5f 6a 73 72 5f 35 
-    // parsed:, offset 149, len 3, h: 000f: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-    // parsed:, offset 152, len 4, h: 0010: utf8{"I"}
-    // .  .  .  I  
-       01 00 01 49 
-    // parsed:, offset 156, len 5, h: 0011: nat{i1:I}
-    // .  .  .  .  .  
-       0c 00 08 00 10 
-// parsed:, offset 161, len 0, h: end constant_pool
-// parsed:, offset 161, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 163, len 2, h: this_class: type{dxc.junit.opcodes.jsr.jm.T_jsr_5}
-// .  .  
-   00 04 
-// parsed:, offset 165, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0f 
-// parsed:, offset 167, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 169, len 2, h: fields_count: 0001
-// .  .  
-   00 01 
-// ========== start-ParseMember:i1, offset 171, len:104,desc: I
-// parsed:, offset 171, len 0, h:  fields[0]: 
-    // parsed:, offset 171, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 173, len 2, h: name: i1
-    // .  .  
-       00 08 
-    // parsed:, offset 175, len 2, h: descriptor: I
-    // .  .  
-       00 10 
-    // parsed:, offset 177, len 2, h: attributes_count: 0000
-    // .  .  
-       00 00 
-// parsed:, offset 179, len 0, h: end fields[0] 
-// ========== end-ParseMember:i1, desc: I
-// parsed:, offset 179, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 181, len:94,desc: ()V
-// parsed:, offset 181, len 0, h:  methods[0]: 
-    // parsed:, offset 181, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 183, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 185, len 2, h: descriptor: ()V
-    // .  .  
-       00 0d 
-    // parsed:, offset 187, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 189, len 0, h:  attributes[0]: 
-        // parsed:, offset 189, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 191, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 195, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 197, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 199, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 208, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 210, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 212, len 0, h: end attributes[0] 
-// parsed:, offset 212, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 212, len:63,desc: ()Z
-// parsed:, offset 212, len 0, h:  methods[1]: 
-    // parsed:, offset 212, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 214, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 216, len 2, h: descriptor: ()Z
-    // .  .  
-       00 0b 
-    // parsed:, offset 218, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 220, len 0, h:  attributes[0]: 
-        // parsed:, offset 220, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 222, len 4, h: length: 00000027
-        // .  .  .  '  
-           00 00 00 27 
-        // parsed:, offset 226, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 228, len 2, h: max_locals: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 230, len 4, h: code_length: 0000001b
-        // .  .  .  .  
-           00 00 00 1b 
-        // parsed:, offset 0, len 3, h: 0000: jsr 0011
-        // .  .  .  
-//@mod           a8 00 11 
-           a8 00 ff 
-        // parsed:, offset 3, len 1, h: 0003: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 4, len 3, h: 0004: getfield field{dxc.junit.opcodes.jsr.jm.T_jsr_5.i1:I}
-        // .  .  .  
-           b4 00 0c 
-        // parsed:, offset 7, len 3, h: 0007: sipush #+03e8
-        // .  .  .  
-           11 03 e8 
-        // parsed:, offset 10, len 3, h: 000a: if_icmpne 000f
-        // .  .  .  
-           a0 00 05 
-        // parsed:, offset 13, len 1, h: 000d: iconst_1 // #+01
-        // .  
-           04 
-        // parsed:, offset 14, len 1, h: 000e: ireturn
-        // .  
-           ac 
-        // parsed:, offset 15, len 1, h: 000f: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 16, len 1, h: 0010: ireturn
-        // .  
-           ac 
-        // parsed:, offset 17, len 1, h: 0011: astore_1 // 01
-        // L  
-           4c 
-        // parsed:, offset 18, len 1, h: 0012: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 19, len 3, h: 0013: sipush #+03e8
-        // .  .  .  
-           11 03 e8 
-        // parsed:, offset 22, len 3, h: 0016: putfield field{dxc.junit.opcodes.jsr.jm.T_jsr_5.i1:I}
-        // .  .  .  
-           b5 00 0c 
-        // parsed:, offset 25, len 2, h: 0019: ret 01
-        // .  .  
-           a9 01 
-        // parsed:, offset 261, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 263, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 265, len 0, h: end attributes[0] 
-// parsed:, offset 265, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()Z
-// parsed:, offset 265, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 267, len 0, h:  attributes[0]: 
-    // parsed:, offset 267, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 269, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 273, len 2, h: source: utf8{"T_jsr_5.java"}
-    // .  .  
-       00 0a 
-// parsed:, offset 275, len 0, h: end attributes[0] 
-// parsed:, offset 275, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_5.j b/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_5.j
deleted file mode 100644
index d369389..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_5.j
+++ /dev/null
@@ -1,52 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_jsr_5.java
-.class public dxc/junit/opcodes/jsr/jm/T_jsr_5
-.super java/lang/Object
-
-.field public i1 I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 2
-    .limit locals 2
-    
-    jsr SetField
-
-    aload_0
-    getfield dxc.junit.opcodes.jsr.jm.T_jsr_5.i1 I
-    sipush 1000
-    if_icmpne Label0
-    
-    iconst_1
-    ireturn
-    
-Label0:
-    iconst_0    
-    ireturn
-
-SetField:
-    astore_1
-    aload_0
-    sipush 1000
-    putfield dxc.junit.opcodes.jsr.jm.T_jsr_5.i1 I
-    
-    ret 1
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_5.java b/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_5.java
deleted file mode 100644
index 6e99e92..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/jsr/jm/T_jsr_5.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.jsr.jm;
-
-public class T_jsr_5 {
-
-    public int i1;
-    
-    private void setfield() {
-        i1 = 1000;
-    }
-    
-    public boolean run() {
-       setfield();
-       if(i1 == 1000)
-           return true;
-       return false;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/Test_jsr_w.java b/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/Test_jsr_w.java
deleted file mode 100644
index 65e3320..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/Test_jsr_w.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.jsr_w;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.jsr_w.jm.T_jsr_w_1;
-import dxc.junit.opcodes.jsr_w.jm.T_jsr_w_2;
-
-public class Test_jsr_w extends DxTestCase {
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_jsr_w_1 t = new T_jsr_w_1();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @title  nested jsrs
-     */
-    public void testN2() {
-        T_jsr_w_2 t = new T_jsr_w_2();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @constraint 4.8.2.23
-     * @title recursion of jsr
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.jsr_w.jm.T_jsr_w_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall be inside the
-     * method
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.jsr_w.jm.T_jsr_w_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target inside wide instruction
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.jsr_w.jm.T_jsr_w_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_1.j b/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_1.j
deleted file mode 100644
index b1e3523..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_1.j
+++ /dev/null
@@ -1,51 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_jsr_w_1.java
-.class public dxc/junit/opcodes/jsr_w/jm/T_jsr_w_1
-.super java/lang/Object
-
-.field public i1 I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 2
-    .limit locals 2
-    
-    jsr_w SetField
-
-    aload_0
-    getfield dxc.junit.opcodes.jsr_w.jm.T_jsr_w_1.i1 I
-    sipush 1000
-    if_icmpne Label0
-    
-    iconst_1
-    ireturn
-    
-Label0:
-    iconst_0    
-    ireturn
-
-SetField:
-    astore_1
-    aload_0
-    sipush 1000
-    putfield dxc.junit.opcodes.jsr_w.jm.T_jsr_w_1.i1 I
-    ret 1
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_1.java b/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_1.java
deleted file mode 100644
index 7dbb6b5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_1.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.jsr_w.jm;
-
-public class T_jsr_w_1 {
-    public int i1;
-    
-    private void setfield() {
-        i1 = 1000;
-    }
-    
-    public boolean run() {
-       setfield();
-       if(i1 == 1000)
-           return true;
-       return false;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_2.j b/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_2.j
deleted file mode 100644
index c9eb7b5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_2.j
+++ /dev/null
@@ -1,61 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_jsr_w_2.java
-.class public dxc/junit/opcodes/jsr_w/jm/T_jsr_w_2
-.super java/lang/Object
-
-.field public i1 I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 2
-    .limit locals 3
-    
-    jsr_w SetField
-
-    aload_0
-    getfield dxc.junit.opcodes.jsr_w.jm.T_jsr_w_2.i1 I
-    sipush 1000
-    if_icmpne Label0
-    
-    iconst_1
-    ireturn
-    
-Label0:
-    iconst_0    
-    ireturn
-
-SetField:
-    astore_1
-    aload_0
-    sipush 500
-    putfield dxc.junit.opcodes.jsr_w.jm.T_jsr_w_2.i1 I
-    
-    jsr_w SetField1
-    
-    ret 1
-    
-SetField1:
-    astore_2
-    aload_0
-    sipush 1000
-    putfield dxc.junit.opcodes.jsr_w.jm.T_jsr_w_2.i1 I
-    ret 2
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_2.java b/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_2.java
deleted file mode 100644
index cd78013..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_2.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.jsr_w.jm;
-
-public class T_jsr_w_2 {
-    public int i1;
-    
-    private void setfield() {
-        i1 = 500;
-        setfield1();
-    }
-    
-    private void setfield1() {
-        i1 = 1000;
-    }
-    
-    public boolean run() {
-       setfield();
-       if(i1 == 1000)
-           return true;
-       return false;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_3.cfh b/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_3.cfh
deleted file mode 100644
index af25bac..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_3.cfh
+++ /dev/null
@@ -1,219 +0,0 @@
-//@class:dxc/junit/opcodes/jsr_w/jm/T_jsr_w_3
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0010
-// .  .  
-   00 10 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0f 00 08 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 17, h: 0004: utf8{"T_jsr_w_3.java"}
-    // .  .  .  T  _  j  s  r  _  w  _  3  .  j  a  v  a  
-       01 00 0e 54 5f 6a 73 72 5f 77 5f 33 2e 6a 61 76 61 
-    // parsed:, offset 64, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 73, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 79, len 5, h: 0007: utf8{"i1"}
-    // .  .  .  i  1  
-       01 00 02 69 31 
-    // parsed:, offset 84, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0d 
-    // parsed:, offset 89, len 39, h: 0009: utf8{"dxc/junit/opcodes/jsr_w/jm/T_jsr_w_3"}
-    // .  .  $  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  j  s  r  _  w  /  j  m  /  T  _  j  s  r  _  w  _  3  
-       01 00 24 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 6a 73 72 5f 77 2f 6a 6d 2f 54 5f 6a 73 72 5f 77 5f 33 
-    // parsed:, offset 128, len 7, h: 000a: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 135, len 6, h: 000b: utf8{"()Z"}
-    // .  .  .  (  )  Z  
-       01 00 03 28 29 5a 
-    // parsed:, offset 141, len 3, h: 000c: type{dxc.junit.opcodes.jsr_w.jm.T_jsr_w_3}
-    // .  .  .  
-       07 00 09 
-    // parsed:, offset 144, len 6, h: 000d: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 150, len 4, h: 000e: utf8{"I"}
-    // .  .  .  I  
-       01 00 01 49 
-    // parsed:, offset 154, len 3, h: 000f: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 157, len 0, h: end constant_pool
-// parsed:, offset 157, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 159, len 2, h: this_class: type{dxc.junit.opcodes.jsr_w.jm.T_jsr_w_3}
-// .  .  
-   00 0c 
-// parsed:, offset 161, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0f 
-// parsed:, offset 163, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 165, len 2, h: fields_count: 0001
-// .  .  
-   00 01 
-// ========== start-ParseMember:i1, offset 167, len:92,desc: I
-// parsed:, offset 167, len 0, h:  fields[0]: 
-    // parsed:, offset 167, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 169, len 2, h: name: i1
-    // .  .  
-       00 07 
-    // parsed:, offset 171, len 2, h: descriptor: I
-    // .  .  
-       00 0e 
-    // parsed:, offset 173, len 2, h: attributes_count: 0000
-    // .  .  
-       00 00 
-// parsed:, offset 175, len 0, h: end fields[0] 
-// ========== end-ParseMember:i1, desc: I
-// parsed:, offset 175, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 177, len:82,desc: ()V
-// parsed:, offset 177, len 0, h:  methods[0]: 
-    // parsed:, offset 177, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 179, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 181, len 2, h: descriptor: ()V
-    // .  .  
-       00 0d 
-    // parsed:, offset 183, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 185, len 0, h:  attributes[0]: 
-        // parsed:, offset 185, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 187, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 191, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 193, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 195, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 204, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 206, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 208, len 0, h: end attributes[0] 
-// parsed:, offset 208, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 208, len:51,desc: ()Z
-// parsed:, offset 208, len 0, h:  methods[1]: 
-    // parsed:, offset 208, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 210, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 212, len 2, h: descriptor: ()Z
-    // .  .  
-       00 0b 
-    // parsed:, offset 214, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 216, len 0, h:  attributes[0]: 
-        // parsed:, offset 216, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 218, len 4, h: length: 0000001b
-        // .  .  .  .  
-           00 00 00 1b 
-        // parsed:, offset 222, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 224, len 2, h: max_locals: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 226, len 4, h: code_length: 0000000f
-        // .  .  .  .  
-           00 00 00 0f 
-        // parsed:, offset 0, len 5, h: 0000: jsr_w 00000009
-        // .  .  .  .  .  
-//@mod           c9 00 00 00 09 
-           c9 00 00 00 0a 
-        // parsed:, offset 5, len 1, h: 0005: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 6, len 1, h: 0006: ireturn
-        // .  
-           ac 
-        // parsed:, offset 7, len 1, h: 0007: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 8, len 1, h: 0008: ireturn
-        // .  
-           ac 
-        // parsed:, offset 9, len 4, h: 0009: wide astore 0001
-        // .  :  .  .  
-           c4 3a 00 01 
-        // parsed:, offset 13, len 2, h: 000d: ret 01
-        // .  .  
-           a9 01 
-        // parsed:, offset 245, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 247, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 249, len 0, h: end attributes[0] 
-// parsed:, offset 249, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()Z
-// parsed:, offset 249, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 251, len 0, h:  attributes[0]: 
-    // parsed:, offset 251, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 253, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 257, len 2, h: source: utf8{"T_jsr_w_3.java"}
-    // .  .  
-       00 04 
-// parsed:, offset 259, len 0, h: end attributes[0] 
-// parsed:, offset 259, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_3.j b/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_3.j
deleted file mode 100644
index 7be029b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_3.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_jsr_w_3.java
-.class public dxc/junit/opcodes/jsr_w/jm/T_jsr_w_3
-.super java/lang/Object
-
-.field public i1 I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 2
-    .limit locals 2
-    
-    jsr_w SetField
-
-    iconst_0
-    ireturn
-    
-Label0:
-    iconst_0    
-    ireturn
-
-SetField:
-    astore_w 1
-    ret 1
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_3.java b/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_3.java
deleted file mode 100644
index 125de8a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_3.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.jsr_w.jm;
-
-public class T_jsr_w_3 {
-
-    public int i1;
-    
-    private void setfield() {
-        i1 = 1000;
-    }
-    
-    public boolean run() {
-       setfield();
-       if(i1 == 1000)
-           return true;
-       return false;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_4.j b/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_4.j
deleted file mode 100644
index 0fdd704..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_4.j
+++ /dev/null
@@ -1,54 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_jsr_w_4.java
-.class public dxc/junit/opcodes/jsr_w/jm/T_jsr_w_4
-.super java/lang/Object
-
-.field public i1 I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 2
-    .limit locals 2
-    
-    jsr_w SetField
-
-    aload_0
-    getfield dxc.junit.opcodes.jsr_w.jm.T_jsr_w_4.i1 I
-    sipush 1000
-    if_icmpne Label0
-    
-    iconst_1
-    ireturn
-    
-Label0:
-    iconst_0    
-    ireturn
-
-SetField:
-    astore_1
-    aload_0
-    sipush 1000
-    putfield dxc.junit.opcodes.jsr_w.jm.T_jsr_w_4.i1 I
- 
-    jsr_w SetField
-  
-    ret 1
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_4.java b/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_4.java
deleted file mode 100644
index c58f2f7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_4.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.jsr_w.jm;
-
-public class T_jsr_w_4 {
-
-    public int i1;
-    
-    private void setfield() {
-        i1 = 1000;
-    }
-    
-    public boolean run() {
-       setfield();
-       if(i1 == 1000)
-           return true;
-       return false;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_5.cfh b/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_5.cfh
deleted file mode 100644
index b0bb2e1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_5.cfh
+++ /dev/null
@@ -1,246 +0,0 @@
-//@class:dxc/junit/opcodes/jsr_w/jm/T_jsr_w_5
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0012
-// .  .  
-   00 12 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0e 00 08 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 3, h: 0004: type{dxc.junit.opcodes.jsr_w.jm.T_jsr_w_5}
-    // .  .  .  
-       07 00 07 
-    // parsed:, offset 50, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 59, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 65, len 39, h: 0007: utf8{"dxc/junit/opcodes/jsr_w/jm/T_jsr_w_5"}
-    // .  .  $  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  j  s  r  _  w  /  j  m  /  T  _  j  s  r  _  w  _  5  
-       01 00 24 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 6a 73 72 5f 77 2f 6a 6d 2f 54 5f 6a 73 72 5f 77 5f 35 
-    // parsed:, offset 104, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0c 
-    // parsed:, offset 109, len 5, h: 0009: utf8{"i1"}
-    // .  .  .  i  1  
-       01 00 02 69 31 
-    // parsed:, offset 114, len 7, h: 000a: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 121, len 6, h: 000b: utf8{"()Z"}
-    // .  .  .  (  )  Z  
-       01 00 03 28 29 5a 
-    // parsed:, offset 127, len 6, h: 000c: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 133, len 5, h: 000d: field{dxc.junit.opcodes.jsr_w.jm.T_jsr_w_5.i1:I}
-    // .  .  .  .  .  
-       09 00 04 00 11 
-    // parsed:, offset 138, len 3, h: 000e: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-    // parsed:, offset 141, len 4, h: 000f: utf8{"I"}
-    // .  .  .  I  
-       01 00 01 49 
-    // parsed:, offset 145, len 17, h: 0010: utf8{"T_jsr_w_5.java"}
-    // .  .  .  T  _  j  s  r  _  w  _  5  .  j  a  v  a  
-       01 00 0e 54 5f 6a 73 72 5f 77 5f 35 2e 6a 61 76 61 
-    // parsed:, offset 162, len 5, h: 0011: nat{i1:I}
-    // .  .  .  .  .  
-       0c 00 09 00 0f 
-// parsed:, offset 167, len 0, h: end constant_pool
-// parsed:, offset 167, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 169, len 2, h: this_class: type{dxc.junit.opcodes.jsr_w.jm.T_jsr_w_5}
-// .  .  
-   00 04 
-// parsed:, offset 171, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0e 
-// parsed:, offset 173, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 175, len 2, h: fields_count: 0001
-// .  .  
-   00 01 
-// ========== start-ParseMember:i1, offset 177, len:106,desc: I
-// parsed:, offset 177, len 0, h:  fields[0]: 
-    // parsed:, offset 177, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 179, len 2, h: name: i1
-    // .  .  
-       00 09 
-    // parsed:, offset 181, len 2, h: descriptor: I
-    // .  .  
-       00 0f 
-    // parsed:, offset 183, len 2, h: attributes_count: 0000
-    // .  .  
-       00 00 
-// parsed:, offset 185, len 0, h: end fields[0] 
-// ========== end-ParseMember:i1, desc: I
-// parsed:, offset 185, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 187, len:96,desc: ()V
-// parsed:, offset 187, len 0, h:  methods[0]: 
-    // parsed:, offset 187, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 189, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 191, len 2, h: descriptor: ()V
-    // .  .  
-       00 0c 
-    // parsed:, offset 193, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 195, len 0, h:  attributes[0]: 
-        // parsed:, offset 195, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 197, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 201, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 203, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 205, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 214, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 216, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 218, len 0, h: end attributes[0] 
-// parsed:, offset 218, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 218, len:65,desc: ()Z
-// parsed:, offset 218, len 0, h:  methods[1]: 
-    // parsed:, offset 218, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 220, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 222, len 2, h: descriptor: ()Z
-    // .  .  
-       00 0b 
-    // parsed:, offset 224, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 226, len 0, h:  attributes[0]: 
-        // parsed:, offset 226, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 228, len 4, h: length: 00000029
-        // .  .  .  )  
-           00 00 00 29 
-        // parsed:, offset 232, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 234, len 2, h: max_locals: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 236, len 4, h: code_length: 0000001d
-        // .  .  .  .  
-           00 00 00 1d 
-        // parsed:, offset 0, len 5, h: 0000: jsr_w 00000013
-        // .  .  .  .  .  
-//@mod           c9 00 00 00 13 
-           c9 00 00 00 ff         
-        // parsed:, offset 5, len 1, h: 0005: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 6, len 3, h: 0006: getfield field{dxc.junit.opcodes.jsr_w.jm.T_jsr_w_5.i1:I}
-        // .  .  .  
-           b4 00 0d 
-        // parsed:, offset 9, len 3, h: 0009: sipush #+03e8
-        // .  .  .  
-           11 03 e8 
-        // parsed:, offset 12, len 3, h: 000c: if_icmpne 0011
-        // .  .  .  
-           a0 00 05 
-        // parsed:, offset 15, len 1, h: 000f: iconst_1 // #+01
-        // .  
-           04 
-        // parsed:, offset 16, len 1, h: 0010: ireturn
-        // .  
-           ac 
-        // parsed:, offset 17, len 1, h: 0011: iconst_0 // #+00
-        // .  
-           03 
-        // parsed:, offset 18, len 1, h: 0012: ireturn
-        // .  
-           ac 
-        // parsed:, offset 19, len 1, h: 0013: astore_1 // 01
-        // L  
-           4c 
-        // parsed:, offset 20, len 1, h: 0014: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 21, len 3, h: 0015: sipush #+03e8
-        // .  .  .  
-           11 03 e8 
-        // parsed:, offset 24, len 3, h: 0018: putfield field{dxc.junit.opcodes.jsr_w.jm.T_jsr_w_5.i1:I}
-        // .  .  .  
-           b5 00 0d 
-        // parsed:, offset 27, len 2, h: 001b: ret 01
-        // .  .  
-           a9 01 
-        // parsed:, offset 269, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 271, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 273, len 0, h: end attributes[0] 
-// parsed:, offset 273, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()Z
-// parsed:, offset 273, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 275, len 0, h:  attributes[0]: 
-    // parsed:, offset 275, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 277, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 281, len 2, h: source: utf8{"T_jsr_w_5.java"}
-    // .  .  
-       00 10 
-// parsed:, offset 283, len 0, h: end attributes[0] 
-// parsed:, offset 283, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_5.j b/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_5.j
deleted file mode 100644
index 41dd4bb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_5.j
+++ /dev/null
@@ -1,52 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_jsr_w_5.java
-.class public dxc/junit/opcodes/jsr_w/jm/T_jsr_w_5
-.super java/lang/Object
-
-.field public i1 I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 2
-    .limit locals 2
-    
-    jsr_w SetField
-
-    aload_0
-    getfield dxc.junit.opcodes.jsr_w.jm.T_jsr_w_5.i1 I
-    sipush 1000
-    if_icmpne Label0
-    
-    iconst_1
-    ireturn
-    
-Label0:
-    iconst_0    
-    ireturn
-
-SetField:
-    astore_1
-    aload_0
-    sipush 1000
-    putfield dxc.junit.opcodes.jsr_w.jm.T_jsr_w_5.i1 I
-    
-    ret 1
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_5.java b/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_5.java
deleted file mode 100644
index 4693529..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/jsr_w/jm/T_jsr_w_5.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.jsr_w.jm;
-
-public class T_jsr_w_5 {
-
-    public int i1;
-    
-    private void setfield() {
-        i1 = 1000;
-    }
-    
-    public boolean run() {
-       setfield();
-       if(i1 == 1000)
-           return true;
-       return false;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2d/Test_l2d.java b/tools/dx-tests/src/dxc/junit/opcodes/l2d/Test_l2d.java
deleted file mode 100644
index 6b27eab..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2d/Test_l2d.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.l2d;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.l2d.jm.T_l2d_1;
-
-public class Test_l2d extends DxTestCase {
-
-    /**
-     * @title  Argument = 50000000000
-     */
-    public void testN1() {
-        T_l2d_1 t = new T_l2d_1();
-        assertEquals(5.0E10d, t.run(50000000000l), 0d);
-    }
-
-    /**
-     * @title  Argument = 1
-     */
-    public void testN2() {
-        T_l2d_1 t = new T_l2d_1();
-        assertEquals(1d, t.run(1l), 0d);
-    }
-
-    /**
-     * @title  Argument = -1
-     */
-    public void testN3() {
-        T_l2d_1 t = new T_l2d_1();
-        assertEquals(-1d, t.run(-1l), 0d);
-    }
-
-    /**
-     * @title  Argument = Long.MAX_VALUE
-     */
-    public void testB1() {
-        T_l2d_1 t = new T_l2d_1();
-        assertEquals(9.223372036854776E18d, t.run(Long.MAX_VALUE), 0d);
-    }
-
-    /**
-     * @title  Argument = Long.MIN_VALUE
-     */
-    public void testB2() {
-        T_l2d_1 t = new T_l2d_1();
-        assertEquals(-9.223372036854776E18, t.run(Long.MIN_VALUE), 0d);
-    }
-
-    /**
-     * @title  Argument = 0
-     */
-    public void testB3() {
-        T_l2d_1 t = new T_l2d_1();
-        assertEquals(0d, t.run(0), 0d);
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.l2d.jm.T_l2d_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.l2d.jm.T_l2d_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - integer
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.l2d.jm.T_l2d_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - reference
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.l2d.jm.T_l2d_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_1.j b/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_1.j
deleted file mode 100644
index 0a98eb7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_1.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_l2d_1.java
-.class public dxc/junit/opcodes/l2d/jm/T_l2d_1
-.super java/lang/Object
-
-
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-
-.method public run(J)D
-    .limit stack 2
-    .limit locals 3
-
-    lload_1
-    l2d
-
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_1.java b/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_1.java
deleted file mode 100644
index 0d4f014..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.l2d.jm;
-
-public class T_l2d_1 {
-
-    public double run(long a) {
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_2.j b/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_2.j
deleted file mode 100644
index ecf0bf8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_2.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_l2d_2.java
-.class public dxc/junit/opcodes/l2d/jm/T_l2d_2
-.super java/lang/Object
-
-
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-
-.method public run(J)D
-    .limit stack 2
-    .limit locals 3
-
-;    lload_1
-    l2d
-
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_2.java b/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_2.java
deleted file mode 100644
index fbba547..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.l2d.jm;
-
-public class T_l2d_2 {
-
-    public double run(long a) {
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_3.j b/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_3.j
deleted file mode 100644
index b529402..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_3.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_l2d_3.java
-.class public dxc/junit/opcodes/l2d/jm/T_l2d_3
-.super java/lang/Object
-
-
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-
-.method public run(F)D
-    .limit stack 2
-    .limit locals 2
-
-    fload_1
-    l2d
-
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_3.java b/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_3.java
deleted file mode 100644
index 92a342f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_3.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.l2d.jm;
-
-public class T_l2d_3 {
-
-    public double run(float a) {
-        return a;
-    }
-    
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_4.j b/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_4.j
deleted file mode 100644
index 42c4e7e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_4.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_l2d_4.java
-.class public dxc/junit/opcodes/l2d/jm/T_l2d_4
-.super java/lang/Object
-
-
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-
-.method public run(I)D
-    .limit stack 2
-    .limit locals 2
-
-    iload_1
-    l2d
-
-    dreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_4.java b/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_4.java
deleted file mode 100644
index 717aedb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.l2d.jm;
-
-public class T_l2d_4 {
-
-    public double run(int a) {
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_5.java b/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_5.java
deleted file mode 100644
index 4a3ebb5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.l2d.jm;
-
-public class T_l2d_5 {
-
-    public void run() {
-        // TODO
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_6.java b/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_6.java
deleted file mode 100644
index f79957e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.l2d.jm;
-
-public class T_l2d_6 {
-
-    public void run() {
-        // TODO
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_7.j b/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_7.j
deleted file mode 100644
index 70fbabb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_7.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_l2d_7.java
-.class public dxc/junit/opcodes/l2d/jm/T_l2d_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(J)D
-    .limit stack 2
-    .limit locals 3
-
-    aload_0
-    l2d
-    dreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_7.java b/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_7.java
deleted file mode 100644
index 2d04278..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2d/jm/T_l2d_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.l2d.jm;
-
-public class T_l2d_7 {
-    
-    public double run(long a) {
-        return a;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2f/Test_l2f.java b/tools/dx-tests/src/dxc/junit/opcodes/l2f/Test_l2f.java
deleted file mode 100644
index 7b1d277..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2f/Test_l2f.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.l2f;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.l2f.jm.T_l2f_1;
-
-public class Test_l2f extends DxTestCase {
-
-    /**
-     * @title  Argument = 123456789012345
-     */
-    public void testN1() {
-        T_l2f_1 t = new T_l2f_1();
-        assertEquals(1.23456788E14f, t.run(123456789012345l), 0f);
-    }
-
-    /**
-     * @title  Argument = 1
-     */
-    public void testN2() {
-        T_l2f_1 t = new T_l2f_1();
-        assertEquals(1f, t.run(1l), 0f);
-    }
-
-    /**
-     * @title  Argument = -1
-     */
-    public void testN3() {
-        T_l2f_1 t = new T_l2f_1();
-        assertEquals(-1f, t.run(-1l), 0f);
-    }
-
-    /**
-     * @title  Argument = Long.MAX_VALUE
-     */
-    public void testB1() {
-        T_l2f_1 t = new T_l2f_1();
-        assertEquals(9.223372036854776E18, t.run(Long.MAX_VALUE), 0f);
-    }
-
-    /**
-     * @title  Argument = Long.MIN_VALUE
-     */
-    public void testB2() {
-        T_l2f_1 t = new T_l2f_1();
-        assertEquals(-9.223372036854776E18, t.run(Long.MIN_VALUE), 0f);
-    }
-
-    /**
-     * @title  Argument = 0
-     */
-    public void testB3() {
-        T_l2f_1 t = new T_l2f_1();
-        assertEquals(0f, t.run(0l), 0f);
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.l2f.jm.T_l2f_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.l2f.jm.T_l2f_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - integer
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.l2f.jm.T_l2f_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - reference
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.l2f.jm.T_l2f_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2f/jm/T_l2f_1.j b/tools/dx-tests/src/dxc/junit/opcodes/l2f/jm/T_l2f_1.j
deleted file mode 100644
index 69cd105..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2f/jm/T_l2f_1.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_l2f_1.java
-.class public dxc/junit/opcodes/l2f/jm/T_l2f_1
-.super java/lang/Object
-
-
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-
-.method public run(J)F
-    .limit stack 2
-    .limit locals 3
-
-    lload_1
-    l2f
-
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2f/jm/T_l2f_1.java b/tools/dx-tests/src/dxc/junit/opcodes/l2f/jm/T_l2f_1.java
deleted file mode 100644
index a115daf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2f/jm/T_l2f_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.l2f.jm;
-
-public class T_l2f_1 {
-
-    public float run(long a) {
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2f/jm/T_l2f_2.j b/tools/dx-tests/src/dxc/junit/opcodes/l2f/jm/T_l2f_2.j
deleted file mode 100644
index abc3a02..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2f/jm/T_l2f_2.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_l2f_2.java
-.class public dxc/junit/opcodes/l2f/jm/T_l2f_2
-.super java/lang/Object
-
-
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-
-.method public run(J)F
-    .limit stack 2
-    .limit locals 3
-
-;    lload_1
-    l2f
-
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2f/jm/T_l2f_2.java b/tools/dx-tests/src/dxc/junit/opcodes/l2f/jm/T_l2f_2.java
deleted file mode 100644
index fde8820..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2f/jm/T_l2f_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.l2f.jm;
-
-public class T_l2f_2 {
-
-    public float run(long a) {
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2f/jm/T_l2f_3.j b/tools/dx-tests/src/dxc/junit/opcodes/l2f/jm/T_l2f_3.j
deleted file mode 100644
index 55b3efd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2f/jm/T_l2f_3.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_l2f_3.java
-.class public dxc/junit/opcodes/l2f/jm/T_l2f_3
-.super java/lang/Object
-
-
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-
-.method public run(D)F
-    .limit stack 2
-    .limit locals 3
-
-    dload_1
-    l2f
-
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2f/jm/T_l2f_3.java b/tools/dx-tests/src/dxc/junit/opcodes/l2f/jm/T_l2f_3.java
deleted file mode 100644
index e4e0342..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2f/jm/T_l2f_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.l2f.jm;
-
-public class T_l2f_3 {
-
-    public float run(double a) {
-        return (float)a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2f/jm/T_l2f_4.j b/tools/dx-tests/src/dxc/junit/opcodes/l2f/jm/T_l2f_4.j
deleted file mode 100644
index 7fa4036..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2f/jm/T_l2f_4.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_l2f_4.java
-.class public dxc/junit/opcodes/l2f/jm/T_l2f_4
-.super java/lang/Object
-
-
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-
-.method public run(I)F
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    l2f
-
-    freturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2f/jm/T_l2f_4.java b/tools/dx-tests/src/dxc/junit/opcodes/l2f/jm/T_l2f_4.java
deleted file mode 100644
index 6bdd0dc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2f/jm/T_l2f_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.l2f.jm;
-
-public class T_l2f_4 {
-
-    public float run(int a) {
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2f/jm/T_l2f_5.j b/tools/dx-tests/src/dxc/junit/opcodes/l2f/jm/T_l2f_5.j
deleted file mode 100644
index 8addc20..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2f/jm/T_l2f_5.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_l2f_5.java
-.class public dxc/junit/opcodes/l2f/jm/T_l2f_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(J)F
-    .limit stack 2
-    .limit locals 3
-
-    aload_0
-    l2f
-    freturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2f/jm/T_l2f_5.java b/tools/dx-tests/src/dxc/junit/opcodes/l2f/jm/T_l2f_5.java
deleted file mode 100644
index dae1222..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2f/jm/T_l2f_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.l2f.jm;
-
-public class T_l2f_5 {
-    
-    public float run(long a) {
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2i/Test_l2i.java b/tools/dx-tests/src/dxc/junit/opcodes/l2i/Test_l2i.java
deleted file mode 100644
index 627e5fc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2i/Test_l2i.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.l2i;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.l2i.jm.T_l2i_1;
-
-public class Test_l2i extends DxTestCase {
-
-    /**
-     * @title  Argument = 0xAAAAFFEEDDCCl
-     */
-    public void testN1() {
-        T_l2i_1 t = new T_l2i_1();
-        assertEquals(0xFFEEDDCC, t.run(0xAAAAFFEEDDCCl));
-    }
-
-    /**
-     * @title  Argument = -123456789
-     */
-    public void testN2() {
-        T_l2i_1 t = new T_l2i_1();
-        assertEquals(-123456789, t.run(-123456789l));
-    }
-
-    /**
-     * @title  Argument = 1
-     */
-    public void testN3() {
-        T_l2i_1 t = new T_l2i_1();
-        assertEquals(1, t.run(1l));
-    }
-
-    /**
-     * @title  Argument = -1
-     */
-    public void testN4() {
-        T_l2i_1 t = new T_l2i_1();
-        assertEquals(-1, t.run(-1l));
-    }
-
-    /**
-     * @title  Argument = Long.MAX_VALUE
-     */
-    public void testB1() {
-        T_l2i_1 t = new T_l2i_1();
-        assertEquals(-1, t.run(Long.MAX_VALUE));
-    }
-
-    /**
-     * @title  Argument = Long.MIN_VALUE
-     */
-    public void testB2() {
-        T_l2i_1 t = new T_l2i_1();
-        assertEquals(0, t.run(Long.MIN_VALUE));
-    }
-
-    /**
-     * @title  Argument = 0
-     */
-    public void testB3() {
-        T_l2i_1 t = new T_l2i_1();
-        assertEquals(0, t.run(0l));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.l2i.jm.T_l2i_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.l2i.jm.T_l2i_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - float
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.l2i.jm.T_l2i_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - reference
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.l2i.jm.T_l2i_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2i/jm/T_l2i_1.j b/tools/dx-tests/src/dxc/junit/opcodes/l2i/jm/T_l2i_1.j
deleted file mode 100644
index 7acd7e2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2i/jm/T_l2i_1.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_l2i_1.java
-.class public dxc/junit/opcodes/l2i/jm/T_l2i_1
-.super java/lang/Object
-
-
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-
-.method public run(J)I
-    .limit stack 2
-    .limit locals 3
-
-    lload_1
-    l2i
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2i/jm/T_l2i_1.java b/tools/dx-tests/src/dxc/junit/opcodes/l2i/jm/T_l2i_1.java
deleted file mode 100644
index a871771..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2i/jm/T_l2i_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.l2i.jm;
-
-public class T_l2i_1 {
-
-    public int run(long a) {
-        return (int) a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2i/jm/T_l2i_2.j b/tools/dx-tests/src/dxc/junit/opcodes/l2i/jm/T_l2i_2.j
deleted file mode 100644
index d2a23ac..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2i/jm/T_l2i_2.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_l2i_2.java
-.class public dxc/junit/opcodes/l2i/jm/T_l2i_2
-.super java/lang/Object
-
-
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-
-.method public run(J)I
-    .limit stack 2
-    .limit locals 3
-
-;    lload_1
-    l2i
-
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2i/jm/T_l2i_2.java b/tools/dx-tests/src/dxc/junit/opcodes/l2i/jm/T_l2i_2.java
deleted file mode 100644
index beabb5f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2i/jm/T_l2i_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.l2i.jm;
-
-public class T_l2i_2 {
-
-    public int run(long a) {
-        return (int) a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2i/jm/T_l2i_3.j b/tools/dx-tests/src/dxc/junit/opcodes/l2i/jm/T_l2i_3.j
deleted file mode 100644
index 013f9b1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2i/jm/T_l2i_3.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_l2i_3.java
-.class public dxc/junit/opcodes/l2i/jm/T_l2i_3
-.super java/lang/Object
-
-
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-
-.method public run(D)I
-    .limit stack 2
-    .limit locals 3
-
-    dload_1
-    l2i
-
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2i/jm/T_l2i_3.java b/tools/dx-tests/src/dxc/junit/opcodes/l2i/jm/T_l2i_3.java
deleted file mode 100644
index edcc6d9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2i/jm/T_l2i_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.l2i.jm;
-
-public class T_l2i_3 {
-
-    public int run(double a) {
-        return (int) a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2i/jm/T_l2i_4.j b/tools/dx-tests/src/dxc/junit/opcodes/l2i/jm/T_l2i_4.j
deleted file mode 100644
index acc31bd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2i/jm/T_l2i_4.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_l2i_4.java
-.class public dxc/junit/opcodes/l2i/jm/T_l2i_4
-.super java/lang/Object
-
-
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-
-.method public run(F)I
-    .limit stack 2
-    .limit locals 3
-
-    fload_1
-    l2i
-
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2i/jm/T_l2i_4.java b/tools/dx-tests/src/dxc/junit/opcodes/l2i/jm/T_l2i_4.java
deleted file mode 100644
index af8320c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2i/jm/T_l2i_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.l2i.jm;
-
-public class T_l2i_4 {
-
-    public int run(float a) {
-        return (int) a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2i/jm/T_l2i_5.j b/tools/dx-tests/src/dxc/junit/opcodes/l2i/jm/T_l2i_5.j
deleted file mode 100644
index 8ee7bcd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2i/jm/T_l2i_5.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_l2i_5.java
-.class public dxc/junit/opcodes/l2i/jm/T_l2i_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(J)I
-    .limit stack 2
-    .limit locals 3
-
-    aload_0
-    l2i
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/l2i/jm/T_l2i_5.java b/tools/dx-tests/src/dxc/junit/opcodes/l2i/jm/T_l2i_5.java
deleted file mode 100644
index 1ffbb57..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/l2i/jm/T_l2i_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.l2i.jm;
-
-public class T_l2i_5 {
-    
-    public int run(long a) {
-        return (int) a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ladd/Test_ladd.java b/tools/dx-tests/src/dxc/junit/opcodes/ladd/Test_ladd.java
deleted file mode 100644
index 7c37739..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ladd/Test_ladd.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ladd;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.ladd.jm.T_ladd_1;
-
-public class Test_ladd extends DxTestCase {
-
-    /**
-     * @title Arguments = 12345678l, 87654321l
-     */
-    public void testN1() {
-        T_ladd_1 t = new T_ladd_1();
-        assertEquals(99999999l, t.run(12345678l, 87654321l));
-    }
-
-    /**
-     * @title Arguments = 0l, 87654321l
-     */
-    public void testN2() {
-        T_ladd_1 t = new T_ladd_1();
-        assertEquals(87654321l, t.run(0l, 87654321l));
-    }
-
-    /**
-     * @title Arguments = -12345678l, 0l
-     */
-    public void testN3() {
-        T_ladd_1 t = new T_ladd_1();
-        assertEquals(-12345678l, t.run(-12345678l, 0l));
-    }
-
-    /**
-     * @title  Arguments: 0 + Long.MAX_VALUE
-     */
-    public void testB1() {
-        T_ladd_1 t = new T_ladd_1();
-        assertEquals(9223372036854775807L, t.run(0l, Long.MAX_VALUE));
-    }
-
-    /**
-     * @title  Arguments: 0 + Long.MIN_VALUE
-     */
-    public void testB2() {
-        T_ladd_1 t = new T_ladd_1();
-        assertEquals(-9223372036854775808L, t.run(0l, Long.MIN_VALUE));
-    }
-
-    /**
-     * @title  Arguments: 0 + 0
-     */
-    public void testB3() {
-        T_ladd_1 t = new T_ladd_1();
-        assertEquals(0l, t.run(0l, 0l));
-    }
-
-    /**
-     * @title  Arguments: Long.MAX_VALUE + Long.MAX_VALUE
-     */
-    public void testB4() {
-        T_ladd_1 t = new T_ladd_1();
-        assertEquals(-2, t.run(Long.MAX_VALUE, Long.MAX_VALUE));
-    }
-
-    /**
-     * @title  Arguments: Long.MAX_VALUE + Long.MIN_VALUE
-     */
-    public void testB5() {
-        T_ladd_1 t = new T_ladd_1();
-        assertEquals(-1l, t.run(Long.MAX_VALUE, Long.MIN_VALUE));
-    }
-
-    /**
-     * @title  Arguments: Long.MIN_VALUE + Long.MIN_VALUE
-     */
-    public void testB6() {
-        T_ladd_1 t = new T_ladd_1();
-        assertEquals(0l, t.run(Long.MIN_VALUE, Long.MIN_VALUE));
-    }
-
-    /**
-     * @title  Arguments: Long.MIN_VALUE + 1
-     */
-    public void testB7() {
-        T_ladd_1 t = new T_ladd_1();
-        assertEquals(-9223372036854775807l, t.run(Long.MIN_VALUE, 1l));
-    }
-
-    /**
-     * @title  Arguments: Long.MAX_VALUE + 1
-     */
-    public void testB8() {
-        T_ladd_1 t = new T_ladd_1();
-        assertEquals(-9223372036854775808l, t.run(Long.MAX_VALUE, 1l));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.ladd.jm.T_ladd_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long / double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.ladd.jm.T_ladd_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long / integer
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.ladd.jm.T_ladd_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long / float
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.ladd.jm.T_ladd_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference / long
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.ladd.jm.T_ladd_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_1.j b/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_1.j
deleted file mode 100644
index 03b8556..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_1.j
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ladd_1.java
-.class public dxc/junit/opcodes/ladd/jm/T_ladd_1
-.super java/lang/Object
-
-
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-
-.method public run(JJ)J
-    .limit stack 4
-    .limit locals 5
-
-    lload_1
-    lload_3
-    ladd
-
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_1.java b/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_1.java
deleted file mode 100644
index 56c7f9a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ladd.jm;
-
-public class T_ladd_1 {
-
-    public long run(long a, long b) {
-        return a+b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_2.j b/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_2.j
deleted file mode 100644
index 5757930..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_2.j
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ladd_2.java
-.class public dxc/junit/opcodes/ladd/jm/T_ladd_2
-.super java/lang/Object
-
-
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-
-.method public run(JJ)J
-    .limit stack 4
-    .limit locals 5
-
-;    lload_1
-    lload_3
-    ladd
-
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_2.java b/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_2.java
deleted file mode 100644
index 98d4e78..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ladd.jm;
-
-public class T_ladd_2 {
-
-    public long run(long a, long b) {
-        return a+b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_3.j b/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_3.j
deleted file mode 100644
index 0fb7885..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_3.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ladd_3.java
-.class public dxc/junit/opcodes/ladd/jm/T_ladd_3
-.super java/lang/Object
-
-
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-
-.method public run(JD)J
-    .limit stack 4
-    .limit locals 5
-
-    lload_1
-    dload_3
-;    d2l    
-    ladd
-
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_3.java b/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_3.java
deleted file mode 100644
index cc306af..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ladd.jm;
-
-public class T_ladd_3 {
-
-    public long run(long a, double b) {
-        return (long)(a+b);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_4.j b/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_4.j
deleted file mode 100644
index da9d27f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_4.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ladd_4.java
-.class public dxc/junit/opcodes/ladd/jm/T_ladd_4
-.super java/lang/Object
-
-
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-
-.method public run(JI)J
-    .limit stack 4
-    .limit locals 4
-
-    lload_1
-    iload_3
-;    i2l
-    ladd
-
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_4.java b/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_4.java
deleted file mode 100644
index 0412967..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ladd.jm;
-
-public class T_ladd_4 {
-
-    public long run(long a, int b) {
-        return a+b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_5.j b/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_5.j
deleted file mode 100644
index fbb7d16..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_5.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ladd_5.java
-.class public dxc/junit/opcodes/ladd/jm/T_ladd_5
-.super java/lang/Object
-
-
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-
-.method public run(JF)J
-    .limit stack 4
-    .limit locals 4
-
-    lload_1
-    fload_3
-;    f2l    
-    ladd
-
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_5.java b/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_5.java
deleted file mode 100644
index 0468585..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ladd.jm;
-
-public class T_ladd_5 {
-
-    public long run(long a, float b) {
-        return (long)(a+b);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_6.j b/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_6.j
deleted file mode 100644
index c82e12e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_6.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ladd_6.java
-.class public dxc/junit/opcodes/ladd/jm/T_ladd_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(JJ)J
-    .limit stack 4
-    .limit locals 5
-
-    aload_0
-    lload_3
-    ladd
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_6.java b/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_6.java
deleted file mode 100644
index b7fefc4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ladd/jm/T_ladd_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ladd.jm;
-
-public class T_ladd_6 {
-    
-    public long run(long a, long b) {
-        return a+b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/laload/Test_laload.java b/tools/dx-tests/src/dxc/junit/opcodes/laload/Test_laload.java
deleted file mode 100644
index a4c0b97..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/laload/Test_laload.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.laload;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.laload.jm.T_laload_1;
-
-public class Test_laload extends DxTestCase {
-
-    /**
-     * @title normal test. trying different indexes
-     */
-    public void testN1() {
-        T_laload_1 t = new T_laload_1();
-        long[] arr = new long[2];
-        arr[1] = 1000000000000000000l;
-        assertEquals(1000000000000000000l, t.run(arr, 1));
-    }
-
-    /**
-     * @title normal test. trying different indexes
-     */
-    public void testN2() {
-        T_laload_1 t = new T_laload_1();
-        long[] arr = new long[2];
-        arr[0] = 1000000000000000000l;
-        assertEquals(1000000000000000000l, t.run(arr, 0));
-    }
-
-    /**
-     * @title  Exception - ArrayIndexOutOfBoundsException
-     */
-    public void testE1() {
-        T_laload_1 t = new T_laload_1();
-        long[] arr = new long[2];
-        try {
-            t.run(arr, 2);
-            fail("expected ArrayIndexOutOfBoundsException");
-        } catch (ArrayIndexOutOfBoundsException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @title  Exception - NullPointerException
-     */
-    public void testE2() {
-        T_laload_1 t = new T_laload_1();
-        try {
-            t.run(null, 2);
-            fail("expected NullPointerException");
-        } catch (NullPointerException np) {
-            // expected
-        }
-    }
-
-    /**
-     * @title  Exception - ArrayIndexOutOfBoundsException
-     */
-    public void testE3() {
-        T_laload_1 t = new T_laload_1();
-        long[] arr = new long[2];
-        try {
-            t.run(arr, -1);
-            fail("expected ArrayIndexOutOfBoundsException");
-        } catch (ArrayIndexOutOfBoundsException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.laload.jm.T_laload_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.laload.jm.T_laload_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, double
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.laload.jm.T_laload_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, float
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.laload.jm.T_laload_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, long
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.laload.jm.T_laload_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - Object, long
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.laload.jm.T_laload_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double[], long
-     */
-    public void testVFE7() {
-        try {
-            Class.forName("dxc.junit.opcodes.laload.jm.T_laload_8");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int[], long
-     */
-    public void testVFE8() {
-        try {
-            Class.forName("dxc.junit.opcodes.laload.jm.T_laload_9");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, reference
-     */
-    public void testVFE9() {
-        try {
-            Class.forName("dxc.junit.opcodes.laload.jm.T_laload_10");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_1.j b/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_1.j
deleted file mode 100644
index 156aad2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_1.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_laload_1.java
-.class public dxc/junit/opcodes/laload/jm/T_laload_1
-.super java/lang/Object
-
-
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-
-.method public run([JI)J
-    .limit stack 2
-    .limit locals 3
-
-    aload_1
-    iload_2
-    
-    laload
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_1.java b/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_1.java
deleted file mode 100644
index 0e06614..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.laload.jm;
-
-public class T_laload_1 {
-
-    public long run(long[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_10.j b/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_10.j
deleted file mode 100644
index ca6cbcf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_10.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_laload_10.java
-.class public dxc/junit/opcodes/laload/jm/T_laload_10
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([JI)J
-    .limit stack 2
-    .limit locals 3
-
-    aload_1
-    aload_0
-    laload
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_10.java b/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_10.java
deleted file mode 100644
index a6fa4bc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_10.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.laload.jm;
-
-public class T_laload_10 {
-    
-    public long run(long[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_2.j b/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_2.j
deleted file mode 100644
index 0b1bc5b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_2.j
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_laload_2.java
-.class public dxc/junit/opcodes/laload/jm/T_laload_2
-.super java/lang/Object
-
-
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-
-.method public run([JI)J
-    .limit stack 2
-    .limit locals 3
-
-;    aload_1
-    iload_2
-    laload
-
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_2.java b/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_2.java
deleted file mode 100644
index 93854c9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.laload.jm;
-
-public class T_laload_2 {
-
-    public long run(long[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_3.j b/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_3.j
deleted file mode 100644
index da77288..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_3.j
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_laload_3.java
-.class public dxc/junit/opcodes/laload/jm/T_laload_3
-.super java/lang/Object
-
-
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-
-.method public run([JI)J
-    .limit stack 2
-    .limit locals 3
-
-    aload_1
-;    iload_2
-    laload
-
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_3.java b/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_3.java
deleted file mode 100644
index 2230c0d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.laload.jm;
-
-public class T_laload_3 {
-
-    public long run(long[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_4.j b/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_4.j
deleted file mode 100644
index 18646c6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_4.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_laload_4.java
-.class public dxc/junit/opcodes/laload/jm/T_laload_4
-.super java/lang/Object
-
-
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-
-.method public run([JD)J
-    .limit stack 5
-    .limit locals 4
-
-    aload_1
-    dload_2
-;    d2i
-    laload
-
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_4.java b/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_4.java
deleted file mode 100644
index fbff226..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.laload.jm;
-
-public class T_laload_4 {
-
-    public long run(long[] arr, double idx) {
-        return arr[(int)idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_5.j b/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_5.j
deleted file mode 100644
index 5b8fcae..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_5.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_laload_5.java
-.class public dxc/junit/opcodes/laload/jm/T_laload_5
-.super java/lang/Object
-
-
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-
-.method public run([JF)J
-    .limit stack 2
-    .limit locals 3
-
-    aload_1
-    fload_2
-;    f2i
-    laload
-
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_5.java b/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_5.java
deleted file mode 100644
index b3072a6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.laload.jm;
-
-public class T_laload_5 {
-
-    public long run(long[] arr, float idx) {
-        return arr[(int)idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_6.j b/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_6.j
deleted file mode 100644
index 299b9ae..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_6.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_laload_6.java
-.class public dxc/junit/opcodes/laload/jm/T_laload_6
-.super java/lang/Object
-
-
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-
-.method public run([JJ)J
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    lload_2
-;    l2i
-    laload
-
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_6.java b/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_6.java
deleted file mode 100644
index 1d2e294..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.laload.jm;
-
-public class T_laload_6 {
-
-    public long run(long[] arr, long idx) {
-        return arr[(int)idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_7.j b/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_7.j
deleted file mode 100644
index 747b974..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_7.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_laload_7.java
-.class public dxc/junit/opcodes/laload/jm/T_laload_7
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-.method public run(Ljava/lang/Object;[JI)J
-    .limit stack 2
-    .limit locals 4
-
-    aload_1
-    iload_3
-    laload
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_7.java b/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_7.java
deleted file mode 100644
index 3c54ede..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.laload.jm;
-
-public class T_laload_7 {
-
-    public long run(Object a, long[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_8.j b/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_8.j
deleted file mode 100644
index 8fb0626..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_8.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_laload_8.java
-.class public dxc/junit/opcodes/laload/jm/T_laload_8
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-
-.method public run([D[JI)J
-    .limit stack 2
-    .limit locals 4
-
-    aload_1
-    iload_3
-    laload
-
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_8.java b/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_8.java
deleted file mode 100644
index 908c1ad..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.laload.jm;
-
-public class T_laload_8 {
-
-    public long run(double[] a, long[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_9.j b/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_9.j
deleted file mode 100644
index 152895c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_9.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_laload_9.java
-.class public dxc/junit/opcodes/laload/jm/T_laload_9
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-.method public run([I[JI)J
-    .limit stack 2
-    .limit locals 4
-
-    aload_1
-    iload_3
-    laload
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_9.java b/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_9.java
deleted file mode 100644
index e4a0373..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/laload/jm/T_laload_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.laload.jm;
-
-public class T_laload_9 {
-
-    public long run(int[] a, long[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/land/Test_land.java b/tools/dx-tests/src/dxc/junit/opcodes/land/Test_land.java
deleted file mode 100644
index 6902318..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/land/Test_land.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.land;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.land.jm.T_land_1;
-
-public class Test_land extends DxTestCase {
-
-    /**
-     * @title Arguments = 0xfffffff8aal, 0xfffffff1aal
-     */
-    public void testN1() {
-        T_land_1 t = new T_land_1();
-        assertEquals(0xfffffff0aal, t.run(0xfffffff8aal, 0xfffffff1aal));
-    }
-
-    /**
-     * @title Arguments = 987654321, 123456789
-     */
-    public void testN2() {
-        T_land_1 t = new T_land_1();
-        assertEquals(39471121, t.run(987654321, 123456789));
-    }
-
-    /**
-     * @title  Arguments = 0xABCDEF & -1
-     */
-    public void testN3() {
-        T_land_1 t = new T_land_1();
-        assertEquals(0xABCDEF, t.run(0xABCDEF, -1));
-    }
-
-    /**
-     * @title  Arguments = 0 & -1
-     */
-    public void testB1() {
-        T_land_1 t = new T_land_1();
-        assertEquals(0, t.run(0, -1));
-    }
-
-    /**
-     * @title  Arguments = Long.MAX_VALUE & Long.MIN_VALUE
-     */
-    public void testB2() {
-        T_land_1 t = new T_land_1();
-        assertEquals(0, t.run(Long.MAX_VALUE, Long.MIN_VALUE));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.land.jm.T_land_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - float & long
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.land.jm.T_land_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int & long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.land.jm.T_land_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference & long
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.land.jm.T_land_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_1.j b/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_1.j
deleted file mode 100644
index ceffcd2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_1.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_land_1.java
-.class public dxc/junit/opcodes/land/jm/T_land_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-.method public run(JJ)J
-    .limit stack 4
-    .limit locals 5
-
-    lload_1
-    lload_3
-    land
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_1.java b/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_1.java
deleted file mode 100644
index dfb8ce3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.land.jm;
-
-public class T_land_1 {
-
-    public long run(long a, long b) {
-        return a & b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_2.j b/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_2.j
deleted file mode 100644
index ca6c6bd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_2.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_land_2.java
-.class public dxc/junit/opcodes/land/jm/T_land_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-
-.method public run(JJ)J
-    .limit stack 4
-    .limit locals 5
-
-    lload_1
-;    lload_3
-    land
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_2.java b/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_2.java
deleted file mode 100644
index 2eeb88f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.land.jm;
-
-public class T_land_2 {
-
-    public long run(long a, long b) {
-        return a & b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_3.j b/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_3.j
deleted file mode 100644
index f2e9b24..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_3.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_land_3.java
-.class public dxc/junit/opcodes/land/jm/T_land_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-.method public run(FJ)J
-    .limit stack 4
-    .limit locals 4
-
-    fload_1
-;    f2l
-    lload_2
-    land
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_3.java b/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_3.java
deleted file mode 100644
index 4d669ae..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.land.jm;
-
-public class T_land_3 {
-
-    public long run(float a, long b) {
-        return (long)a & b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_4.j b/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_4.j
deleted file mode 100644
index 8387452..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_4.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_land_4.java
-.class public dxc/junit/opcodes/land/jm/T_land_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-.method public run(IJ)J
-    .limit stack 4
-    .limit locals 4
-
-    iload_1
-;    i2l
-    lload_2
-    land
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_4.java b/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_4.java
deleted file mode 100644
index 05240b8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.land.jm;
-
-public class T_land_4 {
-
-    public long run(int a, long b) {
-        return a & b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_5.java b/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_5.java
deleted file mode 100644
index 71b07b2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.land.jm;
-
-public class T_land_5 {
-
-    public void run() {
-        // TODO
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_6.java b/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_6.java
deleted file mode 100644
index 1320ff8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.land.jm;
-
-public class T_land_6 {
-
-    public void run() {
-        // TODO
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_7.j b/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_7.j
deleted file mode 100644
index 7547338..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_7.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_land_7.java
-.class public dxc/junit/opcodes/land/jm/T_land_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(JJ)J
-    .limit stack 4
-    .limit locals 5
-
-    aload_0
-    lload_3
-    land
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_7.java b/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_7.java
deleted file mode 100644
index 3df40e1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/land/jm/T_land_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.land.jm;
-
-public class T_land_7 {
-    
-    public long run(long a, long b) {
-        return a & b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lastore/Test_lastore.java b/tools/dx-tests/src/dxc/junit/opcodes/lastore/Test_lastore.java
deleted file mode 100644
index 269cdc7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lastore/Test_lastore.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lastore;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.lastore.jm.T_lastore_1;
-
-public class Test_lastore extends DxTestCase {
-
-    /**
-     * @title normal test. trying different indexes
-     */
-    public void testN1() {
-        T_lastore_1 t = new T_lastore_1();
-        long[] arr = new long[2];
-        t.run(arr, 1, 100000000000l);
-        assertEquals(100000000000l, arr[1]);
-    }
-
-    /**
-     * @title normal test. trying different indexes
-     */
-    public void testN2() {
-        T_lastore_1 t = new T_lastore_1();
-        long[] arr = new long[2];
-        t.run(arr, 0, 100000000000l);
-        assertEquals(100000000000l, arr[0]);
-    }
-
-    /**
-     * @title  Exception - ArrayIndexOutOfBoundsException
-     */
-    public void testE1() {
-        T_lastore_1 t = new T_lastore_1();
-        long[] arr = new long[2];
-        try {
-            t.run(arr, 2, 100000000000l);
-            fail("expected ArrayIndexOutOfBoundsException");
-        } catch (ArrayIndexOutOfBoundsException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @title  Exception - NullPointerException
-     */
-    public void testE2() {
-        T_lastore_1 t = new T_lastore_1();
-        try {
-            t.run(null, 1, 100000000000l);
-            fail("expected NullPointerException");
-        } catch (NullPointerException np) {
-            // expected
-        }
-    }
-
-    /**
-     * @title  Exception - ArrayIndexOutOfBoundsException
-     */
-    public void testE3() {
-        T_lastore_1 t = new T_lastore_1();
-        long[] arr = new long[2];
-        try {
-            t.run(arr, -1, 100000000000l);
-            fail("expected ArrayIndexOutOfBoundsException");
-        } catch (ArrayIndexOutOfBoundsException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.lastore.jm.T_lastore_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.lastore.jm.T_lastore_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, double,
-     * long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.lastore.jm.T_lastore_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, int, int
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.lastore.jm.T_lastore_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - object, int, long
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.lastore.jm.T_lastore_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double[], int,
-     * long
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.lastore.jm.T_lastore_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int[], int, long
-     */
-    public void testVFE7() {
-        try {
-            Class.forName("dxc.junit.opcodes.lastore.jm.T_lastore_8");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, reference,
-     * long
-     */
-    public void testVFE8() {
-        try {
-            Class.forName("dxc.junit.opcodes.lastore.jm.T_lastore_9");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_1.j b/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_1.j
deleted file mode 100644
index 84a545d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_1.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lastore_1.java
-.class public dxc/junit/opcodes/lastore/jm/T_lastore_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run([JIJ)V
-    .limit stack 4
-    .limit locals 5
-
-    aload_1
-    iload_2
-    lload_3
-    lastore
-
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_1.java b/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_1.java
deleted file mode 100644
index 1b99d7e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lastore.jm;
-
-public class T_lastore_1 {
-
-    public void run(long[] arr, int idx, long value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_2.j b/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_2.j
deleted file mode 100644
index e390ddc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_2.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lastore_2.java
-.class public dxc/junit/opcodes/lastore/jm/T_lastore_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-.method public run([JIJ)V
-    .limit stack 4
-    .limit locals 5
-
-    aload_1
-    iload_2
-;    lload_3
-    lastore
-
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_2.java b/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_2.java
deleted file mode 100644
index 5ffe95a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lastore.jm;
-
-public class T_lastore_2 {
-
-    public void run(long[] arr, int idx, long value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_3.j b/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_3.j
deleted file mode 100644
index c99fb54..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_3.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lastore_3.java
-.class public dxc/junit/opcodes/lastore/jm/T_lastore_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-.method public run([JIJ)V
-    .limit stack 4
-    .limit locals 5
-
-;    aload_1
-    iload_2
-    lload_3
-    lastore
-
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_3.java b/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_3.java
deleted file mode 100644
index 49f5b9f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lastore.jm;
-
-public class T_lastore_3 {
-
-    public void run(long[] arr, int idx, long value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_4.j b/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_4.j
deleted file mode 100644
index 0ad73cf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_4.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lastore_4.java
-.class public dxc/junit/opcodes/lastore/jm/T_lastore_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-.method public run([JDJ)V
-    .limit stack 5
-    .limit locals 6
-
-    aload_1
-    dload_2
-;    d2i
-    lload 4
-    lastore
-
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_4.java b/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_4.java
deleted file mode 100644
index d18b82f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lastore.jm;
-
-public class T_lastore_4 {
-
-    public void run(long[] arr, double idx, long value) {
-        arr[(int)idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_5.j b/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_5.j
deleted file mode 100644
index 8c2ffd3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_5.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lastore_5.java
-.class public dxc/junit/opcodes/lastore/jm/T_lastore_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-.method public run([JII)V
-    .limit stack 4
-    .limit locals 4
-    
-    aload_1
-    iload_2
-    iload_3
-;    i2l
-    lastore
-
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_5.java b/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_5.java
deleted file mode 100644
index 091def6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lastore.jm;
-
-public class T_lastore_5 {
-
-    public void run(long[] arr, int idx, int value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_6.j b/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_6.j
deleted file mode 100644
index 0b74d34..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_6.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lastore_6.java
-.class public dxc/junit/opcodes/lastore/jm/T_lastore_6
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-.method public run(Ljava/lang/Object;[JIJ)V
-    .limit stack 4
-    .limit locals 6
-
-    aload_1
-    iload_3
-    lload 4
-    lastore
-
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_6.java b/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_6.java
deleted file mode 100644
index 8fd85cc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lastore.jm;
-
-public class T_lastore_6 {
-
-    public void run(Object a, long[] arr, int idx, long value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_7.j b/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_7.j
deleted file mode 100644
index fbd9554..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_7.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lastore_7.java
-.class public dxc/junit/opcodes/lastore/jm/T_lastore_7
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-.method public run([D[JIJ)V
-    .limit stack 4
-    .limit locals 6
-
-    aload_1
-    iload_3
-    lload 4
-    lastore
-
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_7.java b/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_7.java
deleted file mode 100644
index f878359..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lastore.jm;
-
-public class T_lastore_7 {
-    
-    public void run(double[] a, long[] arr, int idx, long value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_8.j b/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_8.j
deleted file mode 100644
index abde74c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_8.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lastore_8.java
-.class public dxc/junit/opcodes/lastore/jm/T_lastore_8
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-.method public run([I[JIJ)V
-    .limit stack 4
-    .limit locals 6
-
-    aload_1
-    iload_3
-    lload 4
-    lastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_8.java b/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_8.java
deleted file mode 100644
index 21de247..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lastore.jm;
-
-public class T_lastore_8 {
-    
-    public void run(int[] a, long[] arr, int idx, long value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_9.j b/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_9.j
deleted file mode 100644
index dd05a54..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_9.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lastore_9.java
-.class public dxc/junit/opcodes/lastore/jm/T_lastore_9
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([JIJ)V
-    .limit stack 4
-    .limit locals 5
-
-    aload_1
-    aload_0
-    lload_3
-    lastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_9.java b/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_9.java
deleted file mode 100644
index 2cc91fb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lastore/jm/T_lastore_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lastore.jm;
-
-public class T_lastore_9 {
-    
-    public void run(long[] arr, int idx, long value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lcmp/Test_lcmp.java b/tools/dx-tests/src/dxc/junit/opcodes/lcmp/Test_lcmp.java
deleted file mode 100644
index 7a5e66a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lcmp/Test_lcmp.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lcmp;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.lcmp.jm.T_lcmp_1;
-
-public class Test_lcmp extends DxTestCase {
-
-    /**
-     * @title  Arguments = 111234567891l > 111234567890l
-     */
-    public void testN1() {
-        T_lcmp_1 t = new T_lcmp_1();
-        assertEquals(1, t.run(111234567891l, 111234567890l));
-    }
-
-    /**
-     * @title  Arguments = 112234567890 == 112234567890
-     */
-    public void testN2() {
-        T_lcmp_1 t = new T_lcmp_1();
-        assertEquals(0, t.run(112234567890l, 112234567890l));
-    }
-
-    /**
-     * @title  Arguments = 112234567890 < 998876543210
-     */
-    public void testN3() {
-        T_lcmp_1 t = new T_lcmp_1();
-        assertEquals(-1, t.run(112234567890l, 998876543210l));
-    }
-
-    /**
-     * @title  Arguments = Long.MAX_VALUE > Long.MIN_VALUE
-     */
-    public void testB1() {
-        T_lcmp_1 t = new T_lcmp_1();
-        assertEquals(1, t.run(Long.MAX_VALUE, Long.MIN_VALUE));
-    }
-
-    /**
-     * @title  Arguments = Long.MIN_VALUE < Long.MAX_VALUE
-     */
-    public void testB2() {
-        T_lcmp_1 t = new T_lcmp_1();
-        assertEquals(-1, t.run(Long.MIN_VALUE, Long.MAX_VALUE));
-    }
-
-    /**
-     * @title  Arguments = 1 > 0
-     */
-    public void testB3() {
-        T_lcmp_1 t = new T_lcmp_1();
-        assertEquals(1, t.run(1l, 0l));
-    }
-
-    /**
-     * @title  Arguments = 0 > -1
-     */
-    public void testB4() {
-        T_lcmp_1 t = new T_lcmp_1();
-        assertEquals(1, t.run(0l, -1l));
-    }
-
-    /**
-     * @title  Arguments = -1 < 0
-     */
-    public void testB5() {
-        T_lcmp_1 t = new T_lcmp_1();
-        assertEquals(-1, t.run(-1l, 0l));
-    }
-
-    /**
-     * @title  Arguments = 0 = 0
-     */
-    public void testB6() {
-        T_lcmp_1 t = new T_lcmp_1();
-        assertEquals(0, t.run(0l, 0l));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.lcmp.jm.T_lcmp_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long, double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.lcmp.jm.T_lcmp_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - float, long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.lcmp.jm.T_lcmp_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int, long
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.lcmp.jm.T_lcmp_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference, long
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.lcmp.jm.T_lcmp_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_1.j b/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_1.j
deleted file mode 100644
index a37867b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_1.j
+++ /dev/null
@@ -1,58 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lcmp_1.java
-.class public dxc/junit/opcodes/lcmp/jm/T_lcmp_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-.method public run(JJ)I
-    .limit stack 4
-    .limit locals 5
-
-    lload_1
-    lload_3
-    
-    lcmp
-    ifle Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    
-    lload_1
-    lload_3
-    
-    lcmp
-    ifne Label1
-    iconst_0
-    ireturn
-
-    Label1:
-
-    iconst_m1
-
-    Label3:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_1.java b/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_1.java
deleted file mode 100644
index 648eef6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_1.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lcmp.jm;
-
-public class T_lcmp_1 {
-
-    public int run(long a, long b) {
-        if (a > b)   return 1;
-        if (a == b)  return 0;
-        return -1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_2.j b/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_2.j
deleted file mode 100644
index 30e358f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_2.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lcmp_2.java
-.class public dxc/junit/opcodes/lcmp/jm/T_lcmp_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-.method public run(JJ)I
-    .limit stack 4
-    .limit locals 5
-
-;    lload_1
-    lload_3
-    lcmp
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_2.java b/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_2.java
deleted file mode 100644
index 9443337..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_2.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lcmp.jm;
-
-public class T_lcmp_2 {
-
-    public int run(long a, long b) {
-        if (a > b)   return 1;
-        if (a == b)  return 0;
-        return -1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_3.j b/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_3.j
deleted file mode 100644
index 16498e2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_3.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lcmp_3.java
-.class public dxc/junit/opcodes/lcmp/jm/T_lcmp_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(JD)Z
-    .limit stack 4
-    .limit locals 5
-    
-    lload_1
-    dload_3
-;    d2l
-    lcmp
-
-    ireturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_3.java b/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_3.java
deleted file mode 100644
index 6c560b8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lcmp.jm;
-
-public class T_lcmp_3 {
-
-    public boolean run(long a, double b) {
-        return  a > b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_4.j b/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_4.j
deleted file mode 100644
index 01d5862..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_4.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lcmp_4.java
-.class public dxc/junit/opcodes/lcmp/jm/T_lcmp_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(FJ)Z
-    .limit stack 3
-    .limit locals 4
-    
-    fload_1
-;    f2l    
-    lload_2
-    lcmp
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_4.java b/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_4.java
deleted file mode 100644
index 610f55c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lcmp.jm;
-
-public class T_lcmp_4 {
-
-    public boolean run(float a, long b) {
-        return  a > b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_5.j b/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_5.j
deleted file mode 100644
index e726534..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_5.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lcmp_5.java
-.class public dxc/junit/opcodes/lcmp/jm/T_lcmp_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(IJ)Z
-    .limit stack 4
-    .limit locals 4
-
-    iload_1
-;    i2l
-    lload_2
-    lcmp
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_5.java b/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_5.java
deleted file mode 100644
index 3e6e5a5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lcmp.jm;
-
-public class T_lcmp_5 {
-
-    public boolean run(int a, long b) {
-        return  a > b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_6.j b/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_6.j
deleted file mode 100644
index 115621e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_6.j
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lcmp_6.java
-.class public dxc/junit/opcodes/lcmp/jm/T_lcmp_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(IJ)Z
-    .limit stack 4
-    .limit locals 4
-
-    aload_0
-    lload_2
-    lcmp
-    ifle Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-
-    Label2:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_6.java b/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_6.java
deleted file mode 100644
index bd3b599..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lcmp/jm/T_lcmp_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lcmp.jm;
-
-public class T_lcmp_6 {
-
-    public boolean run(int a, long b) {
-        return  a > b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lconst_0/Test_lconst_0.java b/tools/dx-tests/src/dxc/junit/opcodes/lconst_0/Test_lconst_0.java
deleted file mode 100644
index 7da9440..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lconst_0/Test_lconst_0.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lconst_0;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.lconst_0.jm.T_lconst_0_1;
-
-public class Test_lconst_0 extends DxTestCase {
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_lconst_0_1 t = new T_lconst_0_1();
-        long a = 20l;
-        long b = 20l;
-        assertEquals(a - b, t.run());
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.lconst_0.jm.T_lconst_0_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lconst_0/jm/T_lconst_0_1.j b/tools/dx-tests/src/dxc/junit/opcodes/lconst_0/jm/T_lconst_0_1.j
deleted file mode 100644
index 615936c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lconst_0/jm/T_lconst_0_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lconst_0_1.java
-.class public dxc/junit/opcodes/lconst_0/jm/T_lconst_0_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()J
-    .limit stack 2
-    .limit locals 1
-
-    lconst_0
-
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lconst_0/jm/T_lconst_0_1.java b/tools/dx-tests/src/dxc/junit/opcodes/lconst_0/jm/T_lconst_0_1.java
deleted file mode 100644
index 6d20fef..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lconst_0/jm/T_lconst_0_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lconst_0.jm;
-
-public class T_lconst_0_1 {
-
-    public long run() {
-        return 0l;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lconst_0/jm/T_lconst_0_2.j b/tools/dx-tests/src/dxc/junit/opcodes/lconst_0/jm/T_lconst_0_2.j
deleted file mode 100644
index 2290ece..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lconst_0/jm/T_lconst_0_2.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lconst_0_2.java
-.class public dxc/junit/opcodes/lconst_0/jm/T_lconst_0_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()J
-    .limit stack 2
-    .limit locals 1
-
-    lconst_0
-    lconst_0
-
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lconst_0/jm/T_lconst_0_2.java b/tools/dx-tests/src/dxc/junit/opcodes/lconst_0/jm/T_lconst_0_2.java
deleted file mode 100644
index 251f700..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lconst_0/jm/T_lconst_0_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lconst_0.jm;
-
-public class T_lconst_0_2 {
-
-    public long run() {
-        return 0l;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lconst_1/Test_lconst_1.java b/tools/dx-tests/src/dxc/junit/opcodes/lconst_1/Test_lconst_1.java
deleted file mode 100644
index f486fe8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lconst_1/Test_lconst_1.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lconst_1;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.lconst_1.jm.T_lconst_1_1;
-
-public class Test_lconst_1 extends DxTestCase {
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_lconst_1_1 t = new T_lconst_1_1();
-        long a = 20l;
-        long b = 19l;
-        assertEquals(a - b, t.run());
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.lconst_1.jm.T_lconst_1_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lconst_1/jm/T_lconst_1_1.j b/tools/dx-tests/src/dxc/junit/opcodes/lconst_1/jm/T_lconst_1_1.j
deleted file mode 100644
index 3a476e7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lconst_1/jm/T_lconst_1_1.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lconst_1_1.java
-.class public dxc/junit/opcodes/lconst_1/jm/T_lconst_1_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()J
-    .limit stack 2
-    .limit locals 1
-    
-    lconst_1
-    lreturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lconst_1/jm/T_lconst_1_1.java b/tools/dx-tests/src/dxc/junit/opcodes/lconst_1/jm/T_lconst_1_1.java
deleted file mode 100644
index f6d01f2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lconst_1/jm/T_lconst_1_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lconst_1.jm;
-
-public class T_lconst_1_1 {
-
-    public long run() {
-        return 1l;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lconst_1/jm/T_lconst_1_2.j b/tools/dx-tests/src/dxc/junit/opcodes/lconst_1/jm/T_lconst_1_2.j
deleted file mode 100644
index 2be8208..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lconst_1/jm/T_lconst_1_2.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lconst_1_2.java
-.class public dxc/junit/opcodes/lconst_1/jm/T_lconst_1_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()J
-    .limit stack 2
-    .limit locals 1
-
-    lconst_1
-    lconst_1
-
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lconst_1/jm/T_lconst_1_2.java b/tools/dx-tests/src/dxc/junit/opcodes/lconst_1/jm/T_lconst_1_2.java
deleted file mode 100644
index 62d1019..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lconst_1/jm/T_lconst_1_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lconst_1.jm;
-
-public class T_lconst_1_2 {
-
-    public long run() {
-        return 1l;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc/Test_ldc.java b/tools/dx-tests/src/dxc/junit/opcodes/ldc/Test_ldc.java
deleted file mode 100644
index d83462b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc/Test_ldc.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ldc;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.ldc.jm.T_ldc_1;
-import dxc.junit.opcodes.ldc.jm.T_ldc_2;
-import dxc.junit.opcodes.ldc.jm.T_ldc_3;
-
-public class Test_ldc extends DxTestCase {
-
-    /**
-     * @title push string into stack
-     */
-    public void testN1() {
-        T_ldc_1 t = new T_ldc_1();
-        // lcd is hard to test isolated
-        String res = t.run();
-        assertEquals(5, res.length());
-        assertEquals('h', res.charAt(0));
-    }
-
-    /**
-     * @title push float into stack
-     */
-    public void testN2() {
-        T_ldc_2 t = new T_ldc_2();
-        float a = 1.5f;
-        float b = 0.04f;
-        assertEquals(a + b, t.run(), 0f);
-        assertEquals(1.54f, t.run(), 0f);
-    }
-
-    /**
-     * @title push int into stack
-     */
-    public void testN3() {
-        T_ldc_3 t = new T_ldc_3();
-        int a = 1000000000;
-        int b = 1000000000;
-        assertEquals(a + b, t.run());
-    }
-
-    /**
-     * @constraint 4.8.1.10
-     * @title constant pool index
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.ldc.jm.T_ldc_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.10
-     * @title wrong constant pool entry type (long)
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.ldc.jm.T_ldc_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_1.j b/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_1.j
deleted file mode 100644
index 1b9571e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_1.j
+++ /dev/null
@@ -1,28 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ldc_1.java
-.class public dxc/junit/opcodes/ldc/jm/T_ldc_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Ljava/lang/String;
-    ldc "hello"
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_1.java b/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_1.java
deleted file mode 100644
index 1c1d9ed..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ldc.jm;
-
-public class T_ldc_1 {
-
-    public String run() {
-        return "hello";
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_2.j b/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_2.j
deleted file mode 100644
index 65f5222..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_2.j
+++ /dev/null
@@ -1,28 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ldc_2.java
-.class public dxc/junit/opcodes/ldc/jm/T_ldc_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()F
-    ldc 1.54
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_2.java b/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_2.java
deleted file mode 100644
index 771174a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ldc.jm;
-
-public class T_ldc_2 {
-
-    public float run() {
-        return 1.54f;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_3.j b/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_3.j
deleted file mode 100644
index 08731e1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_3.j
+++ /dev/null
@@ -1,28 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ldc_3.java
-.class public dxc/junit/opcodes/ldc/jm/T_ldc_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    ldc 2000000000
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_3.java b/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_3.java
deleted file mode 100644
index 5dbec3f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ldc.jm;
-
-public class T_ldc_3 {
-
-    public int run() {
-        return 2000000000;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_4.cfh b/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_4.cfh
deleted file mode 100644
index ea05bc1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_4.cfh
+++ /dev/null
@@ -1,185 +0,0 @@
-//@class:dxc/junit/opcodes/ldc/jm/T_ldc_4
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000f
-// .  .  
-   00 0f 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0e 00 09 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 5, h: 0004: int{0x00003039 / 12345}
-    // .  .  .  0  9  
-       03 00 00 30 39 
-    // parsed:, offset 52, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 61, len 6, h: 0006: utf8{"()I"}
-    // .  .  .  (  )  I  
-       01 00 03 28 29 49 
-    // parsed:, offset 67, len 6, h: 0007: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 73, len 3, h: 0008: type{dxc.junit.opcodes.ldc.jm.T_ldc_4}
-    // .  .  .  
-       07 00 0d 
-    // parsed:, offset 76, len 5, h: 0009: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0b 
-    // parsed:, offset 81, len 7, h: 000a: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 88, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 94, len 15, h: 000c: utf8{"T_ldc_4.java"}
-    // .  .  .  T  _  l  d  c  _  4  .  j  a  v  a  
-       01 00 0c 54 5f 6c 64 63 5f 34 2e 6a 61 76 61 
-    // parsed:, offset 109, len 35, h: 000d: utf8{"dxc/junit/opcodes/ldc/jm/T_ldc_4"}
-    // .  .     d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  l  d  c  /  j  m  /  T  _  l  d  c  _  4  
-       01 00 20 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 6c 64 63 2f 6a 6d 2f 54 5f 6c 64 63 5f 34 
-    // parsed:, offset 144, len 3, h: 000e: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 147, len 0, h: end constant_pool
-// parsed:, offset 147, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 149, len 2, h: this_class: type{dxc.junit.opcodes.ldc.jm.T_ldc_4}
-// .  .  
-   00 08 
-// parsed:, offset 151, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0e 
-// parsed:, offset 153, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 155, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 157, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 159, len:70,desc: ()V
-// parsed:, offset 159, len 0, h:  methods[0]: 
-    // parsed:, offset 159, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 161, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 163, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 165, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 167, len 0, h:  attributes[0]: 
-        // parsed:, offset 167, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 169, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 173, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 175, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 177, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 186, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 188, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 190, len 0, h: end attributes[0] 
-// parsed:, offset 190, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 190, len:39,desc: ()I
-// parsed:, offset 190, len 0, h:  methods[1]: 
-    // parsed:, offset 190, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 192, len 2, h: name: run
-    // .  .  
-       00 07 
-    // parsed:, offset 194, len 2, h: descriptor: ()I
-    // .  .  
-       00 06 
-    // parsed:, offset 196, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 198, len 0, h:  attributes[0]: 
-        // parsed:, offset 198, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 200, len 4, h: length: 0000000f
-        // .  .  .  .  
-           00 00 00 0f 
-        // parsed:, offset 204, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 206, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 208, len 4, h: code_length: 00000003
-        // .  .  .  .  
-           00 00 00 03 
-        // parsed:, offset 0, len 2, h: 0000: ldc #+00003039
-        // .  .  
-//@mod           12 04 
-           12 14 
-        // parsed:, offset 2, len 1, h: 0002: ireturn
-        // .  
-           ac 
-        // parsed:, offset 215, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 217, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 219, len 0, h: end attributes[0] 
-// parsed:, offset 219, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()I
-// parsed:, offset 219, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 221, len 0, h:  attributes[0]: 
-    // parsed:, offset 221, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 223, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 227, len 2, h: source: utf8{"T_ldc_4.java"}
-    // .  .  
-       00 0c 
-// parsed:, offset 229, len 0, h: end attributes[0] 
-// parsed:, offset 229, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_4.j b/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_4.j
deleted file mode 100644
index 9d121ea..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_4.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ldc_4.java
-.class public dxc/junit/opcodes/ldc/jm/T_ldc_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()I
-    .limit stack 2
-
-    ldc 12345
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_4.java b/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_4.java
deleted file mode 100644
index e66c022..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ldc.jm;
-
-public class T_ldc_4 {
-
-    public int run() {
-        return 12345;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_5.cfh b/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_5.cfh
deleted file mode 100644
index a56ea0a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_5.cfh
+++ /dev/null
@@ -1,194 +0,0 @@
-//@class:dxc/junit/opcodes/ldc/jm/T_ldc_5
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0011
-// .  .  
-   00 11 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0e 00 0a 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 15, h: 0003: utf8{"T_ldc_5.java"}
-    // .  .  .  T  _  l  d  c  _  5  .  j  a  v  a  
-       01 00 0c 54 5f 6c 64 63 5f 35 2e 6a 61 76 61 
-    // parsed:, offset 49, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 62, len 5, h: 0005: int{0x00003039 / 12345}
-    // .  .  .  0  9  
-       03 00 00 30 39 
-    // parsed:, offset 67, len 9, h: 0006: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 76, len 6, h: 0007: utf8{"()I"}
-    // .  .  .  (  )  I  
-       01 00 03 28 29 49 
-    // parsed:, offset 82, len 3, h: 0008: type{dxc.junit.opcodes.ldc.jm.T_ldc_5}
-    // .  .  .  
-       07 00 0d 
-    // parsed:, offset 85, len 6, h: 0009: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 91, len 5, h: 000a: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 06 00 0c 
-    // parsed:, offset 96, len 7, h: 000b: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 103, len 6, h: 000c: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 109, len 35, h: 000d: utf8{"dxc/junit/opcodes/ldc/jm/T_ldc_5"}
-    // .  .     d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  l  d  c  /  j  m  /  T  _  l  d  c  _  5  
-       01 00 20 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 6c 64 63 2f 6a 6d 2f 54 5f 6c 64 63 5f 35 
-    // parsed:, offset 144, len 3, h: 000e: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-    // parsed:, offset 147, len 9, h: 000f: long{0x0000000000003039 / 12345}
-    // .  .  .  .  .  .  .  0  9  
-       05 00 00 00 00 00 00 30 39 
-// parsed:, offset 156, len 0, h: end constant_pool
-// parsed:, offset 156, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 158, len 2, h: this_class: type{dxc.junit.opcodes.ldc.jm.T_ldc_5}
-// .  .  
-   00 08 
-// parsed:, offset 160, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0e 
-// parsed:, offset 162, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 164, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 166, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 168, len:74,desc: ()V
-// parsed:, offset 168, len 0, h:  methods[0]: 
-    // parsed:, offset 168, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 170, len 2, h: name: <init>
-    // .  .  
-       00 06 
-    // parsed:, offset 172, len 2, h: descriptor: ()V
-    // .  .  
-       00 0c 
-    // parsed:, offset 174, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 176, len 0, h:  attributes[0]: 
-        // parsed:, offset 176, len 2, h: name: Code
-        // .  .  
-           00 0b 
-        // parsed:, offset 178, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 182, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 184, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 186, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 195, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 197, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 199, len 0, h: end attributes[0] 
-// parsed:, offset 199, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 199, len:43,desc: ()I
-// parsed:, offset 199, len 0, h:  methods[1]: 
-    // parsed:, offset 199, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 201, len 2, h: name: run
-    // .  .  
-       00 09 
-    // parsed:, offset 203, len 2, h: descriptor: ()I
-    // .  .  
-       00 07 
-    // parsed:, offset 205, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 207, len 0, h:  attributes[0]: 
-        // parsed:, offset 207, len 2, h: name: Code
-        // .  .  
-           00 0b 
-        // parsed:, offset 209, len 4, h: length: 00000013
-        // .  .  .  .  
-           00 00 00 13 
-        // parsed:, offset 213, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 215, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 217, len 4, h: code_length: 00000007
-        // .  .  .  .  
-           00 00 00 07 
-        // parsed:, offset 0, len 3, h: 0000: ldc2_w #+0000000000003039
-        // .  .  .  
-           14 00 0f 
-        // parsed:, offset 3, len 1, h: 0003: pop2
-        // X  
-           58 
-        // parsed:, offset 4, len 2, h: 0004: ldc #+00003039
-        // .  .  
-//@mod           12 05 
-           12 0f 
-        // parsed:, offset 6, len 1, h: 0006: ireturn
-        // .  
-           ac 
-        // parsed:, offset 228, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 230, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 232, len 0, h: end attributes[0] 
-// parsed:, offset 232, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()I
-// parsed:, offset 232, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 234, len 0, h:  attributes[0]: 
-    // parsed:, offset 234, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 236, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 240, len 2, h: source: utf8{"T_ldc_5.java"}
-    // .  .  
-       00 03 
-// parsed:, offset 242, len 0, h: end attributes[0] 
-// parsed:, offset 242, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_5.j b/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_5.j
deleted file mode 100644
index 5640bdf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_5.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ldc_5.java
-.class public dxc/junit/opcodes/ldc/jm/T_ldc_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()I
-    .limit stack 2
-
-    ldc2_w 12345
-    pop2
-    ldc 12345
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_5.java b/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_5.java
deleted file mode 100644
index 8507910..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc/jm/T_ldc_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ldc.jm;
-
-public class T_ldc_5 {
-
-    public int run() {
-        return 12345;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/Test_ldc2_w.java b/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/Test_ldc2_w.java
deleted file mode 100644
index 0ad5ca8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/Test_ldc2_w.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ldc2_w;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.ldc2_w.jm.T_ldc2_w_1;
-import dxc.junit.opcodes.ldc2_w.jm.T_ldc2_w_2;
-
-public class Test_ldc2_w extends DxTestCase {
-
-    /**
-     * @title push long into stack
-     */
-    public void testN1() {
-        T_ldc2_w_1 t = new T_ldc2_w_1();
-        long a = 1234567890122l;
-        long b = 1l;
-        assertEquals(a + b, t.run());
-    }
-
-    /**
-     * @title push double into stack
-     */
-    public void testN2() {
-        T_ldc2_w_2 t = new T_ldc2_w_2();
-        double a = 1234567890123232323232232323232323232323232323456788d;
-        double b = 1d;
-        assertEquals(a + b, t.run(), 0d);
-    }
-
-    /**
-     * @constraint 4.8.1.10
-     * @title constant pool index
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.ldc2_w.jm.T_ldc2_w_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.10
-     * @title wrong constant pool entry type (float)
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.ldc2_w.jm.T_ldc2_w_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_1.j b/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_1.j
deleted file mode 100644
index 35ca464..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_1.j
+++ /dev/null
@@ -1,30 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ldc2_w_1.java
-.class public dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()J
-    .limit stack 2
-    .limit locals 1
-    ldc2_w 1234567890123
-    lreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_1.java b/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_1.java
deleted file mode 100644
index 101a0ac..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ldc2_w.jm;
-
-public class T_ldc2_w_1 {
-
-    public long run() {
-        return 1234567890123l;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_2.j b/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_2.j
deleted file mode 100644
index cbca295..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_2.j
+++ /dev/null
@@ -1,30 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ldc2_w_2.java
-.class public dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()D
-    .limit stack 2
-    .limit locals 1
-    ldc2_w 1.2345678901232324E51
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_2.java b/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_2.java
deleted file mode 100644
index bdc6ed9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ldc2_w.jm;
-
-public class T_ldc2_w_2 {
-
-    public double run() {
-        return 1234567890123232323232232323232323232323232323456789d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_4.cfh b/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_4.cfh
deleted file mode 100644
index cf6919f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_4.cfh
+++ /dev/null
@@ -1,185 +0,0 @@
-//@class:dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_4
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0010
-// .  .  
-   00 10 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0e 00 06 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 6, h: 0005: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 62, len 5, h: 0006: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 0c 
-    // parsed:, offset 67, len 6, h: 0007: utf8{"()D"}
-    // .  .  .  (  )  D  
-       01 00 03 28 29 44 
-    // parsed:, offset 73, len 3, h: 0008: type{dxc.junit.opcodes.ldc2_w.jm.T_ldc2_w_4}
-    // .  .  .  
-       07 00 0f 
-    // parsed:, offset 76, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 83, len 9, h: 000a: double{0x40091eb860000000 / 3.140000104904175}
-    // .  @  .  .  .  `  .  .  .  
-       06 40 09 1e b8 60 00 00 00 
-    // parsed:, offset 92, len 6, h: 000c: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 98, len 18, h: 000d: utf8{"T_ldc2_w_4.java"}
-    // .  .  .  T  _  l  d  c  2  _  w  _  4  .  j  a  v  a  
-       01 00 0f 54 5f 6c 64 63 32 5f 77 5f 34 2e 6a 61 76 61 
-    // parsed:, offset 116, len 3, h: 000e: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-    // parsed:, offset 119, len 41, h: 000f: utf8{"dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_4"}
-    // .  .  &  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  l  d  c  2  _  w  /  j  m  /  T  _  l  d  c  2  _  w  _  4  
-       01 00 26 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 6c 64 63 32 5f 77 2f 6a 6d 2f 54 5f 6c 64 63 32 5f 77 5f 34 
-// parsed:, offset 160, len 0, h: end constant_pool
-// parsed:, offset 160, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 162, len 2, h: this_class: type{dxc.junit.opcodes.ldc2_w.jm.T_ldc2_w_4}
-// .  .  
-   00 08 
-// parsed:, offset 164, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0e 
-// parsed:, offset 166, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 168, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 170, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 172, len:71,desc: ()V
-// parsed:, offset 172, len 0, h:  methods[0]: 
-    // parsed:, offset 172, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 174, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 176, len 2, h: descriptor: ()V
-    // .  .  
-       00 0c 
-    // parsed:, offset 178, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 180, len 0, h:  attributes[0]: 
-        // parsed:, offset 180, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 182, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 186, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 188, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 190, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 199, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 201, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 203, len 0, h: end attributes[0] 
-// parsed:, offset 203, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 203, len:40,desc: ()D
-// parsed:, offset 203, len 0, h:  methods[1]: 
-    // parsed:, offset 203, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 205, len 2, h: name: run
-    // .  .  
-       00 05 
-    // parsed:, offset 207, len 2, h: descriptor: ()D
-    // .  .  
-       00 07 
-    // parsed:, offset 209, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 211, len 0, h:  attributes[0]: 
-        // parsed:, offset 211, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 213, len 4, h: length: 00000010
-        // .  .  .  .  
-           00 00 00 10 
-        // parsed:, offset 217, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 219, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 221, len 4, h: code_length: 00000004
-        // .  .  .  .  
-           00 00 00 04 
-        // parsed:, offset 0, len 3, h: 0000: ldc2_w #40091eb860000000 // 3.140000104904175
-        // .  .  .  
-//@mod           14 00 0a 
-           14 01 0a 
-        // parsed:, offset 3, len 1, h: 0003: dreturn
-        // .  
-           af 
-        // parsed:, offset 229, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 231, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 233, len 0, h: end attributes[0] 
-// parsed:, offset 233, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()D
-// parsed:, offset 233, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 235, len 0, h:  attributes[0]: 
-    // parsed:, offset 235, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 237, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 241, len 2, h: source: utf8{"T_ldc2_w_4.java"}
-    // .  .  
-       00 0d 
-// parsed:, offset 243, len 0, h: end attributes[0] 
-// parsed:, offset 243, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_4.j b/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_4.j
deleted file mode 100644
index c3dc2d5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_4.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ldc2_w_4.java
-.class public dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()D
-    .limit stack 2
-
-    ldc2_w 3.14
-    dreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_4.java b/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_4.java
deleted file mode 100644
index f6d7d17..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ldc2_w.jm;
-
-public class T_ldc2_w_4 {
-
-    public double run() {
-        return 3.14d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_5.cfh b/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_5.cfh
deleted file mode 100644
index 0a5eb37..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_5.cfh
+++ /dev/null
@@ -1,194 +0,0 @@
-//@class:dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_5
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0011
-// .  .  
-   00 11 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 10 00 07 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 18, h: 0004: utf8{"T_ldc2_w_5.java"}
-    // .  .  .  T  _  l  d  c  2  _  w  _  5  .  j  a  v  a  
-       01 00 0f 54 5f 6c 64 63 32 5f 77 5f 35 2e 6a 61 76 61 
-    // parsed:, offset 65, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 74, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 80, len 5, h: 0007: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0d 
-    // parsed:, offset 85, len 3, h: 0008: type{dxc.junit.opcodes.ldc2_w.jm.T_ldc2_w_5}
-    // .  .  .  
-       07 00 0f 
-    // parsed:, offset 88, len 6, h: 0009: utf8{"()D"}
-    // .  .  .  (  )  D  
-       01 00 03 28 29 44 
-    // parsed:, offset 94, len 7, h: 000a: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 101, len 9, h: 000b: double{0x40091eb860000000 / 3.140000104904175}
-    // .  @  .  .  .  `  .  .  .  
-       06 40 09 1e b8 60 00 00 00 
-    // parsed:, offset 110, len 6, h: 000d: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 116, len 5, h: 000e: float{0x4048f5c3 / 3.14}
-    // .  @  H  .  .  
-       04 40 48 f5 c3 
-    // parsed:, offset 121, len 41, h: 000f: utf8{"dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_5"}
-    // .  .  &  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  l  d  c  2  _  w  /  j  m  /  T  _  l  d  c  2  _  w  _  5  
-       01 00 26 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 6c 64 63 32 5f 77 2f 6a 6d 2f 54 5f 6c 64 63 32 5f 77 5f 35 
-    // parsed:, offset 162, len 3, h: 0010: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 165, len 0, h: end constant_pool
-// parsed:, offset 165, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 167, len 2, h: this_class: type{dxc.junit.opcodes.ldc2_w.jm.T_ldc2_w_5}
-// .  .  
-   00 08 
-// parsed:, offset 169, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 10 
-// parsed:, offset 171, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 173, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 175, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 177, len:74,desc: ()V
-// parsed:, offset 177, len 0, h:  methods[0]: 
-    // parsed:, offset 177, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 179, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 181, len 2, h: descriptor: ()V
-    // .  .  
-       00 0d 
-    // parsed:, offset 183, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 185, len 0, h:  attributes[0]: 
-        // parsed:, offset 185, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 187, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 191, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 193, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 195, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 204, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 206, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 208, len 0, h: end attributes[0] 
-// parsed:, offset 208, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 208, len:43,desc: ()D
-// parsed:, offset 208, len 0, h:  methods[1]: 
-    // parsed:, offset 208, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 210, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 212, len 2, h: descriptor: ()D
-    // .  .  
-       00 09 
-    // parsed:, offset 214, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 216, len 0, h:  attributes[0]: 
-        // parsed:, offset 216, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 218, len 4, h: length: 00000013
-        // .  .  .  .  
-           00 00 00 13 
-        // parsed:, offset 222, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 224, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 226, len 4, h: code_length: 00000007
-        // .  .  .  .  
-           00 00 00 07 
-        // parsed:, offset 0, len 2, h: 0000: ldc #4048f5c3 // 3.14
-        // .  .  
-           12 0e 
-        // parsed:, offset 2, len 1, h: 0002: pop
-        // W  
-           57 
-        // parsed:, offset 3, len 3, h: 0003: ldc2_w #40091eb860000000 // 3.140000104904175
-        // .  .  .  
-//@mod           14 00 0b 
-           14 00 0e 
-        // parsed:, offset 6, len 1, h: 0006: dreturn
-        // .  
-           af 
-        // parsed:, offset 237, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 239, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 241, len 0, h: end attributes[0] 
-// parsed:, offset 241, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()D
-// parsed:, offset 241, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 243, len 0, h:  attributes[0]: 
-    // parsed:, offset 243, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 245, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 249, len 2, h: source: utf8{"T_ldc2_w_5.java"}
-    // .  .  
-       00 04 
-// parsed:, offset 251, len 0, h: end attributes[0] 
-// parsed:, offset 251, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_5.j b/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_5.j
deleted file mode 100644
index 4001c60..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_5.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ldc2_w_5.java
-.class public dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()D
-    .limit stack 2
-
-    ldc 3.14
-    pop
-
-    ldc2_w 3.14
-    dreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_5.java b/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_5.java
deleted file mode 100644
index 3c49374..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc2_w/jm/T_ldc2_w_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ldc2_w.jm;
-
-public class T_ldc2_w_5 {
-
-    public double run() {
-        return 3.14d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/Test_ldc_w.java b/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/Test_ldc_w.java
deleted file mode 100644
index 2be1dac..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/Test_ldc_w.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ldc_w;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.ldc_w.jm.T_ldc_w_1;
-import dxc.junit.opcodes.ldc_w.jm.T_ldc_w_2;
-
-public class Test_ldc_w extends DxTestCase {
-
-    /**
-     * @title push float into stack
-     */
-    public void testN1() {
-        T_ldc_w_1 t = new T_ldc_w_1();
-        float a = 1.5f;
-        float b = 0.04f;
-        assertEquals(a + b, t.run(), 0f);
-        assertEquals(1.54f, t.run(), 0f);
-    }
-
-    /**
-     * @title push int into stack
-     */
-    public void testN2() {
-        T_ldc_w_2 t = new T_ldc_w_2();
-        int a = 1000000000;
-        int b = 1000000000;
-        assertEquals(a + b, t.run());
-    }
-
-
-    /**
-     * @constraint 4.8.1.10
-     * @title constant pool index
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.ldc_w.jm.T_ldc_w_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.10
-     * @title wrong constant pool entry type
-     * (double)
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.ldc_w.jm.T_ldc_w_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/jm/T_ldc_w_1.j b/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/jm/T_ldc_w_1.j
deleted file mode 100644
index 532bb69..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/jm/T_ldc_w_1.j
+++ /dev/null
@@ -1,30 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ldc_w_1.java
-.class public dxc/junit/opcodes/ldc_w/jm/T_ldc_w_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()F
-    ldc_w 1.54
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/jm/T_ldc_w_1.java b/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/jm/T_ldc_w_1.java
deleted file mode 100644
index d877227..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/jm/T_ldc_w_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ldc_w.jm;
-
-public class T_ldc_w_1 {
-    
-    public float run(){
-        return 1.54f;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/jm/T_ldc_w_2.j b/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/jm/T_ldc_w_2.j
deleted file mode 100644
index b3f0bc3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/jm/T_ldc_w_2.j
+++ /dev/null
@@ -1,30 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ldc_w_2.java
-.class public dxc/junit/opcodes/ldc_w/jm/T_ldc_w_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()I
-    ldc_w 2000000000
-    ireturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/jm/T_ldc_w_2.java b/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/jm/T_ldc_w_2.java
deleted file mode 100644
index 451fa71..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/jm/T_ldc_w_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ldc_w.jm;
-
-public class T_ldc_w_2 {
-
-    public int run() {
-        return 2000000000;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/jm/T_ldc_w_4.cfh b/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/jm/T_ldc_w_4.cfh
deleted file mode 100644
index 343bc75..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/jm/T_ldc_w_4.cfh
+++ /dev/null
@@ -1,185 +0,0 @@
-//@class:dxc/junit/opcodes/ldc_w/jm/T_ldc_w_4
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000f
-// .  .  
-   00 0f 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 17, h: 0001: utf8{"T_ldc_w_4.java"}
-    // .  .  .  T  _  l  d  c  _  w  _  4  .  j  a  v  a  
-       01 00 0e 54 5f 6c 64 63 5f 77 5f 34 2e 6a 61 76 61 
-    // parsed:, offset 27, len 5, h: 0002: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0e 00 08 
-    // parsed:, offset 32, len 19, h: 0003: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 51, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 64, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 73, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 79, len 6, h: 0007: utf8{"()F"}
-    // .  .  .  (  )  F  
-       01 00 03 28 29 46 
-    // parsed:, offset 85, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0a 
-    // parsed:, offset 90, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 97, len 6, h: 000a: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 103, len 5, h: 000b: float{0x4048f5c3 / 3.14}
-    // .  @  H  .  .  
-       04 40 48 f5 c3 
-    // parsed:, offset 108, len 39, h: 000c: utf8{"dxc/junit/opcodes/ldc_w/jm/T_ldc_w_4"}
-    // .  .  $  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  l  d  c  _  w  /  j  m  /  T  _  l  d  c  _  w  _  4  
-       01 00 24 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 6c 64 63 5f 77 2f 6a 6d 2f 54 5f 6c 64 63 5f 77 5f 34 
-    // parsed:, offset 147, len 3, h: 000d: type{dxc.junit.opcodes.ldc_w.jm.T_ldc_w_4}
-    // .  .  .  
-       07 00 0c 
-    // parsed:, offset 150, len 3, h: 000e: type{java.lang.Object}
-    // .  .  .  
-       07 00 03 
-// parsed:, offset 153, len 0, h: end constant_pool
-// parsed:, offset 153, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 155, len 2, h: this_class: type{dxc.junit.opcodes.ldc_w.jm.T_ldc_w_4}
-// .  .  
-   00 0d 
-// parsed:, offset 157, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0e 
-// parsed:, offset 159, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 161, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 163, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 165, len:71,desc: ()V
-// parsed:, offset 165, len 0, h:  methods[0]: 
-    // parsed:, offset 165, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 167, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 169, len 2, h: descriptor: ()V
-    // .  .  
-       00 0a 
-    // parsed:, offset 171, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 173, len 0, h:  attributes[0]: 
-        // parsed:, offset 173, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 175, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 179, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 181, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 183, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 02 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 192, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 194, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 196, len 0, h: end attributes[0] 
-// parsed:, offset 196, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 196, len:40,desc: ()F
-// parsed:, offset 196, len 0, h:  methods[1]: 
-    // parsed:, offset 196, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 198, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 200, len 2, h: descriptor: ()F
-    // .  .  
-       00 07 
-    // parsed:, offset 202, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 204, len 0, h:  attributes[0]: 
-        // parsed:, offset 204, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 206, len 4, h: length: 00000010
-        // .  .  .  .  
-           00 00 00 10 
-        // parsed:, offset 210, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 212, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 214, len 4, h: code_length: 00000004
-        // .  .  .  .  
-           00 00 00 04 
-        // parsed:, offset 0, len 3, h: 0000: ldc_w #4048f5c3 // 3.14
-        // .  .  .  
-//@mod           13 00 0b 
-           13 01 0b 
-        // parsed:, offset 3, len 1, h: 0003: freturn
-        // .  
-           ae 
-        // parsed:, offset 222, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 224, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 226, len 0, h: end attributes[0] 
-// parsed:, offset 226, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()F
-// parsed:, offset 226, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 228, len 0, h:  attributes[0]: 
-    // parsed:, offset 228, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 230, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 234, len 2, h: source: utf8{"T_ldc_w_4.java"}
-    // .  .  
-       00 01 
-// parsed:, offset 236, len 0, h: end attributes[0] 
-// parsed:, offset 236, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/jm/T_ldc_w_4.j b/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/jm/T_ldc_w_4.j
deleted file mode 100644
index f978b5e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/jm/T_ldc_w_4.j
+++ /dev/null
@@ -1,30 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ldc_w_4.java
-.class public dxc/junit/opcodes/ldc_w/jm/T_ldc_w_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()F
-    ldc_w 3.14f
-    freturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/jm/T_ldc_w_4.java b/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/jm/T_ldc_w_4.java
deleted file mode 100644
index 75eef74..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/jm/T_ldc_w_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ldc_w.jm;
-
-public class T_ldc_w_4 {
-
-    public float run(String a){
-        return 3.14f;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/jm/T_ldc_w_5.cfh b/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/jm/T_ldc_w_5.cfh
deleted file mode 100644
index ecfe634..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/jm/T_ldc_w_5.cfh
+++ /dev/null
@@ -1,194 +0,0 @@
-//@class:dxc/junit/opcodes/ldc_w/jm/T_ldc_w_5
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0011
-// .  .  
-   00 11 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 10 00 08 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 6, h: 0005: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 62, len 17, h: 0006: utf8{"T_ldc_w_5.java"}
-    // .  .  .  T  _  l  d  c  _  w  _  5  .  j  a  v  a  
-       01 00 0e 54 5f 6c 64 63 5f 77 5f 35 2e 6a 61 76 61 
-    // parsed:, offset 79, len 6, h: 0007: utf8{"()F"}
-    // .  .  .  (  )  F  
-       01 00 03 28 29 46 
-    // parsed:, offset 85, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 0c 
-    // parsed:, offset 90, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 97, len 9, h: 000a: double{0x40091eb860000000 / 3.140000104904175}
-    // .  @  .  .  .  `  .  .  .  
-       06 40 09 1e b8 60 00 00 00 
-    // parsed:, offset 106, len 6, h: 000c: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 112, len 5, h: 000d: float{0x4048f5c3 / 3.14}
-    // .  @  H  .  .  
-       04 40 48 f5 c3 
-    // parsed:, offset 117, len 39, h: 000e: utf8{"dxc/junit/opcodes/ldc_w/jm/T_ldc_w_5"}
-    // .  .  $  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  l  d  c  _  w  /  j  m  /  T  _  l  d  c  _  w  _  5  
-       01 00 24 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 6c 64 63 5f 77 2f 6a 6d 2f 54 5f 6c 64 63 5f 77 5f 35 
-    // parsed:, offset 156, len 3, h: 000f: type{dxc.junit.opcodes.ldc_w.jm.T_ldc_w_5}
-    // .  .  .  
-       07 00 0e 
-    // parsed:, offset 159, len 3, h: 0010: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 162, len 0, h: end constant_pool
-// parsed:, offset 162, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 164, len 2, h: this_class: type{dxc.junit.opcodes.ldc_w.jm.T_ldc_w_5}
-// .  .  
-   00 0f 
-// parsed:, offset 166, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 10 
-// parsed:, offset 168, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 170, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 172, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 174, len:75,desc: ()V
-// parsed:, offset 174, len 0, h:  methods[0]: 
-    // parsed:, offset 174, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 176, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 178, len 2, h: descriptor: ()V
-    // .  .  
-       00 0c 
-    // parsed:, offset 180, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 182, len 0, h:  attributes[0]: 
-        // parsed:, offset 182, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 184, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 188, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 190, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 192, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 201, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 203, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 205, len 0, h: end attributes[0] 
-// parsed:, offset 205, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 205, len:44,desc: ()F
-// parsed:, offset 205, len 0, h:  methods[1]: 
-    // parsed:, offset 205, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 207, len 2, h: name: run
-    // .  .  
-       00 05 
-    // parsed:, offset 209, len 2, h: descriptor: ()F
-    // .  .  
-       00 07 
-    // parsed:, offset 211, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 213, len 0, h:  attributes[0]: 
-        // parsed:, offset 213, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 215, len 4, h: length: 00000014
-        // .  .  .  .  
-           00 00 00 14 
-        // parsed:, offset 219, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 221, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 223, len 4, h: code_length: 00000008
-        // .  .  .  .  
-           00 00 00 08 
-        // parsed:, offset 0, len 3, h: 0000: ldc2_w #40091eb860000000 // 3.140000104904175
-        // .  .  .  
-           14 00 0a 
-        // parsed:, offset 3, len 1, h: 0003: pop2
-        // X  
-           58 
-        // parsed:, offset 4, len 3, h: 0004: ldc_w #4048f5c3 // 3.14
-        // .  .  .  
-//@mod           13 00 0d 
-           13 00 0a 
-        // parsed:, offset 7, len 1, h: 0007: freturn
-        // .  
-           ae 
-        // parsed:, offset 235, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 237, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 239, len 0, h: end attributes[0] 
-// parsed:, offset 239, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()F
-// parsed:, offset 239, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 241, len 0, h:  attributes[0]: 
-    // parsed:, offset 241, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 243, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 247, len 2, h: source: utf8{"T_ldc_w_5.java"}
-    // .  .  
-       00 06 
-// parsed:, offset 249, len 0, h: end attributes[0] 
-// parsed:, offset 249, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/jm/T_ldc_w_5.j b/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/jm/T_ldc_w_5.j
deleted file mode 100644
index b6be6e1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/jm/T_ldc_w_5.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ldc_w_5.java
-.class public dxc/junit/opcodes/ldc_w/jm/T_ldc_w_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()F
-    .limit stack 2
-    ldc2_w 3.14
-    pop2
-    ldc_w 3.14f
-    freturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/jm/T_ldc_w_5.java b/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/jm/T_ldc_w_5.java
deleted file mode 100644
index da51419..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldc_w/jm/T_ldc_w_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ldc_w.jm;
-
-public class T_ldc_w_5 {
-
-    public float run(String a){
-        return 3.14f;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldiv/Test_ldiv.java b/tools/dx-tests/src/dxc/junit/opcodes/ldiv/Test_ldiv.java
deleted file mode 100644
index 213d28b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldiv/Test_ldiv.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ldiv;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.ldiv.jm.T_ldiv_1;
-
-public class Test_ldiv extends DxTestCase {
-
-    /**
-     * @title Arguments = 100000000000l, 40000000000l
-     */
-    public void testN1() {
-        T_ldiv_1 t = new T_ldiv_1();
-        assertEquals(2l, t.run(100000000000l, 40000000000l));
-    }
-
-    /**
-     * @title  Rounding
-     */
-    public void testN2() {
-        T_ldiv_1 t = new T_ldiv_1();
-        assertEquals(8l, t.run(98765432123456l, 12345678912345l));
-    }
-
-    /**
-     * @title  Dividend = 0
-     */
-    public void testN3() {
-        T_ldiv_1 t = new T_ldiv_1();
-        assertEquals(0l, t.run(0l, 98765432123456l));
-    }
-
-    /**
-     * @title  Dividend is negative
-     */
-    public void testN4() {
-        T_ldiv_1 t = new T_ldiv_1();
-        assertEquals(-8, t.run(-98765432123456l, 12345678912345l));
-    }
-
-    /**
-     * @title  Divisor is negative
-     */
-    public void testN5() {
-        T_ldiv_1 t = new T_ldiv_1();
-        assertEquals(-8, t.run(98765432123456l, -12345678912345l));
-    }
-
-    /**
-     * @title  Both Dividend and divisor are negative
-     */
-    public void testN6() {
-        T_ldiv_1 t = new T_ldiv_1();
-        assertEquals(80l, t.run(-98765432123456l, -1234567891234l));
-    }
-
-    /**
-     * @title Arguments = Long.MIN_VALUE, -1
-     */
-    public void testB1() {
-        T_ldiv_1 t = new T_ldiv_1();
-        assertEquals(-9223372036854775808L, t.run(Long.MIN_VALUE, -1));
-    }
-    /**
-     * @title Arguments = Long.MIN_VALUE, 1
-     */
-    public void testB2() {
-        T_ldiv_1 t = new T_ldiv_1();
-        assertEquals(-9223372036854775808L, t.run(Long.MIN_VALUE, 1));
-    }
-    /**
-     * @title Arguments = Long.MAX_VALUE, 1
-     */
-    public void testB3() {
-        T_ldiv_1 t = new T_ldiv_1();
-        assertEquals(9223372036854775807L, t.run(Long.MAX_VALUE, 1));
-    }
-    /**
-     * @title Arguments = Long.MIN_VALUE, Long.MAX_VALUE
-     */
-    public void testB4() {
-        T_ldiv_1 t = new T_ldiv_1();
-        assertEquals(-1, t.run(Long.MIN_VALUE, Long.MAX_VALUE));
-    }
-    /**
-     * @title Arguments = 1, Long.MAX_VALUE
-     */
-    public void testB5() {
-        T_ldiv_1 t = new T_ldiv_1();
-        assertEquals(0, t.run(1, Long.MAX_VALUE));
-    }
-    /**
-     * @title Arguments = 1, Long.MIN_VALUE
-     */
-    public void testB6() {
-        T_ldiv_1 t = new T_ldiv_1();
-        assertEquals(0, t.run(1, Long.MIN_VALUE));
-    }
-
-    /**
-     * @title  Divisor is 0
-     */
-    public void testE1() {
-        T_ldiv_1 t = new T_ldiv_1();
-        try {
-            t.run(12345678912345l, 0);
-            fail("expected ArithmeticException");
-        } catch (ArithmeticException ae) {
-            // expected
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.ldiv.jm.T_ldiv_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.ldiv.jm.T_ldiv_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long / double
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.ldiv.jm.T_ldiv_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int / long
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.ldiv.jm.T_ldiv_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - float / long
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.ldiv.jm.T_ldiv_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference / long
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.ldiv.jm.T_ldiv_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_1.j b/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_1.j
deleted file mode 100644
index 49f0bda..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_1.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ldiv_1.java
-.class public dxc/junit/opcodes/ldiv/jm/T_ldiv_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(JJ)J
-    .limit stack 4
-    .limit locals 5
-
-    lload_1
-    lload_3
-    ldiv
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_1.java b/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_1.java
deleted file mode 100644
index b33a03d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_1.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ldiv.jm;
-
-
-public class T_ldiv_1 {
-
-    public long run(long a, long b) {
-        return a/b;
-    }
-    
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_2.j b/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_2.j
deleted file mode 100644
index d1a1bec..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_2.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ldiv_2.java
-.class public dxc/junit/opcodes/ldiv/jm/T_ldiv_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(JJ)J
-    .limit stack 4
-    .limit locals 5
-
-;    lload_1
-    lload_3
-    ldiv
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_2.java b/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_2.java
deleted file mode 100644
index 0f92d94..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ldiv.jm;
-
-public class T_ldiv_2 {
-
-    public long run(long a, long b) {
-        return a/b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_3.j b/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_3.j
deleted file mode 100644
index 04592e2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_3.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ldiv_3.java
-.class public dxc/junit/opcodes/ldiv/jm/T_ldiv_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(JJ)J
-    .limit stack 4
-    .limit locals 5
-
-    lload_1
-;    lload_3
-    ldiv
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_3.java b/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_3.java
deleted file mode 100644
index 1703f8d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ldiv.jm;
-
-public class T_ldiv_3 {
-
-    public long run(long a, long b) {
-        return a/b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_4.j b/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_4.j
deleted file mode 100644
index 1043a5c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_4.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ldiv_4.java
-.class public dxc/junit/opcodes/ldiv/jm/T_ldiv_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(JD)J
-    .limit stack 4
-    .limit locals 5
-
-    lload_1
-    dload_3
-;    d2l    
-    ldiv
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_4.java b/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_4.java
deleted file mode 100644
index a9f70ba..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ldiv.jm;
-
-public class T_ldiv_4 {
-
-    public long run(long a, double b) {
-        return (long)(a/b);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_5.j b/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_5.j
deleted file mode 100644
index 5e0cd21..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_5.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ldiv_5.java
-.class public dxc/junit/opcodes/ldiv/jm/T_ldiv_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(IJ)J
-    .limit stack 4
-    .limit locals 4
-
-    iload_1
-;    i2l
-    lload_2
-    ldiv
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_5.java b/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_5.java
deleted file mode 100644
index d413aa6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ldiv.jm;
-
-public class T_ldiv_5 {
-
-    public long run(int a, long b) {
-        return a/b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_6.j b/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_6.j
deleted file mode 100644
index 2bf8741..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_6.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ldiv_6.java
-.class public dxc/junit/opcodes/ldiv/jm/T_ldiv_6
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(FJ)J
-    .limit stack 3
-    .limit locals 4
-    
-    fload_1
-    lload_2
-    ldiv
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_6.java b/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_6.java
deleted file mode 100644
index bd48c33..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ldiv.jm;
-
-public class T_ldiv_6 {
-
-    public long run(float a, long b) {
-        return (long)(a/b);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_7.j b/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_7.j
deleted file mode 100644
index 9bd04a6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_7.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ldiv_7.java
-.class public dxc/junit/opcodes/ldiv/jm/T_ldiv_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(JJ)J
-    .limit stack 4
-    .limit locals 5
-
-    aload_0
-    lload_3
-    ldiv
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_7.java b/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_7.java
deleted file mode 100644
index f859a38..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ldiv/jm/T_ldiv_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ldiv.jm;
-
-public class T_ldiv_7 {
-    
-    public long run(long a, long b) {
-        return a/b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload/Test_lload.java b/tools/dx-tests/src/dxc/junit/opcodes/lload/Test_lload.java
deleted file mode 100644
index ed06cbb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload/Test_lload.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.lload.jm.T_lload_1;
-import dxc.junit.opcodes.lload.jm.T_lload_1_w;
-import dxc.junit.opcodes.lload.jm.T_lload_2;
-import dxc.junit.opcodes.lload.jm.T_lload_2_w;
-
-public class Test_lload extends DxTestCase {
-
-    /*
-     * NORMAL ILOAD VERSION
-     */
-
-    /**
-     * @title Test lload 1
-     */
-    public void testN1() {
-        T_lload_1 t = new T_lload_1();
-        assertEquals(1234567890123l, t.run());
-    }
-
-    /**
-     * @title  Test lload 255
-     */
-    public void testN2() {
-        T_lload_2 t = new T_lload_2();
-        assertEquals(9876543210123l, t.run());
-    }
-
-    /**
-     * @constraint 4.8.1.21
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.lload.jm.T_lload_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.lload.jm.T_lload_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.lload.jm.T_lload_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.lload.jm.T_lload_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /*
-     * WIDE ILOAD VERSION
-     */
-
-    /**
-     * @title  Test lload_w 1
-     */
-    public void testN3() {
-        T_lload_1_w t = new T_lload_1_w();
-        assertEquals(1234567890123l, t.run());
-    }
-
-    /**
-     * @title  Test lload 257
-     */
-    public void testN4() {
-        T_lload_2_w t = new T_lload_2_w();
-        assertEquals(9876543210123l, t.run());
-    }
-
-    /**
-     * @constraint 4.8.1.25
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.lload.jm.T_lload_3_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.lload.jm.T_lload_4_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - int
-     */
-    public void testVFE7() {
-        try {
-            Class.forName("dxc.junit.opcodes.lload.jm.T_lload_5_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE8() {
-        try {
-            Class.forName("dxc.junit.opcodes.lload.jm.T_lload_6_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_1.j b/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_1.j
deleted file mode 100644
index 7acd2d7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_1.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_1.java
-.class public dxc/junit/opcodes/lload/jm/T_lload_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()J
-    .limit stack 4
-    .limit locals 4
-
-    ldc2_w 1234567890123
-    lstore 1
-    ldc2_w 3
-    lload 1
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_1.java b/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_1.java
deleted file mode 100644
index 564bc8e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload.jm;
-
-public class T_lload_1 {
-
-    public long run() {
-        return 1234567890123l;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_1_w.j b/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_1_w.j
deleted file mode 100644
index db18231..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_1_w.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_1_w.java
-.class public dxc/junit/opcodes/lload/jm/T_lload_1_w
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()J
-    .limit stack 4
-    .limit locals 4
-
-    ldc2_w 1234567890123
-    lstore 1
-    ldc2_w 3
-    lload_w 1
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_1_w.java b/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_1_w.java
deleted file mode 100644
index e608b1a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_1_w.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload.jm;
-
-public class T_lload_1_w {
-    
-    public long run() {
-        return 1234567890123l;
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_2.j b/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_2.j
deleted file mode 100644
index 2034bcd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_2.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_2.java
-.class public dxc/junit/opcodes/lload/jm/T_lload_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()J
-    .limit stack 4
-    .limit locals 300
-    
-    ldc2_w 9876543210123
-    lstore 255
-    ldc2_w 3
-    lload 255
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_2.java b/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_2.java
deleted file mode 100644
index 7149ed5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload.jm;
-
-public class T_lload_2 {
-
-    public long run() {
-        return 9876543210123l;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_2_w.j b/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_2_w.j
deleted file mode 100644
index 6ffe007..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_2_w.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_2_w.java
-.class public dxc/junit/opcodes/lload/jm/T_lload_2_w
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()J
-    .limit stack 4
-    .limit locals 300
-    
-    ldc2_w 9876543210123
-    lstore 257
-    ldc2_w 3
-    lload_w 257
-
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_2_w.java b/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_2_w.java
deleted file mode 100644
index 2175495..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_2_w.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload.jm;
-
-public class T_lload_2_w {
-    
-    public long run() {
-        return 9876543210123l;
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_3.j b/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_3.j
deleted file mode 100644
index 217bb42..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_3.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_3.java
-.class public dxc/junit/opcodes/lload/jm/T_lload_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 0
-    .limit locals 2
-
-    lload 2
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_3.java b/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_3.java
deleted file mode 100644
index ba729a5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload.jm;
-
-public class T_lload_3 {
-
-    public void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_3_w.j b/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_3_w.j
deleted file mode 100644
index 7ad273a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_3_w.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_3_w.java
-.class public dxc/junit/opcodes/lload/jm/T_lload_3_w
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 300
-
-    lload_w 300
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_3_w.java b/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_3_w.java
deleted file mode 100644
index 2e0a76f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_3_w.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload.jm;
-
-public class T_lload_3_w {
-    public void run() {
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_4.j b/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_4.j
deleted file mode 100644
index 2d0c1c3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_4.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_4.java
-.class public dxc/junit/opcodes/lload/jm/T_lload_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 4
-    .limit locals 4
-    
-    dconst_1
-    dstore_1
-    
-    lload 1
-    
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_4.java b/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_4.java
deleted file mode 100644
index 01231c3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload.jm;
-
-public class T_lload_4 {
-
-    public void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_4_w.j b/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_4_w.j
deleted file mode 100644
index 0540f0c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_4_w.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_4_w.java
-.class public dxc/junit/opcodes/lload/jm/T_lload_4_w
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 4
-    .limit locals 300
-
-    dconst_1
-    dstore 260
-    
-    lload_w 260
-    
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_4_w.java b/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_4_w.java
deleted file mode 100644
index 3a7ebbe..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_4_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload.jm;
-
-public class T_lload_4_w {
-    
-    public void run() {
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_5.j b/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_5.j
deleted file mode 100644
index 9e1fc59..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_5.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_5.java
-.class public dxc/junit/opcodes/lload/jm/T_lload_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 4
-    .limit locals 4
-    
-    iconst_1
-    istore_1
-    iconst_1
-    istore_2
-    
-    lload 1
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_5.java b/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_5.java
deleted file mode 100644
index ee11b04..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload.jm;
-
-public class T_lload_5 {
-
-    public void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_5_w.j b/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_5_w.j
deleted file mode 100644
index cc2476b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_5_w.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_5_w.java
-.class public dxc/junit/opcodes/lload/jm/T_lload_5_w
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 4
-    .limit locals 300
-
-    iconst_1
-    istore 257
-    iconst_1
-    istore 258
-    
-    lload_w 257
-    
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_5_w.java b/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_5_w.java
deleted file mode 100644
index 6d8f81a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_5_w.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload.jm;
-
-public class T_lload_5_w {
-    public void run() {
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_6.j b/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_6.j
deleted file mode 100644
index e2a6e09..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_6.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_6.java
-.class public dxc/junit/opcodes/lload/jm/T_lload_6
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 1
-    .limit locals 3
-
-    lconst_1
-    lstore_1
-    
-    lload 1
-    lload 1
-    
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_6.java b/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_6.java
deleted file mode 100644
index 13bfa4c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload.jm;
-
-public class T_lload_6 {
-
-    public void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_6_w.j b/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_6_w.j
deleted file mode 100644
index af353ad..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_6_w.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_6_w.java
-.class public dxc/junit/opcodes/lload/jm/T_lload_6_w
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 1
-    .limit locals 300
-
-    lconst_1
-    lstore 257
-    
-    lload_w 257
-    lload_w 257
-    
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_6_w.java b/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_6_w.java
deleted file mode 100644
index 9f9a392..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload/jm/T_lload_6_w.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload.jm;
-
-public class T_lload_6_w {
-    public void run() {
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_0/Test_lload_0.java b/tools/dx-tests/src/dxc/junit/opcodes/lload_0/Test_lload_0.java
deleted file mode 100644
index 907b444..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_0/Test_lload_0.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload_0;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.lload_0.jm.T_lload_0_1;
-import dxc.junit.opcodes.lload_0.jm.T_lload_0_6;
-
-public class Test_lload_0 extends DxTestCase {
-
-    /**
-     * @title value is pushed onto the operand stack
-     */
-    public void testN1() {
-        assertEquals(1234567890123l, T_lload_0_1.run());
-    }
-
-    /**
-     * @title equality of lload_<n> and lload <n>
-     */
-    public void testN2() {
-        assertTrue(T_lload_0_6.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.lload_0.jm.T_lload_0_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.lload_0.jm.T_lload_0_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.lload_0.jm.T_lload_0_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.lload_0.jm.T_lload_0_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_1.j b/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_1.j
deleted file mode 100644
index 880e0f8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_1.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_0_1.java
-.class public dxc/junit/opcodes/lload_0/jm/T_lload_0_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()J
-    .limit stack 4
-    .limit locals 2
-    
-    ldc2_w 1234567890123
-    lstore_0
-    ldc2_w 4
-    lload_0
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_1.java b/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_1.java
deleted file mode 100644
index f7c26cf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload_0.jm;
-
-public class T_lload_0_1 {
-
-    public static long run() {
-        return 1234567890123l;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_2.j b/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_2.j
deleted file mode 100644
index 410c35d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_2.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_0_2.java
-.class public dxc/junit/opcodes/lload_0/jm/T_lload_0_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    lload_0
-    
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_2.java b/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_2.java
deleted file mode 100644
index 965b1c9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_2.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload_0.jm;
-
-public class T_lload_0_2 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_3.j b/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_3.j
deleted file mode 100644
index 7fee6f7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_3.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_0_3.java
-.class public dxc/junit/opcodes/lload_0/jm/T_lload_0_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    dconst_1
-    dstore_0
-    
-    lload_0
-    
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_3.java b/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_3.java
deleted file mode 100644
index fffd4b7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload_0.jm;
-
-public class T_lload_0_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_4.j b/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_4.j
deleted file mode 100644
index d946623..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_4.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_0_4.java
-.class public dxc/junit/opcodes/lload_0/jm/T_lload_0_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    iconst_1
-    istore_0
-    iconst_1
-    istore_1
-    
-    lload_0
-    
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_4.java b/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_4.java
deleted file mode 100644
index b054db4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload_0.jm;
-
-public class T_lload_0_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_5.j b/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_5.j
deleted file mode 100644
index 43e0600..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_5.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_0_5.java
-.class public dxc/junit/opcodes/lload_0/jm/T_lload_0_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 2
-
-    lconst_1
-    lstore_0
-    
-    lload_0
-    lload_0
-    
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_5.java b/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_5.java
deleted file mode 100644
index 0c71a3e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_5.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload_0.jm;
-
-public class T_lload_0_5 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_6.j b/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_6.j
deleted file mode 100644
index e1b7d2f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_6.j
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_0_6.java
-.class public dxc/junit/opcodes/lload_0/jm/T_lload_0_6
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()Z
-    .limit stack 4
-    .limit locals 3
-
-    ldc2_w 1234567890123
-    lstore_0
-
-    lload_0
-    lload 0
-
-    lcmp
-    ifne Label0
-    iconst_1
-    ireturn
-
-Label0:
-    iconst_0
-    ireturn
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_6.java b/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_6.java
deleted file mode 100644
index 2f225f9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_0/jm/T_lload_0_6.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload_0.jm;
-
-public class T_lload_0_6 {
-
-    public static boolean run() {
-        long i = 1234567890123l;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_1/Test_lload_1.java b/tools/dx-tests/src/dxc/junit/opcodes/lload_1/Test_lload_1.java
deleted file mode 100644
index 161d6d9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_1/Test_lload_1.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload_1;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.lload_1.jm.T_lload_1_1;
-import dxc.junit.opcodes.lload_1.jm.T_lload_1_6;
-
-public class Test_lload_1 extends DxTestCase {
-
-    /**
-     * @title value is pushed onto the operand stack
-     */
-    public void testN1() {
-        assertEquals(1234567890123l, T_lload_1_1.run());
-    }
-
-    /**
-     * @title equality of lload_<n> and lload <n>
-     */
-    public void testN2() {
-        assertTrue(T_lload_1_6.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.lload_1.jm.T_lload_1_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.lload_1.jm.T_lload_1_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.lload_1.jm.T_lload_1_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.lload_1.jm.T_lload_1_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_1.j b/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_1.j
deleted file mode 100644
index f6f0f2e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_1.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_1_1.java
-.class public dxc/junit/opcodes/lload_1/jm/T_lload_1_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()J
-    .limit stack 4
-    .limit locals 3
-    
-    ldc2_w 1234567890123
-    lstore_1
-    ldc2_w 4
-    lload_1
-    lreturn
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_1.java b/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_1.java
deleted file mode 100644
index e111f73..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload_1.jm;
-
-public class T_lload_1_1 {
-
-    public static long run() {
-        return 1234567890123l;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_2.j b/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_2.j
deleted file mode 100644
index ea2e467..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_2.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_1_2.java
-.class public dxc/junit/opcodes/lload_1/jm/T_lload_1_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    lload_1
-    
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_2.java b/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_2.java
deleted file mode 100644
index 6734f21..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_2.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload_1.jm;
-
-public class T_lload_1_2 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_3.j b/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_3.j
deleted file mode 100644
index 9c50055..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_3.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_1_3.java
-.class public dxc/junit/opcodes/lload_1/jm/T_lload_1_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    dconst_1
-    dstore_1
-    
-    lload_1
-    
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_3.java b/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_3.java
deleted file mode 100644
index 3161c8e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload_1.jm;
-
-public class T_lload_1_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_4.j b/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_4.j
deleted file mode 100644
index 93ec644..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_4.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_1_4.java
-.class public dxc/junit/opcodes/lload_1/jm/T_lload_1_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    iconst_1
-    istore_1
-    iconst_1
-    istore_2
-    
-    lload_1
-    
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_4.java b/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_4.java
deleted file mode 100644
index 7bcdd19..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload_1.jm;
-
-public class T_lload_1_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_5.j b/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_5.j
deleted file mode 100644
index 16e89db..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_5.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_1_5.java
-.class public dxc/junit/opcodes/lload_1/jm/T_lload_1_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 3
-
-    lconst_1
-    lstore_1
-    
-    lload_1
-    lload_1
-    
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_5.java b/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_5.java
deleted file mode 100644
index 8e3b949..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_5.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload_1.jm;
-
-public class T_lload_1_5 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_6.j b/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_6.j
deleted file mode 100644
index 2cdbd8a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_6.j
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_1_6.java
-.class public dxc/junit/opcodes/lload_1/jm/T_lload_1_6
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()Z
-    .limit stack 4
-    .limit locals 3
-
-    ldc2_w 1234567890123
-    lstore_1
-
-    lload_1
-    lload 1
-    lcmp
-    ifne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_6.java b/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_6.java
deleted file mode 100644
index 91fc928..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_1/jm/T_lload_1_6.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload_1.jm;
-
-public class T_lload_1_6 {
-
-    public static boolean run() {
-        long i = 1234567890123l;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_2/Test_lload_2.java b/tools/dx-tests/src/dxc/junit/opcodes/lload_2/Test_lload_2.java
deleted file mode 100644
index e8976b8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_2/Test_lload_2.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload_2;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.lload_2.jm.T_lload_2_1;
-import dxc.junit.opcodes.lload_2.jm.T_lload_2_6;
-
-public class Test_lload_2 extends DxTestCase {
-
-    /**
-     * @title value is pushed onto the operand stack
-     */
-    public void testN1() {
-        assertEquals(1234567890123l, T_lload_2_1.run());
-    }
-
-    /**
-     * @title equality of lload_<n> and lload <n>
-     */
-    public void testN2() {
-        assertTrue(T_lload_2_6.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.lload_2.jm.T_lload_2_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.lload_2.jm.T_lload_2_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.lload_2.jm.T_lload_2_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.lload_2.jm.T_lload_2_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_1.j b/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_1.j
deleted file mode 100644
index 753ab6a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_1.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_2_1.java
-.class public dxc/junit/opcodes/lload_2/jm/T_lload_2_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()J
-    .limit stack 4
-    .limit locals 4
-    
-    ldc2_w 1234567890123
-    lstore_2
-    ldc2_w 4
-    lload_2
-    lreturn
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_1.java b/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_1.java
deleted file mode 100644
index 86720db..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload_2.jm;
-
-public class T_lload_2_1 {
-
-    public static long run() {
-        return 1234567890123l;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_2.j b/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_2.j
deleted file mode 100644
index 4ce9a63..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_2.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_2_2.java
-.class public dxc/junit/opcodes/lload_2/jm/T_lload_2_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    lload_2
-    
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_2.java b/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_2.java
deleted file mode 100644
index cd54b1b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_2.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload_2.jm;
-
-public class T_lload_2_2 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_3.j b/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_3.j
deleted file mode 100644
index 85c8f7d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_3.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_2_3.java
-.class public dxc/junit/opcodes/lload_2/jm/T_lload_2_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    dconst_1
-    dstore_2
-    
-    lload_2
-    
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_3.java b/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_3.java
deleted file mode 100644
index 866e9a1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload_2.jm;
-
-public class T_lload_2_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_4.j b/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_4.j
deleted file mode 100644
index ee23e5c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_4.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_2_4.java
-.class public dxc/junit/opcodes/lload_2/jm/T_lload_2_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    iconst_2
-    istore_2
-    iconst_2
-    istore_3
-    
-    lload_2
-    
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_4.java b/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_4.java
deleted file mode 100644
index c6305a7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload_2.jm;
-
-public class T_lload_2_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_5.j b/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_5.j
deleted file mode 100644
index 8e0022d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_5.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_2_5.java
-.class public dxc/junit/opcodes/lload_2/jm/T_lload_2_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 3
-
-    lconst_1
-    lstore_2
-    
-    lload_2
-    lload_2
-    
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_5.java b/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_5.java
deleted file mode 100644
index d21571e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_5.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload_2.jm;
-
-public class T_lload_2_5 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_6.j b/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_6.j
deleted file mode 100644
index 10633f0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_6.j
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_2_6.java
-.class public dxc/junit/opcodes/lload_2/jm/T_lload_2_6
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()Z
-    .limit stack 4
-    .limit locals 4
-
-    ldc2_w 1234567890123
-    lstore_2
-
-    lload_2
-    lload 2
-    lcmp
-    ifne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_6.java b/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_6.java
deleted file mode 100644
index 41fa7ac..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_2/jm/T_lload_2_6.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload_2.jm;
-
-public class T_lload_2_6 {
-
-    public static boolean run() {
-        long i = 1234567890123l;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_3/Test_lload_3.java b/tools/dx-tests/src/dxc/junit/opcodes/lload_3/Test_lload_3.java
deleted file mode 100644
index 16227ea..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_3/Test_lload_3.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload_3;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.lload_3.jm.T_lload_3_1;
-import dxc.junit.opcodes.lload_3.jm.T_lload_3_6;
-
-public class Test_lload_3 extends DxTestCase {
-
-    /**
-     * @title value is pushed onto the operand stack
-     */
-    public void testN1() {
-        assertEquals(1234567890123l, T_lload_3_1.run());
-    }
-
-    /**
-     * @title equality of lload_<n> and lload <n>
-     */
-    public void testN2() {
-        assertTrue(T_lload_3_6.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.lload_3.jm.T_lload_3_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.lload_3.jm.T_lload_3_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.lload_3.jm.T_lload_3_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.lload_3.jm.T_lload_3_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_1.j b/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_1.j
deleted file mode 100644
index 987c791..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_1.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_3_1.java
-.class public dxc/junit/opcodes/lload_3/jm/T_lload_3_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()J
-    .limit stack 4
-    .limit locals 5
-    
-    ldc2_w 1234567890123
-    lstore_3
-    ldc2_w 4
-    lload_3
-    lreturn
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_1.java b/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_1.java
deleted file mode 100644
index e5436cf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload_3.jm;
-
-public class T_lload_3_1 {
-
-    public static long run() {
-        return 1234567890123l;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_2.j b/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_2.j
deleted file mode 100644
index 1e4a2a2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_2.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_3_2.java
-.class public dxc/junit/opcodes/lload_3/jm/T_lload_3_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    lload_3
-    
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_2.java b/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_2.java
deleted file mode 100644
index 2e12383..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_2.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload_3.jm;
-
-public class T_lload_3_2 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_3.j b/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_3.j
deleted file mode 100644
index 0d06391..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_3.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_3_3.java
-.class public dxc/junit/opcodes/lload_3/jm/T_lload_3_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 5
-
-    dconst_1
-    dstore_3
-    
-    lload_3
-    
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_3.java b/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_3.java
deleted file mode 100644
index add5f68..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload_3.jm;
-
-public class T_lload_3_3 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_4.j b/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_4.j
deleted file mode 100644
index 6fe0e5c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_4.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_3_4.java
-.class public dxc/junit/opcodes/lload_3/jm/T_lload_3_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 5
-
-    iconst_1
-    istore_3
-    iconst_1
-    istore 4
-    
-    lload_3
-    
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_4.java b/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_4.java
deleted file mode 100644
index 26fb64c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload_3.jm;
-
-public class T_lload_3_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_5.j b/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_5.j
deleted file mode 100644
index 6639760..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_5.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_3_5.java
-.class public dxc/junit/opcodes/lload_3/jm/T_lload_3_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 1
-    .limit locals 5
-
-    lconst_1
-    lstore_3
-    
-    lload_3
-    lload_3
-    
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_5.java b/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_5.java
deleted file mode 100644
index 552d7e6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_5.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload_3.jm;
-
-public class T_lload_3_5 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_6.j b/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_6.j
deleted file mode 100644
index ddfb923..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_6.j
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lload_3_6.java
-.class public dxc/junit/opcodes/lload_3/jm/T_lload_3_6
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()Z
-    .limit stack 4
-    .limit locals 5
-
-    ldc2_w 1234567890123
-    lstore_3
-
-    lload_3
-    lload 3
-    lcmp
-    ifne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-    ireturn
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_6.java b/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_6.java
deleted file mode 100644
index 781ed48..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lload_3/jm/T_lload_3_6.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lload_3.jm;
-
-public class T_lload_3_6 {
-
-    public static boolean run() {
-        long i = 1234567890123l;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lmul/Test_lmul.java b/tools/dx-tests/src/dxc/junit/opcodes/lmul/Test_lmul.java
deleted file mode 100644
index 8bd913a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lmul/Test_lmul.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lmul;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.lmul.jm.T_lmul_1;
-
-public class Test_lmul extends DxTestCase {
-
-    /**
-     * @title Arguments = 222000000000l, 5000000000l
-     */
-    public void testN1() {
-        T_lmul_1 t = new T_lmul_1();
-        assertEquals(3195355577426903040l, t.run(222000000000l, 5000000000l));
-    }
-
-    /**
-     * @title Arguments = -123456789l, 123456789l
-     */
-    public void testN2() {
-        T_lmul_1 t = new T_lmul_1();
-        assertEquals(-15241578750190521l, t.run(-123456789l, 123456789l));
-    }
-
-    /**
-     * @title Arguments = -123456789l, -123456789l
-     */
-    public void testN3() {
-        T_lmul_1 t = new T_lmul_1();
-        assertEquals(15241578750190521l, t.run(-123456789l, -123456789l));
-    }
-
-    /**
-     * @title Arguments = 0, Long.MAX_VALUE
-     */
-    public void testB1() {
-        T_lmul_1 t = new T_lmul_1();
-        assertEquals(0, t.run(0, Long.MAX_VALUE));
-    }
-    /**
-     * @title Arguments = Long.MAX_VALUE, 1
-     */
-    public void testB2() {
-        T_lmul_1 t = new T_lmul_1();
-        assertEquals(9223372036854775807L, t.run(Long.MAX_VALUE, 1));
-    }
-    /**
-     * @title Arguments = Long.MIN_VALUE, 1
-     */
-    public void testB3() {
-        T_lmul_1 t = new T_lmul_1();
-        assertEquals(-9223372036854775808L, t.run(Long.MIN_VALUE, 1));
-    }
-    /**
-     * @title Arguments = Long.MAX_VALUE, Long.MIN_VALUE
-     */
-    public void testB4() {
-        T_lmul_1 t = new T_lmul_1();
-        assertEquals(-9223372036854775808L, t.run(Long.MAX_VALUE,
-                Long.MIN_VALUE));
-    }
-    /**
-     * @title Arguments = 0, 0
-     */
-    public void testB5() {
-        T_lmul_1 t = new T_lmul_1();
-        assertEquals(0, t.run(0, 0));
-    }
-    /**
-     * @title Arguments = Long.MAX_VALUE, -1
-     */
-    public void testB6() {
-        T_lmul_1 t = new T_lmul_1();
-        assertEquals(-9223372036854775807L, t.run(Long.MAX_VALUE, -1));
-    }
-    /**
-     * @title Arguments = Long.MIN_VALUE, -1
-     */
-    public void testB7() {
-        T_lmul_1 t = new T_lmul_1();
-        assertEquals(-9223372036854775808L, t.run(Long.MIN_VALUE, -1));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.lmul.jm.T_lmul_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.lmul.jm.T_lmul_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long * double
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.lmul.jm.T_lmul_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long * int
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.lmul.jm.T_lmul_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - float * long
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.lmul.jm.T_lmul_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference * long
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.lmul.jm.T_lmul_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_1.j b/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_1.j
deleted file mode 100644
index 59ba73e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_1.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lmul_1.java
-.class public dxc/junit/opcodes/lmul/jm/T_lmul_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(JJ)J
-    .limit stack 4
-    .limit locals 5
-
-    lload_1
-    lload_3
-    lmul
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_1.java b/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_1.java
deleted file mode 100644
index 455a293..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lmul.jm;
-
-public class T_lmul_1 {
-
-    public long run(long a, long b) {
-        return a*b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_2.j b/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_2.j
deleted file mode 100644
index 2965969..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_2.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lmul_2.java
-.class public dxc/junit/opcodes/lmul/jm/T_lmul_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(JJ)J
-    .limit stack 4
-    .limit locals 5
-
-;    lload_1
-    lload_3
-    lmul
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_2.java b/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_2.java
deleted file mode 100644
index 10a1dce..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lmul.jm;
-
-public class T_lmul_2 {
-
-    public long run(long a, long b) {
-        return a*b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_3.j b/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_3.j
deleted file mode 100644
index 32818bf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_3.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lmul_3.java
-.class public dxc/junit/opcodes/lmul/jm/T_lmul_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(JJ)J
-    .limit stack 4
-    .limit locals 5
-
-    lload_1
-;    lload_3
-    lmul
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_3.java b/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_3.java
deleted file mode 100644
index 44d7e83..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lmul.jm;
-
-public class T_lmul_3 {
-
-    public long run(long a, long b) {
-        return a*b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_4.j b/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_4.j
deleted file mode 100644
index b50059e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_4.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lmul_4.java
-.class public dxc/junit/opcodes/lmul/jm/T_lmul_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(JD)J
-    .limit stack 4
-    .limit locals 5
-
-    lload_1
-    dload_3
-    lmul
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_4.java b/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_4.java
deleted file mode 100644
index db452a1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lmul.jm;
-
-public class T_lmul_4 {
-
-    public long run(long a, double b) {
-        return (long)(a*b);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_5.j b/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_5.j
deleted file mode 100644
index 7fe2ef8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_5.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lmul_5.java
-.class public dxc/junit/opcodes/lmul/jm/T_lmul_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(JI)J
-    .limit stack 4
-    .limit locals 4
-
-    lload_1
-    iload_3
-    lmul
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_5.java b/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_5.java
deleted file mode 100644
index 8869241..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lmul.jm;
-
-public class T_lmul_5 {
-
-    public long run(long a, int b) {
-        return a*b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_6.j b/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_6.j
deleted file mode 100644
index 691a9a1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_6.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lmul_6.java
-.class public dxc/junit/opcodes/lmul/jm/T_lmul_6
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(FJ)J
-    .limit stack 3
-    .limit locals 4
-
-    fload_1
-    lload_2
-    lmul
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_6.java b/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_6.java
deleted file mode 100644
index 46ecbec..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lmul.jm;
-
-public class T_lmul_6 {
-
-    public long run(float a, long b) {
-        return (long)(a*b);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_7.j b/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_7.j
deleted file mode 100644
index fe37744..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_7.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lmul_7.java
-.class public dxc/junit/opcodes/lmul/jm/T_lmul_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(JJ)J
-    .limit stack 4
-    .limit locals 5
-
-    aload_0
-    lload_3
-    lmul
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_7.java b/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_7.java
deleted file mode 100644
index b30347d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lmul/jm/T_lmul_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lmul.jm;
-
-public class T_lmul_7 {
-    
-    public long run(long a, long b) {
-        return a*b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lneg/Test_lneg.java b/tools/dx-tests/src/dxc/junit/opcodes/lneg/Test_lneg.java
deleted file mode 100644
index b9d2010..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lneg/Test_lneg.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lneg;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.lneg.jm.T_lneg_1;
-import dxc.junit.opcodes.lneg.jm.T_lneg_2;
-
-public class Test_lneg extends DxTestCase {
-
-    /**
-     * @title Argument = 123123123272432432l
-     */
-    public void testN1() {
-        T_lneg_1 t = new T_lneg_1();
-        assertEquals(-123123123272432432l, t.run(123123123272432432l));
-    }
-
-    /**
-     * @title  Argument = 1
-     */
-    public void testN2() {
-        T_lneg_1 t = new T_lneg_1();
-        assertEquals(-1l, t.run(1l));
-    }
-
-    /**
-     * @title  Argument = -1
-     */
-    public void testN3() {
-        T_lneg_1 t = new T_lneg_1();
-        assertEquals(1l, t.run(-1l));
-    }
-
-    /**
-     * @title  Check that -x == (~x + 1)
-     */
-    public void testN4() {
-        T_lneg_2 t = new T_lneg_2();
-        assertTrue(t.run(123123123272432432l));
-    }
-
-    /**
-     * @title  Argument = 0
-     */
-    public void testB1() {
-        T_lneg_1 t = new T_lneg_1();
-        assertEquals(0, t.run(0));
-    }
-
-    /**
-     * @title  Argument = Long.MAX_VALUE
-     */
-    public void testB2() {
-        T_lneg_1 t = new T_lneg_1();
-        assertEquals(-9223372036854775807L, t.run(Long.MAX_VALUE));
-    }
-
-    /**
-     * @title  Argument = Long.MIN_VALUE
-     */
-    public void testB3() {
-        T_lneg_1 t = new T_lneg_1();
-        assertEquals(-9223372036854775808L, t.run(Long.MIN_VALUE));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.lneg.jm.T_lneg_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.lneg.jm.T_lneg_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.lneg.jm.T_lneg_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - float
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.lneg.jm.T_lneg_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - reference
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.lneg.jm.T_lneg_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_1.j b/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_1.j
deleted file mode 100644
index a92e968..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_1.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lneg_1.java
-.class public dxc/junit/opcodes/lneg/jm/T_lneg_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(J)J
-    .limit stack 2
-    .limit locals 3
-
-    lload_1
-    lneg
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_1.java b/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_1.java
deleted file mode 100644
index 662717f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lneg.jm;
-
-public class T_lneg_1 {
-
-    public long run(long d) {
-        return -d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_2.j b/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_2.j
deleted file mode 100644
index 3142cdb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_2.j
+++ /dev/null
@@ -1,49 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lneg_2.java
-.class public dxc/junit/opcodes/lneg/jm/T_lneg_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(J)Z
-    .limit stack 6
-    .limit locals 3
-
-    lload_1
-    lneg
-    lload_1
-    ldc2_w -1
-    lxor
-    lconst_1
-    ladd
-    lcmp
-    ifne Label0
-    iconst_1
-    ireturn
-
-    Label0:
-    iconst_0
-
-    Label2:
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_2.java b/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_2.java
deleted file mode 100644
index 44b3657..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lneg.jm;
-
-public class T_lneg_2 {
-
-    public boolean run(long d) {
-        return -d == (~d + 1);
-     }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_3.j b/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_3.j
deleted file mode 100644
index 1fe25a9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_3.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lneg_3.java
-.class public dxc/junit/opcodes/lneg/jm/T_lneg_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(J)J
-    .limit stack 2
-    .limit locals 3
-
-;    lload_1
-    lneg
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_3.java b/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_3.java
deleted file mode 100644
index 423f347..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lneg.jm;
-
-public class T_lneg_3 {
-
-    public long run(long d) {
-        return -d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_4.j b/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_4.j
deleted file mode 100644
index 5e585ab..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lneg_4.java
-.class public dxc/junit/opcodes/lneg/jm/T_lneg_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(D)J
-    .limit stack 2
-    .limit locals 3
-
-    dload_1
-    lneg
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_4.java b/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_4.java
deleted file mode 100644
index e2bbda3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lneg.jm;
-
-public class T_lneg_4 {
-
-    public long run(double d) {
-        return (long)-d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_5.j b/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_5.j
deleted file mode 100644
index bc1a58f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_5.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lneg_5.java
-.class public dxc/junit/opcodes/lneg/jm/T_lneg_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(I)J
-    .limit stack 2
-    .limit locals 2
-
-    iload_1
-    lneg
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_5.java b/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_5.java
deleted file mode 100644
index 8d80a66..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lneg.jm;
-
-public class T_lneg_5 {
-
-    public long run(int d) {
-        return -d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_6.j b/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_6.j
deleted file mode 100644
index 2b5fa6d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_6.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lneg_6.java
-.class public dxc/junit/opcodes/lneg/jm/T_lneg_6
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(F)J
-    .limit stack 2
-    .limit locals 2
-
-    fload_1
-    lneg
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_6.java b/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_6.java
deleted file mode 100644
index 47b901a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lneg.jm;
-
-public class T_lneg_6 {
-
-    public long run(float d) {
-        return (long)-d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_7.j b/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_7.j
deleted file mode 100644
index a5e1696..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_7.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lneg_7.java
-.class public dxc/junit/opcodes/lneg/jm/T_lneg_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(J)J
-    .limit stack 2
-    .limit locals 3
-
-    aload_0
-    lneg
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_7.java b/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_7.java
deleted file mode 100644
index ccbc868..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lneg/jm/T_lneg_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lneg.jm;
-
-public class T_lneg_7 {
-    
-    public long run(long d) {
-        return -d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/Test_lookupswitch.java b/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/Test_lookupswitch.java
deleted file mode 100644
index 5b5ced8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/Test_lookupswitch.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lookupswitch;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.lookupswitch.jm.T_lookupswitch_1;
-
-public class Test_lookupswitch extends DxTestCase {
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_lookupswitch_1 t = new T_lookupswitch_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 check Integer.MAX_VALUE
-     */
-    public void testB1() {
-        T_lookupswitch_1 t = new T_lookupswitch_1();
-        assertEquals(-1, t.run(Integer.MAX_VALUE));
-    }
-
-    /**
-     * @title check Integer.MIN_VALUE
-     */
-    public void testB2() {
-        T_lookupswitch_1 t = new T_lookupswitch_1();
-        assertEquals(-1, t.run(Integer.MIN_VALUE));
-    }
-
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.lookupswitch.jm.T_lookupswitch_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.lookupswitch.jm.T_lookupswitch_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.9
-     * @title branch target shall be inside the
-     * method
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.lookupswitch.jm.T_lookupswitch_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.9
-     * @title branch target shall not be "inside" wide
-     * instruction
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.lookupswitch.jm.T_lookupswitch_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.9
-     * @title npairs shall be >= 0
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.lookupswitch.jm.T_lookupswitch_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.9
-     * @title non-zero padding
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.lookupswitch.jm.T_lookupswitch_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.9
-     * @title pairs shall be sorted in ascending
-     * order
-     */
-    public void testVFE7() {
-        try {
-            Class.forName("dxc.junit.opcodes.lookupswitch.jm.T_lookupswitch_8");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - reference
-     */
-    public void testVFE8() {
-        try {
-            Class.forName("dxc.junit.opcodes.lookupswitch.jm.T_lookupswitch_9");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.9
-     * @title number of entries in jump table
-     */
-    public void testVFE9() {
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.lookupswitch.jm.T_lookupswitch_10");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_1.j b/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_1.j
deleted file mode 100644
index 310c3d1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_1.j
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lookupswitch_1.java
-.class public dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-    iload_1
-    lookupswitch
-            -1 : Label0
-            10 : Label1
-            15 : Label1
-            default: Label3
-
-    Label0:
-    iconst_2
-    ireturn
-
-    Label1:
-    bipush 20
-    ireturn
-
-    Label3:
-    iconst_m1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_1.java b/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_1.java
deleted file mode 100644
index 0f1f657..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_1.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lookupswitch.jm;
-
-public class T_lookupswitch_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/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_10.cfh b/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_10.cfh
deleted file mode 100644
index d4c30e8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_10.cfh
+++ /dev/null
@@ -1,185 +0,0 @@
-//@class:dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_10
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000d
-// .  .  
-   00 0d 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0c 00 07 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 6, h: 0005: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 62, len 25, h: 0006: utf8{"T_lookupswitch_10.java"}
-    // .  .  .  T  _  l  o  o  k  u  p  s  w  i  t  c  h  _  1  0  .  j  a  v  a  
-       01 00 16 54 5f 6c 6f 6f 6b 75 70 73 77 69 74 63 68 5f 31 30 2e 6a 61 76 61 
-    // parsed:, offset 87, len 5, h: 0007: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 0b 
-    // parsed:, offset 92, len 7, h: 0008: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 99, len 54, h: 0009: utf8{"dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_10"}
-    // .  .  3  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  l  o  o  k  u  p  s  w  i  t  c  h  /  j  m  /  T  _  l  o  o  k  u  p  s  w  i  t  c  h  _  1  0  
-       01 00 33 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 6c 6f 6f 6b 75 70 73 77 69 74 63 68 2f 6a 6d 2f 54 5f 6c 6f 6f 6b 75 70 73 77 69 74 63 68 5f 31 30 
-    // parsed:, offset 153, len 3, h: 000a: type{dxc.junit.opcodes.lookupswitch.jm.T_lookupswitch_10}
-    // .  .  .  
-       07 00 09 
-    // parsed:, offset 156, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 162, len 3, h: 000c: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 165, len 0, h: end constant_pool
-// parsed:, offset 165, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 167, len 2, h: this_class: type{dxc.junit.opcodes.lookupswitch.jm.T_lookupswitch_10}
-// .  .  
-   00 0a 
-// parsed:, offset 169, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0c 
-// parsed:, offset 171, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 173, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 175, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 177, len:89,desc: ()V
-// parsed:, offset 177, len 0, h:  methods[0]: 
-    // parsed:, offset 177, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 179, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 181, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 183, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 185, len 0, h:  attributes[0]: 
-        // parsed:, offset 185, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 187, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 191, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 193, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 195, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 204, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 206, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 208, len 0, h: end attributes[0] 
-// parsed:, offset 208, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 208, len:58,desc: ()V
-// parsed:, offset 208, len 0, h:  methods[1]: 
-    // parsed:, offset 208, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 210, len 2, h: name: run
-    // .  .  
-       00 05 
-    // parsed:, offset 212, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 214, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 216, len 0, h:  attributes[0]: 
-        // parsed:, offset 216, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 218, len 4, h: length: 00000022
-        // .  .  .  "  
-           00 00 00 22 
-        // parsed:, offset 222, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 224, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 226, len 4, h: code_length: 00000016
-        // .  .  .  .  
-           00 00 00 16 
-        // parsed:, offset 0, len 1, h: 0000: iconst_1 // #+01
-        // .  
-           04 
-        // parsed:, offset 1, len 19, h: 0001: lookupswitch   -00000001: 0014   default: 0015
-        // .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
-//@mod           ab 00 00 00 00 00 14 00 00 00 01 ff ff ff ff 00 00 00 13 
-           ab 00 00 00 00 00 14 00 00 00 02 ff ff ff ff 00 00 00 13 
-        // parsed:, offset 20, len 1, h: 0014: return
-        // .  
-           b1 
-        // parsed:, offset 21, len 1, h: 0015: return
-        // .  
-           b1 
-        // parsed:, offset 252, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 254, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 256, len 0, h: end attributes[0] 
-// parsed:, offset 256, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()V
-// parsed:, offset 256, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 258, len 0, h:  attributes[0]: 
-    // parsed:, offset 258, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 260, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 264, len 2, h: source: utf8{"T_lookupswitch_10.java"}
-    // .  .  
-       00 06 
-// parsed:, offset 266, len 0, h: end attributes[0] 
-// parsed:, offset 266, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_10.j b/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_10.j
deleted file mode 100644
index 73ad264..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_10.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lookupswitch_10.java
-.class public dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_10
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()V
-    .limit stack 1
-    .limit locals 1
-    iconst_1
-    lookupswitch
-            -1 : Label0
-            default: Label2
-
- Label0:
-    return
-
-Label2:
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_10.java b/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_10.java
deleted file mode 100644
index ee806f4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_10.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lookupswitch.jm;
-
-public class T_lookupswitch_10 {
-
-    public void run() {
-        switch (1) {
-        case -1:
-            return;
-        case 10:
-            return;
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_2.j b/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_2.j
deleted file mode 100644
index db16d9d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_2.j
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lookupswitch_2.java
-.class public dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-;    iload_1
-    lookupswitch
-            -1 : Label0
-            10 : Label1
-            15 : Label1
-            default: Label3
-
-    Label0:
-    iconst_2
-    ireturn
-
-    Label1:
-    bipush 20
-    ireturn
-
-    Label3:
-    iconst_m1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_2.java b/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_2.java
deleted file mode 100644
index 05ec5ce..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_2.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lookupswitch.jm;
-
-public class T_lookupswitch_2 {
-
-    public int run(int i) {
-        switch (i) {
-        case -1:
-            return 2;
-        case 10:
-        case 15:
-            return 20;
-        default:
-            return -1;
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_3.j b/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_3.j
deleted file mode 100644
index 0b96e9d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_3.j
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lookupswitch_3.java
-.class public dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-
-    fconst_1
-    lookupswitch
-            -1 : Label0
-            10 : Label1
-            15 : Label1
-            default: Label3
-
-    Label0:
-    iconst_2
-    ireturn
-
-    Label1:
-    bipush 20
-    ireturn
-
-    Label3:
-    iconst_m1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_3.java b/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_3.java
deleted file mode 100644
index 1c777ab..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_3.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lookupswitch.jm;
-
-public class T_lookupswitch_3 {
-
-    public int run(int i) {
-        switch (i) {
-        case -1:
-            return 2;
-        case 10:
-        case 15:
-            return 20;
-        default:
-            return -1;
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_4.cfh b/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_4.cfh
deleted file mode 100644
index 436d184..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_4.cfh
+++ /dev/null
@@ -1,200 +0,0 @@
-//@class:dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_4
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0c 00 06 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 6, h: 0005: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 62, len 5, h: 0006: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 0a 
-    // parsed:, offset 67, len 3, h: 0007: type{dxc.junit.opcodes.lookupswitch.jm.T_lookupswitch_4}
-    // .  .  .  
-       07 00 09 
-    // parsed:, offset 70, len 7, h: 0008: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 77, len 53, h: 0009: utf8{"dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_4"}
-    // .  .  2  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  l  o  o  k  u  p  s  w  i  t  c  h  /  j  m  /  T  _  l  o  o  k  u  p  s  w  i  t  c  h  _  4  
-       01 00 32 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 6c 6f 6f 6b 75 70 73 77 69 74 63 68 2f 6a 6d 2f 54 5f 6c 6f 6f 6b 75 70 73 77 69 74 63 68 5f 34 
-    // parsed:, offset 130, len 6, h: 000a: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 136, len 24, h: 000b: utf8{"T_lookupswitch_4.java"}
-    // .  .  .  T  _  l  o  o  k  u  p  s  w  i  t  c  h  _  4  .  j  a  v  a  
-       01 00 15 54 5f 6c 6f 6f 6b 75 70 73 77 69 74 63 68 5f 34 2e 6a 61 76 61 
-    // parsed:, offset 160, len 3, h: 000c: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-    // parsed:, offset 163, len 7, h: 000d: utf8{"(I)I"}
-    // .  .  .  (  I  )  I  
-       01 00 04 28 49 29 49 
-// parsed:, offset 170, len 0, h: end constant_pool
-// parsed:, offset 170, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 172, len 2, h: this_class: type{dxc.junit.opcodes.lookupswitch.jm.T_lookupswitch_4}
-// .  .  
-   00 07 
-// parsed:, offset 174, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0c 
-// parsed:, offset 176, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 178, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 180, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 182, len:110,desc: ()V
-// parsed:, offset 182, len 0, h:  methods[0]: 
-    // parsed:, offset 182, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 184, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 186, len 2, h: descriptor: ()V
-    // .  .  
-       00 0a 
-    // parsed:, offset 188, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 190, len 0, h:  attributes[0]: 
-        // parsed:, offset 190, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 192, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 196, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 198, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 200, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 209, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 211, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 213, len 0, h: end attributes[0] 
-// parsed:, offset 213, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 213, len:79,desc: (I)I
-// parsed:, offset 213, len 0, h:  methods[1]: 
-    // parsed:, offset 213, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 215, len 2, h: name: run
-    // .  .  
-       00 05 
-    // parsed:, offset 217, len 2, h: descriptor: (I)I
-    // .  .  
-       00 0d 
-    // parsed:, offset 219, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 221, len 0, h:  attributes[0]: 
-        // parsed:, offset 221, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 223, len 4, h: length: 00000037
-        // .  .  .  7  
-           00 00 00 37 
-        // parsed:, offset 227, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 229, len 2, h: max_locals: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 231, len 4, h: code_length: 0000002b
-        // .  .  .  +  
-           00 00 00 2b 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 35, h: 0001: lookupswitch   -00000001: 0024   +0000000a: 0026   +0000000f: 0026   default: 0029
-        // .  .  .  .  .  .  (  .  .  .  .  .  .  .  .  .  .  .  #  .  .  .  .  .  .  .  %  .  .  .  .  .  .  .  %  
-//@mod           ab 00 00 00 00 00 28 00 00 00 03 ff ff ff ff 00 00 00 23 00 00 00 0a 00 00 00 25 00 00 00 0f 00 00 00 25 
-           ab 00 00 00 00 00 28 00 00 00 03 ff ff ff ff 00 00 00 23 00 00 00 0a 00 00 00 25 00 00 00 0f 00 00 00 ff 
-        // parsed:, offset 36, len 1, h: 0024: iconst_2 // #+02
-        // .  
-           05 
-        // parsed:, offset 37, len 1, h: 0025: ireturn
-        // .  
-           ac 
-        // parsed:, offset 38, len 2, h: 0026: bipush #+14
-        // .  .  
-           10 14 
-        // parsed:, offset 40, len 1, h: 0028: ireturn
-        // .  
-           ac 
-        // parsed:, offset 41, len 1, h: 0029: iconst_m1 // #-01
-        // .  
-           02 
-        // parsed:, offset 42, len 1, h: 002a: ireturn
-        // .  
-           ac 
-        // parsed:, offset 278, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 280, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 282, len 0, h: end attributes[0] 
-// parsed:, offset 282, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (I)I
-// parsed:, offset 282, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 284, len 0, h:  attributes[0]: 
-    // parsed:, offset 284, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 286, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 290, len 2, h: source: utf8{"T_lookupswitch_4.java"}
-    // .  .  
-       00 0b 
-// parsed:, offset 292, len 0, h: end attributes[0] 
-// parsed:, offset 292, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_4.j b/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_4.j
deleted file mode 100644
index e342dc3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_4.j
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lookupswitch_4.java
-.class public dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-    iload_1
-
-    lookupswitch
-            -1 : Label0
-            10 : Label1
-            15 : Label1
-            default: Label3
-
-    Label0:
-    iconst_2
-    ireturn
-
-    Label1:
-    bipush 20
-    ireturn
-
-    Label3:
-    iconst_m1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_4.java b/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_4.java
deleted file mode 100644
index 407ccad..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_4.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lookupswitch.jm;
-
-public class T_lookupswitch_4 {
-
-    public int run(int i) {
-        switch (i) {
-        case -1:
-            return 2;
-        case 10:
-        case 15:
-            return 20;
-        default:
-            return -1;
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_5.cfh b/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_5.cfh
deleted file mode 100644
index e578a07..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_5.cfh
+++ /dev/null
@@ -1,200 +0,0 @@
-//@class:dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_5
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 24, h: 0001: utf8{"T_lookupswitch_5.java"}
-    // .  .  .  T  _  l  o  o  k  u  p  s  w  i  t  c  h  _  5  .  j  a  v  a  
-       01 00 15 54 5f 6c 6f 6f 6b 75 70 73 77 69 74 63 68 5f 35 2e 6a 61 76 61 
-    // parsed:, offset 34, len 5, h: 0002: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0c 00 07 
-    // parsed:, offset 39, len 19, h: 0003: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 58, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 71, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 80, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 86, len 5, h: 0007: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0a 
-    // parsed:, offset 91, len 3, h: 0008: type{dxc.junit.opcodes.lookupswitch.jm.T_lookupswitch_5}
-    // .  .  .  
-       07 00 0b 
-    // parsed:, offset 94, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 101, len 6, h: 000a: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 107, len 53, h: 000b: utf8{"dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_5"}
-    // .  .  2  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  l  o  o  k  u  p  s  w  i  t  c  h  /  j  m  /  T  _  l  o  o  k  u  p  s  w  i  t  c  h  _  5  
-       01 00 32 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 6c 6f 6f 6b 75 70 73 77 69 74 63 68 2f 6a 6d 2f 54 5f 6c 6f 6f 6b 75 70 73 77 69 74 63 68 5f 35 
-    // parsed:, offset 160, len 3, h: 000c: type{java.lang.Object}
-    // .  .  .  
-       07 00 03 
-    // parsed:, offset 163, len 7, h: 000d: utf8{"(I)I"}
-    // .  .  .  (  I  )  I  
-       01 00 04 28 49 29 49 
-// parsed:, offset 170, len 0, h: end constant_pool
-// parsed:, offset 170, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 172, len 2, h: this_class: type{dxc.junit.opcodes.lookupswitch.jm.T_lookupswitch_5}
-// .  .  
-   00 08 
-// parsed:, offset 174, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0c 
-// parsed:, offset 176, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 178, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 180, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 182, len:112,desc: ()V
-// parsed:, offset 182, len 0, h:  methods[0]: 
-    // parsed:, offset 182, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 184, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 186, len 2, h: descriptor: ()V
-    // .  .  
-       00 0a 
-    // parsed:, offset 188, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 190, len 0, h:  attributes[0]: 
-        // parsed:, offset 190, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 192, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 196, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 198, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 200, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 02 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 209, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 211, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 213, len 0, h: end attributes[0] 
-// parsed:, offset 213, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 213, len:81,desc: (I)I
-// parsed:, offset 213, len 0, h:  methods[1]: 
-    // parsed:, offset 213, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 215, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 217, len 2, h: descriptor: (I)I
-    // .  .  
-       00 0d 
-    // parsed:, offset 219, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 221, len 0, h:  attributes[0]: 
-        // parsed:, offset 221, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 223, len 4, h: length: 00000039
-        // .  .  .  9  
-           00 00 00 39 
-        // parsed:, offset 227, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 229, len 2, h: max_locals: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 231, len 4, h: code_length: 0000002d
-        // .  .  .  -  
-           00 00 00 2d 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 35, h: 0001: lookupswitch   -00000001: 0024   +0000000a: 0026   +0000000f: 0026   default: 002b
-        // .  .  .  .  .  .  *  .  .  .  .  .  .  .  .  .  .  .  #  .  .  .  .  .  .  .  %  .  .  .  .  .  .  .  %  
-//@mod           ab 00 00 00 00 00 2a 00 00 00 03 ff ff ff ff 00 00 00 23 00 00 00 0a 00 00 00 25 00 00 00 0f 00 00 00 25 
-           ab 00 00 00 00 00 2a 00 00 00 03 ff ff ff ff 00 00 00 23 00 00 00 0a 00 00 00 26 00 00 00 0f 00 00 00 25 
-        // parsed:, offset 36, len 1, h: 0024: iconst_2 // #+02
-        // .  
-           05 
-        // parsed:, offset 37, len 1, h: 0025: ireturn
-        // .  
-           ac 
-        // parsed:, offset 38, len 4, h: 0026: wide iload 0001
-        // .  .  .  .  
-           c4 15 00 01 
-        // parsed:, offset 42, len 1, h: 002a: ireturn
-        // .  
-           ac 
-        // parsed:, offset 43, len 1, h: 002b: iconst_m1 // #-01
-        // .  
-           02 
-        // parsed:, offset 44, len 1, h: 002c: ireturn
-        // .  
-           ac 
-        // parsed:, offset 280, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 282, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 284, len 0, h: end attributes[0] 
-// parsed:, offset 284, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (I)I
-// parsed:, offset 284, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 286, len 0, h:  attributes[0]: 
-    // parsed:, offset 286, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 288, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 292, len 2, h: source: utf8{"T_lookupswitch_5.java"}
-    // .  .  
-       00 01 
-// parsed:, offset 294, len 0, h: end attributes[0] 
-// parsed:, offset 294, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_5.j b/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_5.j
deleted file mode 100644
index cd74f87..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_5.j
+++ /dev/null
@@ -1,48 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lookupswitch_5.java
-.class public dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-    iload_1
-
-    lookupswitch
-            -1 : Label0
-            10 : Label1
-            15 : Label1
-            default: Label3
-
-    Label0:
-    iconst_2
-    ireturn
-
-    Label1:
-    iload_w 1
-;
-    ireturn
-
-    Label3:
-    iconst_m1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_5.java b/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_5.java
deleted file mode 100644
index 9fbeaa4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_5.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lookupswitch.jm;
-
-public class T_lookupswitch_5 {
-
-    public int run(int i) {
-        switch (i) {
-        case -1:
-            return 2;
-        case 10:
-        case 15:
-            return 20;
-        default:
-            return -1;
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_6.cfh b/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_6.cfh
deleted file mode 100644
index 6ea0620..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_6.cfh
+++ /dev/null
@@ -1,200 +0,0 @@
-//@class:dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_6
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0c 00 07 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 6, h: 0005: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 62, len 24, h: 0006: utf8{"T_lookupswitch_6.java"}
-    // .  .  .  T  _  l  o  o  k  u  p  s  w  i  t  c  h  _  6  .  j  a  v  a  
-       01 00 15 54 5f 6c 6f 6f 6b 75 70 73 77 69 74 63 68 5f 36 2e 6a 61 76 61 
-    // parsed:, offset 86, len 5, h: 0007: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 0a 
-    // parsed:, offset 91, len 3, h: 0008: type{dxc.junit.opcodes.lookupswitch.jm.T_lookupswitch_6}
-    // .  .  .  
-       07 00 0b 
-    // parsed:, offset 94, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 101, len 6, h: 000a: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 107, len 53, h: 000b: utf8{"dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_6"}
-    // .  .  2  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  l  o  o  k  u  p  s  w  i  t  c  h  /  j  m  /  T  _  l  o  o  k  u  p  s  w  i  t  c  h  _  6  
-       01 00 32 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 6c 6f 6f 6b 75 70 73 77 69 74 63 68 2f 6a 6d 2f 54 5f 6c 6f 6f 6b 75 70 73 77 69 74 63 68 5f 36 
-    // parsed:, offset 160, len 3, h: 000c: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-    // parsed:, offset 163, len 7, h: 000d: utf8{"(I)I"}
-    // .  .  .  (  I  )  I  
-       01 00 04 28 49 29 49 
-// parsed:, offset 170, len 0, h: end constant_pool
-// parsed:, offset 170, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 172, len 2, h: this_class: type{dxc.junit.opcodes.lookupswitch.jm.T_lookupswitch_6}
-// .  .  
-   00 08 
-// parsed:, offset 174, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0c 
-// parsed:, offset 176, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 178, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 180, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 182, len:110,desc: ()V
-// parsed:, offset 182, len 0, h:  methods[0]: 
-    // parsed:, offset 182, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 184, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 186, len 2, h: descriptor: ()V
-    // .  .  
-       00 0a 
-    // parsed:, offset 188, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 190, len 0, h:  attributes[0]: 
-        // parsed:, offset 190, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 192, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 196, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 198, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 200, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 209, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 211, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 213, len 0, h: end attributes[0] 
-// parsed:, offset 213, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 213, len:79,desc: (I)I
-// parsed:, offset 213, len 0, h:  methods[1]: 
-    // parsed:, offset 213, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 215, len 2, h: name: run
-    // .  .  
-       00 05 
-    // parsed:, offset 217, len 2, h: descriptor: (I)I
-    // .  .  
-       00 0d 
-    // parsed:, offset 219, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 221, len 0, h:  attributes[0]: 
-        // parsed:, offset 221, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 223, len 4, h: length: 00000037
-        // .  .  .  7  
-           00 00 00 37 
-        // parsed:, offset 227, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 229, len 2, h: max_locals: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 231, len 4, h: code_length: 0000002b
-        // .  .  .  +  
-           00 00 00 2b 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 35, h: 0001: lookupswitch   -00000001: 0024   +0000000a: 0026   +0000000f: 0026   default: 0029
-        // .  .  .  .  .  .  (  .  .  .  .  .  .  .  .  .  .  .  #  .  .  .  .  .  .  .  %  .  .  .  .  .  .  .  %  
-//@mod           ab 00 00 00 00 00 28 00 00 00 03 ff ff ff ff 00 00 00 23 00 00 00 0a 00 00 00 25 00 00 00 0f 00 00 00 25 
-           ab 00 00 00 00 00 28 ff ff ff ff ff ff ff ff 00 00 00 23 00 00 00 0a 00 00 00 25 00 00 00 0f 00 00 00 25 
-        // parsed:, offset 36, len 1, h: 0024: iconst_2 // #+02
-        // .  
-           05 
-        // parsed:, offset 37, len 1, h: 0025: ireturn
-        // .  
-           ac 
-        // parsed:, offset 38, len 2, h: 0026: bipush #+14
-        // .  .  
-           10 14 
-        // parsed:, offset 40, len 1, h: 0028: ireturn
-        // .  
-           ac 
-        // parsed:, offset 41, len 1, h: 0029: iconst_m1 // #-01
-        // .  
-           02 
-        // parsed:, offset 42, len 1, h: 002a: ireturn
-        // .  
-           ac 
-        // parsed:, offset 278, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 280, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 282, len 0, h: end attributes[0] 
-// parsed:, offset 282, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (I)I
-// parsed:, offset 282, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 284, len 0, h:  attributes[0]: 
-    // parsed:, offset 284, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 286, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 290, len 2, h: source: utf8{"T_lookupswitch_6.java"}
-    // .  .  
-       00 06 
-// parsed:, offset 292, len 0, h: end attributes[0] 
-// parsed:, offset 292, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_6.j b/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_6.j
deleted file mode 100644
index dde35ca..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_6.j
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lookupswitch_6.java
-.class public dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-    iload_1
-
-    lookupswitch
-            -1 : Label0
-            10 : Label1
-            15 : Label1
-            default: Label3
-
-    Label0:
-    iconst_2
-    ireturn
-
-    Label1:
-    bipush 20
-    ireturn
-
-    Label3:
-    iconst_m1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_6.java b/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_6.java
deleted file mode 100644
index 5fa0f3d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_6.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lookupswitch.jm;
-
-public class T_lookupswitch_6 {
-
-    public int run(int i) {
-        switch (i) {
-        case -1:
-            return 2;
-        case 10:
-        case 15:
-            return 20;
-        default:
-            return -1;
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_7.cfh b/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_7.cfh
deleted file mode 100644
index 278dc9b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_7.cfh
+++ /dev/null
@@ -1,200 +0,0 @@
-//@class:dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_7
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0b 00 07 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 6, h: 0005: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 62, len 3, h: 0006: type{dxc.junit.opcodes.lookupswitch.jm.T_lookupswitch_7}
-    // .  .  .  
-       07 00 0c 
-    // parsed:, offset 65, len 5, h: 0007: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 0a 
-    // parsed:, offset 70, len 7, h: 0008: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 77, len 24, h: 0009: utf8{"T_lookupswitch_7.java"}
-    // .  .  .  T  _  l  o  o  k  u  p  s  w  i  t  c  h  _  7  .  j  a  v  a  
-       01 00 15 54 5f 6c 6f 6f 6b 75 70 73 77 69 74 63 68 5f 37 2e 6a 61 76 61 
-    // parsed:, offset 101, len 6, h: 000a: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 107, len 3, h: 000b: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-    // parsed:, offset 110, len 53, h: 000c: utf8{"dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_7"}
-    // .  .  2  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  l  o  o  k  u  p  s  w  i  t  c  h  /  j  m  /  T  _  l  o  o  k  u  p  s  w  i  t  c  h  _  7  
-       01 00 32 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 6c 6f 6f 6b 75 70 73 77 69 74 63 68 2f 6a 6d 2f 54 5f 6c 6f 6f 6b 75 70 73 77 69 74 63 68 5f 37 
-    // parsed:, offset 163, len 7, h: 000d: utf8{"(I)I"}
-    // .  .  .  (  I  )  I  
-       01 00 04 28 49 29 49 
-// parsed:, offset 170, len 0, h: end constant_pool
-// parsed:, offset 170, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 172, len 2, h: this_class: type{dxc.junit.opcodes.lookupswitch.jm.T_lookupswitch_7}
-// .  .  
-   00 06 
-// parsed:, offset 174, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0b 
-// parsed:, offset 176, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 178, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 180, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 182, len:110,desc: ()V
-// parsed:, offset 182, len 0, h:  methods[0]: 
-    // parsed:, offset 182, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 184, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 186, len 2, h: descriptor: ()V
-    // .  .  
-       00 0a 
-    // parsed:, offset 188, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 190, len 0, h:  attributes[0]: 
-        // parsed:, offset 190, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 192, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 196, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 198, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 200, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 209, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 211, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 213, len 0, h: end attributes[0] 
-// parsed:, offset 213, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 213, len:79,desc: (I)I
-// parsed:, offset 213, len 0, h:  methods[1]: 
-    // parsed:, offset 213, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 215, len 2, h: name: run
-    // .  .  
-       00 05 
-    // parsed:, offset 217, len 2, h: descriptor: (I)I
-    // .  .  
-       00 0d 
-    // parsed:, offset 219, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 221, len 0, h:  attributes[0]: 
-        // parsed:, offset 221, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 223, len 4, h: length: 00000037
-        // .  .  .  7  
-           00 00 00 37 
-        // parsed:, offset 227, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 229, len 2, h: max_locals: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 231, len 4, h: code_length: 0000002b
-        // .  .  .  +  
-           00 00 00 2b 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 35, h: 0001: lookupswitch   -00000001: 0024   +0000000a: 0026   +0000000f: 0026   default: 0029
-        // .  .  .  .  .  .  (  .  .  .  .  .  .  .  .  .  .  .  #  .  .  .  .  .  .  .  %  .  .  .  .  .  .  .  %  
-//@mod           ab 00 00 00 00 00 28 00 00 00 03 ff ff ff ff 00 00 00 23 00 00 00 0a 00 00 00 25 00 00 00 0f 00 00 00 25 
-           ab 01 00 00 00 00 28 00 00 00 03 ff ff ff ff 00 00 00 23 00 00 00 0a 00 00 00 25 00 00 00 0f 00 00 00 25 
-        // parsed:, offset 36, len 1, h: 0024: iconst_2 // #+02
-        // .  
-           05 
-        // parsed:, offset 37, len 1, h: 0025: ireturn
-        // .  
-           ac 
-        // parsed:, offset 38, len 2, h: 0026: bipush #+14
-        // .  .  
-           10 14 
-        // parsed:, offset 40, len 1, h: 0028: ireturn
-        // .  
-           ac 
-        // parsed:, offset 41, len 1, h: 0029: iconst_m1 // #-01
-        // .  
-           02 
-        // parsed:, offset 42, len 1, h: 002a: ireturn
-        // .  
-           ac 
-        // parsed:, offset 278, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 280, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 282, len 0, h: end attributes[0] 
-// parsed:, offset 282, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (I)I
-// parsed:, offset 282, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 284, len 0, h:  attributes[0]: 
-    // parsed:, offset 284, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 286, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 290, len 2, h: source: utf8{"T_lookupswitch_7.java"}
-    // .  .  
-       00 09 
-// parsed:, offset 292, len 0, h: end attributes[0] 
-// parsed:, offset 292, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_7.j b/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_7.j
deleted file mode 100644
index 5dfd4df..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_7.j
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lookupswitch_7.java
-.class public dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-    iload_1
-
-    lookupswitch
-            -1 : Label0
-            10 : Label1
-            15 : Label1
-            default: Label3
-
-    Label0:
-    iconst_2
-    ireturn
-
-    Label1:
-    bipush 20
-    ireturn
-
-    Label3:
-    iconst_m1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_7.java b/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_7.java
deleted file mode 100644
index 105db5e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_7.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lookupswitch.jm;
-
-public class T_lookupswitch_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/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_8.cfh b/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_8.cfh
deleted file mode 100644
index b03b95c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_8.cfh
+++ /dev/null
@@ -1,200 +0,0 @@
-//@class:dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_8
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0a 00 07 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 3, h: 0005: type{dxc.junit.opcodes.lookupswitch.jm.T_lookupswitch_8}
-    // .  .  .  
-       07 00 0b 
-    // parsed:, offset 59, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 65, len 5, h: 0007: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 09 
-    // parsed:, offset 70, len 7, h: 0008: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 77, len 6, h: 0009: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 83, len 3, h: 000a: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-    // parsed:, offset 86, len 53, h: 000b: utf8{"dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_8"}
-    // .  .  2  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  l  o  o  k  u  p  s  w  i  t  c  h  /  j  m  /  T  _  l  o  o  k  u  p  s  w  i  t  c  h  _  8  
-       01 00 32 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 6c 6f 6f 6b 75 70 73 77 69 74 63 68 2f 6a 6d 2f 54 5f 6c 6f 6f 6b 75 70 73 77 69 74 63 68 5f 38 
-    // parsed:, offset 139, len 24, h: 000c: utf8{"T_lookupswitch_8.java"}
-    // .  .  .  T  _  l  o  o  k  u  p  s  w  i  t  c  h  _  8  .  j  a  v  a  
-       01 00 15 54 5f 6c 6f 6f 6b 75 70 73 77 69 74 63 68 5f 38 2e 6a 61 76 61 
-    // parsed:, offset 163, len 7, h: 000d: utf8{"(I)I"}
-    // .  .  .  (  I  )  I  
-       01 00 04 28 49 29 49 
-// parsed:, offset 170, len 0, h: end constant_pool
-// parsed:, offset 170, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 172, len 2, h: this_class: type{dxc.junit.opcodes.lookupswitch.jm.T_lookupswitch_8}
-// .  .  
-   00 05 
-// parsed:, offset 174, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0a 
-// parsed:, offset 176, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 178, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 180, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 182, len:110,desc: ()V
-// parsed:, offset 182, len 0, h:  methods[0]: 
-    // parsed:, offset 182, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 184, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 186, len 2, h: descriptor: ()V
-    // .  .  
-       00 09 
-    // parsed:, offset 188, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 190, len 0, h:  attributes[0]: 
-        // parsed:, offset 190, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 192, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 196, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 198, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 200, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 209, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 211, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 213, len 0, h: end attributes[0] 
-// parsed:, offset 213, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 213, len:79,desc: (I)I
-// parsed:, offset 213, len 0, h:  methods[1]: 
-    // parsed:, offset 213, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 215, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 217, len 2, h: descriptor: (I)I
-    // .  .  
-       00 0d 
-    // parsed:, offset 219, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 221, len 0, h:  attributes[0]: 
-        // parsed:, offset 221, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 223, len 4, h: length: 00000037
-        // .  .  .  7  
-           00 00 00 37 
-        // parsed:, offset 227, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 229, len 2, h: max_locals: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 231, len 4, h: code_length: 0000002b
-        // .  .  .  +  
-           00 00 00 2b 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 35, h: 0001: lookupswitch   -00000001: 0024   +0000000a: 0026   +0000000f: 0026   default: 0029
-        // .  .  .  .  .  .  (  .  .  .  .  .  .  .  .  .  .  .  #  .  .  .  .  .  .  .  %  .  .  .  .  .  .  .  %  
-//@mod           ab 00 00 00 00 00 28 00 00 00 03 ff ff ff ff 00 00 00 23 00 00 00 0a 00 00 00 25 00 00 00 0f 00 00 00 25 
-           ab 00 00 00 00 00 28 00 00 00 03 ff ff ff ff 00 00 00 23 00 00 00 0f 00 00 00 25 00 00 00 0a 00 00 00 25 
-        // parsed:, offset 36, len 1, h: 0024: iconst_2 // #+02
-        // .  
-           05 
-        // parsed:, offset 37, len 1, h: 0025: ireturn
-        // .  
-           ac 
-        // parsed:, offset 38, len 2, h: 0026: bipush #+14
-        // .  .  
-           10 14 
-        // parsed:, offset 40, len 1, h: 0028: ireturn
-        // .  
-           ac 
-        // parsed:, offset 41, len 1, h: 0029: iconst_m1 // #-01
-        // .  
-           02 
-        // parsed:, offset 42, len 1, h: 002a: ireturn
-        // .  
-           ac 
-        // parsed:, offset 278, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 280, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 282, len 0, h: end attributes[0] 
-// parsed:, offset 282, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (I)I
-// parsed:, offset 282, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 284, len 0, h:  attributes[0]: 
-    // parsed:, offset 284, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 286, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 290, len 2, h: source: utf8{"T_lookupswitch_8.java"}
-    // .  .  
-       00 0c 
-// parsed:, offset 292, len 0, h: end attributes[0] 
-// parsed:, offset 292, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_8.j b/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_8.j
deleted file mode 100644
index 9213d50..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_8.j
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lookupswitch_8.java
-.class public dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_8
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-    iload_1
-
-    lookupswitch
-            -1 : Label0
-            10 : Label1
-            15 : Label1
-            default: Label3
-
-    Label0:
-    iconst_2
-    ireturn
-
-    Label1:
-    bipush 20
-    ireturn
-
-    Label3:
-    iconst_m1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_8.java b/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_8.java
deleted file mode 100644
index 13a1255..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_8.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lookupswitch.jm;
-
-public class T_lookupswitch_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/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_9.j b/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_9.j
deleted file mode 100644
index 9359025..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_9.j
+++ /dev/null
@@ -1,53 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lookupswitch_9.java
-.class public dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_9
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-
-    aload_0
-    lookupswitch
-            -1 : Label0
-            10 : Label1
-            15 : Label1
-            default: Label3
-
-    Label0:
-.line 8
-    iconst_2
-    ireturn
-
-    Label1:
-.line 11
-    bipush 20
-    ireturn
-
-    Label3:
-.line 13
-    iconst_m1
-
-    Label5:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_9.java b/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_9.java
deleted file mode 100644
index e6dca83..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lookupswitch/jm/T_lookupswitch_9.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lookupswitch.jm;
-
-public class T_lookupswitch_9 {
-    
-    public int run(int i) {
-        switch (i) {
-        case -1:
-            return 2;
-        case 10:
-        case 15:
-            return 20;
-        default:
-            return -1;
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lor/Test_lor.java b/tools/dx-tests/src/dxc/junit/opcodes/lor/Test_lor.java
deleted file mode 100644
index 6c39754..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lor/Test_lor.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lor;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.lor.jm.T_lor_1;
-
-public class Test_lor extends DxTestCase {
-
-    /**
-     * @title Arguments = 123456789121l, 2l
-     */
-    public void testN1() {
-        T_lor_1 t = new T_lor_1();
-        assertEquals(123456789123l, t.run(123456789121l, 2l));
-    }
-
-    /**
-     * @title Arguments = 0xffffffffffffff8l, 0xffffffffffffff1l
-     */
-    public void testN2() {
-        T_lor_1 t = new T_lor_1();
-        assertEquals(0xffffffffffffff9l, t.run(0xffffffffffffff8l,
-                0xffffffffffffff1l));
-    }
-
-    /**
-     * @title  Arguments = 0xabcdefabcdef, -1
-     */
-    public void testN3() {
-        T_lor_1 t = new T_lor_1();
-        assertEquals(-1l, t.run(0xabcdefabcdefl, -1l));
-    }
-
-    /**
-     * @title  Arguments = 0, -1
-     */
-    public void testB1() {
-        T_lor_1 t = new T_lor_1();
-        assertEquals(-1l, t.run(0l, -1l));
-    }
-
-    /**
-     * @title  Arguments = Long.MAX_VALUE, Long.MIN_VALUE
-     */
-    public void testB2() {
-        T_lor_1 t = new T_lor_1();
-        assertEquals(-1l, t.run(Long.MAX_VALUE, Long.MIN_VALUE));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.lor.jm.T_lor_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double & long
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.lor.jm.T_lor_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int & long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.lor.jm.T_lor_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - float & long
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.lor.jm.T_lor_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference & long
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.lor.jm.T_lor_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_1.j b/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_1.j
deleted file mode 100644
index b2bf3b6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_1.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lor_1.java
-.class public dxc/junit/opcodes/lor/jm/T_lor_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(JJ)J
-    .limit stack 4
-    .limit locals 5
-
-    lload_1
-    lload_3
-    lor
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_1.java b/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_1.java
deleted file mode 100644
index ca5c203..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lor.jm;
-
-public class T_lor_1 {
-
-    public long run(long a, long b) {
-        return a | b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_2.j b/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_2.j
deleted file mode 100644
index f706ad6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_2.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lor_2.java
-.class public dxc/junit/opcodes/lor/jm/T_lor_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(JJ)J
-    .limit stack 4
-    .limit locals 5
-
-;    lload_1
-    lload_3
-    lor
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_2.java b/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_2.java
deleted file mode 100644
index 9124f10..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lor.jm;
-
-public class T_lor_2 {
-
-    public long run(long a, long b) {
-        return a | b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_3.j b/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_3.j
deleted file mode 100644
index da974e4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_3.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lor_3.java
-.class public dxc/junit/opcodes/lor/jm/T_lor_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(DJ)J
-    .limit stack 4
-    .limit locals 5
-
-    dload_1
-    lload_3
-    lor
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_3.java b/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_3.java
deleted file mode 100644
index 99cf176..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lor.jm;
-
-public class T_lor_3 {
-
-    public long run(double a, long b) {
-        return (long)a | b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_4.j b/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_4.j
deleted file mode 100644
index b60b092..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_4.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lor_4.java
-.class public dxc/junit/opcodes/lor/jm/T_lor_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(IJ)J
-    .limit stack 4
-    .limit locals 4
-
-    iload_1
-    lload_2
-    lor
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_4.java b/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_4.java
deleted file mode 100644
index e37f8f6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lor.jm;
-
-public class T_lor_4 {
-
-    public long run(int a, long b) {
-        return a | b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_5.j b/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_5.j
deleted file mode 100644
index 62376b9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_5.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lor_5.java
-.class public dxc/junit/opcodes/lor/jm/T_lor_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(FJ)J
-    .limit stack 4
-    .limit locals 4
-
-    fload_1
-    lload_2
-    lor
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_5.java b/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_5.java
deleted file mode 100644
index db49535..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lor.jm;
-
-public class T_lor_5 {
-
-    public long run(float a, long b) {
-        return (long)a | b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_6.j b/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_6.j
deleted file mode 100644
index c03fcc6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_6.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lor_6.java
-.class public dxc/junit/opcodes/lor/jm/T_lor_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(JJ)J
-    .limit stack 4
-    .limit locals 5
-
-    aload_0
-    lload_3
-    lor
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_6.java b/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_6.java
deleted file mode 100644
index 8918dd6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lor/jm/T_lor_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lor.jm;
-
-public class T_lor_6 {
-
-    public long run(long a, long b) {
-        return a | b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lrem/Test_lrem.java b/tools/dx-tests/src/dxc/junit/opcodes/lrem/Test_lrem.java
deleted file mode 100644
index 1c9346d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lrem/Test_lrem.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lrem;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.lrem.jm.T_lrem_1;
-
-public class Test_lrem extends DxTestCase {
-
-    /**
-     * @title Arguments = 10000000000l, 4000000000l
-     */
-    public void testN1() {
-        T_lrem_1 t = new T_lrem_1();
-        assertEquals(2000000000l, t.run(10000000000l, 4000000000l));
-    }
-
-    /**
-     * @title Arguments = 1234567890123l, 123456789l
-     */
-    public void testN2() {
-        T_lrem_1 t = new T_lrem_1();
-        assertEquals(123l, t.run(1234567890123l, 123456789l));
-    }
-
-    /**
-     * @title  Dividend = 0
-     */
-    public void testN3() {
-        T_lrem_1 t = new T_lrem_1();
-        assertEquals(0l, t.run(0l, 1234567890123l));
-    }
-
-    /**
-     * @title  Dividend is negative
-     */
-    public void testN4() {
-        T_lrem_1 t = new T_lrem_1();
-        assertEquals(-2000000000l, t.run(-10000000000l, 4000000000l));
-    }
-
-    /**
-     * @title  Divisor is negative
-     */
-    public void testN5() {
-        T_lrem_1 t = new T_lrem_1();
-        assertEquals(2000000000l, t.run(10000000000l, -4000000000l));
-    }
-
-    /**
-     * @title  Both Dividend and divisor are negative
-     */
-    public void testN6() {
-        T_lrem_1 t = new T_lrem_1();
-        assertEquals(-2000000000l, t.run(-10000000000l, -4000000000l));
-    }
-
-    /**
-     * @title Arguments = Long.MIN_VALUE, -1l
-     */
-    public void testB1() {
-        T_lrem_1 t = new T_lrem_1();
-        assertEquals(0l, t.run(Long.MIN_VALUE, -1l));
-    }
-    /**
-     * @title Arguments = Long.MIN_VALUE, 1l
-     */
-    public void testB2() {
-        T_lrem_1 t = new T_lrem_1();
-        assertEquals(0l, t.run(Long.MIN_VALUE, 1l));
-    }
-    /**
-     * @title Arguments = Long.MAX_VALUE, 1l
-     */
-    public void testB3() {
-        T_lrem_1 t = new T_lrem_1();
-        assertEquals(0l, t.run(Long.MAX_VALUE, 1l));
-    }
-    /**
-     * @title Arguments = Long.MIN_VALUE, Long.MAX_VALUE
-     */
-    public void testB4() {
-        T_lrem_1 t = new T_lrem_1();
-        assertEquals(-1l, t.run(Long.MIN_VALUE, Long.MAX_VALUE));
-    }
-    /**
-     * @title Arguments = 1l, Long.MAX_VALUE
-     */
-    public void testB5() {
-        T_lrem_1 t = new T_lrem_1();
-        assertEquals(1l, t.run(1l, Long.MAX_VALUE));
-    }
-    /**
-     * @title Arguments = 1l, Long.MIN_VALUE
-     */
-    public void testB6() {
-        T_lrem_1 t = new T_lrem_1();
-        assertEquals(1l, t.run(1l, Long.MIN_VALUE));
-    }
-
-    /**
-     * @title  Divisor is 0
-     */
-    public void testE1() {
-        T_lrem_1 t = new T_lrem_1();
-        try {
-            t.run(1234567890123l, 0l);
-            fail("expected ArithmeticException");
-        } catch (ArithmeticException ae) {
-            // expected
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.lrem.jm.T_lrem_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long / double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.lrem.jm.T_lrem_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int / long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.lrem.jm.T_lrem_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long / float
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.lrem.jm.T_lrem_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference / float
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.lrem.jm.T_lrem_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_1.j b/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_1.j
deleted file mode 100644
index c675add..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_1.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lrem_1.java
-.class public dxc/junit/opcodes/lrem/jm/T_lrem_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(JJ)J
-    .limit stack 4
-    .limit locals 5
-
-    lload_1
-    lload_3
-    lrem
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_1.java b/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_1.java
deleted file mode 100644
index d4a6114..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lrem.jm;
-
-public class T_lrem_1 {
-
-    public long run(long a, long b) {
-        return a % b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_2.j b/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_2.j
deleted file mode 100644
index 8612604..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_2.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lrem_2.java
-.class public dxc/junit/opcodes/lrem/jm/T_lrem_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(JJ)J
-    .limit stack 4
-    .limit locals 5
-
-;    lload_1
-    lload_3
-    lrem
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_2.java b/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_2.java
deleted file mode 100644
index 4f9a924..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lrem.jm;
-
-public class T_lrem_2 {
-
-    public long run(long a, long b) {
-        return a % b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_3.j b/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_3.j
deleted file mode 100644
index 6b51605..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_3.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lrem_3.java
-.class public dxc/junit/opcodes/lrem/jm/T_lrem_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(JD)J
-    .limit stack 4
-    .limit locals 5
-
-    lload_1
-    dload_3
-    lrem
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_3.java b/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_3.java
deleted file mode 100644
index 5b6d8df..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lrem.jm;
-
-public class T_lrem_3 {
-
-    public long run(long a, double b) {
-        return (long) (a % b);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_4.j b/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_4.j
deleted file mode 100644
index 3fcffc5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_4.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lrem_4.java
-.class public dxc/junit/opcodes/lrem/jm/T_lrem_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(IJ)J
-    .limit stack 4
-    .limit locals 4
-
-    iload_1
-    lload_2
-    lrem
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_4.java b/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_4.java
deleted file mode 100644
index 6e5990d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lrem.jm;
-
-public class T_lrem_4 {
-
-    public long run(int a, long b) {
-        return a % b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_5.j b/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_5.j
deleted file mode 100644
index 10841d5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_5.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lrem_5.java
-.class public dxc/junit/opcodes/lrem/jm/T_lrem_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(JF)J
-    .limit stack 3
-    .limit locals 4
-
-    lload_1
-    fload_3
-    lrem
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_5.java b/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_5.java
deleted file mode 100644
index e3267dd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lrem.jm;
-
-public class T_lrem_5 {
-
-    public long run(long a, float b) {
-        return (long) (a % b);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_6.j b/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_6.j
deleted file mode 100644
index 6b329d6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_6.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lrem_6.java
-.class public dxc/junit/opcodes/lrem/jm/T_lrem_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(JJ)J
-    .limit stack 4
-    .limit locals 5
-
-    aload_0
-    lload_3
-    lrem
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_6.java b/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_6.java
deleted file mode 100644
index b9d3b17..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lrem/jm/T_lrem_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lrem.jm;
-
-public class T_lrem_6 {
-
-    public long run(long a, long b) {
-        return a % b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/Test_lreturn.java b/tools/dx-tests/src/dxc/junit/opcodes/lreturn/Test_lreturn.java
deleted file mode 100644
index 805c4a7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/Test_lreturn.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lreturn;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.lreturn.jm.T_lreturn_1;
-import dxc.junit.opcodes.lreturn.jm.T_lreturn_6;
-import dxc.junit.opcodes.lreturn.jm.T_lreturn_7;
-import dxc.junit.opcodes.lreturn.jm.T_lreturn_8;
-import dxc.junit.opcodes.lreturn.jm.T_lreturn_9;
-
-public class Test_lreturn extends DxTestCase {
-
-    /**
-     * @title  simple
-     */
-    public void testN1() {
-        T_lreturn_1 t = new T_lreturn_1();
-        assertEquals(12345612345l, t.run());
-    }
-
-    /**
-     * @title  check that frames are discarded and reinstananted correctly
-     */
-    public void testN2() {
-        T_lreturn_6 t = new T_lreturn_6();
-        assertEquals(0l, t.run());
-    }
-
-    /**
-     * @title  check that monitor is released by lreturn
-     */
-    public void testN3() {
-        assertTrue(T_lreturn_7.execute());
-    }
-
-
-    /**
-     * @title  Method is synchronized but thread is not monitor owner
-     */
-    public void testE1() {
-        T_lreturn_8 t = new T_lreturn_8();
-        try {
-            assertTrue(t.run());
-            fail("expected IllegalMonitorStateException");
-        } catch (IllegalMonitorStateException imse) {
-            // expected
-        }
-    }
-
-    /**
-     * @title  Lock structural rule 1 is violated
-     */
-// Dalvik currently does not support structured locks, so we remove this test.    
-//    public void testE2() {
-//        T_lreturn_9 t = new T_lreturn_9();
-//        try {
-//            assertEquals(1d, t.run());
-//            // the JVM spec says that it is optional to implement the structural
-//            // lock rules, see JVM spec 8.13 and monitorenter/exit opcodes.
-//            System.out.print("dvmvfe:");
-//            //fail("expected IllegalMonitorStateException");
-//        } catch (IllegalMonitorStateException imse) {
-//            // expected
-//        }
-//    }
-
-    /**
-     * @constraint 4.8.2.14
-     * @title method's return type - void
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.lreturn.jm.T_lreturn_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.14
-     * @title method's return type - float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.lreturn.jm.T_lreturn_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.lreturn.jm.T_lreturn_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - float
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.lreturn.jm.T_lreturn_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.lreturn.jm.T_lreturn_10");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - reference
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.lreturn.jm.T_lreturn_11");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_1.j b/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_1.j
deleted file mode 100644
index 1049bf3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_1.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lreturn_1.java
-.class public dxc/junit/opcodes/lreturn/jm/T_lreturn_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()J
-    .limit stack 2
-    
-    ldc2_w 12345612345
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_1.java b/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_1.java
deleted file mode 100644
index 5fb565d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lreturn.jm;
-
-public class T_lreturn_1 {
-
-    public long run() {
-        return 12345612345l;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_10.j b/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_10.j
deleted file mode 100644
index d855369..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_10.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lreturn_10.java
-.class public dxc/junit/opcodes/lreturn/jm/T_lreturn_10
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method private static test()J
-    .limit stack 2
-    .limit locals 0
-    
-    lconst_1
-    lreturn
-    
-.end method
-
-
-.method public run()J
-    .limit stack 0
-    .limit locals 1
-
-    invokestatic dxc/junit/opcodes/lreturn/jm/T_lreturn_10/test()J
-    lreturn
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_10.java b/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_10.java
deleted file mode 100644
index 5949439..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_10.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lreturn.jm;
-
-public class T_lreturn_10 {
-    
-    private static long test() {
-        return 1l;
-    }
-    
-    public long run() {
-        return test();
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_11.j b/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_11.j
deleted file mode 100644
index 68dfcd4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_11.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lreturn_11.java
-.class public dxc/junit/opcodes/lreturn/jm/T_lreturn_11
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()J
-    .limit stack 2
-    .limit locals 1
-
-    aload_0
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_11.java b/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_11.java
deleted file mode 100644
index 0b1c976..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lreturn.jm;
-
-public class T_lreturn_11 {
-    
-    public long run() {
-        return 0l;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_2.j b/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_2.j
deleted file mode 100644
index 117d3fc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lreturn_2.java
-.class public dxc/junit/opcodes/lreturn/jm/T_lreturn_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 1
-
-    lconst_0
-    lreturn
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_2.java b/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_2.java
deleted file mode 100644
index 778ee8f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_2.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lreturn.jm;
-
-public class T_lreturn_2 {
-
-    public void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_3.j b/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_3.j
deleted file mode 100644
index b9a758c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_3.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lreturn_3.java
-.class public dxc/junit/opcodes/lreturn/jm/T_lreturn_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    return
-.end method
-
-
-.method public run()F
-    .limit stack 2
-    .limit locals 1
-
-    lconst_0
-    lreturn
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_3.java b/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_3.java
deleted file mode 100644
index 1708e8a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_3.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lreturn.jm;
-
-public class T_lreturn_3 {
-
-   
-    public long run() {
-        return 0l;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_4.j b/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_4.j
deleted file mode 100644
index 1776541..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_4.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lreturn_4.java
-.class public dxc/junit/opcodes/lreturn/jm/T_lreturn_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()J
-    .limit stack 2
-    .limit locals 1
-
-    ;lconst_0
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_4.java b/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_4.java
deleted file mode 100644
index c7ad19c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lreturn.jm;
-
-public class T_lreturn_4 {
-
-    public long run() {
-        return 0l;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_5.j b/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_5.j
deleted file mode 100644
index 16c1340..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_5.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lreturn_5.java
-.class public dxc/junit/opcodes/lreturn/jm/T_lreturn_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()J
-    .limit stack 2
-    .limit locals 1
-
-    fconst_0
-    lreturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_5.java b/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_5.java
deleted file mode 100644
index c1cb526..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lreturn.jm;
-
-public class T_lreturn_5 {
-
-    public long run() {
-        return 0l;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_6.j b/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_6.j
deleted file mode 100644
index 6c7fed7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_6.j
+++ /dev/null
@@ -1,93 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lreturn_6.java
-.class public dxc/junit/opcodes/lreturn/jm/T_lreturn_6
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()J
-    .limit locals 12
-    .limit stack 6
-    
-    lconst_1
-    lstore_1
-    ldc2_w 22222222222
-    lstore_3
-    ldc2_w 33333333333
-    lstore 5
-    
-    ldc2_w 44444444444
-    
-    invokestatic dxc/junit/opcodes/lreturn/jm/T_lreturn_6/test()J
-    
-    ldc2_w 4444444444444
-    lcmp
-    ifne Label1
-    
-    ldc2_w 44444444444
-    lcmp
-    ifne Label0
-    
-    lload_1
-    lconst_1
-    lcmp
-    ifne Label0
-    
-    lload_3
-    ldc2_w 22222222222
-    lcmp
-    ifne Label0
-    
-    lload 5
-    ldc2_w 33333333333
-    lcmp
-    ifne Label0    
-    
-    ldc2_w 12345612345
-    lreturn
-
-Label1:
-    pop2
-Label0:
-    lconst_0
-    lreturn
-
-.end method
-
-
-.method private static test()J
-    .limit locals 8
-    .limit stack 4
-    
-    ldc2_w 11111111111
-    lstore_1
-    ldc2_w 22222222222
-    lstore_3
-    ldc2_w 33333333333
-    lstore 5
-    
-    ldc2_w 55555555555
-    
-    ldc2_w 44444444444
-    lreturn
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_6.java b/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_6.java
deleted file mode 100644
index 2461760..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_6.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lreturn.jm;
-
-public class T_lreturn_6 {
-
-    public long run() {
-        return 12345612345l;
-    }
-    
-    private static long test() {
-        long a = 11111111111l;
-        long b = 22222222222l;
-        long c = 33333333333l;
-        return 44444444444l;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_7.j b/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_7.j
deleted file mode 100644
index 70e857c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_7.j
+++ /dev/null
@@ -1,164 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lreturn_7.java
-.class public dxc/junit/opcodes/lreturn/jm/T_lreturn_7
-.super java/lang/Object
-.implements java/lang/Runnable
-
-.field  value J
-.field  failed Z
-
-.method public <init>()V
-    .limit stack 3
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    aload_0
-    lconst_0
-    putfield dxc.junit.opcodes.lreturn.jm.T_lreturn_7.value J
-
-    aload_0
-    iconst_0
-    putfield dxc.junit.opcodes.lreturn.jm.T_lreturn_7.failed Z
-
-    return
-
-.end method
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 2
-   
-    iconst_0
-    istore_1
-
-Label4:
-    iload_1
-    sipush 1000
-    if_icmpge Label3
-
-    aload_0
-    invokespecial dxc/junit/opcodes/lreturn/jm/T_lreturn_7/test()J
-    pop2
-
-    iinc 1 1
-
-    goto Label4
-
-
-Label3:
-    return
-
-.end method
-
-
-
-.method private synchronized test()J
-    .limit stack 5
-    .limit locals 3
-    
-.line 16
-    aload_0
-    dup
-    getfield dxc.junit.opcodes.lreturn.jm.T_lreturn_7.value J
-    dup2
-    lstore_1
-
-    lconst_1
-    ladd
-    putfield dxc.junit.opcodes.lreturn.jm.T_lreturn_7.value J
-
-    lload_1
-    lconst_1
-    ladd
-    lstore_1
-
-    invokestatic java/lang/Thread/yield()V
-
-    lload_1
-    aload_0
-    getfield dxc.junit.opcodes.lreturn.jm.T_lreturn_7.value J
-    lcmp
-    ifeq Label0
-
-    aload_0
-    iconst_1
-    putfield dxc.junit.opcodes.lreturn.jm.T_lreturn_7.failed Z
-
-Label0:
-    lload_1
-    lreturn
-.end method
-
-
-.method public static execute()Z
-    .limit stack 5
-    .limit locals 4
-
-    new dxc/junit/opcodes/lreturn/jm/T_lreturn_7
-    dup
-    invokespecial dxc/junit/opcodes/lreturn/jm/T_lreturn_7/<init>()V
-    astore_0
-
-    new java/lang/Thread
-    dup
-    aload_0
-    invokespecial java/lang/Thread/<init>(Ljava/lang/Runnable;)V
-    astore_1
-
-    new java/lang/Thread
-    dup
-    aload_0
-    invokespecial java/lang/Thread/<init>(Ljava/lang/Runnable;)V
-    astore_2
-
-    aload_1
-    invokevirtual java/lang/Thread/start()V
-
-    aload_2
-    invokevirtual java/lang/Thread/start()V
-
-Label12:
-    ldc2_w 5000
-    invokestatic java/lang/Thread/sleep(J)V
-
-Label13:
-    goto Label0
-
-Label14:            ; exception handler
-    astore_3
-    goto Label3
-
-Label0:
-    aload_0
-    getfield dxc.junit.opcodes.lreturn.jm.T_lreturn_7.value J
-    ldc2_w 2000
-    lcmp
-    ifne Label3
-
-    aload_0
-    getfield dxc.junit.opcodes.lreturn.jm.T_lreturn_7.failed Z
-    ifne Label3
-
-    iconst_1
-    ireturn
-
-Label3:
-    iconst_0
-    ireturn
-
-.catch java/lang/InterruptedException from Label12 to Label13 using Label14
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_7.java b/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_7.java
deleted file mode 100644
index fc97b6e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_7.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lreturn.jm;
-
-import dxc.junit.opcodes.lreturn.jm.T_lreturn_7;
-
-public class T_lreturn_7 implements Runnable {
-    public final static int CNT = 1000;
-    long value = 0;
-    boolean failed = false;
-    
-    public void run() {
-        for(int i = 0; i < CNT; i++) {
-            test();
-        }
-    }
-    
-    private synchronized long test()  {
-        value++;
-        long c = value;
-        Thread.yield();
-        if(c != value)
-            failed = true;
-        return c;
-    }
-    
-    public static boolean execute() {
-        T_lreturn_7 test = new T_lreturn_7();
-        Thread t1 = new Thread(test);
-        Thread t2 = new Thread(test);
-        
-        t1.start();
-        t2.start();
-        
-        try
-        {
-            Thread.sleep(5000);
-        }
-        catch(InterruptedException ie) {
-            return false;
-        }
-        
-        if(test.value != CNT * 2)
-            return false;
-        return !test.failed;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_8.j b/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_8.j
deleted file mode 100644
index 6b7597c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_8.j
+++ /dev/null
@@ -1,48 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lreturn_8.java
-.class public dxc/junit/opcodes/lreturn/jm/T_lreturn_8
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method private synchronized test()J
-    .limit stack 2
-    
-    aload_0
-    monitorexit
-       lconst_0
-    lreturn
-.end method
-
-
-.method public run()Z
-    .limit stack 2
-    .limit locals 1
-
-    aload_0
-    invokespecial dxc/junit/opcodes/lreturn/jm/T_lreturn_8/test()J
-    pop2
-
-    iconst_1
-    ireturn
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_8.java b/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_8.java
deleted file mode 100644
index 1653cb1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_8.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lreturn.jm;
-
-public class T_lreturn_8 {
-    
-    private synchronized long test() {
-        return 0l;
-    }
-    
-    public boolean run() {
-        test();
-        return true;
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_9.j b/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_9.j
deleted file mode 100644
index 17dfe86..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_9.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lreturn_9.java
-.class public dxc/junit/opcodes/lreturn/jm/T_lreturn_9
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()J
-    .limit stack 2
-    .limit locals 1
-
-    aload_0
-    monitorenter
-
-    lconst_1
-    lreturn
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_9.java b/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_9.java
deleted file mode 100644
index df514b4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lreturn/jm/T_lreturn_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lreturn.jm;
-
-public class T_lreturn_9 {
-    
-    public long run() {
-        return 1l;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lshl/Test_lshl.java b/tools/dx-tests/src/dxc/junit/opcodes/lshl/Test_lshl.java
deleted file mode 100644
index df45a03..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lshl/Test_lshl.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lshl;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.lshl.jm.T_lshl_1;
-
-public class Test_lshl extends DxTestCase {
-
-    /**
-     * @title Arguments = 5000000000l, 3
-     */
-    public void testN1() {
-        T_lshl_1 t = new T_lshl_1();
-        assertEquals(40000000000l, t.run(5000000000l, 3));
-    }
-
-    /**
-     * @title Arguments = 5000000000l, 1
-     */
-    public void testN2() {
-        T_lshl_1 t = new T_lshl_1();
-        assertEquals(10000000000l, t.run(5000000000l, 1));
-    }
-
-    /**
-     * @title Arguments = -5000000000l, 1
-     */
-    public void testN3() {
-        T_lshl_1 t = new T_lshl_1();
-        assertEquals(-10000000000l, t.run(-5000000000l, 1));
-    }
-
-    /**
-     * @title  Arguments = 1, -1
-     */
-    public void testN4() {
-        T_lshl_1 t = new T_lshl_1();
-        assertEquals(0x8000000000000000l, t.run(1l, -1));
-    }
-
-    /**
-     * @title  Verify that shift distance is actually in range 0 to 64.
-     */
-    public void testN5() {
-        T_lshl_1 t = new T_lshl_1();
-        assertEquals(130l, t.run(65l, 65));
-    }
-
-    /**
-     * @title  Arguments = 0, -1
-     */
-    public void testB1() {
-        T_lshl_1 t = new T_lshl_1();
-        assertEquals(0, t.run(0, -1));
-    }
-
-    /**
-     * @title  Arguments = 1, 0
-     */
-    public void testB2() {
-        T_lshl_1 t = new T_lshl_1();
-        assertEquals(1, t.run(1, 0));
-    }
-
-    /**
-     * @title  Arguments = Long.MAX_VALUE, 1
-     */
-    public void testB3() {
-        T_lshl_1 t = new T_lshl_1();
-        assertEquals(0xfffffffe, t.run(Long.MAX_VALUE, 1));
-    }
-
-    /**
-     * @title  Arguments = Long.MIN_VALUE, 1
-     */
-    public void testB4() {
-        T_lshl_1 t = new T_lshl_1();
-        assertEquals(0l, t.run(Long.MIN_VALUE, 1));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.lshl.jm.T_lshl_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double & int
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.lshl.jm.T_lshl_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int & int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.lshl.jm.T_lshl_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - float & int
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.lshl.jm.T_lshl_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference & int
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.lshl.jm.T_lshl_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_1.j b/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_1.j
deleted file mode 100644
index 47ea4ff..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_1.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lshl_1.java
-.class public dxc/junit/opcodes/lshl/jm/T_lshl_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(JI)J
-    .limit stack 3
-    .limit locals 4
-
-    lload_1
-    iload_3
-    lshl
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_1.java b/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_1.java
deleted file mode 100644
index 5855d09..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lshl.jm;
-
-public class T_lshl_1 {
-
-    public long run(long a, int b) {
-        return a << b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_2.j b/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_2.j
deleted file mode 100644
index cb0a00c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_2.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lshl_2.java
-.class public dxc/junit/opcodes/lshl/jm/T_lshl_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(JI)J
-    .limit stack 3
-    .limit locals 4
-
-;    lload_1
-    iload_3
-    lshl
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_2.java b/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_2.java
deleted file mode 100644
index 42d89f0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lshl.jm;
-
-public class T_lshl_2 {
-
-    public long run(long a, int b) {
-        return a << b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_3.j b/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_3.j
deleted file mode 100644
index a5d5200..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_3.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lshl_3.java
-.class public dxc/junit/opcodes/lshl/jm/T_lshl_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(DI)J
-    .limit stack 3
-    .limit locals 4
-
-    dload_1
-    iload_3
-    lshl
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_3.java b/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_3.java
deleted file mode 100644
index 0de1686..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lshl.jm;
-
-public class T_lshl_3 {
-
-    public long run(double a, int b) {
-        return (long)a << b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_4.j b/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_4.j
deleted file mode 100644
index 6ff06c7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_4.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lshl_4.java
-.class public dxc/junit/opcodes/lshl/jm/T_lshl_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(II)J
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    iload_2
-    lshl
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_4.java b/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_4.java
deleted file mode 100644
index a7a4fcf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lshl.jm;
-
-public class T_lshl_4 {
-
-    public long run(int a, int b) {
-        return a << b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_5.j b/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_5.j
deleted file mode 100644
index 6461614..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_5.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lshl_5.java
-.class public dxc/junit/opcodes/lshl/jm/T_lshl_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(FI)J
-    .limit stack 3
-    .limit locals 3
-
-    fload_1
-    iload_2
-    lshl
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_5.java b/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_5.java
deleted file mode 100644
index f48ad7d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lshl.jm;
-
-public class T_lshl_5 {
-
-    public long run(float a, int b) {
-        return (long)a << b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_6.j b/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_6.j
deleted file mode 100644
index 6b3e135..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_6.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lshl_6.java
-.class public dxc/junit/opcodes/lshl/jm/T_lshl_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(JI)J
-    .limit stack 3
-    .limit locals 4
-
-    aload_0
-    iload_3
-    lshl
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_6.java b/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_6.java
deleted file mode 100644
index b27e156..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lshl/jm/T_lshl_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lshl.jm;
-
-public class T_lshl_6 {
-
-    public long run(long a, int b) {
-        return a << b;
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lshr/Test_lshr.java b/tools/dx-tests/src/dxc/junit/opcodes/lshr/Test_lshr.java
deleted file mode 100644
index 5f98083..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lshr/Test_lshr.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lshr;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.lshr.jm.T_lshr_1;
-
-public class Test_lshr extends DxTestCase {
-
-    /**
-     * @title Arguments = 40000000000l, 3
-     */
-    public void testN1() {
-        T_lshr_1 t = new T_lshr_1();
-        assertEquals(5000000000l, t.run(40000000000l, 3));
-    }
-
-    /**
-     * @title Arguments = 40000000000l, 1
-     */
-    public void testN2() {
-        T_lshr_1 t = new T_lshr_1();
-        assertEquals(20000000000l, t.run(40000000000l, 1));
-    }
-
-    /**
-     * @title Arguments = -40000000000l, 1
-     */
-    public void testN3() {
-        T_lshr_1 t = new T_lshr_1();
-        assertEquals(-20000000000l, t.run(-40000000000l, 1));
-    }
-
-    /**
-     * @title  Arguments = 1, -1
-     */
-    public void testN4() {
-        T_lshr_1 t = new T_lshr_1();
-        assertEquals(0l, t.run(1l, -1));
-    }
-
-    /**
-     * @title  Verify that shift distance is actually in range 0 to 64.
-     */
-    public void testN5() {
-        T_lshr_1 t = new T_lshr_1();
-        assertEquals(32, t.run(65l, 65));
-    }
-
-    /**
-     * @title  Arguments = 0, -1
-     */
-    public void testB1() {
-        T_lshr_1 t = new T_lshr_1();
-        assertEquals(0l, t.run(0l, -1));
-    }
-
-    /**
-     * @title  Arguments = 1, 0
-     */
-    public void testB2() {
-        T_lshr_1 t = new T_lshr_1();
-        assertEquals(1l, t.run(1l, 0));
-    }
-
-    /**
-     * @title  Arguments = Long.MAX_VALUE, 1
-     */
-    public void testB3() {
-        T_lshr_1 t = new T_lshr_1();
-        assertEquals(0x3FFFFFFFFFFFFFFFl, t.run(Long.MAX_VALUE, 1));
-    }
-
-    /**
-     * @title  Arguments = Long.MIN_VALUE, 1
-     */
-    public void testB4() {
-        T_lshr_1 t = new T_lshr_1();
-        assertEquals(0xc000000000000000l, t.run(Long.MIN_VALUE, 1));
-    }
-
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.lshr.jm.T_lshr_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double & int
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.lshr.jm.T_lshr_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int & int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.lshr.jm.T_lshr_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - float & int
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.lshr.jm.T_lshr_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference & int
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.lshr.jm.T_lshr_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_1.j b/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_1.j
deleted file mode 100644
index b21e884..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_1.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lshr_1.java
-.class public dxc/junit/opcodes/lshr/jm/T_lshr_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(JI)J
-    .limit stack 3
-    .limit locals 4
-
-    lload_1
-    iload_3
-    lshr
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_1.java b/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_1.java
deleted file mode 100644
index 45f4113..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lshr.jm;
-
-public class T_lshr_1 {
-
-    public long run(long a, int b) {
-        return a >> b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_2.j b/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_2.j
deleted file mode 100644
index 21a59a7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_2.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lshr_2.java
-.class public dxc/junit/opcodes/lshr/jm/T_lshr_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(JI)J
-    .limit stack 3
-    .limit locals 4
-
-;    lload_1
-    iload_3
-    lshr
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_2.java b/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_2.java
deleted file mode 100644
index 6c0243b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lshr.jm;
-
-public class T_lshr_2 {
-
-    public long run(long a, int b) {
-        return a >> b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_3.j b/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_3.j
deleted file mode 100644
index 3edefd3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_3.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lshr_3.java
-.class public dxc/junit/opcodes/lshr/jm/T_lshr_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(DI)J
-    .limit stack 3
-    .limit locals 4
-
-    dload_1
-    iload_3
-    lshr
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_3.java b/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_3.java
deleted file mode 100644
index 8a2132d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lshr.jm;
-
-public class T_lshr_3 {
-
-    public long run(double a, int b) {
-        return (long)a >> b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_4.j b/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_4.j
deleted file mode 100644
index 58349f5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_4.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lshr_4.java
-.class public dxc/junit/opcodes/lshr/jm/T_lshr_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(II)J
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    iload_2
-    lshr
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_4.java b/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_4.java
deleted file mode 100644
index 322a193..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lshr.jm;
-
-public class T_lshr_4 {
-
-    public long run(int a, int b) {
-        return a >> b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_5.j b/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_5.j
deleted file mode 100644
index 179e48e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_5.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lshr_5.java
-.class public dxc/junit/opcodes/lshr/jm/T_lshr_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(FI)J
-    .limit stack 3
-    .limit locals 3
-
-    fload_1
-    iload_2
-    lshr
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_5.java b/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_5.java
deleted file mode 100644
index 0f97441..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lshr.jm;
-
-public class T_lshr_5 {
-
-    public long run(float a, int b) {
-        return (long)a >> b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_6.j b/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_6.j
deleted file mode 100644
index 33c9991..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_6.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lshr_6.java
-.class public dxc/junit/opcodes/lshr/jm/T_lshr_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(JI)J
-    .limit stack 3
-    .limit locals 4
-
-    aload_0
-    iload_3
-    lshr
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_6.java b/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_6.java
deleted file mode 100644
index 31d5f9e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lshr/jm/T_lshr_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lshr.jm;
-
-public class T_lshr_6 {
-
-    public long run(long a, int b) {
-        return a >> b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore/Test_lstore.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore/Test_lstore.java
deleted file mode 100644
index 8d5ba1a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore/Test_lstore.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.lstore.jm.T_lstore_1;
-import dxc.junit.opcodes.lstore.jm.T_lstore_1_w;
-import dxc.junit.opcodes.lstore.jm.T_lstore_2;
-import dxc.junit.opcodes.lstore.jm.T_lstore_2_w;
-
-public class Test_lstore extends DxTestCase {
-
-    /*
-     * NORMAL ISTORE VERSION
-     */
-
-    /**
-     * @title  lstore 0
-     */
-    public void testN1() {
-        assertEquals(1234567890123l, T_lstore_1.run());
-    }
-
-    /**
-     * @title  lstore 255
-     */
-    public void testN2() {
-        assertEquals(1234567890123l, T_lstore_2.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.lstore.jm.T_lstore_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.lstore.jm.T_lstore_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.lstore.jm.T_lstore_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - float
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.lstore.jm.T_lstore_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /*
-     * WIDE ISTORE VERSION
-     */
-
-    /**
-     * @title  lstore_w 0
-     */
-    public void testN3() {
-        assertEquals(1234567890123l, T_lstore_1_w.run());
-    }
-
-    /**
-     * @title  lstore 257
-     */
-    public void testN4() {
-        assertEquals(1234567890123l, T_lstore_2_w.run());
-    }
-
-    /**
-     * @constraint 4.8.1.25
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.lstore.jm.T_lstore_3_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.lstore.jm.T_lstore_4_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - int
-     */
-    public void testVFE7() {
-        try {
-            Class.forName("dxc.junit.opcodes.lstore.jm.T_lstore_5_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - float
-     */
-    public void testVFE8() {
-        try {
-            Class.forName("dxc.junit.opcodes.lstore.jm.T_lstore_6_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_1.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_1.j
deleted file mode 100644
index 02f5c5a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_1.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_1.java
-.class public dxc/junit/opcodes/lstore/jm/T_lstore_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()J
-    .limit stack 4
-    .limit locals 2
-    
-    ldc2_w 1234567890123
-
-    lstore 0
-    ldc2_w 4
-    lload 0
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_1.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_1.java
deleted file mode 100644
index 7c1c4b7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore.jm;
-
-public class T_lstore_1 {
-
-    public static long run() {
-        return 1234567890123l;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_1_w.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_1_w.j
deleted file mode 100644
index 24666bb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_1_w.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_1_w.java
-.class public dxc/junit/opcodes/lstore/jm/T_lstore_1_w
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()J
-    .limit stack 4
-    .limit locals 2
-
-    ldc2_w 1234567890123
-    lstore_w 0
-    ldc2_w 4
-    lload 0
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_1_w.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_1_w.java
deleted file mode 100644
index 416a4e1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_1_w.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore.jm;
-
-public class T_lstore_1_w {
-    
-    public static long run() {
-        return 1234567890123l;
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_2.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_2.j
deleted file mode 100644
index b0501e7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_2.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_2.java
-.class public dxc/junit/opcodes/lstore/jm/T_lstore_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()J
-    .limit stack 4
-    .limit locals 300
-
-    ldc2_w 1234567890123
-    lstore 255
-    ldc2_w 4
-    lload 255
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_2.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_2.java
deleted file mode 100644
index 877fd84..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore.jm;
-
-public class T_lstore_2 {
-
-    public static long run() {
-        return 1234567890123l;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_2_w.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_2_w.j
deleted file mode 100644
index 294ea0a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_2_w.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_2_w.java
-.class public dxc/junit/opcodes/lstore/jm/T_lstore_2_w
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()J
-    .limit stack 4
-    .limit locals 300
-    
-    ldc2_w 1234567890123
-    lstore_w 257
-    ldc2_w 4
-    lload 257
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_2_w.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_2_w.java
deleted file mode 100644
index 369e5ef..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_2_w.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore.jm;
-
-public class T_lstore_2_w {
-    
-    public static long run() {
-        return 1234567890123l;
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_3.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_3.j
deleted file mode 100644
index a3e1c91..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_3.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_3.java
-.class public dxc/junit/opcodes/lstore/jm/T_lstore_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-    
-    lstore 0
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_3.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_3.java
deleted file mode 100644
index a26dc24..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore.jm;
-
-public class T_lstore_3 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_3_w.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_3_w.j
deleted file mode 100644
index 782a123..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_3_w.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_3_w.java
-.class public dxc/junit/opcodes/lstore/jm/T_lstore_3_w
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    lstore_w 0
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_3_w.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_3_w.java
deleted file mode 100644
index 717415a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_3_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore.jm;
-
-public class T_lstore_3_w {
-    public static void run() {
-
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_4.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_4.j
deleted file mode 100644
index 15529ed..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_4.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_4.java
-.class public dxc/junit/opcodes/lstore/jm/T_lstore_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-    
-     dconst_1
-    lstore 0
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_4.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_4.java
deleted file mode 100644
index 566f220..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore.jm;
-
-public class T_lstore_4 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_4_w.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_4_w.j
deleted file mode 100644
index 54bb0aa..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_4_w.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_4_w.java
-.class public dxc/junit/opcodes/lstore/jm/T_lstore_4_w
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-     dconst_1
-    lstore_w 0
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_4_w.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_4_w.java
deleted file mode 100644
index cb56b27..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_4_w.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore.jm;
-
-public class T_lstore_4_w {
-    public static void run() {
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_5.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_5.j
deleted file mode 100644
index f4017d7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_5.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_5.java
-.class public dxc/junit/opcodes/lstore/jm/T_lstore_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    iconst_1
-    lstore 0
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_5.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_5.java
deleted file mode 100644
index ad183ea..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_5.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore.jm;
-
-public class T_lstore_5 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_5_w.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_5_w.j
deleted file mode 100644
index 7ada7ba..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_5_w.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_5_w.java
-.class public dxc/junit/opcodes/lstore/jm/T_lstore_5_w
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-     iconst_1
-    lstore_w 0
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_5_w.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_5_w.java
deleted file mode 100644
index 1a9bbe7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_5_w.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore.jm;
-
-public class T_lstore_5_w {
-    public static void run() {
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_6.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_6.j
deleted file mode 100644
index 960f6a4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_6.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_6.java
-.class public dxc/junit/opcodes/lstore/jm/T_lstore_6
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-    
-    fconst_1
-    lstore 0
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_6.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_6.java
deleted file mode 100644
index 2417318..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_6.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore.jm;
-
-public class T_lstore_6 {
-
-    public static void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_6_w.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_6_w.j
deleted file mode 100644
index 4f32a72..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_6_w.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_6_w.java
-.class public dxc/junit/opcodes/lstore/jm/T_lstore_6_w
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-     fconst_1
-    lstore_w 0
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_6_w.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_6_w.java
deleted file mode 100644
index 69a7469..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore/jm/T_lstore_6_w.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore.jm;
-
-public class T_lstore_6_w {
-    
-    public static void run() {
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/Test_lstore_0.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/Test_lstore_0.java
deleted file mode 100644
index 9259090..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/Test_lstore_0.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore_0;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.lstore_0.jm.T_lstore_0_1;
-import dxc.junit.opcodes.lstore_0.jm.T_lstore_0_2;
-
-public class Test_lstore_0 extends DxTestCase {
-
-    /**
-     * @title value of local variable at <n> is pushed onto the operand stack
-     */
-    public void testN1() {
-        assertEquals(1234567890123l, T_lstore_0_1.run());
-    }
-
-    /**
-     * @title Each of the lstore_<n> instructions is the same as lstore with an index of <n>
-     */
-    public void testN2() {
-        assertTrue(T_lstore_0_2.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.lstore_0.jm.T_lstore_0_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.lstore_0.jm.T_lstore_0_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.lstore_0.jm.T_lstore_0_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - float
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.lstore_0.jm.T_lstore_0_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_1.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_1.j
deleted file mode 100644
index e6d36c0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_1.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_0_1.java
-.class public dxc/junit/opcodes/lstore_0/jm/T_lstore_0_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()J
-    .limit stack 4
-    .limit locals 2
-    
-    ldc2_w 1234567890123
-    lstore_0
-    ldc2_w 4
-    lload_0
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_1.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_1.java
deleted file mode 100644
index 3d017ea..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore_0.jm;
-
-public class T_lstore_0_1 {
-
-    public static long run() {
-        return 1234567890123l;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_2.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_2.j
deleted file mode 100644
index f61972a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_2.j
+++ /dev/null
@@ -1,48 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_0_2.java
-.class public dxc/junit/opcodes/lstore_0/jm/T_lstore_0_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()Z
-    .limit stack 4
-    .limit locals 2
-   
-    ldc2_w 1234567890123
-    lstore_0
-    lload_0
-    
-    ldc2_w 1234567890123
-    lstore 0
-    lload_0
-    
-    lcmp
-    ifne Label0
-    iconst_1
-    ireturn
-
-Label0:
-    iconst_0
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_2.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_2.java
deleted file mode 100644
index 15fff7e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_2.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore_0.jm;
-
-public class T_lstore_0_2 {
-
-    public static boolean run() {
-        long i = 1234567890123l;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_3.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_3.j
deleted file mode 100644
index 115c9d7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_3.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_0_3.java
-.class public dxc/junit/opcodes/lstore_0/jm/T_lstore_0_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    lstore_0
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_3.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_3.java
deleted file mode 100644
index 78bedb4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore_0.jm;
-
-public class T_lstore_0_3 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_4.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_4.j
deleted file mode 100644
index 212743c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_4.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_0_4.java
-.class public dxc/junit/opcodes/lstore_0/jm/T_lstore_0_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    dconst_1
-    lstore_0
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_4.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_4.java
deleted file mode 100644
index 84982cb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore_0.jm;
-
-public class T_lstore_0_4 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_5.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_5.j
deleted file mode 100644
index e8653c7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_5.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_0_5.java
-.class public dxc/junit/opcodes/lstore_0/jm/T_lstore_0_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    iconst_1
-    lstore_0
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_5.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_5.java
deleted file mode 100644
index 82e115b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore_0.jm;
-
-public class T_lstore_0_5 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_6.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_6.j
deleted file mode 100644
index 6722bca..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_6.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_0_6.java
-.class public dxc/junit/opcodes/lstore_0/jm/T_lstore_0_6
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    fconst_1
-    lstore_0
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_6.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_6.java
deleted file mode 100644
index 7a56680..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_0/jm/T_lstore_0_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore_0.jm;
-
-public class T_lstore_0_6 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/Test_lstore_1.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/Test_lstore_1.java
deleted file mode 100644
index 019721b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/Test_lstore_1.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore_1;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.lstore_1.jm.T_lstore_1_1;
-import dxc.junit.opcodes.lstore_1.jm.T_lstore_1_2;
-
-public class Test_lstore_1 extends DxTestCase {
-
-    /**
-     * @title value of local variable at <n> is pushed onto the operand stack
-     */
-    public void testN1() {
-        assertEquals(1234567890123l, T_lstore_1_1.run());
-    }
-
-    /**
-     * @title each of the lstore_<n> instructions is the same as lstore with an index of <n>
-     */
-    public void testN2() {
-        assertTrue(T_lstore_1_2.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.lstore_1.jm.T_lstore_1_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.lstore_1.jm.T_lstore_1_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.lstore_1.jm.T_lstore_1_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - float
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.lstore_1.jm.T_lstore_1_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_1.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_1.j
deleted file mode 100644
index 6da940c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_1.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_1_1.java
-.class public dxc/junit/opcodes/lstore_1/jm/T_lstore_1_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()J
-    .limit stack 4
-    .limit locals 4
-    
-    ldc2_w 1234567890123
-    lstore_1
-    ldc2_w 4
-    lload_1
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_1.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_1.java
deleted file mode 100644
index 406368d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore_1.jm;
-
-public class T_lstore_1_1 {
-    
-    public static long run() {
-        return 1234567890123l;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_2.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_2.j
deleted file mode 100644
index cdbae78..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_2.j
+++ /dev/null
@@ -1,48 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_1_2.java
-.class public dxc/junit/opcodes/lstore_1/jm/T_lstore_1_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()Z
-    .limit stack 4
-    .limit locals 4
-    
-    ldc2_w 1234567890123
-    lstore_1
-    lload_1
-
-    ldc2_w 1234567890123
-    lstore 1
-    lload_1
-    
-    lcmp
-    ifne Label0
-    iconst_1
-    ireturn
-
-Label0:
-    iconst_0
-    ireturn
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_2.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_2.java
deleted file mode 100644
index 767fccb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_2.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore_1.jm;
-
-public class T_lstore_1_2 {
-
-    public static boolean run() {
-        long i = 1234567890123l;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_3.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_3.j
deleted file mode 100644
index 46567eb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_3.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_1_3.java
-.class public dxc/junit/opcodes/lstore_1/jm/T_lstore_1_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    lstore_1
-    return
-    
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_3.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_3.java
deleted file mode 100644
index 2a02047..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore_1.jm;
-
-public class T_lstore_1_3 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_4.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_4.j
deleted file mode 100644
index 8045824..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_4.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_1_4.java
-.class public dxc/junit/opcodes/lstore_1/jm/T_lstore_1_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    dconst_1
-    lstore_1
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_4.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_4.java
deleted file mode 100644
index b27f43f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore_1.jm;
-
-public class T_lstore_1_4 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_5.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_5.j
deleted file mode 100644
index 4926c01..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_5.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_1_5.java
-.class public dxc/junit/opcodes/lstore_1/jm/T_lstore_1_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    iconst_1
-    lstore_1
-    return
-    
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_5.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_5.java
deleted file mode 100644
index 380b2e6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore_1.jm;
-
-public class T_lstore_1_5 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_6.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_6.j
deleted file mode 100644
index 684aa83..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_6.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_1_6.java
-.class public dxc/junit/opcodes/lstore_1/jm/T_lstore_1_6
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    fconst_1
-    lstore_1
-    return
-    
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_6.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_6.java
deleted file mode 100644
index 22b4ec4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_1/jm/T_lstore_1_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore_1.jm;
-
-public class T_lstore_1_6 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/Test_lstore_2.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/Test_lstore_2.java
deleted file mode 100644
index e42d3f8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/Test_lstore_2.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore_2;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.lstore_2.jm.T_lstore_2_1;
-import dxc.junit.opcodes.lstore_2.jm.T_lstore_2_2;
-
-public class Test_lstore_2 extends DxTestCase {
-
-    /**
-     * @title value of local variable at <n> is pushed onto the operand stack.
-     */
-    public void testN1() {
-        assertEquals(1234567890123l, T_lstore_2_1.run());
-    }
-
-    /**
-     * @title each of the lstore_<n> instructions is the same as lstore with an index of <n>
-     */
-    public void testN2() {
-        assertTrue(T_lstore_2_2.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.lstore_2.jm.T_lstore_2_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.lstore_2.jm.T_lstore_2_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.lstore_2.jm.T_lstore_2_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - float
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.lstore_2.jm.T_lstore_2_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_1.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_1.j
deleted file mode 100644
index 28b3391..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_1.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_2_1.java
-.class public dxc/junit/opcodes/lstore_2/jm/T_lstore_2_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()J
-    .limit stack 4
-    .limit locals 4
-    
-    ldc2_w 1234567890123
-    lstore_2
-    ldc2_w 4
-    lload_2
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_1.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_1.java
deleted file mode 100644
index cf0a9c6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore_2.jm;
-
-public class T_lstore_2_1 {
-
-    public static long run() {
-        return 1234567890123l;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_2.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_2.j
deleted file mode 100644
index 7bd36ac..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_2.j
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_2_2.java
-.class public dxc/junit/opcodes/lstore_2/jm/T_lstore_2_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()Z
-    .limit stack 4
-    .limit locals 4
-    
-    ldc2_w 1234567890123
-    lstore_2
-    lload_2
-
-    ldc2_w 1234567890123
-    lstore 2
-    lload_2
-    
-    lcmp
-    ifne Label0
-    iconst_1
-    ireturn
-
-Label0:
-    iconst_0
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_2.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_2.java
deleted file mode 100644
index 8947807..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_2.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore_2.jm;
-
-public class T_lstore_2_2 {
-
-    public static boolean run() {
-        long i = 1234567890123l;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_3.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_3.j
deleted file mode 100644
index fbd7f42..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_3.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_2_3.java
-.class public dxc/junit/opcodes/lstore_2/jm/T_lstore_2_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    lstore_2
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_3.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_3.java
deleted file mode 100644
index ff83d99..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore_2.jm;
-
-public class T_lstore_2_3 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_4.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_4.j
deleted file mode 100644
index d939607..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_4.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_2_4.java
-.class public dxc/junit/opcodes/lstore_2/jm/T_lstore_2_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    dconst_1
-    lstore_2
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_4.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_4.java
deleted file mode 100644
index c9b028e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore_2.jm;
-
-public class T_lstore_2_4 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_5.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_5.j
deleted file mode 100644
index 51d5d5f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_5.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_2_5.java
-.class public dxc/junit/opcodes/lstore_2/jm/T_lstore_2_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    iconst_2
-    lstore_2
-    return
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_5.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_5.java
deleted file mode 100644
index 898c226..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore_2.jm;
-
-public class T_lstore_2_5 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_6.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_6.j
deleted file mode 100644
index 9de277f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_6.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_2_6.java
-.class public dxc/junit/opcodes/lstore_2/jm/T_lstore_2_6
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 4
-
-    fconst_2
-    lstore_2
-    return
-    
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_6.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_6.java
deleted file mode 100644
index 30c6c25..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_2/jm/T_lstore_2_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore_2.jm;
-
-public class T_lstore_2_6 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/Test_lstore_3.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/Test_lstore_3.java
deleted file mode 100644
index b89ca5c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/Test_lstore_3.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore_3;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.lstore_3.jm.T_lstore_3_1;
-import dxc.junit.opcodes.lstore_3.jm.T_lstore_3_2;
-
-public class Test_lstore_3 extends DxTestCase {
-
-    /**
-     * @title value of local variable at <n> is pushed onto the operand stack.
-     */
-    public void testN1() {
-        assertEquals(1234567890123l, T_lstore_3_1.run());
-    }
-
-    /**
-     * @title each of the lstore_<n> instructions is the same as lstore with an index of <n>
-     */
-    public void testN2() {
-        assertTrue(T_lstore_3_2.run());
-    }
-
-    /**
-     * @constraint 4.8.1.22
-     * @title index must be no greater than the value
-     * of max_locals-1
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.lstore_3.jm.T_lstore_3_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.lstore_3.jm.T_lstore_3_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.lstore_3.jm.T_lstore_3_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of argument - float
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.lstore_3.jm.T_lstore_3_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_1.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_1.j
deleted file mode 100644
index d5cafea..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_1.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_3_1.java
-.class public dxc/junit/opcodes/lstore_3/jm/T_lstore_3_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()J
-    .limit stack 4
-    .limit locals 5
-    
-    ldc2_w 1234567890123
-    lstore_3
-    ldc2_w 4
-    lload_3
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_1.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_1.java
deleted file mode 100644
index a03805a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore_3.jm;
-
-public class T_lstore_3_1 {
-
-    public static long run() {
-        return 1234567890123l;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_2.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_2.j
deleted file mode 100644
index bd47d6e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_2.j
+++ /dev/null
@@ -1,48 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_3_2.java
-.class public dxc/junit/opcodes/lstore_3/jm/T_lstore_3_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()Z
-    .limit stack 4
-    .limit locals 5
-    
-    ldc2_w 1234567890123
-    lstore_3
-    lload_3
-
-    ldc2_w 1234567890123
-    lstore 3
-    lload_3
-    
-    lcmp
-    ifne Label0
-    iconst_3
-    ireturn
-
-Label0:
-    iconst_0
-    ireturn
-   
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_2.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_2.java
deleted file mode 100644
index cbe2c13..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_2.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore_3.jm;
-
-public class T_lstore_3_2 {
-
-    public static boolean run() {
-        long i = 1234567890123l;
-        return i == i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_3.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_3.j
deleted file mode 100644
index 6ddc10b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_3.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_3_3.java
-.class public dxc/junit/opcodes/lstore_3/jm/T_lstore_3_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 0
-
-    lstore_3
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_3.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_3.java
deleted file mode 100644
index 89e037a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore_3.jm;
-
-public class T_lstore_3_3 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_4.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_4.j
deleted file mode 100644
index f8266ef..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_4.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_3_4.java
-.class public dxc/junit/opcodes/lstore_3/jm/T_lstore_3_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 5
-
-    dconst_1
-    lstore_3
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_4.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_4.java
deleted file mode 100644
index 493601a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore_3.jm;
-
-public class T_lstore_3_4 {
-    
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_5.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_5.j
deleted file mode 100644
index 4dd787e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_5.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_3_5.java
-.class public dxc/junit/opcodes/lstore_3/jm/T_lstore_3_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 5
-
-    iconst_3
-    lstore_3
-    return
-    
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_5.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_5.java
deleted file mode 100644
index 70f5f71..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore_3.jm;
-
-public class T_lstore_3_5 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_6.j b/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_6.j
deleted file mode 100644
index 3684396..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_6.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lstore_3_6.java
-.class public dxc/junit/opcodes/lstore_3/jm/T_lstore_3_6
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public static run()V
-    .limit stack 4
-    .limit locals 5
-
-    fconst_1
-    lstore_3
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_6.java b/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_6.java
deleted file mode 100644
index 766386b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lstore_3/jm/T_lstore_3_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lstore_3.jm;
-
-public class T_lstore_3_6 {
-
-    public static void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lsub/Test_lsub.java b/tools/dx-tests/src/dxc/junit/opcodes/lsub/Test_lsub.java
deleted file mode 100644
index e298784..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lsub/Test_lsub.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lsub;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.lsub.jm.T_lsub_1;
-
-public class Test_lsub extends DxTestCase {
-
-    /**
-     * @title Arguments = 1111127348242l, 11111111114l
-     */
-    public void testN1() {
-        T_lsub_1 t = new T_lsub_1();
-        assertEquals(1100016237128l, t.run(1111127348242l, 11111111114l));
-    }
-
-    /**
-     * @title Arguments = 0, 1111127348242l
-     */
-    public void testN2() {
-        T_lsub_1 t = new T_lsub_1();
-        assertEquals(-1111127348242l, t.run(0, 1111127348242l));
-    }
-
-    /**
-     * @title Arguments = 0, -11111111114l
-     */
-    public void testN3() {
-        T_lsub_1 t = new T_lsub_1();
-        assertEquals(11111111114l, t.run(0, -11111111114l));
-    }
-
-    /**
-     * @title Arguments = 0l, Long.MAX_VALUE
-     */
-    public void testB1() {
-        T_lsub_1 t = new T_lsub_1();
-        assertEquals(-9223372036854775807L, t.run(0l, Long.MAX_VALUE));
-    }
-    /**
-     * @title Arguments = 9223372036854775807L, Long.MAX_VALUE
-     */
-    public void testB2() {
-        T_lsub_1 t = new T_lsub_1();
-        assertEquals(0l, t.run(9223372036854775807L, Long.MAX_VALUE));
-    }
-    /**
-     * @title Arguments = Long.MAX_VALUE, -1l
-     */
-    public void testB3() {
-        T_lsub_1 t = new T_lsub_1();
-        assertEquals(-9223372036854775808L, t.run(Long.MAX_VALUE, -1l));
-    }
-    /**
-     * @title Arguments = Long.MIN_VALUE, 1l
-     */
-    public void testB4() {
-        T_lsub_1 t = new T_lsub_1();
-        assertEquals(9223372036854775807L, t.run(Long.MIN_VALUE, 1l));
-    }
-    /**
-     * @title Arguments = 0l, 0l
-     */
-    public void testB5() {
-        T_lsub_1 t = new T_lsub_1();
-        assertEquals(0l, t.run(0l, 0l));
-    }
-    /**
-     * @title Arguments = 0l, -Long.MIN_VALUE
-     */
-    public void testB6() {
-        T_lsub_1 t = new T_lsub_1();
-        assertEquals(-9223372036854775808L, t.run(0l, -Long.MIN_VALUE));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.lsub.jm.T_lsub_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long, double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.lsub.jm.T_lsub_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int, long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.lsub.jm.T_lsub_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long, float
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.lsub.jm.T_lsub_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long, reference
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.lsub.jm.T_lsub_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_1.j b/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_1.j
deleted file mode 100644
index 1afeb41..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_1.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lsub_1.java
-.class public dxc/junit/opcodes/lsub/jm/T_lsub_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(JJ)J
-    .limit stack 4
-    .limit locals 5
-
-    lload_1
-    lload_3
-    lsub
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_1.java b/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_1.java
deleted file mode 100644
index 047b1bf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_1.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lsub.jm;
-
-public class T_lsub_1 {
-    
-    public long run(long a, long b) {
-        return a-b;
-    }
-    
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_2.j b/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_2.j
deleted file mode 100644
index 8872c53..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_2.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lsub_2.java
-.class public dxc/junit/opcodes/lsub/jm/T_lsub_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(JJ)J
-    .limit stack 4
-    .limit locals 5
-
-;    lload_1
-    lload_3
-    lsub
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_2.java b/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_2.java
deleted file mode 100644
index c509295..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lsub.jm;
-
-public class T_lsub_2 {
-
-    public long run(long a, long b) {
-        return a-b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_3.j b/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_3.j
deleted file mode 100644
index f1fa846..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_3.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lsub_3.java
-.class public dxc/junit/opcodes/lsub/jm/T_lsub_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(JD)J
-    .limit stack 4
-    .limit locals 5
-
-    lload_1
-    dload_3
-    lsub
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_3.java b/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_3.java
deleted file mode 100644
index d86e773..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lsub.jm;
-
-public class T_lsub_3 {
-
-    public long run(long a, double b) {
-        return (long)(a-b);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_4.j b/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_4.j
deleted file mode 100644
index 1443e48..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_4.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lsub_4.java
-.class public dxc/junit/opcodes/lsub/jm/T_lsub_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(IJ)J
-    .limit stack 4
-    .limit locals 4
-
-    iload_1
-    lload_2
-    lsub
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_4.java b/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_4.java
deleted file mode 100644
index e3166d0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lsub.jm;
-
-public class T_lsub_4 {
-
-    public long run(int a, long b) {
-        return a-b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_5.j b/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_5.j
deleted file mode 100644
index 8156f63..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_5.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lsub_5.java
-.class public dxc/junit/opcodes/lsub/jm/T_lsub_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(FJ)J
-    .limit stack 3
-    .limit locals 4
-
-    fload_1
-    lload_2
-    lsub
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_5.java b/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_5.java
deleted file mode 100644
index 3e89d5c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lsub.jm;
-
-public class T_lsub_5 {
-
-    public long run(float a, long b) {
-        return (long)(a-b);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_6.j b/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_6.j
deleted file mode 100644
index 0598c05..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_6.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lsub_6.java
-.class public dxc/junit/opcodes/lsub/jm/T_lsub_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(JJ)J
-    .limit stack 4
-    .limit locals 5
-
-    lload_1
-    aload_0
-    lsub
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_6.java b/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_6.java
deleted file mode 100644
index d0fd41b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lsub/jm/T_lsub_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lsub.jm;
-
-public class T_lsub_6 {
-
-    public long run(long a, long b) {
-        return a-b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lushr/Test_lushr.java b/tools/dx-tests/src/dxc/junit/opcodes/lushr/Test_lushr.java
deleted file mode 100644
index 41f41ea..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lushr/Test_lushr.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lushr;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.lushr.jm.T_lushr_1;
-
-public class Test_lushr extends DxTestCase {
-
-    /**
-     * @title Arguments = 40000000000l, 3
-     */
-    public void testN1() {
-        T_lushr_1 t = new T_lushr_1();
-        assertEquals(5000000000l, t.run(40000000000l, 3));
-    }
-
-    /**
-     * @title Arguments = 40000000000l, 1
-     */
-    public void testN2() {
-        T_lushr_1 t = new T_lushr_1();
-        assertEquals(20000000000l, t.run(40000000000l, 1));
-    }
-
-    /**
-     * @title Arguments = -123456789l, 1
-     */
-    public void testN3() {
-        T_lushr_1 t = new T_lushr_1();
-        assertEquals(0x7FFFFFFFFC521975l, t.run(-123456789l, 1));
-    }
-
-    /**
-     * @title  Arguments = 1, -1
-     */
-    public void testN4() {
-        T_lushr_1 t = new T_lushr_1();
-        assertEquals(0l, t.run(1l, -1));
-    }
-
-    /**
-     * @title Arguments = 123456789l, 64
-     */
-    public void testN5() {
-        T_lushr_1 t = new T_lushr_1();
-        assertEquals(123456789l, t.run(123456789l, 64));
-    }
-
-    /**
-     * @title Arguments = 123456789l, 63
-     */
-    public void testN6() {
-        T_lushr_1 t = new T_lushr_1();
-        assertEquals(0l, t.run(123456789l, 63));
-    }
-
-    /**
-     * @title  Arguments = 0, -1
-     */
-    public void testB1() {
-        T_lushr_1 t = new T_lushr_1();
-        assertEquals(0l, t.run(0l, -1));
-    }
-
-    /**
-     * @title  Arguments = Long.MAX_VALUE, 1
-     */
-    public void testB2() {
-        T_lushr_1 t = new T_lushr_1();
-        assertEquals(0x3FFFFFFFFFFFFFFFl, t.run(Long.MAX_VALUE, 1));
-    }
-
-    /**
-     * @title  Arguments = Long.MIN_VALUE, 1
-     */
-    public void testB3() {
-        T_lushr_1 t = new T_lushr_1();
-        assertEquals(0x4000000000000000l, t.run(Long.MIN_VALUE, 1));
-    }
-
-    /**
-     * @title  Arguments = 1, 0
-     */
-    public void testB4() {
-        T_lushr_1 t = new T_lushr_1();
-        assertEquals(1l, t.run(1l, 0));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.lushr.jm.T_lushr_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double, int
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.lushr.jm.T_lushr_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int, int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.lushr.jm.T_lushr_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - float, int
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.lushr.jm.T_lushr_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference, int
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.lushr.jm.T_lushr_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_1.j b/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_1.j
deleted file mode 100644
index 4c92f16..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_1.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lushr_1.java
-.class public dxc/junit/opcodes/lushr/jm/T_lushr_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(JI)J
-    .limit stack 3
-    .limit locals 4
-
-    lload_1
-    iload_3
-    lushr
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_1.java b/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_1.java
deleted file mode 100644
index eebd399..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lushr.jm;
-
-public class T_lushr_1 {
-
-    public long run(long a, int b) {
-        return a >>> b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_2.j b/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_2.j
deleted file mode 100644
index fde0760..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_2.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lushr_2.java
-.class public dxc/junit/opcodes/lushr/jm/T_lushr_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(JI)J
-    .limit stack 3
-    .limit locals 4
-
-;    lload_1
-    iload_3
-    lushr
-
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_2.java b/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_2.java
deleted file mode 100644
index 2512ad1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lushr.jm;
-
-public class T_lushr_2 {
-
-    public long run(long a, int b) {
-        return a >>> b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_3.j b/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_3.j
deleted file mode 100644
index baeb03f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_3.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lushr_3.java
-.class public dxc/junit/opcodes/lushr/jm/T_lushr_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(DI)J
-    .limit stack 3
-    .limit locals 4
-
-    dload_1
-    iload_3
-    lushr
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_3.java b/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_3.java
deleted file mode 100644
index a349f21..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lushr.jm;
-
-public class T_lushr_3 {
-
-    public long run(double a, int b) {
-        return (long)a >>> b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_4.j b/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_4.j
deleted file mode 100644
index 0713473..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_4.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lushr_4.java
-.class public dxc/junit/opcodes/lushr/jm/T_lushr_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(II)J
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    iload_2
-    lushr
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_4.java b/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_4.java
deleted file mode 100644
index f2c2dbd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lushr.jm;
-
-public class T_lushr_4 {
-
-    public long run(int a, int b) {
-        return a >>> b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_5.j b/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_5.j
deleted file mode 100644
index 2d9f06e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_5.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lushr_5.java
-.class public dxc/junit/opcodes/lushr/jm/T_lushr_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(FI)J
-    .limit stack 3
-    .limit locals 3
-
-    fload_1
-    iload_2
-    lushr
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_5.java b/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_5.java
deleted file mode 100644
index 0ac3afd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lushr.jm;
-
-public class T_lushr_5 {
-
-    public long run(float a, int b) {
-        return (long)a >>> b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_6.j b/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_6.j
deleted file mode 100644
index 6c5158f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_6.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lushr_6.java
-.class public dxc/junit/opcodes/lushr/jm/T_lushr_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(JI)J
-    .limit stack 3
-    .limit locals 4
-
-    aload_0
-    iload_3
-    lushr
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_6.java b/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_6.java
deleted file mode 100644
index cc32717..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lushr/jm/T_lushr_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lushr.jm;
-
-public class T_lushr_6 {
-
-    public long run(long a, int b) {
-        return a >>> b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lxor/Test_lxor.java b/tools/dx-tests/src/dxc/junit/opcodes/lxor/Test_lxor.java
deleted file mode 100644
index 567c548..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lxor/Test_lxor.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lxor;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.lxor.jm.T_lxor_1;
-
-public class Test_lxor extends DxTestCase {
-
-    /**
-     * @title Arguments = 23423432423777l, 23423432423778l
-     */
-    public void testN1() {
-        T_lxor_1 t = new T_lxor_1();
-        assertEquals(3, t.run(23423432423777l, 23423432423778l));
-    }
-
-    /**
-     * @title Arguments = 0xfffffff5, 0xfffffff1
-     */
-    public void testN2() {
-        T_lxor_1 t = new T_lxor_1();
-        assertEquals(4, t.run(0xfffffff5, 0xfffffff1));
-    }
-
-    /**
-     * @title  Arguments = 0xABCDEFAB & -1
-     */
-    public void testN3() {
-        T_lxor_1 t = new T_lxor_1();
-        assertEquals(0x54321054, t.run(0xABCDEFAB, -1l));
-    }
-
-    /**
-     * @title  Arguments = 0 & -1
-     */
-    public void testB1() {
-        T_lxor_1 t = new T_lxor_1();
-        assertEquals(-1l, t.run(0l, -1l));
-    }
-
-    /**
-     * @title  Arguments = Long.MAX_VALUE & Long.MIN_VALUE
-     */
-    public void testB2() {
-        T_lxor_1 t = new T_lxor_1();
-        assertEquals(0xffffffff, t.run(Long.MAX_VALUE, Long.MIN_VALUE));
-    }
-
-    /**
-     * @title  Arguments = Long.MAX_VALUE & Long.MAX_VALUE
-     */
-    public void testB3() {
-        T_lxor_1 t = new T_lxor_1();
-        assertEquals(0l, t.run(Long.MAX_VALUE, Long.MAX_VALUE));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.lxor.jm.T_lxor_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double & long
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.lxor.jm.T_lxor_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int & long
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.lxor.jm.T_lxor_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - float & long
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.lxor.jm.T_lxor_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - reference & long
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.lxor.jm.T_lxor_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_1.j b/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_1.j
deleted file mode 100644
index a6d08d1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_1.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lxor_1.java
-.class public dxc/junit/opcodes/lxor/jm/T_lxor_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(JJ)J
-    .limit stack 4
-    .limit locals 5
-    
-    lload_1
-    lload_3
-    lxor
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_1.java b/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_1.java
deleted file mode 100644
index e7e1c94..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lxor.jm;
-
-public class T_lxor_1 {
-
-    public long run(long a, long b) {
-        return a ^ b; 
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_2.j b/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_2.j
deleted file mode 100644
index 4510c47..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_2.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lxor_2.java
-.class public dxc/junit/opcodes/lxor/jm/T_lxor_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(JJ)J
-    .limit stack 4
-    .limit locals 5
-
-    lload_1
-;    lload_3
-    lxor
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_2.java b/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_2.java
deleted file mode 100644
index 2216760..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lxor.jm;
-
-public class T_lxor_2 {
-
-    public long run(long a, long b) {
-        return a ^ b; 
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_3.j b/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_3.j
deleted file mode 100644
index b0ff453..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_3.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lxor_3.java
-.class public dxc/junit/opcodes/lxor/jm/T_lxor_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(DJ)J
-    .limit stack 4
-    .limit locals 5
-
-    dload_1
-    lload_3
-    lxor
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_3.java b/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_3.java
deleted file mode 100644
index 7dc6d0a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lxor.jm;
-
-public class T_lxor_3 {
-
-    public long run(double a, long b) {
-        return (long)a ^ b; 
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_4.j b/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_4.j
deleted file mode 100644
index 2c39d88..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_4.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lxor_4.java
-.class public dxc/junit/opcodes/lxor/jm/T_lxor_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(IJ)J
-    .limit stack 4
-    .limit locals 4
-
-    iload_1
-    lload_2
-    lxor
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_4.java b/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_4.java
deleted file mode 100644
index aeb756e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lxor.jm;
-
-public class T_lxor_4 {
-
-    public long run(int a, long b) {
-        return a ^ b; 
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_5.j b/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_5.j
deleted file mode 100644
index 72d4a35..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_5.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lxor_5.java
-.class public dxc/junit/opcodes/lxor/jm/T_lxor_5
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(FJ)J
-    .limit stack 4
-    .limit locals 4
-
-    fload_1
-    lload_2
-    lxor
-
-    lreturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_5.java b/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_5.java
deleted file mode 100644
index 3310cb1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lxor.jm;
-
-public class T_lxor_5 {
-
-    public long run(float a, long b) {
-        return (long)a ^ b; 
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_6.j b/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_6.j
deleted file mode 100644
index aaa389b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_6.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_lxor_6.java
-.class public dxc/junit/opcodes/lxor/jm/T_lxor_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(JJ)J
-    .limit stack 4
-    .limit locals 5
-
-    aload_0
-    lload_3
-    lxor
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_6.java b/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_6.java
deleted file mode 100644
index 390a570..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/lxor/jm/T_lxor_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.lxor.jm;
-
-public class T_lxor_6 {
-
-    public long run(long a, long b) {
-        return a ^ b; 
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/Test_monitorenter.java b/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/Test_monitorenter.java
deleted file mode 100644
index a47cc26..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/Test_monitorenter.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.monitorenter;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.monitorenter.jm.T_monitorenter_1;
-import dxc.junit.opcodes.monitorenter.jm.T_monitorenter_2;
-import dxc.junit.opcodes.monitorenter.jm.T_monitorenter_4;
-
-public class Test_monitorenter extends DxTestCase {
-
-    /**
-     * @title normal test
-     * 
-     * @throws InterruptedException
-     */
-    public void testN1() throws InterruptedException {
-        //@uses dxc.junit.opcodes.monitorenter.TestRunnable
-        final T_monitorenter_1 t1 = new T_monitorenter_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 dxc.junit.opcodes.monitorenter.TestRunnable2
-        final T_monitorenter_2 t1 = new T_monitorenter_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_monitorenter_4 t = new T_monitorenter_4();
-        try {
-            t.run();
-            fail("expected NullPointerException");
-        } catch (NullPointerException npe) {
-            // expected
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.monitorenter.jm.T_monitorenter_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.monitorenter.jm.T_monitorenter_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
-
-class TestRunnable implements Runnable {
-    private T_monitorenter_1 t1;
-    TestRunnable(T_monitorenter_1 t1) {
-        this.t1 = t1;
-    }
-    
-    public void run() {
-        try {
-            t1.run();
-        } catch (InterruptedException e) {
-            throw new RuntimeException("interrupted!");
-        }
-    }
-}
-
-class TestRunnable2 implements Runnable {
-    private T_monitorenter_2 t2;
-    private int val;
-    TestRunnable2(T_monitorenter_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/dx-tests/src/dxc/junit/opcodes/monitorenter/jm/T_monitorenter_1.j b/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/jm/T_monitorenter_1.j
deleted file mode 100644
index 0ea107d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/jm/T_monitorenter_1.j
+++ /dev/null
@@ -1,83 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_monitorenter_1.java
-.class public dxc/junit/opcodes/monitorenter/jm/T_monitorenter_1
-.super java/lang/Object
-
-.field public counter I
-
-.method public <init>()V
-    .limit stack 2
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    aload_0
-    iconst_0
-    putfield dxc.junit.opcodes.monitorenter.jm.T_monitorenter_1.counter I
-
-    return
-.end method
-
-
-.method public run()V
-    .throws java/lang/InterruptedException
-    .limit stack 3
-    .limit locals 3
-    
-Label1:
-    aload_0
-    dup
-    astore_1
-    monitorenter
-
-Label5:
-    aload_0
-    getfield dxc.junit.opcodes.monitorenter.jm.T_monitorenter_1.counter I
-    istore_2
-
-Label3:
-    ldc2_w 500
-    invokestatic java/lang/Thread/sleep(J)V
-
-    aload_0
-    iinc 2 1
-    iload_2
-    putfield dxc.junit.opcodes.monitorenter.jm.T_monitorenter_1.counter I
-
-Label4:
-    aload_1
-    monitorexit
-
-Label6:
-    goto Label0
-
-Label7:
-    aload_1
-    monitorexit
-
-Label9:
-    aload_0
-    iconst_m1
-    putfield dxc.junit.opcodes.monitorenter.jm.T_monitorenter_1.counter I
-    athrow
-
-Label0:
-    return
-
-.catch all from Label5 to Label6 using Label7
-.catch all from Label7 to Label9 using Label7
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/jm/T_monitorenter_1.java b/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/jm/T_monitorenter_1.java
deleted file mode 100644
index 5632c81..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/jm/T_monitorenter_1.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.monitorenter.jm;
-
-public class T_monitorenter_1 {
-    public int counter = 0;
-    
-    public void run() throws InterruptedException  {
-        synchronized(this) {
-            int a = counter;
-            Thread.sleep(500);
-            counter = ++a;
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/jm/T_monitorenter_2.j b/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/jm/T_monitorenter_2.j
deleted file mode 100644
index 5927fed..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/jm/T_monitorenter_2.j
+++ /dev/null
@@ -1,118 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_monitorenter_2.java
-.class public dxc/junit/opcodes/monitorenter/jm/T_monitorenter_2
-.super java/lang/Object
-
-.field private flg I
-.field public result Z
-
-.method public <init>()V
-    .limit stack 2
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    aload_0
-    iconst_0
-    putfield dxc.junit.opcodes.monitorenter.jm.T_monitorenter_2.flg I
-
-    aload_0
-    iconst_1
-    putfield dxc.junit.opcodes.monitorenter.jm.T_monitorenter_2.result Z
-
-    return
-.end method
-
-
-
-.method public run(I)V
-    .throws java/lang/InterruptedException
-    .limit stack 3
-    .limit locals 4
-
-    aload_0
-    dup
-    astore_2
-    monitorenter
-
-Label13:
-    aload_0
-    dup
-    astore_3
-    monitorenter
-
-Label7:
-    aload_0
-    iload_1
-    putfield dxc.junit.opcodes.monitorenter.jm.T_monitorenter_2.flg I
-
-    aload_3
-    monitorexit
-
-Label8:
-    goto Label0
-
-Label9:
-    aload_0
-    iconst_0
-    putfield dxc.junit.opcodes.monitorenter.jm.T_monitorenter_2.result Z
-
-    aload_3
-    monitorexit
-
-Label11:
-    athrow
-
-Label0:
-    ldc2_w 500
-    invokestatic java/lang/Thread/sleep(J)V
-
-    aload_0
-    getfield dxc.junit.opcodes.monitorenter.jm.T_monitorenter_2.flg I
-    iload_1
-    if_icmpeq Label1
-
-    aload_0
-    iconst_0
-    putfield dxc.junit.opcodes.monitorenter.jm.T_monitorenter_2.result Z
-
-Label1:
-    aload_2
-    monitorexit
-
-Label14:
-    goto Label2
-
-Label15:
-    aload_0
-    iconst_0
-    putfield dxc.junit.opcodes.monitorenter.jm.T_monitorenter_2.result Z
-
-    aload_2
-    monitorexit
-
-Label17:
-    athrow
-
-Label2:
-    return
-
-.catch all from Label7 to Label8 using Label9
-.catch all from Label9 to Label11 using Label9
-.catch all from Label13 to Label14 using Label15
-.catch all from Label15 to Label17 using Label15
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/jm/T_monitorenter_2.java b/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/jm/T_monitorenter_2.java
deleted file mode 100644
index ef7387d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/jm/T_monitorenter_2.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.monitorenter.jm;
-
-public class T_monitorenter_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/dx-tests/src/dxc/junit/opcodes/monitorenter/jm/T_monitorenter_4.j b/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/jm/T_monitorenter_4.j
deleted file mode 100644
index 8c08eeb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/jm/T_monitorenter_4.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_monitorenter_5.java
-.class public dxc/junit/opcodes/monitorenter/jm/T_monitorenter_5
-.super java/lang/Object
-
-.method public <init>()V
-    .limit stack 2
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    .throws java/lang/InterruptedException
-    .limit stack 2
-    .limit locals 3
-
-    aconst_null
-    monitorenter
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/jm/T_monitorenter_4.java b/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/jm/T_monitorenter_4.java
deleted file mode 100644
index 04b8e6b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/jm/T_monitorenter_4.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.monitorenter.jm;
-
-public class T_monitorenter_4 {
-
-    public void run() {
-        Object o = null;
-        synchronized(o) {
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/jm/T_monitorenter_5.j b/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/jm/T_monitorenter_5.j
deleted file mode 100644
index 4850486..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/jm/T_monitorenter_5.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_monitorenter_5.java
-.class public dxc/junit/opcodes/monitorenter/jm/T_monitorenter_5
-.super java/lang/Object
-
-.method public <init>()V
-    .limit stack 2
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    .throws java/lang/InterruptedException
-    .limit stack 2
-    .limit locals 3
-
-;    aload_0    
-    iconst_1
-    monitorenter
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/jm/T_monitorenter_5.java b/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/jm/T_monitorenter_5.java
deleted file mode 100644
index 02ac602..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/jm/T_monitorenter_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.monitorenter.jm;
-
-public class T_monitorenter_5 {
-
-    public void run() {
-        synchronized(this) {
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/jm/T_monitorenter_6.j b/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/jm/T_monitorenter_6.j
deleted file mode 100644
index 625ec89..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/jm/T_monitorenter_6.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_monitorenter_6.java
-.class public dxc/junit/opcodes/monitorenter/jm/T_monitorenter_6
-.super java/lang/Object
-
-.method public <init>()V
-    .limit stack 2
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    .throws java/lang/InterruptedException
-    .limit stack 2
-    .limit locals 3
-
-;    aload_0    
-    monitorenter
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/jm/T_monitorenter_6.java b/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/jm/T_monitorenter_6.java
deleted file mode 100644
index 303a03d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/monitorenter/jm/T_monitorenter_6.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.monitorenter.jm;
-
-public class T_monitorenter_6 {
-    
-    public void run() {
-        synchronized(this) {
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/Test_monitorexit.java b/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/Test_monitorexit.java
deleted file mode 100644
index b4924b6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/Test_monitorexit.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.monitorexit;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.monitorexit.jm.T_monitorexit_2;
-import dxc.junit.opcodes.monitorexit.jm.T_monitorexit_3;
-import dxc.junit.opcodes.monitorexit.jm.T_monitorexit_4;
-
-public class Test_monitorexit extends DxTestCase {
-
-    /**
-     * @title  thread is not monitor owner
-     */
-    public void testE1() throws InterruptedException {
-        //@uses dxc.junit.opcodes.monitorexit.TestRunnable
-        final T_monitorexit_2 t = new T_monitorexit_2();
-        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  structural lock rules violation
-     */
-    public void testE2() {
-        T_monitorexit_3 t = new T_monitorexit_3();
-        try {
-            t.run();
-            fail("expected IllegalMonitorStateException");
-        } catch (IllegalMonitorStateException imse) {
-            // expected
-        }
-    }
-
-    /**
-     * @title expected NullPointerException
-     */
-    public void testE3() {
-        T_monitorexit_4 t = new T_monitorexit_4();
-        try {
-            t.run();
-            fail("expected NullPointerException");
-        } catch (NullPointerException npe) {
-            // expected
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.monitorexit.jm.T_monitorexit_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.monitorexit.jm.T_monitorexit_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
-
-
-class TestRunnable implements Runnable {
-    private T_monitorexit_2 t;
-    private Object o;
-
-    public TestRunnable(T_monitorexit_2 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/dx-tests/src/dxc/junit/opcodes/monitorexit/jm/T_monitorexit_2.j b/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/jm/T_monitorexit_2.j
deleted file mode 100644
index a376e05..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/jm/T_monitorexit_2.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_monitorexit_2.java
-.class public dxc/junit/opcodes/monitorexit/jm/T_monitorexit_2
-.super java/lang/Object
-
-.field public result Z
-
-.method public <init>()V
-    .limit stack 2
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    
-    aload_0
-    iconst_1
-    putfield dxc.junit.opcodes.monitorexit.jm.T_monitorexit_2.result Z
-    
-    return
-.end method
-
-
-.method public run(Ljava/lang/Object;)V
-    .limit stack 2
-    .limit locals 2
-
-    aload_1
-    monitorexit
-
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/jm/T_monitorexit_2.java b/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/jm/T_monitorexit_2.java
deleted file mode 100644
index de7086f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/jm/T_monitorexit_2.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.monitorexit.jm;
-
-public class T_monitorexit_2 {
-
-    public boolean result = false;
-    
-    public void run(Object o) {
-        synchronized(o) {
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/jm/T_monitorexit_3.j b/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/jm/T_monitorexit_3.j
deleted file mode 100644
index 8c4be70..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/jm/T_monitorexit_3.j
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_monitorexit_3.java
-.class public dxc/junit/opcodes/monitorexit/jm/T_monitorexit_3
-.super java/lang/Object
-
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-.end method
-
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 1
-
-    aload_0
-    monitorenter
-    aload_0    
-    monitorexit
-
-    aload_0    
-    monitorexit
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/jm/T_monitorexit_3.java b/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/jm/T_monitorexit_3.java
deleted file mode 100644
index 99aefa4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/jm/T_monitorexit_3.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.monitorexit.jm;
-
-public class T_monitorexit_3 {
-
-    public void run() {
-        synchronized(this) {
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/jm/T_monitorexit_4.j b/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/jm/T_monitorexit_4.j
deleted file mode 100644
index 9c110b9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/jm/T_monitorexit_4.j
+++ /dev/null
@@ -1,51 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_monitorexit_4.java
-.class public dxc/junit/opcodes/monitorexit/jm/T_monitorexit_4
-.super java/lang/Object
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 1
-
-    aload_0
-    monitorenter
-    
-Label1:    
-    aconst_null
-    monitorexit
-Label2:
-    goto Label4
-
-Label3:
-    aload_0
-    monitorexit
-    athrow
-Label4:
-    return
-    
-.catch all from Label1 to Label2 using Label3    
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/jm/T_monitorexit_4.java b/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/jm/T_monitorexit_4.java
deleted file mode 100644
index 14bcbd9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/jm/T_monitorexit_4.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.monitorexit.jm;
-
-public class T_monitorexit_4 {
-
-    public void run() {
-        synchronized(this) {
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/jm/T_monitorexit_5.j b/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/jm/T_monitorexit_5.j
deleted file mode 100644
index d60a777..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/jm/T_monitorexit_5.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_monitorexit_5.java
-.class public dxc/junit/opcodes/monitorexit/jm/T_monitorexit_5
-.super java/lang/Object
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 1
-
-    aload_0
-    monitorenter
-;    aload_0
-    monitorexit
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/jm/T_monitorexit_5.java b/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/jm/T_monitorexit_5.java
deleted file mode 100644
index 5210071..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/jm/T_monitorexit_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.monitorexit.jm;
-
-public class T_monitorexit_5 {
-
-    public void run() {
-        synchronized(this) {
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/jm/T_monitorexit_6.j b/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/jm/T_monitorexit_6.j
deleted file mode 100644
index a56c030..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/jm/T_monitorexit_6.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_monitorexit_6.java
-.class public dxc/junit/opcodes/monitorexit/jm/T_monitorexit_6
-.super java/lang/Object
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 1
-
-    aload_0
-    monitorenter
-    iconst_1
-    monitorexit
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/jm/T_monitorexit_6.java b/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/jm/T_monitorexit_6.java
deleted file mode 100644
index d7e9825..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/monitorexit/jm/T_monitorexit_6.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.monitorexit.jm;
-
-public class T_monitorexit_6 {
-
-    public void run() {
-        synchronized(this) {
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/Test_multianewarray.java b/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/Test_multianewarray.java
deleted file mode 100644
index 0d2d0fb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/Test_multianewarray.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.multianewarray;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.multianewarray.jm.T_multianewarray_1;
-import dxc.junit.opcodes.multianewarray.jm.T_multianewarray_2;
-import dxc.junit.opcodes.multianewarray.jm.T_multianewarray_7;
-import dxc.junit.opcodes.multianewarray.jm.T_multianewarray_9;
-
-public class Test_multianewarray extends DxTestCase {
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_multianewarray_1 t = new T_multianewarray_1();
-        String[][][] res = t.run(2, 5, 4);
-
-        assertEquals(2, res.length);
-
-        // check default initialization
-        for (int i = 0; i < 2; i++) {
-            assertEquals(5, res[i].length);
-
-            for (int j = 0; j < 5; j++) {
-                assertEquals(4, res[i][j].length);
-
-                for (int k = 0; j < 4; j++) {
-                    assertNull(res[i][j][k]);
-                }
-            }
-        }
-    }
-
-    /**
-     * @title  if count is zero, no subsequent dimensions allocated
-     */
-    public void testN2() {
-        T_multianewarray_1 t = new T_multianewarray_1();
-        String[][][] res = t.run(2, 0, 4);
-
-        try {
-            String s = res[2][0][0];
-            fail("expected ArrayIndexOutOfBoundsException");
-            fail("dummy for s "+s);
-        } catch (ArrayIndexOutOfBoundsException ae) {
-            // expected
-        }
-    }
-
-    /**
-     * @title  multinewarray must only be used to create array with
-     * dimensions specified by dimensions operand
-     */
-    public void testN3() {
-        T_multianewarray_9 t = new T_multianewarray_9();
-        String[][][] res = t.run(2, 1, 4);
-
-        if (res.length != 2) fail("incorrect multiarray length");
-        if (res[0].length != 1) fail("incorrect array length");
-
-        try {
-            int i = res[0][0].length;
-            fail("expected NullPointerException");
-            fail("dummy for i "+i);
-        } catch (NullPointerException npe) {
-            // expected
-        }
-    }
-
-    /**
-     * @title expected NegativeArraySizeException
-     */
-    public void testE1() {
-        T_multianewarray_1 t = new T_multianewarray_1();
-        try {
-            t.run(2, -5, 3);
-            fail("expected NegativeArraySizeException");
-        } catch (NegativeArraySizeException nase) {
-            // expected
-        }
-    }
-
-    /**
-     * @title expected IllegalAccessError
-     */
-    public void testE2() {
-        // @uses dxc.junit.opcodes.multianewarray.jm.sub.TestStubs$TestStub
-        try {
-            T_multianewarray_2 t = new T_multianewarray_2();
-            t.run(2, 5, 3);
-            fail("expected IllegalAccessError");
-        } catch (IllegalAccessError iae) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title expected NoClassDefFoundError
-     */
-    public void testE3() {
-        try {
-        T_multianewarray_7 t = new T_multianewarray_7();
-            t.run(2, 5, 3);
-            fail("expected NoClassDefFoundError");
-        } catch (NoClassDefFoundError e) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.16
-     * @title constant pool index
-     */
-    public void testVFE1() {
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.multianewarray.jm.T_multianewarray_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE2() {
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.multianewarray.jm.T_multianewarray_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - float
-     */
-    public void testVFE3() {
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.multianewarray.jm.T_multianewarray_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.19
-     * @title dimension size must not be zero
-     */
-    public void testVFE4() {
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.multianewarray.jm.T_multianewarray_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.16
-     * @title constant pool type
-     */
-    public void testVFE5() {
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.multianewarray.jm.T_multianewarray_8");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - reference
-     */
-    public void testVFE6() {
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.multianewarray.jm.T_multianewarray_10");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_1.j b/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_1.j
deleted file mode 100644
index 745bb41..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_1.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_multianewarray_1.java
-.class public dxc/junit/opcodes/multianewarray/jm/T_multianewarray_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(III)[[[Ljava/lang/String;
-    .limit stack 3
-    .limit locals 4
-    iload_1
-    iload_2
-    iload_3
-    multianewarray [[[Ljava/lang/String; 3
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_1.java b/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_1.java
deleted file mode 100644
index 8acf7ab..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.multianewarray.jm;
-
-public class T_multianewarray_1 {
-
-    public String[][][] run(int d1, int d2, int d3) {
-        return new String[d1][d2][d3];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_10.j b/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_10.j
deleted file mode 100644
index 2fc8358..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_10.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_multianewarray_10.java
-.class public dxc/junit/opcodes/multianewarray/jm/T_multianewarray_10
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)[[Ljava/lang/String;
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-    aload_0
-    multianewarray [[Ljava/lang/String; 2
-    areturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_10.java b/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_10.java
deleted file mode 100644
index 3ee7dc1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_10.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.multianewarray.jm;
-
-public class T_multianewarray_10 {
-    
-    public String[][] run(int d1, int d2) {
-        return new String[d1][d2];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_2.j b/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_2.j
deleted file mode 100644
index 6fe2d3f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_multianewarray_2.java
-.class public dxc/junit/opcodes/multianewarray/jm/T_multianewarray_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(III)V
-    .limit stack 3
-    .limit locals 4
-    iload_1
-    iload_2
-    iload_3
-    multianewarray [[[Ldxc/junit/opcodes/multianewarray/jm/sub/TestStubs$TestStub; 3
-    pop
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_2.java b/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_2.java
deleted file mode 100644
index fd248e2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_2.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.multianewarray.jm;
-
-public class T_multianewarray_2 {
-
-    public void run(int d1, int d2, int d3) {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_3.cfh b/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_3.cfh
deleted file mode 100644
index 58462bd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_3.cfh
+++ /dev/null
@@ -1,197 +0,0 @@
-//@class:dxc/junit/opcodes/multianewarray/jm/T_multianewarray_3
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0010
-// .  .  
-   00 10 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0e 00 08 
-    // parsed:, offset 15, len 57, h: 0002: utf8{"dxc/junit/opcodes/multianewarray/jm/T_multianewarray_3"}
-    // .  .  6  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  m  u  l  t  i  a  n  e  w  a  r  r  a  y  /  j  m  /  T  _  m  u  l  t  i  a  n  e  w  a  r  r  a  y  _  3  
-       01 00 36 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 6d 75 6c 74 69 61 6e 65 77 61 72 72 61 79 2f 6a 6d 2f 54 5f 6d 75 6c 74 69 61 6e 65 77 61 72 72 61 79 5f 33 
-    // parsed:, offset 72, len 19, h: 0003: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 91, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 104, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 113, len 3, h: 0006: type{dxc.junit.opcodes.multianewarray.jm.T_multianewarray_3}
-    // .  .  .  
-       07 00 02 
-    // parsed:, offset 116, len 6, h: 0007: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 122, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0c 
-    // parsed:, offset 127, len 26, h: 0009: utf8{"T_multianewarray_3.java"}
-    // .  .  .  T  _  m  u  l  t  i  a  n  e  w  a  r  r  a  y  _  3  .  j  a  v  a  
-       01 00 17 54 5f 6d 75 6c 74 69 61 6e 65 77 61 72 72 61 79 5f 33 2e 6a 61 76 61 
-    // parsed:, offset 153, len 7, h: 000a: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 160, len 24, h: 000b: utf8{"[[[Ljava/lang/String;"}
-    // .  .  .  [  [  [  L  j  a  v  a  /  l  a  n  g  /  S  t  r  i  n  g  ;  
-       01 00 15 5b 5b 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 
-    // parsed:, offset 184, len 6, h: 000c: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 190, len 29, h: 000d: utf8{"(III)[[[Ljava/lang/String;"}
-    // .  .  .  (  I  I  I  )  [  [  [  L  j  a  v  a  /  l  a  n  g  /  S  t  r  i  n  g  ;  
-       01 00 1a 28 49 49 49 29 5b 5b 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 
-    // parsed:, offset 219, len 3, h: 000e: type{java.lang.Object}
-    // .  .  .  
-       07 00 03 
-    // parsed:, offset 222, len 3, h: 000f: type{java.lang.String[][][]}
-    // .  .  .  
-       07 00 0b 
-// parsed:, offset 225, len 0, h: end constant_pool
-// parsed:, offset 225, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 227, len 2, h: this_class: type{dxc.junit.opcodes.multianewarray.jm.T_multianewarray_3}
-// .  .  
-   00 06 
-// parsed:, offset 229, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0e 
-// parsed:, offset 231, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 233, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 235, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 237, len:75,desc: ()V
-// parsed:, offset 237, len 0, h:  methods[0]: 
-    // parsed:, offset 237, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 239, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 241, len 2, h: descriptor: ()V
-    // .  .  
-       00 0c 
-    // parsed:, offset 243, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 245, len 0, h:  attributes[0]: 
-        // parsed:, offset 245, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 247, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 251, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 253, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 255, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 264, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 266, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 268, len 0, h: end attributes[0] 
-// parsed:, offset 268, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 268, len:44,desc: (III)[[[Ljava/lang/String;
-// parsed:, offset 268, len 0, h:  methods[1]: 
-    // parsed:, offset 268, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 270, len 2, h: name: run
-    // .  .  
-       00 07 
-    // parsed:, offset 272, len 2, h: descriptor: (III)[[[Ljava/lang/String;
-    // .  .  
-       00 0d 
-    // parsed:, offset 274, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 276, len 0, h:  attributes[0]: 
-        // parsed:, offset 276, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 278, len 4, h: length: 00000014
-        // .  .  .  .  
-           00 00 00 14 
-        // parsed:, offset 282, len 2, h: max_stack: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 284, len 2, h: max_locals: 0004
-        // .  .  
-           00 04 
-        // parsed:, offset 286, len 4, h: code_length: 00000008
-        // .  .  .  .  
-           00 00 00 08 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 1, h: 0001: iload_2 // 02
-        // .  
-           1c 
-        // parsed:, offset 2, len 1, h: 0002: iload_3 // 03
-        // .  
-           1d 
-        // parsed:, offset 3, len 4, h: 0003: multianewarray type{java.lang.String[][][]}, 03
-        // .  .  .  .  
-//@mod           c5 00 0f 03 
-           c5 01 0f 03 
-        // parsed:, offset 7, len 1, h: 0007: areturn
-        // .  
-           b0 
-        // parsed:, offset 298, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 300, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 302, len 0, h: end attributes[0] 
-// parsed:, offset 302, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (III)[[[Ljava/lang/String;
-// parsed:, offset 302, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 304, len 0, h:  attributes[0]: 
-    // parsed:, offset 304, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 306, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 310, len 2, h: source: utf8{"T_multianewarray_3.java"}
-    // .  .  
-       00 09 
-// parsed:, offset 312, len 0, h: end attributes[0] 
-// parsed:, offset 312, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_3.j b/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_3.j
deleted file mode 100644
index 7ca4a03..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_3.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_multianewarray_3.java
-.class public dxc/junit/opcodes/multianewarray/jm/T_multianewarray_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(III)[[[Ljava/lang/String;
-    .limit stack 3
-    .limit locals 4
-    iload_1
-    iload_2
-    iload_3
-    multianewarray [[[Ljava/lang/String; 3
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_3.java b/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_3.java
deleted file mode 100644
index 468ff6e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.multianewarray.jm;
-
-public class T_multianewarray_3 {
-
-    public String[][][] run(int d1, int d2, int d3) {
-        return new String[d1][d2][d3];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_4.j b/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_4.j
deleted file mode 100644
index 3583a5a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_4.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_multianewarray_4.java
-.class public dxc/junit/opcodes/multianewarray/jm/T_multianewarray_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)[[Ljava/lang/String;
-    .limit stack 2
-    .limit locals 3
-    iload_1
-;    iload_2
-    multianewarray [[Ljava/lang/String; 2
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_4.java b/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_4.java
deleted file mode 100644
index 24e7c45..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.multianewarray.jm;
-
-public class T_multianewarray_4 {
-
-    public String[][] run(int d1, int d2) {
-        return new String[d1][d2];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_5.j b/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_5.j
deleted file mode 100644
index 825fd4a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_5.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_multianewarray_5.java
-.class public dxc/junit/opcodes/multianewarray/jm/T_multianewarray_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)[[Ljava/lang/String;
-    .limit stack 2
-    .limit locals 3
-    iload_1
-    fconst_1
-    multianewarray [[Ljava/lang/String; 2
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_5.java b/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_5.java
deleted file mode 100644
index c213317..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.multianewarray.jm;
-
-public class T_multianewarray_5 {
-
-    public String[][] run(int d1, int d2) {
-        return new String[d1][d2];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_6.j b/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_6.j
deleted file mode 100644
index ef716e4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_6.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_multianewarray_6.java
-.class public dxc/junit/opcodes/multianewarray/jm/T_multianewarray_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)[[Ljava/lang/String;
-    .limit stack 2
-    .limit locals 3
-    iload_1
-    iload_2
-    multianewarray [[Ljava/lang/String; 0
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_6.java b/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_6.java
deleted file mode 100644
index ce6033c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.multianewarray.jm;
-
-public class T_multianewarray_6 {
-
-    public String[][] run(int d1, int d2) {
-        return new String[d1][d2];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_7.j b/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_7.j
deleted file mode 100644
index bce3003..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_7.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_multianewarray_7.java
-.class public dxc/junit/opcodes/multianewarray/jm/T_multianewarray_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(III)V
-    .limit stack 3
-    .limit locals 4
-    iload_1
-    iload_2
-    iload_3
-    ; class not found exception
-    multianewarray [[[Ldxc/junit/opcodes/multianewarray/jm/Foobar1; 3
-    pop
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_7.java b/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_7.java
deleted file mode 100644
index 27939ad..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_7.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.multianewarray.jm;
-
-public class T_multianewarray_7 {
-
-    public void run(int d1, int d2, int d3) {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_8.cfh b/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_8.cfh
deleted file mode 100644
index 9228061..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_8.cfh
+++ /dev/null
@@ -1,206 +0,0 @@
-//@class:dxc/junit/opcodes/multianewarray/jm/T_multianewarray_8
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0011
-// .  .  
-   00 11 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0e 00 06 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 6, h: 0005: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 62, len 5, h: 0006: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 09 
-    // parsed:, offset 67, len 7, h: 0007: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 74, len 24, h: 0008: utf8{"[[[Ljava/lang/String;"}
-    // .  .  .  [  [  [  L  j  a  v  a  /  l  a  n  g  /  S  t  r  i  n  g  ;  
-       01 00 15 5b 5b 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 
-    // parsed:, offset 98, len 6, h: 0009: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 104, len 5, h: 000a: float{0x4048f5c3 / 3.14}
-    // .  @  H  .  .  
-       04 40 48 f5 c3 
-    // parsed:, offset 109, len 26, h: 000b: utf8{"T_multianewarray_8.java"}
-    // .  .  .  T  _  m  u  l  t  i  a  n  e  w  a  r  r  a  y  _  8  .  j  a  v  a  
-       01 00 17 54 5f 6d 75 6c 74 69 61 6e 65 77 61 72 72 61 79 5f 38 2e 6a 61 76 61 
-    // parsed:, offset 135, len 3, h: 000c: type{java.lang.String[][][]}
-    // .  .  .  
-       07 00 08 
-    // parsed:, offset 138, len 57, h: 000d: utf8{"dxc/junit/opcodes/multianewarray/jm/T_multianewarray_8"}
-    // .  .  6  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  m  u  l  t  i  a  n  e  w  a  r  r  a  y  /  j  m  /  T  _  m  u  l  t  i  a  n  e  w  a  r  r  a  y  _  8  
-       01 00 36 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 6d 75 6c 74 69 61 6e 65 77 61 72 72 61 79 2f 6a 6d 2f 54 5f 6d 75 6c 74 69 61 6e 65 77 61 72 72 61 79 5f 38 
-    // parsed:, offset 195, len 3, h: 000e: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-    // parsed:, offset 198, len 29, h: 000f: utf8{"(III)[[[Ljava/lang/String;"}
-    // .  .  .  (  I  I  I  )  [  [  [  L  j  a  v  a  /  l  a  n  g  /  S  t  r  i  n  g  ;  
-       01 00 1a 28 49 49 49 29 5b 5b 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 
-    // parsed:, offset 227, len 3, h: 0010: type{dxc.junit.opcodes.multianewarray.jm.T_multianewarray_8}
-    // .  .  .  
-       07 00 0d 
-// parsed:, offset 230, len 0, h: end constant_pool
-// parsed:, offset 230, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 232, len 2, h: this_class: type{dxc.junit.opcodes.multianewarray.jm.T_multianewarray_8}
-// .  .  
-   00 10 
-// parsed:, offset 234, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0e 
-// parsed:, offset 236, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 238, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 240, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 242, len:78,desc: ()V
-// parsed:, offset 242, len 0, h:  methods[0]: 
-    // parsed:, offset 242, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 244, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 246, len 2, h: descriptor: ()V
-    // .  .  
-       00 09 
-    // parsed:, offset 248, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 250, len 0, h:  attributes[0]: 
-        // parsed:, offset 250, len 2, h: name: Code
-        // .  .  
-           00 07 
-        // parsed:, offset 252, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 256, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 258, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 260, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 269, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 271, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 273, len 0, h: end attributes[0] 
-// parsed:, offset 273, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 273, len:47,desc: (III)[[[Ljava/lang/String;
-// parsed:, offset 273, len 0, h:  methods[1]: 
-    // parsed:, offset 273, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 275, len 2, h: name: run
-    // .  .  
-       00 05 
-    // parsed:, offset 277, len 2, h: descriptor: (III)[[[Ljava/lang/String;
-    // .  .  
-       00 0f 
-    // parsed:, offset 279, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 281, len 0, h:  attributes[0]: 
-        // parsed:, offset 281, len 2, h: name: Code
-        // .  .  
-           00 07 
-        // parsed:, offset 283, len 4, h: length: 00000017
-        // .  .  .  .  
-           00 00 00 17 
-        // parsed:, offset 287, len 2, h: max_stack: 0003
-        // .  .  
-           00 03 
-        // parsed:, offset 289, len 2, h: max_locals: 0004
-        // .  .  
-           00 04 
-        // parsed:, offset 291, len 4, h: code_length: 0000000b
-        // .  .  .  .  
-           00 00 00 0b 
-        // parsed:, offset 0, len 2, h: 0000: ldc #4048f5c3 // 3.14
-        // .  .  
-           12 0a 
-        // parsed:, offset 2, len 1, h: 0002: pop
-        // W  
-           57 
-        // parsed:, offset 3, len 1, h: 0003: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 4, len 1, h: 0004: iload_2 // 02
-        // .  
-           1c 
-        // parsed:, offset 5, len 1, h: 0005: iload_3 // 03
-        // .  
-           1d 
-        // parsed:, offset 6, len 4, h: 0006: multianewarray type{java.lang.String[][][]}, 03
-        // .  .  .  .  
-//@mod           c5 00 0c 03 
-           c5 00 0a 03 
-        // parsed:, offset 10, len 1, h: 000a: areturn
-        // .  
-           b0 
-        // parsed:, offset 306, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 308, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 310, len 0, h: end attributes[0] 
-// parsed:, offset 310, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (III)[[[Ljava/lang/String;
-// parsed:, offset 310, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 312, len 0, h:  attributes[0]: 
-    // parsed:, offset 312, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 314, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 318, len 2, h: source: utf8{"T_multianewarray_8.java"}
-    // .  .  
-       00 0b 
-// parsed:, offset 320, len 0, h: end attributes[0] 
-// parsed:, offset 320, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_8.j b/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_8.j
deleted file mode 100644
index 5d315c2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_8.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_multianewarray_8.java
-.class public dxc/junit/opcodes/multianewarray/jm/T_multianewarray_8
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(III)[[[Ljava/lang/String;
-    .limit stack 3
-    .limit locals 4
-    
-    ldc 3.14
-    pop
-    
-    iload_1
-    iload_2
-    iload_3
-    multianewarray [[[Ljava/lang/String; 3
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_8.java b/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_8.java
deleted file mode 100644
index 7b4aa01..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.multianewarray.jm;
-
-public class T_multianewarray_8 {
-
-    public String[][][] run(int d1, int d2, int d3) {
-        return new String[d1][d2][d3];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_9.j b/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_9.j
deleted file mode 100644
index b814c67..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_9.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_multianewarray_9.java
-.class public dxc/junit/opcodes/multianewarray/jm/T_multianewarray_9
-.super java/lang/Object
-
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(III)[[[Ljava/lang/String;
-    .limit stack 2
-    .limit locals 4
-
-    iload_1
-    iload_2
-    multianewarray [[[Ljava/lang/String; 2
-
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_9.java b/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_9.java
deleted file mode 100644
index 0df794d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/T_multianewarray_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.multianewarray.jm;
-
-public class T_multianewarray_9 {
-
-    public String[][][] run(int d1, int d2, int d3) {
-        return new String[d1][d2][];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/sub/TestStubs.java b/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/sub/TestStubs.java
deleted file mode 100644
index ee091bb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/multianewarray/jm/sub/TestStubs.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.multianewarray.jm.sub;
-
-public class TestStubs {
-
-    @SuppressWarnings("unused")
-    private class TestStub {
-        // used by testE2
-    }
-    
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/newarray/Test_newarray.java b/tools/dx-tests/src/dxc/junit/opcodes/newarray/Test_newarray.java
deleted file mode 100644
index 4126bba..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/newarray/Test_newarray.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.newarray;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.newarray.jm.T_newarray_1;
-import dxc.junit.opcodes.newarray.jm.T_newarray_2;
-
-public class Test_newarray extends DxTestCase {
-
-    /**
-     * @title  Array of ints
-     */
-    public void testN1() {
-        T_newarray_1 t = new T_newarray_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 floats
-     */
-    public void testN2() {
-        T_newarray_2 t = new T_newarray_2();
-        float[] r = t.run(10);
-        int l = r.length;
-        assertEquals(10, l);
-
-        // check default initialization
-        for (int i = 0; i < l; i++) {
-            assertEquals(0f, r[i]);
-        }
-    }
-
-    /**
-     * @title expected NegativeArraySizeException
-     */
-    public void testE1() {
-        T_newarray_2 t = new T_newarray_2();
-        try {
-            t.run(-1);
-            fail("expected NegativeArraySizeException");
-        } catch (NegativeArraySizeException nase) {
-            // expected
-        }
-    }
-
-    /**
-     * @title  Array size = 0
-     */
-    public void testB1() {
-        T_newarray_1 t = new T_newarray_1();
-        int[] r = t.run(0);
-        assertNotNull(r);
-        assertEquals(0, r.length);
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.newarray.jm.T_newarray_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.newarray.jm.T_newarray_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.20
-     * @title atype must take one of the following
-     * values
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.newarray.jm.T_newarray_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - reference
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.newarray.jm.T_newarray_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_1.j b/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_1.j
deleted file mode 100644
index afe0883..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_1.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_newarray_1.java
-.class public dxc/junit/opcodes/newarray/jm/T_newarray_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)[I
-    .limit locals 2
-    .limit stack 2
-    iload_1
-    newarray int
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_1.java b/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_1.java
deleted file mode 100644
index 0d5d439..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.newarray.jm;
-
-public class T_newarray_1 {
-
-    public int[] run(int sz) {
-        return new int[sz];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_2.j b/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_2.j
deleted file mode 100644
index a04589d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_2.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_newarray_2.java
-.class public dxc/junit/opcodes/newarray/jm/T_newarray_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)[F
-    .limit locals 2
-    .limit stack 2
-    iload_1
-    newarray float
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_2.java b/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_2.java
deleted file mode 100644
index 419f2d5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.newarray.jm;
-
-public class T_newarray_2 {
-
-    public float[] run(int sz) {
-        return new float[sz];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_3.j b/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_3.j
deleted file mode 100644
index 51c1004..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_3.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_newarray_3.java
-.class public dxc/junit/opcodes/newarray/jm/T_newarray_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)[I
-    .limit locals 2
-    .limit stack 2
-;    iload_1
-    newarray int
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_3.java b/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_3.java
deleted file mode 100644
index 9de24fc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.newarray.jm;
-
-public class T_newarray_3 {
-
-    public int[] run(int sz) {
-        return new int[sz];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_4.j b/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_4.j
deleted file mode 100644
index 9f56669..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_4.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_newarray_4.java
-.class public dxc/junit/opcodes/newarray/jm/T_newarray_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)[I
-    .limit locals 2
-    .limit stack 2
-;    iload_1
-    fconst_1
-    newarray int
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_4.java b/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_4.java
deleted file mode 100644
index 1fcb3b8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.newarray.jm;
-
-public class T_newarray_4 {
-
-    public int[] run(int sz) {
-        return new int[sz];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_5.cfh b/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_5.cfh
deleted file mode 100644
index b59839a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_5.cfh
+++ /dev/null
@@ -1,185 +0,0 @@
-//@class:dxc/junit/opcodes/newarray/jm/T_newarray_5
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0d 00 07 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 45, h: 0005: utf8{"dxc/junit/opcodes/newarray/jm/T_newarray_5"}
-    // .  .  *  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  n  e  w  a  r  r  a  y  /  j  m  /  T  _  n  e  w  a  r  r  a  y  _  5  
-       01 00 2a 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 6e 65 77 61 72 72 61 79 2f 6a 6d 2f 54 5f 6e 65 77 61 72 72 61 79 5f 35 
-    // parsed:, offset 101, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 107, len 5, h: 0007: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 0c 
-    // parsed:, offset 112, len 3, h: 0008: type{dxc.junit.opcodes.newarray.jm.T_newarray_5}
-    // .  .  .  
-       07 00 05 
-    // parsed:, offset 115, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 122, len 20, h: 000a: utf8{"T_newarray_5.java"}
-    // .  .  .  T  _  n  e  w  a  r  r  a  y  _  5  .  j  a  v  a  
-       01 00 11 54 5f 6e 65 77 61 72 72 61 79 5f 35 2e 6a 61 76 61 
-    // parsed:, offset 142, len 8, h: 000b: utf8{"(I)[I"}
-    // .  .  .  (  I  )  [  I  
-       01 00 05 28 49 29 5b 49 
-    // parsed:, offset 150, len 6, h: 000c: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 156, len 3, h: 000d: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 159, len 0, h: end constant_pool
-// parsed:, offset 159, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 161, len 2, h: this_class: type{dxc.junit.opcodes.newarray.jm.T_newarray_5}
-// .  .  
-   00 08 
-// parsed:, offset 163, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0d 
-// parsed:, offset 165, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 167, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 169, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 171, len:71,desc: ()V
-// parsed:, offset 171, len 0, h:  methods[0]: 
-    // parsed:, offset 171, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 173, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 175, len 2, h: descriptor: ()V
-    // .  .  
-       00 0c 
-    // parsed:, offset 177, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 179, len 0, h:  attributes[0]: 
-        // parsed:, offset 179, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 181, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 185, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 187, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 189, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 198, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 200, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 202, len 0, h: end attributes[0] 
-// parsed:, offset 202, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 202, len:40,desc: (I)[I
-// parsed:, offset 202, len 0, h:  methods[1]: 
-    // parsed:, offset 202, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 204, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 206, len 2, h: descriptor: (I)[I
-    // .  .  
-       00 0b 
-    // parsed:, offset 208, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 210, len 0, h:  attributes[0]: 
-        // parsed:, offset 210, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 212, len 4, h: length: 00000010
-        // .  .  .  .  
-           00 00 00 10 
-        // parsed:, offset 216, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 218, len 2, h: max_locals: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 220, len 4, h: code_length: 00000004
-        // .  .  .  .  
-           00 00 00 04 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 2, h: 0001: newarray int
-        // .  .  
-//@mod     bc 0a    
-           bc 03 
-        // parsed:, offset 3, len 1, h: 0003: areturn
-        // .  
-           b0 
-        // parsed:, offset 228, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 230, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 232, len 0, h: end attributes[0] 
-// parsed:, offset 232, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (I)[I
-// parsed:, offset 232, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 234, len 0, h:  attributes[0]: 
-    // parsed:, offset 234, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 236, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 240, len 2, h: source: utf8{"T_newarray_5.java"}
-    // .  .  
-       00 0a 
-// parsed:, offset 242, len 0, h: end attributes[0] 
-// parsed:, offset 242, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_5.j b/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_5.j
deleted file mode 100644
index 06737b4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_5.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_newarray_5.java
-.class public dxc/junit/opcodes/newarray/jm/T_newarray_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)[I
-    .limit locals 2
-    .limit stack 2
-    iload_1
-    newarray int
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_5.java b/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_5.java
deleted file mode 100644
index 7ad3257..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.newarray.jm;
-
-public class T_newarray_5 {
-
-    public int[] run(int sz) {
-        return new int[sz];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_6.j b/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_6.j
deleted file mode 100644
index db58795..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_6.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_newarray_6.java
-.class public dxc/junit/opcodes/newarray/jm/T_newarray_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)[I
-    .limit stack 1
-    .limit locals 2
-
-    aload_0
-    newarray int
-    areturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_6.java b/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_6.java
deleted file mode 100644
index 6729fa4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/newarray/jm/T_newarray_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.newarray.jm;
-
-public class T_newarray_6 {
-    
-    public int[] run(int sz) {
-        return new int[sz];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/nop/Test_nop.java b/tools/dx-tests/src/dxc/junit/opcodes/nop/Test_nop.java
deleted file mode 100644
index 78e019b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/nop/Test_nop.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.nop;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.opcodes.nop.jm.T_nop_1;
-
-public class Test_nop extends DxTestCase {
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_nop_1 t = new T_nop_1();
-        // how do we test nop - e.g. push some data onto the stack, and
-        // test if nothing has changed
-        assertTrue(t.run());
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/nop/jm/T_nop_1.j b/tools/dx-tests/src/dxc/junit/opcodes/nop/jm/T_nop_1.j
deleted file mode 100644
index d4ddbed..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/nop/jm/T_nop_1.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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 dxc/junit/opcodes/nop/jm/T_nop_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 4
-    ldc2_w 12345678
-    nop
-    nop
-    nop
-    nop
-    nop
-    dup2
-    nop
-    nop
-    nop
-    lcmp
-    ifne Label0
-    iconst_1
-    ireturn
-Label0:
-    iconst_0    
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/nop/jm/T_nop_1.java b/tools/dx-tests/src/dxc/junit/opcodes/nop/jm/T_nop_1.java
deleted file mode 100644
index be36869..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/nop/jm/T_nop_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.nop.jm;
-
-public class T_nop_1 {
-
-    public boolean run() {
-      return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/Test_opc_goto.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/Test_opc_goto.java
deleted file mode 100644
index b4a9ccc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/Test_opc_goto.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_goto;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.opc_goto.jm.T_opc_goto_1;
-import dxc.junit.opcodes.opc_goto.jm.T_opc_goto_5;
-
-public class Test_opc_goto extends DxTestCase {
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_opc_goto_1 t = new T_opc_goto_1();
-        assertEquals(0, t.run(20));
-    }
-
-    /**
-     * @title normal test
-     */
-    public void testN2() {
-        T_opc_goto_1 t = new T_opc_goto_1();
-        assertEquals(-20, t.run(-20));
-    }
-
-    /**
-     * @title  negative offset
-     */
-    public void testN3() {
-        T_opc_goto_5 t = new T_opc_goto_5();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target is inside instruction
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.opc_goto.jm.T_opc_goto_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall be inside the
-     * method
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.opc_goto.jm.T_opc_goto_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.7
-     * @title branch target shall not be "inside" wide
-     * instruction
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.opc_goto.jm.T_opc_goto_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_1.j b/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_1.j
deleted file mode 100644
index 17477a9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_1.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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 dxc/junit/opcodes/opc_goto/jm/T_opc_goto_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-    goto Label0
-
-    Label1:
-    iinc 1 -1
-
-    Label0:
-    iload_1
-    ifgt Label1
-
-    iload_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_1.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_1.java
deleted file mode 100644
index 9e50e31..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_1.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_goto.jm;
-
-public class T_opc_goto_1 {
-
-    public int run(int a) {
-        while (a > 0) {
-            a--;
-        }
-        return a;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_2.cfh b/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_2.cfh
deleted file mode 100644
index 82dbe4f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_2.cfh
+++ /dev/null
@@ -1,193 +0,0 @@
-//@class:dxc/junit/opcodes/opc_goto/jm/T_opc_goto_2
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000f
-// .  .  
-   00 0f 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0e 00 06 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 6, h: 0005: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 62, len 5, h: 0006: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 0b 
-    // parsed:, offset 67, len 3, h: 0007: type{dxc.junit.opcodes.opc_goto.jm.T_opc_goto_2}
-    // .  .  .  
-       07 00 0a 
-    // parsed:, offset 70, len 7, h: 0008: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 77, len 3, h: 0009: string{"a"}
-    // .  .  .  
-       08 00 0c 
-    // parsed:, offset 80, len 45, h: 000a: utf8{"dxc/junit/opcodes/opc_goto/jm/T_opc_goto_2"}
-    // .  .  *  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  o  p  c  _  g  o  t  o  /  j  m  /  T  _  o  p  c  _  g  o  t  o  _  2  
-       01 00 2a 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 6f 70 63 5f 67 6f 74 6f 2f 6a 6d 2f 54 5f 6f 70 63 5f 67 6f 74 6f 5f 32 
-    // parsed:, offset 125, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 131, len 4, h: 000c: utf8{"a"}
-    // .  .  .  a  
-       01 00 01 61 
-    // parsed:, offset 135, len 20, h: 000d: utf8{"T_opc_goto_2.java"}
-    // .  .  .  T  _  o  p  c  _  g  o  t  o  _  2  .  j  a  v  a  
-       01 00 11 54 5f 6f 70 63 5f 67 6f 74 6f 5f 32 2e 6a 61 76 61 
-    // parsed:, offset 155, len 3, h: 000e: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 158, len 0, h: end constant_pool
-// parsed:, offset 158, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 160, len 2, h: this_class: type{dxc.junit.opcodes.opc_goto.jm.T_opc_goto_2}
-// .  .  
-   00 07 
-// parsed:, offset 162, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0e 
-// parsed:, offset 164, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 166, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 168, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 170, len:74,desc: ()V
-// parsed:, offset 170, len 0, h:  methods[0]: 
-    // parsed:, offset 170, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 172, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 174, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 176, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 178, len 0, h:  attributes[0]: 
-        // parsed:, offset 178, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 180, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 184, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 186, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 188, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 197, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 199, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 201, len 0, h: end attributes[0] 
-// parsed:, offset 201, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 201, len:43,desc: ()V
-// parsed:, offset 201, len 0, h:  methods[1]: 
-    // parsed:, offset 201, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 203, len 2, h: name: run
-    // .  .  
-       00 05 
-    // parsed:, offset 205, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 207, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 209, len 0, h:  attributes[0]: 
-        // parsed:, offset 209, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 211, len 4, h: length: 00000013
-        // .  .  .  .  
-           00 00 00 13 
-        // parsed:, offset 215, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 217, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 219, len 4, h: code_length: 00000007
-        // .  .  .  .  
-           00 00 00 07 
-        // parsed:, offset 0, len 3, h: 0000: goto 0004
-        // .  .  .  
-//@mod:    a7 00 04 
-// we jump to the parameter of a byte code (was: ldc, now: string "a"), so this 
-// must be rejected by the verifier            
-           a7 00 05
-        // parsed:, offset 3, len 1, h: 0003: return
-        // .  
-           b1 
-        // parsed:, offset 4, len 2, h: 0004: ldc string{"a"}
-        // .  .  
-           12 09 
-        // parsed:, offset 6, len 1, h: 0006: return
-        // .  
-           b1 
-        // parsed:, offset 230, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 232, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 234, len 0, h: end attributes[0] 
-// parsed:, offset 234, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()V
-// parsed:, offset 234, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 236, len 0, h:  attributes[0]: 
-    // parsed:, offset 236, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 238, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 242, len 2, h: source: utf8{"T_opc_goto_2.java"}
-    // .  .  
-       00 0d 
-// parsed:, offset 244, len 0, h: end attributes[0] 
-// parsed:, offset 244, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_2.j b/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_2.j
deleted file mode 100644
index 9a155df..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_2.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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 dxc/junit/opcodes/opc_goto/jm/T_opc_goto_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    goto Label0
-    return
-Label0:    
-    ldc "a"
-    return
-.end method
-
-
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_2.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_2.java
deleted file mode 100644
index 344523d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_goto.jm;
-
-public class T_opc_goto_2 {
-
-    public void run() {
-        String a = "a";
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_3.cfh b/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_3.cfh
deleted file mode 100644
index 89cfde8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_3.cfh
+++ /dev/null
@@ -1,191 +0,0 @@
-//@class:dxc/junit/opcodes/opc_goto/jm/T_opc_goto_3
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000f
-// .  .  
-   00 0f 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0e 00 08 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 3, h: 0004: string{"a"}
-    // .  .  .  
-       08 00 0d 
-    // parsed:, offset 50, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 59, len 20, h: 0006: utf8{"T_opc_goto_3.java"}
-    // .  .  .  T  _  o  p  c  _  g  o  t  o  _  3  .  j  a  v  a  
-       01 00 11 54 5f 6f 70 63 5f 67 6f 74 6f 5f 33 2e 6a 61 76 61 
-    // parsed:, offset 79, len 6, h: 0007: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 85, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0c 
-    // parsed:, offset 90, len 3, h: 0009: type{dxc.junit.opcodes.opc_goto.jm.T_opc_goto_3}
-    // .  .  .  
-       07 00 0b 
-    // parsed:, offset 93, len 7, h: 000a: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 100, len 45, h: 000b: utf8{"dxc/junit/opcodes/opc_goto/jm/T_opc_goto_3"}
-    // .  .  *  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  o  p  c  _  g  o  t  o  /  j  m  /  T  _  o  p  c  _  g  o  t  o  _  3  
-       01 00 2a 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 6f 70 63 5f 67 6f 74 6f 2f 6a 6d 2f 54 5f 6f 70 63 5f 67 6f 74 6f 5f 33 
-    // parsed:, offset 145, len 6, h: 000c: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 151, len 4, h: 000d: utf8{"a"}
-    // .  .  .  a  
-       01 00 01 61 
-    // parsed:, offset 155, len 3, h: 000e: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 158, len 0, h: end constant_pool
-// parsed:, offset 158, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 160, len 2, h: this_class: type{dxc.junit.opcodes.opc_goto.jm.T_opc_goto_3}
-// .  .  
-   00 09 
-// parsed:, offset 162, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0e 
-// parsed:, offset 164, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 166, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 168, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 170, len:74,desc: ()V
-// parsed:, offset 170, len 0, h:  methods[0]: 
-    // parsed:, offset 170, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 172, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 174, len 2, h: descriptor: ()V
-    // .  .  
-       00 0c 
-    // parsed:, offset 176, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 178, len 0, h:  attributes[0]: 
-        // parsed:, offset 178, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 180, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 184, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 186, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 188, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 197, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 199, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 201, len 0, h: end attributes[0] 
-// parsed:, offset 201, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 201, len:43,desc: ()V
-// parsed:, offset 201, len 0, h:  methods[1]: 
-    // parsed:, offset 201, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 203, len 2, h: name: run
-    // .  .  
-       00 07 
-    // parsed:, offset 205, len 2, h: descriptor: ()V
-    // .  .  
-       00 0c 
-    // parsed:, offset 207, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 209, len 0, h:  attributes[0]: 
-        // parsed:, offset 209, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 211, len 4, h: length: 00000013
-        // .  .  .  .  
-           00 00 00 13 
-        // parsed:, offset 215, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 217, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 219, len 4, h: code_length: 00000007
-        // .  .  .  .  
-           00 00 00 07 
-        // parsed:, offset 0, len 3, h: 0000: goto 0004
-        // .  .  .  
-//@mod           a7 00 04 
-           a7 00 ff 
-        // parsed:, offset 3, len 1, h: 0003: return
-        // .  
-           b1 
-        // parsed:, offset 4, len 2, h: 0004: ldc string{"a"}
-        // .  .  
-           12 04 
-        // parsed:, offset 6, len 1, h: 0006: return
-        // .  
-           b1 
-        // parsed:, offset 230, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 232, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 234, len 0, h: end attributes[0] 
-// parsed:, offset 234, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()V
-// parsed:, offset 234, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 236, len 0, h:  attributes[0]: 
-    // parsed:, offset 236, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 238, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 242, len 2, h: source: utf8{"T_opc_goto_3.java"}
-    // .  .  
-       00 06 
-// parsed:, offset 244, len 0, h: end attributes[0] 
-// parsed:, offset 244, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_3.j b/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_3.j
deleted file mode 100644
index 926612c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_3.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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 dxc/junit/opcodes/opc_goto/jm/T_opc_goto_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    goto Label0
-    return
-Label0:    
-    ldc "a"
-    return
-.end method
-
-
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_3.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_3.java
deleted file mode 100644
index 243af4f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_goto.jm;
-
-public class T_opc_goto_3 {
-
-    public void run() {
-        String a = "a";
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_4.cfh b/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_4.cfh
deleted file mode 100644
index 1b60dd5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_4.cfh
+++ /dev/null
@@ -1,182 +0,0 @@
-//@class:dxc/junit/opcodes/opc_goto/jm/T_opc_goto_4
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000d
-// .  .  
-   00 0d 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0c 00 06 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 6, h: 0005: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 62, len 5, h: 0006: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 0b 
-    // parsed:, offset 67, len 3, h: 0007: type{dxc.junit.opcodes.opc_goto.jm.T_opc_goto_4}
-    // .  .  .  
-       07 00 08 
-    // parsed:, offset 70, len 45, h: 0008: utf8{"dxc/junit/opcodes/opc_goto/jm/T_opc_goto_4"}
-    // .  .  *  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  o  p  c  _  g  o  t  o  /  j  m  /  T  _  o  p  c  _  g  o  t  o  _  4  
-       01 00 2a 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 6f 70 63 5f 67 6f 74 6f 2f 6a 6d 2f 54 5f 6f 70 63 5f 67 6f 74 6f 5f 34 
-    // parsed:, offset 115, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 122, len 20, h: 000a: utf8{"T_opc_goto_4.java"}
-    // .  .  .  T  _  o  p  c  _  g  o  t  o  _  4  .  j  a  v  a  
-       01 00 11 54 5f 6f 70 63 5f 67 6f 74 6f 5f 34 2e 6a 61 76 61 
-    // parsed:, offset 142, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 148, len 3, h: 000c: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 151, len 0, h: end constant_pool
-// parsed:, offset 151, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 153, len 2, h: this_class: type{dxc.junit.opcodes.opc_goto.jm.T_opc_goto_4}
-// .  .  
-   00 07 
-// parsed:, offset 155, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0c 
-// parsed:, offset 157, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 159, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 161, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 163, len:75,desc: ()V
-// parsed:, offset 163, len 0, h:  methods[0]: 
-    // parsed:, offset 163, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 165, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 167, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 169, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 171, len 0, h:  attributes[0]: 
-        // parsed:, offset 171, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 173, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 177, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 179, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 181, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 190, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 192, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 194, len 0, h: end attributes[0] 
-// parsed:, offset 194, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 194, len:44,desc: ()V
-// parsed:, offset 194, len 0, h:  methods[1]: 
-    // parsed:, offset 194, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 196, len 2, h: name: run
-    // .  .  
-       00 05 
-    // parsed:, offset 198, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 200, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 202, len 0, h:  attributes[0]: 
-        // parsed:, offset 202, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 204, len 4, h: length: 00000014
-        // .  .  .  .  
-           00 00 00 14 
-        // parsed:, offset 208, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 210, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 212, len 4, h: code_length: 00000008
-        // .  .  .  .  
-           00 00 00 08 
-        // parsed:, offset 0, len 3, h: 0000: goto 0003
-        // .  .  .  
-//@mod           a7 00 03 
-           a7 00 04 
-        // parsed:, offset 3, len 4, h: 0003: wide aload 0000
-        // .  .  .  .  
-           c4 19 00 00 
-        // parsed:, offset 7, len 1, h: 0007: return
-        // .  
-           b1 
-        // parsed:, offset 224, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 226, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 228, len 0, h: end attributes[0] 
-// parsed:, offset 228, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()V
-// parsed:, offset 228, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 230, len 0, h:  attributes[0]: 
-    // parsed:, offset 230, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 232, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 236, len 2, h: source: utf8{"T_opc_goto_4.java"}
-    // .  .  
-       00 0a 
-// parsed:, offset 238, len 0, h: end attributes[0] 
-// parsed:, offset 238, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_4.j b/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_4.j
deleted file mode 100644
index 9fda78a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_4.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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 dxc/junit/opcodes/opc_goto/jm/T_opc_goto_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    goto Label0
-Label0:    
-    aload_w 0
-    return
-.end method
-
-
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_4.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_4.java
deleted file mode 100644
index 1b6e4ab..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_goto.jm;
-
-public class T_opc_goto_4 {
-
-    public void run() {
-        String a = "a";
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_5.j b/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_5.j
deleted file mode 100644
index 12e5804..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_5.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_5.java
-.class public dxc/junit/opcodes/opc_goto/jm/T_opc_goto_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    goto Label1
-Label0:
-    nop
-    nop
-    nop
-    iconst_1
-    ireturn
-Label1:    
-    goto Label0
-    iconst_0
-    ireturn
-.end method
-
-
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_5.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_5.java
deleted file mode 100644
index 61d7c4d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_goto/jm/T_opc_goto_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_goto.jm;
-
-public class T_opc_goto_5 {
-
-    public boolean run() {
-        return true;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/TestStubs.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/TestStubs.java
deleted file mode 100644
index 03fb771..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/TestStubs.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_instanceof;
-
-public class TestStubs {
-    @SuppressWarnings("unused")
-    private class TestStub {
-        // testE1
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/Test_opc_instanceof.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/Test_opc_instanceof.java
deleted file mode 100644
index b5278df..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/Test_opc_instanceof.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_instanceof;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.opc_instanceof.jm.T_opc_instanceof_1;
-import dxc.junit.opcodes.opc_instanceof.jm.T_opc_instanceof_2;
-import dxc.junit.opcodes.opc_instanceof.jm.T_opc_instanceof_3;
-import dxc.junit.opcodes.opc_instanceof.jm.T_opc_instanceof_7;
-
-public class Test_opc_instanceof extends DxTestCase {
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_opc_instanceof_1 t = new T_opc_instanceof_1();
-        assertTrue(t.run(""));
-    }
-
-    /**
-     * @title check null value
-     */
-    public void testN2() {
-        T_opc_instanceof_1 t = new T_opc_instanceof_1();
-        assertFalse(t.run(null));
-    }
-
-    /**
-     * @title normal test
-     */
-    public void testN3() {
-        T_opc_instanceof_1 t = new T_opc_instanceof_1();
-        assertFalse(t.run(this));
-    }
-
-    /**
-     * @title normal test
-     */
-    public void testN4() {
-        // @uses dxc.junit.opcodes.opc_instanceof.jm.SubClass
-        // @uses dxc.junit.opcodes.opc_instanceof.jm.SuperClass
-        // @uses dxc.junit.opcodes.opc_instanceof.jm.SuperInterface
-        // @uses dxc.junit.opcodes.opc_instanceof.jm.SuperInterface2
-        T_opc_instanceof_2 t = new T_opc_instanceof_2();
-        assertEquals(0, t.run());
-    }
-
-    /**
-     * @title expected IllegalAccessError
-     */
-    public void testE1() {
-        // @uses dxc.junit.opcodes.opc_instanceof.jm.TestStubs$TestStub
-        T_opc_instanceof_3 t = new T_opc_instanceof_3();
-        try {
-            t.run();
-            fail("expected IllegalAccessError");
-        } catch (IllegalAccessError e) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title expected NoClassDefFoundError
-     */
-    public void testE2() {
-        T_opc_instanceof_7 t = new T_opc_instanceof_7();
-        try {
-            t.run();
-            fail("expected NoClassDefFoundError");
-        } catch (NoClassDefFoundError e) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-    
-    /**
-     * @constraint 4.8.1.16
-     * @title constant pool index
-     */
-    public void testVFE1() {
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.opc_instanceof.jm.T_opc_instanceof_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - float
-     */
-    public void testVFE2() {
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.opc_instanceof.jm.T_opc_instanceof_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE3() {
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.opc_instanceof.jm.T_opc_instanceof_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.16
-     * @title constant pool type
-     */
-    public void testVFE4() {
-        try {
-            Class
-                    .forName("dxc.junit.opcodes.opc_instanceof.jm.T_opc_instanceof_8");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_1.j b/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_1.j
deleted file mode 100644
index 07c0fd9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_1.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_instanceof_1.java
-.class public dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/Object;)Z
-    .limit stack 1
-    .limit locals 2
-    aload_1
-    instanceof java/lang/String
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_1.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_1.java
deleted file mode 100644
index c9a44fb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_instanceof.jm;
-
-public class T_opc_instanceof_1 {
-
-    public boolean run(Object o) {
-        return (o instanceof String);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_2.j b/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_2.j
deleted file mode 100644
index f5a5675..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_2.j
+++ /dev/null
@@ -1,117 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_instanceof_2.java
-.class public dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 2
-    .limit locals 2
-    
-; (SubClass instanceof SuperClass)    
-    new        dxc/junit/opcodes/opc_instanceof/jm/SubClass
-    dup
-    invokespecial dxc/junit/opcodes/opc_instanceof/jm/SubClass.<init>()V
-    instanceof dxc/junit/opcodes/opc_instanceof/jm/SuperClass
-    ifne Label1
-    iconst_1
-    goto LabelExit
-
-Label1:        
-; !(SuperClass instanceof SubClass)    
-    new dxc/junit/opcodes/opc_instanceof/jm/SuperClass
-    dup
-    invokespecial dxc/junit/opcodes/opc_instanceof/jm/SuperClass.<init>()V
-    instanceof dxc/junit/opcodes/opc_instanceof/jm/SubClass
-    ifeq Label2
-    iconst_2
-    goto LabelExit
-    
-Label2:        
-; (SubClass instanceof SuperInterface)    
-    new dxc/junit/opcodes/opc_instanceof/jm/SubClass
-    dup
-    invokespecial dxc/junit/opcodes/opc_instanceof/jm/SubClass.<init>()V    
-    instanceof dxc/junit/opcodes/opc_instanceof/jm/SuperInterface
-    ifne Label3
-    iconst_3
-    goto LabelExit    
-    
-Label3:        
-; !(SubClass instanceof SuperInterface2)    
-    new dxc/junit/opcodes/opc_instanceof/jm/SubClass
-    dup
-    invokespecial dxc/junit/opcodes/opc_instanceof/jm/SubClass.<init>()V    
-    instanceof dxc/junit/opcodes/opc_instanceof/jm/SuperInterface2
-    ifeq Label4
-    iconst_4
-    goto LabelExit        
-    
-Label4:
-; !(SubClass[] instanceof SuperInterface)    
-    iconst_1
-    anewarray dxc/junit/opcodes/opc_instanceof/jm/SubClass
-    instanceof dxc/junit/opcodes/opc_instanceof/jm/SuperInterface
-    ifeq Label6
-    sipush 5
-    goto LabelExit        
-    
-Label6:        
-; (SubClass[] instanceof Object)    
-    iconst_1
-    anewarray dxc/junit/opcodes/opc_instanceof/jm/SubClass
-    instanceof java/lang/Object
-    ifne Label7
-    sipush 7
-    goto LabelExit        
-
-Label7:        
-; !(SubClass[] instanceof SubClass)    
-    iconst_1
-    anewarray dxc/junit/opcodes/opc_instanceof/jm/SubClass
-    instanceof dxc/junit/opcodes/opc_instanceof/jm/SubClass
-    ifeq Label8
-    sipush 8
-    goto LabelExit    
-    
-Label8:        
-; (SubClass[] instanceof SuperClass[])    
-    iconst_1
-    anewarray dxc/junit/opcodes/opc_instanceof/jm/SubClass
-    instanceof [Ldxc/junit/opcodes/opc_instanceof/jm/SuperClass;
-    ifne Label9
-    sipush 9
-    goto LabelExit
-    
-Label9:        
-; !(SuperClass[] instanceof SubClass[])    
-    iconst_1
-    anewarray dxc/junit/opcodes/opc_instanceof/jm/SuperClass
-    instanceof [Ldxc/junit/opcodes/opc_instanceof/jm/SubClass;
-    ifeq Label0
-    sipush 10
-    goto LabelExit    
-        
-Label0:    
-    iconst_0
-LabelExit:
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_2.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_2.java
deleted file mode 100644
index fa3a477..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_instanceof.jm;
-
-public class T_opc_instanceof_2 {
-
-    public int run() {
-        return 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_3.j b/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_3.j
deleted file mode 100644
index cd0e33a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_3.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_instanceof_3.java
-.class public dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    .limit stack 3
-    .limit locals 4
-    aload_0
-    instanceof [[[Ldxc/junit/opcodes/opc_instanceof/TestStubs$TestStub;
-    pop
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_3.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_3.java
deleted file mode 100644
index 919d541..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_instanceof.jm;
-
-public class T_opc_instanceof_3 {
-
-    public void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_4.cfh b/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_4.cfh
deleted file mode 100644
index 6282aac..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_4.cfh
+++ /dev/null
@@ -1,191 +0,0 @@
-//@class:dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_4
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0010
-// .  .  
-   00 10 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0e 00 09 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 57, h: 0003: utf8{"dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_4"}
-    // .  .  6  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  o  p  c  _  i  n  s  t  a  n  c  e  o  f  /  j  m  /  T  _  o  p  c  _  i  n  s  t  a  n  c  e  o  f  _  4  
-       01 00 36 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 6f 70 63 5f 69 6e 73 74 61 6e 63 65 6f 66 2f 6a 6d 2f 54 5f 6f 70 63 5f 69 6e 73 74 61 6e 63 65 6f 66 5f 34 
-    // parsed:, offset 91, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 104, len 24, h: 0005: utf8{"(Ljava/lang/Object;)Z"}
-    // .  .  .  (  L  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  ;  )  Z  
-       01 00 15 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 3b 29 5a 
-    // parsed:, offset 128, len 19, h: 0006: utf8{"java/lang/String"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  S  t  r  i  n  g  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 
-    // parsed:, offset 147, len 9, h: 0007: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 156, len 6, h: 0008: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 162, len 5, h: 0009: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 07 00 0c 
-    // parsed:, offset 167, len 7, h: 000a: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 174, len 3, h: 000b: type{java.lang.String}
-    // .  .  .  
-       07 00 06 
-    // parsed:, offset 177, len 6, h: 000c: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 183, len 26, h: 000d: utf8{"T_opc_instanceof_4.java"}
-    // .  .  .  T  _  o  p  c  _  i  n  s  t  a  n  c  e  o  f  _  4  .  j  a  v  a  
-       01 00 17 54 5f 6f 70 63 5f 69 6e 73 74 61 6e 63 65 6f 66 5f 34 2e 6a 61 76 61 
-    // parsed:, offset 209, len 3, h: 000e: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-    // parsed:, offset 212, len 3, h: 000f: type{dxc.junit.opcodes.opc_instanceof.jm.T_opc_instanceof_4}
-    // .  .  .  
-       07 00 03 
-// parsed:, offset 215, len 0, h: end constant_pool
-// parsed:, offset 215, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 217, len 2, h: this_class: type{dxc.junit.opcodes.opc_instanceof.jm.T_opc_instanceof_4}
-// .  .  
-   00 0f 
-// parsed:, offset 219, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0e 
-// parsed:, offset 221, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 223, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 225, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 227, len:72,desc: ()V
-// parsed:, offset 227, len 0, h:  methods[0]: 
-    // parsed:, offset 227, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 229, len 2, h: name: <init>
-    // .  .  
-       00 07 
-    // parsed:, offset 231, len 2, h: descriptor: ()V
-    // .  .  
-       00 0c 
-    // parsed:, offset 233, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 235, len 0, h:  attributes[0]: 
-        // parsed:, offset 235, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 237, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 241, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 243, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 245, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 254, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 256, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 258, len 0, h: end attributes[0] 
-// parsed:, offset 258, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 258, len:41,desc: (Ljava/lang/Object;)Z
-// parsed:, offset 258, len 0, h:  methods[1]: 
-    // parsed:, offset 258, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 260, len 2, h: name: run
-    // .  .  
-       00 08 
-    // parsed:, offset 262, len 2, h: descriptor: (Ljava/lang/Object;)Z
-    // .  .  
-       00 05 
-    // parsed:, offset 264, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 266, len 0, h:  attributes[0]: 
-        // parsed:, offset 266, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 268, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 272, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 274, len 2, h: max_locals: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 276, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_1 // 01
-        // +  
-           2b 
-        // parsed:, offset 1, len 3, h: 0001: instanceof type{java.lang.String}
-        // .  .  .  
-//@mod           c1 00 0b 
-           c1 01 0b 
-        // parsed:, offset 4, len 1, h: 0004: ireturn
-        // .  
-           ac 
-        // parsed:, offset 285, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 287, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 289, len 0, h: end attributes[0] 
-// parsed:, offset 289, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (Ljava/lang/Object;)Z
-// parsed:, offset 289, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 291, len 0, h:  attributes[0]: 
-    // parsed:, offset 291, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 293, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 297, len 2, h: source: utf8{"T_opc_instanceof_4.java"}
-    // .  .  
-       00 0d 
-// parsed:, offset 299, len 0, h: end attributes[0] 
-// parsed:, offset 299, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_4.j b/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_4.j
deleted file mode 100644
index ecef8ec..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_4.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_instanceof_4.java
-.class public dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/Object;)Z
-    .limit stack 1
-    .limit locals 2
-    aload_1
-    instanceof java/lang/String
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_4.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_4.java
deleted file mode 100644
index decdb1c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_instanceof.jm;
-
-public class T_opc_instanceof_4 {
-
-    public boolean run(Object o) {
-        return (o instanceof String);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_5.j b/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_5.j
deleted file mode 100644
index 9765c16..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_5.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_instanceof_5.java
-.class public dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/Object;)Z
-    .limit stack 1
-    .limit locals 2
-
-    fconst_1
-    instanceof java/lang/String
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_5.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_5.java
deleted file mode 100644
index 29b53cd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_instanceof.jm;
-
-public class T_opc_instanceof_5 {
-
-    public boolean run(Object o) {
-        return (o instanceof String);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_6.j b/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_6.j
deleted file mode 100644
index fcba05c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_6.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_instanceof_6.java
-.class public dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/Object;)Z
-    .limit stack 1
-    .limit locals 2
-;    aload_1
-    instanceof java/lang/String
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_6.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_6.java
deleted file mode 100644
index 67ad4b9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_instanceof.jm;
-
-public class T_opc_instanceof_6 {
-
-    public boolean run(Object o) {
-        return (o instanceof String);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_7.j b/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_7.j
deleted file mode 100644
index 7010432..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_7.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_instanceof_7.java
-.class public dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    .limit stack 3
-    .limit locals 4
-    aload_0
-    ; next: class not found error
-    instanceof [[[Ldxc/junit/opcodes/opc_instanceof/foobar1;
-    pop
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_7.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_7.java
deleted file mode 100644
index 8842de6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_instanceof.jm;
-
-public class T_opc_instanceof_7 {
-
-    public void run() {
-
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_8.cfh b/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_8.cfh
deleted file mode 100644
index a680546..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_8.cfh
+++ /dev/null
@@ -1,200 +0,0 @@
-//@class:dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_8
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0011
-// .  .  
-   00 11 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 10 00 09 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 3, h: 0003: type{java.lang.String}
-    // .  .  .  
-       07 00 0c 
-    // parsed:, offset 37, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 50, len 24, h: 0005: utf8{"(Ljava/lang/Object;)Z"}
-    // .  .  .  (  L  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  ;  )  Z  
-       01 00 15 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 3b 29 5a 
-    // parsed:, offset 74, len 26, h: 0006: utf8{"T_opc_instanceof_8.java"}
-    // .  .  .  T  _  o  p  c  _  i  n  s  t  a  n  c  e  o  f  _  8  .  j  a  v  a  
-       01 00 17 54 5f 6f 70 63 5f 69 6e 73 74 61 6e 63 65 6f 66 5f 38 2e 6a 61 76 61 
-    // parsed:, offset 100, len 9, h: 0007: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 109, len 6, h: 0008: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 115, len 5, h: 0009: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 07 00 0e 
-    // parsed:, offset 120, len 57, h: 000a: utf8{"dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_8"}
-    // .  .  6  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  o  p  c  _  i  n  s  t  a  n  c  e  o  f  /  j  m  /  T  _  o  p  c  _  i  n  s  t  a  n  c  e  o  f  _  8  
-       01 00 36 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 6f 70 63 5f 69 6e 73 74 61 6e 63 65 6f 66 2f 6a 6d 2f 54 5f 6f 70 63 5f 69 6e 73 74 61 6e 63 65 6f 66 5f 38 
-    // parsed:, offset 177, len 7, h: 000b: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 184, len 19, h: 000c: utf8{"java/lang/String"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  S  t  r  i  n  g  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 
-    // parsed:, offset 203, len 3, h: 000d: type{dxc.junit.opcodes.opc_instanceof.jm.T_opc_instanceof_8}
-    // .  .  .  
-       07 00 0a 
-    // parsed:, offset 206, len 6, h: 000e: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 212, len 5, h: 000f: float{0x4048f5c3 / 3.14}
-    // .  @  H  .  .  
-       04 40 48 f5 c3 
-    // parsed:, offset 217, len 3, h: 0010: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 220, len 0, h: end constant_pool
-// parsed:, offset 220, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 222, len 2, h: this_class: type{dxc.junit.opcodes.opc_instanceof.jm.T_opc_instanceof_8}
-// .  .  
-   00 0d 
-// parsed:, offset 224, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 10 
-// parsed:, offset 226, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 228, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 230, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 232, len:75,desc: ()V
-// parsed:, offset 232, len 0, h:  methods[0]: 
-    // parsed:, offset 232, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 234, len 2, h: name: <init>
-    // .  .  
-       00 07 
-    // parsed:, offset 236, len 2, h: descriptor: ()V
-    // .  .  
-       00 0e 
-    // parsed:, offset 238, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 240, len 0, h:  attributes[0]: 
-        // parsed:, offset 240, len 2, h: name: Code
-        // .  .  
-           00 0b 
-        // parsed:, offset 242, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 246, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 248, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 250, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 259, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 261, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 263, len 0, h: end attributes[0] 
-// parsed:, offset 263, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 263, len:44,desc: (Ljava/lang/Object;)Z
-// parsed:, offset 263, len 0, h:  methods[1]: 
-    // parsed:, offset 263, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 265, len 2, h: name: run
-    // .  .  
-       00 08 
-    // parsed:, offset 267, len 2, h: descriptor: (Ljava/lang/Object;)Z
-    // .  .  
-       00 05 
-    // parsed:, offset 269, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 271, len 0, h:  attributes[0]: 
-        // parsed:, offset 271, len 2, h: name: Code
-        // .  .  
-           00 0b 
-        // parsed:, offset 273, len 4, h: length: 00000014
-        // .  .  .  .  
-           00 00 00 14 
-        // parsed:, offset 277, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 279, len 2, h: max_locals: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 281, len 4, h: code_length: 00000008
-        // .  .  .  .  
-           00 00 00 08 
-        // parsed:, offset 0, len 2, h: 0000: ldc #4048f5c3 // 3.14
-        // .  .  
-           12 0f 
-        // parsed:, offset 2, len 1, h: 0002: pop
-        // W  
-           57 
-        // parsed:, offset 3, len 1, h: 0003: aload_1 // 01
-        // +  
-           2b 
-        // parsed:, offset 4, len 3, h: 0004: instanceof type{java.lang.String}
-        // .  .  .  
-//@mod           c1 00 03 
-           c1 00 0f 
-        // parsed:, offset 7, len 1, h: 0007: ireturn
-        // .  
-           ac 
-        // parsed:, offset 293, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 295, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 297, len 0, h: end attributes[0] 
-// parsed:, offset 297, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (Ljava/lang/Object;)Z
-// parsed:, offset 297, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 299, len 0, h:  attributes[0]: 
-    // parsed:, offset 299, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 301, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 305, len 2, h: source: utf8{"T_opc_instanceof_8.java"}
-    // .  .  
-       00 06 
-// parsed:, offset 307, len 0, h: end attributes[0] 
-// parsed:, offset 307, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_8.j b/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_8.j
deleted file mode 100644
index 4dd3200..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_8.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_instanceof_8.java
-.class public dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_8
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/Object;)Z
-    .limit stack 1
-    .limit locals 2
-    
-    ldc 3.14
-    pop
-    
-    aload_1
-    instanceof java/lang/String
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_8.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_8.java
deleted file mode 100644
index 8a4990d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/T_opc_instanceof_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_instanceof.jm;
-
-public class T_opc_instanceof_8 {
-
-    public boolean run(Object o) {
-        return (o instanceof String);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/TestStubs.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/TestStubs.java
deleted file mode 100644
index cf54729..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_instanceof/jm/TestStubs.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_instanceof.jm;
-
-public class TestStubs {
-    @SuppressWarnings("unused")
-    private class TestStub {
-        // testE1
-    }
-}
-
-interface SuperInterface{
-    
-}
-
-interface SuperInterface2{
-    
-}
-
-class SuperClass implements SuperInterface{
-    
-}
-
-class SubClass extends SuperClass{
-
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/Test_opc_new.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_new/Test_opc_new.java
deleted file mode 100644
index 14b6c64..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/Test_opc_new.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_new;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.opc_new.jm.T_opc_new_1;
-import dxc.junit.opcodes.opc_new.jm.T_opc_new_3;
-import dxc.junit.opcodes.opc_new.jm.T_opc_new_4;
-import dxc.junit.opcodes.opc_new.jm.T_opc_new_5;
-import dxc.junit.opcodes.opc_new.jm.T_opc_new_8;
-import dxc.junit.opcodes.opc_new.jm.T_opc_new_9;
-
-public class Test_opc_new extends DxTestCase {
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_opc_new_1 t = new T_opc_new_1();
-        String s = t.run();
-        assertNotNull(s);
-        assertEquals(0, s.compareTo("abc"));
-    }
-
-    /**
-     * @title expected Error (exception during class loading)
-     */
-    public void testE1() {
-        try {
-            T_opc_new_3.run();
-            fail("expected Error");
-        } catch (Error e) {
-            // expected
-        }
-    }
-
-    /**
-     * @title expected IllegalAccessError
-     */
-    public void testE2() {
-        // @uses dxc.junit.opcodes.opc_new.jm.TestStubs$TestStub
-        try {
-            T_opc_new_4 t = new T_opc_new_4();
-            t.run();
-            fail("expected IllegalAccessError");
-        } catch (IllegalAccessError iae) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title expected NoClassDefFoundError
-     */
-    public void testE3() {
-        try {
-            T_opc_new_5 t = new T_opc_new_5();
-            t.run();
-            fail("expected NoClassDefFoundError");
-        } catch (NoClassDefFoundError iae) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.18 
-     * @title attempt to instantiate interface
-     */
-    public void testE4() {
-        // @uses dxc.junit.opcodes.opc_new.jm.TestInterface
-        try {
-            T_opc_new_8 t = new T_opc_new_8();
-            t.run();
-            fail("expected InstantiationError");
-        } catch (InstantiationError ie) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.18 
-     * @title attempt to instantiate abstract
-     * class
-     */
-    public void testE5() {
-        // @uses dxc.junit.opcodes.opc_new.jm.TestAbstractClass
-        T_opc_new_9 t = new T_opc_new_9();
-        try {
-            t.run();
-            fail("expected Error");
-        } catch (Error iae) {
-            // expected
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.16
-     * @title constant pool index
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.opc_new.jm.T_opc_new_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.18
-     * @title attempt to create array using new
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.opc_new.jm.T_opc_new_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint n/a
-     * @title  Attempt to access uninitialized class (before <init> is
-     * called)
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.opc_new.jm.T_opc_new_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.16
-     * @title constant pool type
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.opc_new.jm.T_opc_new_10");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_1.j b/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_1.j
deleted file mode 100644
index 63e9ddc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_1.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_new_1.java
-.class public dxc/junit/opcodes/opc_new/jm/T_opc_new_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()Ljava/lang/String;
-    .limit stack 3
-    .limit locals 1
-
-    new java/lang/String
-    dup
-    ldc "abc"
-    invokespecial java/lang/String/<init>(Ljava/lang/String;)V
-
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_1.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_1.java
deleted file mode 100644
index 9dffdbd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_new.jm;
-
-public class T_opc_new_1 {
-
-    public String run() {
-        return new String("abc");
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_10.cfh b/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_10.cfh
deleted file mode 100644
index acc5a5d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_10.cfh
+++ /dev/null
@@ -1,197 +0,0 @@
-//@class:dxc/junit/opcodes/opc_new/jm/T_opc_new_10
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000f
-// .  .  
-   00 0f 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0e 00 08 
-    // parsed:, offset 15, len 44, h: 0002: utf8{"dxc/junit/opcodes/opc_new/jm/T_opc_new_10"}
-    // .  .  )  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  o  p  c  _  n  e  w  /  j  m  /  T  _  o  p  c  _  n  e  w  _  1  0  
-       01 00 29 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 6f 70 63 5f 6e 65 77 2f 6a 6d 2f 54 5f 6f 70 63 5f 6e 65 77 5f 31 30 
-    // parsed:, offset 59, len 19, h: 0003: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 78, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 91, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 100, len 23, h: 0006: utf8{"()Ljava/lang/Object;"}
-    // .  .  .  (  )  L  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  ;  
-       01 00 14 28 29 4c 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 3b 
-    // parsed:, offset 123, len 6, h: 0007: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 129, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0b 
-    // parsed:, offset 134, len 20, h: 0009: utf8{"T_opc_new_10.java"}
-    // .  .  .  T  _  o  p  c  _  n  e  w  _  1  0  .  j  a  v  a  
-       01 00 11 54 5f 6f 70 63 5f 6e 65 77 5f 31 30 2e 6a 61 76 61 
-    // parsed:, offset 154, len 7, h: 000a: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 161, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 167, len 5, h: 000c: float{0x4048f5c3 / 3.14}
-    // .  @  H  .  .  
-       04 40 48 f5 c3 
-    // parsed:, offset 172, len 3, h: 000d: type{dxc.junit.opcodes.opc_new.jm.T_opc_new_10}
-    // .  .  .  
-       07 00 02 
-    // parsed:, offset 175, len 3, h: 000e: type{java.lang.Object}
-    // .  .  .  
-       07 00 03 
-// parsed:, offset 178, len 0, h: end constant_pool
-// parsed:, offset 178, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 180, len 2, h: this_class: type{dxc.junit.opcodes.opc_new.jm.T_opc_new_10}
-// .  .  
-   00 0d 
-// parsed:, offset 182, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0e 
-// parsed:, offset 184, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 186, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 188, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 190, len:78,desc: ()V
-// parsed:, offset 190, len 0, h:  methods[0]: 
-    // parsed:, offset 190, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 192, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 194, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 196, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 198, len 0, h:  attributes[0]: 
-        // parsed:, offset 198, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 200, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 204, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 206, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 208, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 217, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 219, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 221, len 0, h: end attributes[0] 
-// parsed:, offset 221, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 221, len:47,desc: ()Ljava/lang/Object;
-// parsed:, offset 221, len 0, h:  methods[1]: 
-    // parsed:, offset 221, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 223, len 2, h: name: run
-    // .  .  
-       00 07 
-    // parsed:, offset 225, len 2, h: descriptor: ()Ljava/lang/Object;
-    // .  .  
-       00 06 
-    // parsed:, offset 227, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 229, len 0, h:  attributes[0]: 
-        // parsed:, offset 229, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 231, len 4, h: length: 00000017
-        // .  .  .  .  
-           00 00 00 17 
-        // parsed:, offset 235, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 237, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 239, len 4, h: code_length: 0000000b
-        // .  .  .  .  
-           00 00 00 0b 
-        // parsed:, offset 0, len 2, h: 0000: ldc #4048f5c3 // 3.14
-        // .  .  
-           12 0c 
-        // parsed:, offset 2, len 1, h: 0002: pop
-        // W  
-           57 
-        // parsed:, offset 3, len 3, h: 0003: new type{java.lang.Object}
-        // .  .  .  
-//@mod           bb 00 0e 
-           bb 00 0c 
-        // parsed:, offset 6, len 1, h: 0006: dup
-        // Y  
-           59 
-        // parsed:, offset 7, len 3, h: 0007: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 10, len 1, h: 000a: areturn
-        // .  
-           b0 
-        // parsed:, offset 254, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 256, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 258, len 0, h: end attributes[0] 
-// parsed:, offset 258, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()Ljava/lang/Object;
-// parsed:, offset 258, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 260, len 0, h:  attributes[0]: 
-    // parsed:, offset 260, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 262, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 266, len 2, h: source: utf8{"T_opc_new_10.java"}
-    // .  .  
-       00 09 
-// parsed:, offset 268, len 0, h: end attributes[0] 
-// parsed:, offset 268, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_10.j b/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_10.j
deleted file mode 100644
index c55935f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_10.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_new_10.java
-.class public dxc/junit/opcodes/opc_new/jm/T_opc_new_10
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()Ljava/lang/Object;
-    .limit stack 2
-    .limit locals 1
-
-    ldc 3.14
-    pop
-
-    new java/lang/Object
-    dup
-    invokespecial java/lang/Object/<init>()V
-
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_10.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_10.java
deleted file mode 100644
index 7b549bb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_10.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_new.jm;
-
-public class T_opc_new_10 {
-
-    public Object run() {
-        return new Object();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_2.j b/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_2.j
deleted file mode 100644
index 4dd2001..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_2.j
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_new_2.java
-.class public dxc/junit/opcodes/opc_new/jm/T_opc_new_2
-.super java/lang/Object
-
-.field  i I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    aload_0
-    bipush 123
-    putfield dxc.junit.opcodes.opc_new.jm.T_opc_new_2.i I
-
-    return
-.end method
-
-
-.method public static run()I
-    .limit stack 2
-    .limit locals 1
-
-    new dxc/junit/opcodes/opc_new/jm/T_opc_new_2
-    dup
-;    invokespecial dxc/junit/opcodes/opc_new/jm/T_opc_new_2/<init>()V
-    astore_0
-
-    aload_0
-    getfield dxc.junit.opcodes.opc_new.jm.T_opc_new_2.i I
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_2.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_2.java
deleted file mode 100644
index 4fe58d0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_2.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_new.jm;
-
-public class T_opc_new_2 {
-    
-    int i = 123;
-
-    public static int run() {
-        T_opc_new_2 t = new T_opc_new_2();
-        return t.i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_3.j b/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_3.j
deleted file mode 100644
index b7d35f8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_3.j
+++ /dev/null
@@ -1,61 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_new_3.java
-.class public dxc/junit/opcodes/opc_new/jm/T_opc_new_3
-.super java/lang/Object
-
-.field static i I
-
-.method static <clinit>()V
-    .limit stack 2
-    .limit locals 0
-
-    bipush 123
-    iconst_0
-    idiv
-    putstatic dxc.junit.opcodes.opc_new.jm.T_opc_new_3.i I
-
-    return
-
-.end method
-
-
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-.end method
-
-
-
-.method public static run()I
-    .limit stack 2
-    .limit locals 1
-
-    new dxc/junit/opcodes/opc_new/jm/T_opc_new_3
-    dup
-    invokespecial dxc/junit/opcodes/opc_new/jm/T_opc_new_3/<init>()V
-    astore_0
-
-    getstatic dxc.junit.opcodes.opc_new.jm.T_opc_new_3.i I
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_3.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_3.java
deleted file mode 100644
index 9a75f14..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_3.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_new.jm;
-
-public class T_opc_new_3 {
-
-    static int i = 123 / 0;
-
-    public static int run() {
-        T_opc_new_3 t = new T_opc_new_3();
-        return t.i;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_4.j b/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_4.j
deleted file mode 100644
index e596e9e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_4.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_new_4.java
-.class public dxc/junit/opcodes/opc_new/jm/T_opc_new_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()Ljava/lang/Object;
-    .limit stack 2
-    .limit locals 1
-
-    new dxc/junit/opcodes/opc_new/jm/TestStubs$TestStub
-    dup
-    invokespecial dxc/junit/opcodes/opc_new/jm/TestStubs$TestStub/<init>()V
-
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_4.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_4.java
deleted file mode 100644
index 2a340fa..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_new.jm;
-
-public class T_opc_new_4 {
-
-     public Object run() {
-            return null;
-     }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_5.j b/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_5.j
deleted file mode 100644
index 8ddb620..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_5.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_new_5.java
-.class public dxc/junit/opcodes/opc_new/jm/T_opc_new_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()Ljava/lang/Object;
-    .limit stack 2
-    .limit locals 1
-
-    new dxc/junit/opcodes/opc_new/jm/Foobar
-    dup
-    invokespecial dxc/junit/opcodes/opc_new/jm/Foobar/<init>()V
-
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_5.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_5.java
deleted file mode 100644
index 0892739..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_new.jm;
-
-public class T_opc_new_5 {
-
-    public Object run() {
-        return null;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_6.cfh b/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_6.cfh
deleted file mode 100644
index 10917fa..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_6.cfh
+++ /dev/null
@@ -1,188 +0,0 @@
-//@class:dxc/junit/opcodes/opc_new/jm/T_opc_new_6
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0c 00 06 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 6, h: 0005: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 62, len 5, h: 0006: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 0b 
-    // parsed:, offset 67, len 23, h: 0007: utf8{"()Ljava/lang/Object;"}
-    // .  .  .  (  )  L  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  ;  
-       01 00 14 28 29 4c 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 3b 
-    // parsed:, offset 90, len 7, h: 0008: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 97, len 43, h: 0009: utf8{"dxc/junit/opcodes/opc_new/jm/T_opc_new_6"}
-    // .  .  (  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  o  p  c  _  n  e  w  /  j  m  /  T  _  o  p  c  _  n  e  w  _  6  
-       01 00 28 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 6f 70 63 5f 6e 65 77 2f 6a 6d 2f 54 5f 6f 70 63 5f 6e 65 77 5f 36 
-    // parsed:, offset 140, len 3, h: 000a: type{dxc.junit.opcodes.opc_new.jm.T_opc_new_6}
-    // .  .  .  
-       07 00 09 
-    // parsed:, offset 143, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 149, len 3, h: 000c: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-    // parsed:, offset 152, len 19, h: 000d: utf8{"T_opc_new_6.java"}
-    // .  .  .  T  _  o  p  c  _  n  e  w  _  6  .  j  a  v  a  
-       01 00 10 54 5f 6f 70 63 5f 6e 65 77 5f 36 2e 6a 61 76 61 
-// parsed:, offset 171, len 0, h: end constant_pool
-// parsed:, offset 171, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 173, len 2, h: this_class: type{dxc.junit.opcodes.opc_new.jm.T_opc_new_6}
-// .  .  
-   00 0a 
-// parsed:, offset 175, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0c 
-// parsed:, offset 177, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 179, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 181, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 183, len:75,desc: ()V
-// parsed:, offset 183, len 0, h:  methods[0]: 
-    // parsed:, offset 183, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 185, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 187, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 189, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 191, len 0, h:  attributes[0]: 
-        // parsed:, offset 191, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 193, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 197, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 199, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 201, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 210, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 212, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 214, len 0, h: end attributes[0] 
-// parsed:, offset 214, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 214, len:44,desc: ()Ljava/lang/Object;
-// parsed:, offset 214, len 0, h:  methods[1]: 
-    // parsed:, offset 214, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 216, len 2, h: name: run
-    // .  .  
-       00 05 
-    // parsed:, offset 218, len 2, h: descriptor: ()Ljava/lang/Object;
-    // .  .  
-       00 07 
-    // parsed:, offset 220, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 222, len 0, h:  attributes[0]: 
-        // parsed:, offset 222, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 224, len 4, h: length: 00000014
-        // .  .  .  .  
-           00 00 00 14 
-        // parsed:, offset 228, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 230, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 232, len 4, h: code_length: 00000008
-        // .  .  .  .  
-           00 00 00 08 
-        // parsed:, offset 0, len 3, h: 0000: new type{java.lang.Object}
-        // .  .  .  
-//@mod           bb 00 0c 
-           bb 01 0c 
-        // parsed:, offset 3, len 1, h: 0003: dup
-        // Y  
-           59 
-        // parsed:, offset 4, len 3, h: 0004: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 7, len 1, h: 0007: areturn
-        // .  
-           b0 
-        // parsed:, offset 244, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 246, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 248, len 0, h: end attributes[0] 
-// parsed:, offset 248, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()Ljava/lang/Object;
-// parsed:, offset 248, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 250, len 0, h:  attributes[0]: 
-    // parsed:, offset 250, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 252, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 256, len 2, h: source: utf8{"T_opc_new_6.java"}
-    // .  .  
-       00 0d 
-// parsed:, offset 258, len 0, h: end attributes[0] 
-// parsed:, offset 258, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_6.j b/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_6.j
deleted file mode 100644
index a6c2e14..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_6.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_new_6.java
-.class public dxc/junit/opcodes/opc_new/jm/T_opc_new_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()Ljava/lang/Object;
-    .limit stack 2
-    .limit locals 1
-
-    new java/lang/Object
-    dup
-    invokespecial java/lang/Object/<init>()V
-
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_6.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_6.java
deleted file mode 100644
index 3ff3df7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_new.jm;
-
-public class T_opc_new_6 {
-
-    public Object run() {
-        return new Object();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_7.j b/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_7.j
deleted file mode 100644
index 482b25e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_7.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_new_7.java
-.class public dxc/junit/opcodes/opc_new/jm/T_opc_new_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()Ljava/lang/Object;
-    .limit stack 2
-    .limit locals 1
-
-    new [Ljava/lang/Object;
-
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_7.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_7.java
deleted file mode 100644
index 37256b4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_new.jm;
-
-public class T_opc_new_7 {
-
-    public Object run() {
-        return new Object();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_8.j b/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_8.j
deleted file mode 100644
index 8ca522d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_8.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_new_8.java
-.class public dxc/junit/opcodes/opc_new/jm/T_opc_new_8
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()Ljava/lang/Object;
-    .limit stack 2
-    .limit locals 1
-
-    new dxc/junit/opcodes/opc_new/jm/TestInterface
-    dup
-    invokespecial dxc/junit/opcodes/opc_new/jm/TestInterface/<init>()V
-
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_8.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_8.java
deleted file mode 100644
index dfe9621..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_new.jm;
-
-public class T_opc_new_8 {
-
-    public Object run() {
-        return new Object();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_9.j b/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_9.j
deleted file mode 100644
index 688c678..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_9.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_new_9.java
-.class public dxc/junit/opcodes/opc_new/jm/T_opc_new_9
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()Ljava/lang/Object;
-    .limit stack 2
-    .limit locals 1
-
-    new dxc/junit/opcodes/opc_new/jm/TestAbstractClass
-    dup
-    invokespecial dxc/junit/opcodes/opc_new/jm/TestAbstractClass/<init>()V
-
-    aload_0
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_9.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_9.java
deleted file mode 100644
index 8999e7f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/T_opc_new_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_new.jm;
-
-public class T_opc_new_9 {
-
-    public Object run() {
-        return new Object();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/TestStubs.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/TestStubs.java
deleted file mode 100644
index 7d8214a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_new/jm/TestStubs.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_new.jm;
-
-
-interface TestInterface {
-    public abstract void test();
-}
-
-abstract class TestAbstractClass{
-    
-}
-
-public class TestStubs {
-    private static @SuppressWarnings("unused") class TestStub {
-        private TestStub() {
-            
-        }
-        // testE3
-    }
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_return/Test_opc_return.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_return/Test_opc_return.java
deleted file mode 100644
index 98b4c94..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_return/Test_opc_return.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_return;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.opc_return.jm.T_opc_return_1;
-import dxc.junit.opcodes.opc_return.jm.T_opc_return_2;
-import dxc.junit.opcodes.opc_return.jm.T_opc_return_3;
-import dxc.junit.opcodes.opc_return.jm.T_opc_return_4;
-
-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  check that monitor is released by return
-     */
-    public void testN2() {
-        assertTrue(T_opc_return_2.execute());
-    }
-
-
-    /**
-     * @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
-        }
-    }
-
-    /**
-     * @title  Lock structural rule 1 is violated
-     */
-    public void testE2() {
-        T_opc_return_4 t = new T_opc_return_4();
-        try {
-            t.run();
-            // the JVM spec says that it is optional to implement the structural
-            // lock rules, see JVM spec 8.13 and monitorenter/exit opcodes.
-            System.out.print("dvmvfe:");
-            //fail("expected IllegalMonitorStateException");
-        } catch (IllegalMonitorStateException imse) {
-            // expected
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.14
-     * @title method's return type - int
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.opc_return.jm.T_opc_return_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.14
-     * @title method's return type - reference
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.opc_return.jm.T_opc_return_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_1.j b/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_1.j
deleted file mode 100644
index fe94d2e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_1.j
+++ /dev/null
@@ -1,82 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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 dxc/junit/opcodes/opc_return/jm/T_opc_return_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit locals 6
-    .limit stack 6
-    
-    iconst_1
-    istore_1
-    iconst_2
-    istore_2
-    iconst_3
-    istore 3
-    
-    iconst_4
-    
-    invokestatic dxc/junit/opcodes/opc_return/jm/T_opc_return_1/test()V
-    
-    iconst_4
-    if_icmpne Label0
-    
-    iload_1
-    iconst_1
-    if_icmpne Label0
-    
-    iload_2
-    iconst_2
-    if_icmpne Label0
-    
-    iload_3
-    iconst_3
-    if_icmpne Label0    
-    
-    ldc 123456
-    ireturn
-
-Label1:
-    pop
-Label0:
-    iconst_0
-    ireturn
-
-.end method
-
-.method private static test()V
-    .limit locals 4
-    .limit stack 4
-    
-    ldc 0xaaa
-    istore_1
-    ldc 0xbbbb
-    istore_2
-    ldc 0xcccc
-    istore_3
-    
-    ldc 0xdddd
-    
-    ldc 0xcafe
-    return
-    
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_1.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_1.java
deleted file mode 100644
index b2170ff..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_1.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_return.jm;
-
-public class T_opc_return_1 {
-
-    public int run() {
-        return 123456;
-    }
-    
-    private static void test() {
-        int a = 0xaaaa;
-        int b = 0xbbbb;
-        int c = 0xcccc;
-        return;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_2.j b/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_2.j
deleted file mode 100644
index b6f383b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_2.j
+++ /dev/null
@@ -1,159 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_2.java
-.class public dxc/junit/opcodes/opc_return/jm/T_opc_return_2
-.super java/lang/Object
-.implements java/lang/Runnable
-
-.field  value I
-.field  failed Z
-
-.method public <init>()V
-    .limit stack 3
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    aload_0
-    iconst_0
-    putfield dxc.junit.opcodes.opc_return.jm.T_opc_return_2.value I
-
-    aload_0
-    iconst_0
-    putfield dxc.junit.opcodes.opc_return.jm.T_opc_return_2.failed Z
-
-    return
-
-.end method
-
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 2
-   
-    iconst_0
-    istore_1
-
-Label4:
-    iload_1
-    sipush 1000
-    if_icmpge Label3
-
-    aload_0
-    invokespecial dxc/junit/opcodes/opc_return/jm/T_opc_return_2/test()V
-
-    iinc 1 1
-
-    goto Label4
-
-
-Label3:
-    return
-
-.end method
-
-
-
-.method private synchronized test()V
-    .limit stack 3
-    .limit locals 2
-    
-.line 16
-    aload_0
-    dup
-    getfield dxc.junit.opcodes.opc_return.jm.T_opc_return_2.value I
-    dup
-    istore_1
-
-    iconst_1
-    iadd
-    putfield dxc.junit.opcodes.opc_return.jm.T_opc_return_2.value I
-
-    iinc 1 1
-
-    invokestatic java/lang/Thread/yield()V
-
-    iload_1
-    aload_0
-    getfield dxc.junit.opcodes.opc_return.jm.T_opc_return_2.value I
-    if_icmpeq Label0
-
-    aload_0
-    iconst_1
-    putfield dxc.junit.opcodes.opc_return.jm.T_opc_return_2.failed Z
-
-Label0:
-    return
-.end method
-
-
-
-.method public static execute()Z
-    .limit stack 3
-    .limit locals 4
-
-    new dxc/junit/opcodes/opc_return/jm/T_opc_return_2
-    dup
-    invokespecial dxc/junit/opcodes/opc_return/jm/T_opc_return_2/<init>()V
-    astore_0
-
-    new java/lang/Thread
-    dup
-    aload_0
-    invokespecial java/lang/Thread/<init>(Ljava/lang/Runnable;)V
-    astore_1
-
-    new java/lang/Thread
-    dup
-    aload_0
-    invokespecial java/lang/Thread/<init>(Ljava/lang/Runnable;)V
-    astore_2
-
-    aload_1
-    invokevirtual java/lang/Thread/start()V
-
-    aload_2
-    invokevirtual java/lang/Thread/start()V
-
-Label12:
-    ldc2_w 5000
-    invokestatic java/lang/Thread/sleep(J)V
-
-Label13:
-    goto Label0
-
-Label14:            ; exception handler
-    astore_3
-    goto Label3
-
-Label0:
-    aload_0
-    getfield dxc.junit.opcodes.opc_return.jm.T_opc_return_2.value I
-    sipush 2000
-    if_icmpne Label3
-
-    aload_0
-    getfield dxc.junit.opcodes.opc_return.jm.T_opc_return_2.failed Z
-    ifne Label3
-
-    iconst_1
-    ireturn
-
-Label3:
-    iconst_0
-    ireturn
-
-.catch java/lang/InterruptedException from Label12 to Label13 using Label14
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_2.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_2.java
deleted file mode 100644
index b70986f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_2.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_return.jm;
-
-public class T_opc_return_2 implements Runnable {
-    public final static int CNT = 1000;
-    int value = 0;
-    boolean failed = false;
-    
-    public void run() {
-        for(int i = 0; i < CNT; i++) {
-            test();
-        }
-    }
-    
-    private synchronized void test()    {
-        value++;
-        int c = value;
-        Thread.yield();
-        if(c != value)
-            failed = true;
-    }
-    
-    public static boolean execute() {
-        T_opc_return_2 test = new T_opc_return_2();
-        Thread t1 = new Thread(test);
-        Thread t2 = new Thread(test);
-        
-        t1.start();
-        t2.start();
-        
-        try
-        {
-            Thread.sleep(5000);
-        }
-        catch(InterruptedException ie) {
-            return false;
-        }
-        
-        if(test.value != CNT * 2)
-            return false;
-        return !test.failed;
-    }
-    
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_3.j b/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_3.j
deleted file mode 100644
index 33b99cc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_3.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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 dxc/junit/opcodes/opc_return/jm/T_opc_return_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method private synchronized test()V
-    .limit stack 1
-    aload_0
-    monitorexit
-    return
-.end method
-
-
-
-.method public run()Z
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokespecial dxc/junit/opcodes/opc_return/jm/T_opc_return_3/test()V
-
-    iconst_1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_3.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_3.java
deleted file mode 100644
index 1e1ee36..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_3.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_return.jm;
-
-public class T_opc_return_3 {
-    
-    private synchronized void test() {
-        return;
-    }
-    
-    public boolean run() {
-        test();
-        return true;
-    }
-    
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_4.j b/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_4.j
deleted file mode 100644
index 80c1778..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_4.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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_4.java
-.class public dxc/junit/opcodes/opc_return/jm/T_opc_return_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    monitorenter
-
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_4.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_4.java
deleted file mode 100644
index 89dddd5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_4.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_return.jm;
-
-public class T_opc_return_4 {
-    
-    public void run() {
-        return;
-    }
-    
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_5.j b/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_5.j
deleted file mode 100644
index aa2d8bc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_5.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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 dxc/junit/opcodes/opc_return/jm/T_opc_return_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()I
-    .limit stack 1
-    .limit locals 1
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_5.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_5.java
deleted file mode 100644
index 4025b84..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_return.jm;
-
-public class T_opc_return_5 {
-
-    public void run() {
-        return;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_6.j b/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_6.j
deleted file mode 100644
index f286394..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_6.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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 dxc/junit/opcodes/opc_return/jm/T_opc_return_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Ljava/lang/String;
-    .limit stack 1
-    .limit locals 1
-
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_6.java b/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_6.java
deleted file mode 100644
index 27def5e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/opc_return/jm/T_opc_return_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.opc_return.jm;
-
-public class T_opc_return_6 {
-    
-    public void run() {
-        return;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/pop/Test_pop.java b/tools/dx-tests/src/dxc/junit/opcodes/pop/Test_pop.java
deleted file mode 100644
index 893b425..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/pop/Test_pop.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.pop;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.pop.jm.T_pop_1;
-import dxc.junit.opcodes.pop.jm.T_pop_2;
-
-public class Test_pop extends DxTestCase {
-
-    /**
-     * @title  type of argument - int
-     */
-    public void testN1() {
-        T_pop_1 t = new T_pop_1();
-        assertEquals(1234, t.run());
-    }
-
-    /**
-     * @title  type of argument - float
-     */
-    public void testN2() {
-        T_pop_2 t = new T_pop_2();
-        assertEquals(1234f, t.run());
-    }
-
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.pop.jm.T_pop_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - long
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.pop.jm.T_pop_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/pop/jm/T_pop_1.j b/tools/dx-tests/src/dxc/junit/opcodes/pop/jm/T_pop_1.j
deleted file mode 100644
index 730d4a6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/pop/jm/T_pop_1.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_pop_1.java
-.class public dxc/junit/opcodes/pop/jm/T_pop_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 2
-    .limit locals 2
-    
-    sipush 1234
-    sipush 5678
-    pop
-    
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/pop/jm/T_pop_1.java b/tools/dx-tests/src/dxc/junit/opcodes/pop/jm/T_pop_1.java
deleted file mode 100644
index d1f799e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/pop/jm/T_pop_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.pop.jm;
-
-public class T_pop_1 {
-
-    public int run() {
-        return 1234;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/pop/jm/T_pop_2.j b/tools/dx-tests/src/dxc/junit/opcodes/pop/jm/T_pop_2.j
deleted file mode 100644
index 19977d2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/pop/jm/T_pop_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_pop_2.java
-.class public dxc/junit/opcodes/pop/jm/T_pop_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()F
-    .limit stack 2
-    .limit locals 2
-    ldc 1234.0
-    ldc 5678.0
-    pop
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/pop/jm/T_pop_2.java b/tools/dx-tests/src/dxc/junit/opcodes/pop/jm/T_pop_2.java
deleted file mode 100644
index b14351a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/pop/jm/T_pop_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.pop.jm;
-
-public class T_pop_2 {
-
-    public float run() {
-        return 1234f;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/pop/jm/T_pop_3.j b/tools/dx-tests/src/dxc/junit/opcodes/pop/jm/T_pop_3.j
deleted file mode 100644
index ce81ca5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/pop/jm/T_pop_3.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_pop_3.java
-.class public dxc/junit/opcodes/pop/jm/T_pop_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 2
-    .limit locals 3
-    sipush 1234
-;    sipush 1234    
-    pop
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/pop/jm/T_pop_3.java b/tools/dx-tests/src/dxc/junit/opcodes/pop/jm/T_pop_3.java
deleted file mode 100644
index 46c4574..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/pop/jm/T_pop_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.pop.jm;
-
-public class T_pop_3 {
-
-    public int run() {
-        return 1234;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/pop/jm/T_pop_4.j b/tools/dx-tests/src/dxc/junit/opcodes/pop/jm/T_pop_4.j
deleted file mode 100644
index 3f9f52c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/pop/jm/T_pop_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_pop_4.java
-.class public dxc/junit/opcodes/pop/jm/T_pop_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 3
-    .limit locals 3
-
-    sipush 1234
-    lconst_1
-
-    pop
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/pop/jm/T_pop_4.java b/tools/dx-tests/src/dxc/junit/opcodes/pop/jm/T_pop_4.java
deleted file mode 100644
index 5c2bd53..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/pop/jm/T_pop_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.pop.jm;
-
-public class T_pop_4 {
-
-    public int run() {
-        return 1234;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/pop2/Test_pop2.java b/tools/dx-tests/src/dxc/junit/opcodes/pop2/Test_pop2.java
deleted file mode 100644
index 01af289..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/pop2/Test_pop2.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.pop2;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.pop2.jm.T_pop2_1;
-import dxc.junit.opcodes.pop2.jm.T_pop2_2;
-
-public class Test_pop2 extends DxTestCase {
-
-    /**
-     * @title  type of argument - long
-     */
-    public void testN1() {
-        T_pop2_1 t = new T_pop2_1();
-        assertEquals(1234l, t.run());
-    }
-
-    /**
-     * @title  type of argument - double
-     */
-    public void testN2() {
-        T_pop2_2 t = new T_pop2_2();
-        assertEquals(1234d, t.run());
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.pop2.jm.T_pop2_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - int
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.pop2.jm.T_pop2_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/pop2/jm/T_pop2_1.j b/tools/dx-tests/src/dxc/junit/opcodes/pop2/jm/T_pop2_1.j
deleted file mode 100644
index ce2c92a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/pop2/jm/T_pop2_1.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_pop2_1.java
-.class public dxc/junit/opcodes/pop2/jm/T_pop2_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()J
-    .limit stack 4
-    .limit locals 2
-    
-    ldc2_w 1234
-    ldc2_w 5678
-    pop2
-    
-    lreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/pop2/jm/T_pop2_1.java b/tools/dx-tests/src/dxc/junit/opcodes/pop2/jm/T_pop2_1.java
deleted file mode 100644
index 5d21090..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/pop2/jm/T_pop2_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.pop2.jm;
-
-public class T_pop2_1 {
-
-    public long run() {
-        return 1234l;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/pop2/jm/T_pop2_2.j b/tools/dx-tests/src/dxc/junit/opcodes/pop2/jm/T_pop2_2.j
deleted file mode 100644
index d184609..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/pop2/jm/T_pop2_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_pop2_2.java
-.class public dxc/junit/opcodes/pop2/jm/T_pop2_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()D
-    .limit stack 4
-    .limit locals 2
-    ldc2_w 1234.0
-    ldc2_w 5678.0
-    pop2
-    dreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/pop2/jm/T_pop2_2.java b/tools/dx-tests/src/dxc/junit/opcodes/pop2/jm/T_pop2_2.java
deleted file mode 100644
index 329658a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/pop2/jm/T_pop2_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.pop2.jm;
-
-public class T_pop2_2 {
-
-    public double run() {
-        return 1234d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/pop2/jm/T_pop2_3.j b/tools/dx-tests/src/dxc/junit/opcodes/pop2/jm/T_pop2_3.j
deleted file mode 100644
index 82b7a69..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/pop2/jm/T_pop2_3.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_pop2_3.java
-.class public dxc/junit/opcodes/pop2/jm/T_pop2_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()J
-    .limit stack 2
-    .limit locals 3
-    ldc2_w 1234
-;    ldc2_w 1234    
-    pop2
-    lreturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/pop2/jm/T_pop2_3.java b/tools/dx-tests/src/dxc/junit/opcodes/pop2/jm/T_pop2_3.java
deleted file mode 100644
index 1b5fefc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/pop2/jm/T_pop2_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.pop2.jm;
-
-public class T_pop2_3 {
-
-    public long run() {
-        return 1234l;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/pop2/jm/T_pop2_4.j b/tools/dx-tests/src/dxc/junit/opcodes/pop2/jm/T_pop2_4.j
deleted file mode 100644
index 5b49788..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/pop2/jm/T_pop2_4.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_pop2_4.java
-.class public dxc/junit/opcodes/pop2/jm/T_pop2_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()J
-    .limit stack 3
-    .limit locals 3
-
-    ldc2_w 1234
-    iconst_1
-
-    pop2
-
-    lreturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/pop2/jm/T_pop2_4.java b/tools/dx-tests/src/dxc/junit/opcodes/pop2/jm/T_pop2_4.java
deleted file mode 100644
index 9b3c66e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/pop2/jm/T_pop2_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.pop2.jm;
-
-public class T_pop2_4 {
-
-    public long run() {
-        return 1234l;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/TPutfield.java b/tools/dx-tests/src/dxc/junit/opcodes/putfield/TPutfield.java
deleted file mode 100644
index e417405..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/TPutfield.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putfield;
-
-class TPutfield {
-    // used by testE2
-    @SuppressWarnings("unused")
-    private int TestStubField = 0;
-
-    // used by testE7
-    protected int TestStubFieldP = 0;
-
-    // used by testE5
-    public final int TestStubFieldFinal = 0;
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/Test_putfield.java b/tools/dx-tests/src/dxc/junit/opcodes/putfield/Test_putfield.java
deleted file mode 100644
index dd9b11a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/Test_putfield.java
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putfield;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.putfield.jm.T_putfield_1;
-import dxc.junit.opcodes.putfield.jm.T_putfield_10;
-import dxc.junit.opcodes.putfield.jm.T_putfield_11;
-import dxc.junit.opcodes.putfield.jm.T_putfield_12;
-import dxc.junit.opcodes.putfield.jm.T_putfield_13;
-import dxc.junit.opcodes.putfield.jm.T_putfield_14;
-import dxc.junit.opcodes.putfield.jm.T_putfield_15;
-import dxc.junit.opcodes.putfield.jm.T_putfield_16;
-import dxc.junit.opcodes.putfield.jm.T_putfield_18;
-import dxc.junit.opcodes.putfield.jm.T_putfield_2;
-import dxc.junit.opcodes.putfield.jm.T_putfield_7;
-import dxc.junit.opcodes.putfield.jm.T_putfield_8;
-import dxc.junit.opcodes.putfield.jm.T_putfield_9;
-
-public class Test_putfield extends DxTestCase {
-
-    /**
-     * @title  type - int
-     */
-    public void testN1() {
-        T_putfield_1 t = new T_putfield_1();
-        assertEquals(0, t.st_i1);
-        t.run();
-        assertEquals(1000000, t.st_i1);
-    }
-
-    /**
-     * @title  type - double
-     */
-    public void testN2() {
-        T_putfield_2 t = new T_putfield_2();
-        assertEquals(0d, t.st_d1);
-        t.run();
-        assertEquals(1000000d, t.st_d1);
-    }
-
-    /**
-     * @title  modification of final field
-     */
-    public void testN3() {
-        T_putfield_12 t = new T_putfield_12();
-        assertEquals(0, t.st_i1);
-        t.run();
-        assertEquals(1000000, t.st_i1);
-    }
-
-    /**
-     * @title  modification of protected field from subclass
-     */
-    public void testN4() {
-        // @uses dxc.junit.opcodes.putfield.jm.T_putfield_1
-        T_putfield_14 t = new T_putfield_14();
-        assertEquals(0, t.getProtectedField());
-        t.run();
-        assertEquals(1000000, t.getProtectedField());
-    }
-
-    /**
-     * @title  assignment compatible object references
-     */
-    public void testN5() {
-        // @uses dxc.junit.opcodes.putfield.jm.TChild
-        // @uses dxc.junit.opcodes.putfield.jm.TSuper
-        T_putfield_18 t = new T_putfield_18();
-        assertEquals(0, t.run().compareTo("xyz"));
-    }
-
-    /**
-     * @title  assignment compatible values
-     */
-    public void testN6() {
-        T_putfield_16 t = new T_putfield_16();
-        assertNull(t.o);
-        t.run();
-        assertEquals("", (String) t.o);
-    }
-
-    /**
-     * @title  attempt to set static field
-     */
-    public void testE1() {
-        try {
-            T_putfield_7 t = new T_putfield_7();
-            t.run();
-            fail("expected IncompatibleClassChangeError");
-        } catch (IncompatibleClassChangeError e) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title  modification of non-accessible private field
-     */
-    public void testE2() {
-        // @uses dxc.junit.opcodes.putfield.TPutfield
-        try {
-            T_putfield_8 t = new T_putfield_8();
-            t.run();
-            fail("expected IllegalAccessError");
-        } catch (IllegalAccessError iae) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title expected NullPointerException
-     */
-    public void testE3() {
-        T_putfield_9 t = new T_putfield_9();
-        try {
-            t.run();
-            fail("expected NullPointerException");
-        } catch (NullPointerException e) {
-            // expected
-        }
-    }
-
-    /**
-     * @title expected NoSuchFieldError
-     */
-    public void testE4() {
-        try {
-        T_putfield_10 t = new T_putfield_10();
-            t.run();
-            fail("expected NoSuchFieldError");
-        } catch (NoSuchFieldError e) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title  Modification of final field in other class
-     */
-    public void testE5() {
-        // @uses dxc.junit.opcodes.putfield.TPutfield
-        try {
-            T_putfield_11 t = new T_putfield_11();
-            t.run();
-            fail("expected IllegalAccessError");
-        } catch (IllegalAccessError iae) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-
-    //  FIXME: "fail" commented out temporarily - check
-    /**
-     * @title  modification of superclass' private field from subclass
-     * FIXME: is this a JVM bug?
-     */
-    public void testE6() {
-        // @uses dxc.junit.opcodes.putfield.jm.T_putfield_1
-        try {
-            T_putfield_15 t = new T_putfield_15();
-            assertEquals(0, t.getPvtField());
-            t.run();
-            assertEquals(10101, t.getPvtField());
-            //fail("expected IllegalAccessError");
-        } catch (IllegalAccessError e) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title  modification of non-accessible protected field
-     */
-    public void testE7() {
-        // @uses dxc.junit.opcodes.putfield.TPutfield
-        try {
-            T_putfield_13 t = new T_putfield_13();
-            t.run();
-            fail("expected IllegalAccessError");
-        } catch (IllegalAccessError iae) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.12
-     * @title constant pool index
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.putfield.jm.T_putfield_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.putfield.jm.T_putfield_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.17
-     * @title type of argument - float instead of
-     * int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.putfield.jm.T_putfield_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.17
-     * @title type of argument - assignment
-     * incompatible references
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.putfield.jm.T_putfield_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.17
-     * @title type of argument - assignment
-     * incompatible values
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.putfield.jm.T_putfield_20");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.16
-     * @title type of argument - assignment
-     * incompatible object references
-     */
-    public void testVFE6() {
-        // @uses dxc.junit.opcodes.putfield.jm.TChild
-        // @uses dxc.junit.opcodes.putfield.jm.TSuper
-        try {
-            Class.forName("dxc.junit.opcodes.putfield.jm.T_putfield_19");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_1.j b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_1.j
deleted file mode 100644
index 05a16e5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_1.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putfield_1.java
-.class public dxc/junit/opcodes/putfield/jm/T_putfield_1
-.super java/lang/Object
-
-.field public st_i1 I
-.field protected st_p1 I
-.field private st_pvt1 I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    .limit stack 2
-    aload_0
-    ldc 1000000
-    putfield dxc.junit.opcodes.putfield.jm.T_putfield_1.st_i1 I
-    return
-.end method
-
-.method public getPvtField()I
-   aload_0    
-   getfield dxc.junit.opcodes.putfield.jm.T_putfield_1.st_pvt1 I
-   ireturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_1.java b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_1.java
deleted file mode 100644
index 23ae850..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_1.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putfield.jm;
-
-public class T_putfield_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/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_10.j b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_10.j
deleted file mode 100644
index 858ee70..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_10.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putfield_10.java
-.class public dxc/junit/opcodes/putfield/jm/T_putfield_10
-.super java/lang/Object
-
-.field public st_i1 I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    .limit stack 2
-    aload_0
-    ldc 1000000
-    putfield dxc.junit.opcodes.putfield.jm.T_putfield_10.st_i1N I
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_10.java b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_10.java
deleted file mode 100644
index 361e4f8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_10.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putfield.jm;
-
-public class T_putfield_10 {
-    public void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_11.j b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_11.j
deleted file mode 100644
index f11374f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_11.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putfield_11.java
-.class public dxc/junit/opcodes/putfield/jm/T_putfield_11
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    .limit stack 2
-    .limit locals 2
-
-    new dxc/junit/opcodes/putfield/TPutfield
-    dup
-    invokespecial dxc/junit/opcodes/putfield/TPutfield/<init>()V
-
-    ldc 1000000
-    putfield dxc.junit.opcodes.putfield.TPutfield.TestStubFieldFinal I
-
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_11.java b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_11.java
deleted file mode 100644
index e24a160..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putfield.jm;
-
-
-public class T_putfield_11 {
-    public void run() {
-        
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_12.j b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_12.j
deleted file mode 100644
index 7650f55..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_12.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putfield_12.java
-.class public dxc/junit/opcodes/putfield/jm/T_putfield_12
-.super java/lang/Object
-
-.field public final st_i1 I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    .limit stack 2
-    aload_0
-    ldc 1000000
-    putfield dxc.junit.opcodes.putfield.jm.T_putfield_12.st_i1 I
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_12.java b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_12.java
deleted file mode 100644
index c40a5e8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_12.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putfield.jm;
-
-public class T_putfield_12 {
-    public int st_i1;
-    
-    public void run() {
-        st_i1 = 1000000;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_13.j b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_13.j
deleted file mode 100644
index 0269325..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_13.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putfield_13.java
-.class public dxc/junit/opcodes/putfield/jm/T_putfield_13
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    .limit stack 2
-    
-    new dxc/junit/opcodes/putfield/TPutfield
-    dup
-    invokespecial dxc/junit/opcodes/putfield/TPutfield/<init>()V
-    
-    ldc 1000000
-    putfield dxc.junit.opcodes.putfield.TPutfield.TestStubFieldP I
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_13.java b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_13.java
deleted file mode 100644
index 3c2708b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_13.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putfield.jm;
-
-public class T_putfield_13 {
-    public void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_14.j b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_14.j
deleted file mode 100644
index 4a7ef88..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_14.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putfield_14.java
-.class public dxc/junit/opcodes/putfield/jm/T_putfield_14
-.super dxc/junit/opcodes/putfield/jm/T_putfield_1
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/putfield/jm/T_putfield_1/<init>()V
-    return
-.end method
-
-.method public run()V
-    .limit stack 2
-    aload_0
-    ldc 1000000
-    putfield dxc.junit.opcodes.putfield.jm.T_putfield_1.st_p1 I
-    return
-.end method
-
-.method public getProtectedField()I
-    .limit stack 2
-    aload_0
-    getfield dxc.junit.opcodes.putfield.jm.T_putfield_1.st_p1 I
-    ireturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_14.java b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_14.java
deleted file mode 100644
index 8ba1e76..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_14.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putfield.jm;
-
-public class T_putfield_14 extends T_putfield_1{
-    
-    public void run() {
-        st_p1 = 1000000;
-    }
-    
-    public int getProtectedField(){
-        return st_p1;
-    }
-    
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_15.j b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_15.j
deleted file mode 100644
index ee2c082..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_15.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putfield_15.java
-.class public dxc/junit/opcodes/putfield/jm/T_putfield_15
-.super dxc/junit/opcodes/putfield/jm/T_putfield_1
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/putfield/jm/T_putfield_1/<init>()V
-    return
-.end method
-
-.method public run()V
-    .limit stack 2
-    aload_0
-    ldc 10101
-    putfield dxc.junit.opcodes.putfield.jm.T_putfield_1.st_pvt1 I
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_15.java b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_15.java
deleted file mode 100644
index fabb97a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_15.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putfield.jm;
-
-public class T_putfield_15 extends T_putfield_1{
-    
-    public void run() {
-        throw new UnsupportedOperationException();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_16.j b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_16.j
deleted file mode 100644
index d62bb32..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_16.j
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putfield_16.java
-.class public dxc/junit/opcodes/putfield/jm/T_putfield_16
-.super java/lang/Object
-
-.field public o Ljava/lang/Object;
-
-
-.method public <init>()V
-    .limit stack 2
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    aload_0
-    aconst_null
-    putfield dxc.junit.opcodes.putfield.jm.T_putfield_16.o Ljava/lang/Object;
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 4
-    .limit locals 2
-
-    aload_0
-    new java/lang/String
-    dup
-    ldc ""
-    invokespecial java/lang/String/<init>(Ljava/lang/String;)V
-
-    putfield dxc.junit.opcodes.putfield.jm.T_putfield_16.o Ljava/lang/Object;
-
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_16.java b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_16.java
deleted file mode 100644
index 3ea025e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_16.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putfield.jm;
-
-public class T_putfield_16 {
-
-    public Object o = null;
-    
-    public void run() {
-        String s = new String("");
-        o = s;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_17.cfh b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_17.cfh
deleted file mode 100644
index b32c3df..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_17.cfh
+++ /dev/null
@@ -1,216 +0,0 @@
-//@class:dxc/junit/opcodes/putfield/jm/T_putfield_17
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0012
-// .  .  
-   00 12 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 11 00 0a 
-    // parsed:, offset 15, len 5, h: 0002: field{dxc.junit.opcodes.putfield.jm.T_putfield_17.st_i1:I}
-    // .  .  .  .  .  
-       09 00 0c 00 10 
-    // parsed:, offset 20, len 46, h: 0003: utf8{"dxc/junit/opcodes/putfield/jm/T_putfield_17"}
-    // .  .  +  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  p  u  t  f  i  e  l  d  /  j  m  /  T  _  p  u  t  f  i  e  l  d  _  1  7  
-       01 00 2b 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 70 75 74 66 69 65 6c 64 2f 6a 6d 2f 54 5f 70 75 74 66 69 65 6c 64 5f 31 37 
-    // parsed:, offset 66, len 19, h: 0004: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 85, len 21, h: 0005: utf8{"T_putfield_17.java"}
-    // .  .  .  T  _  p  u  t  f  i  e  l  d  _  1  7  .  j  a  v  a  
-       01 00 12 54 5f 70 75 74 66 69 65 6c 64 5f 31 37 2e 6a 61 76 61 
-    // parsed:, offset 106, len 5, h: 0006: int{0x000f4240 / 1000000}
-    // .  .  .  B  @  
-       03 00 0f 42 40 
-    // parsed:, offset 111, len 13, h: 0007: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 124, len 9, h: 0008: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 133, len 6, h: 0009: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 139, len 5, h: 000a: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 08 00 0d 
-    // parsed:, offset 144, len 7, h: 000b: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 151, len 3, h: 000c: type{dxc.junit.opcodes.putfield.jm.T_putfield_17}
-    // .  .  .  
-       07 00 03 
-    // parsed:, offset 154, len 6, h: 000d: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 160, len 8, h: 000e: utf8{"st_i1"}
-    // .  .  .  s  t  _  i  1  
-       01 00 05 73 74 5f 69 31 
-    // parsed:, offset 168, len 4, h: 000f: utf8{"I"}
-    // .  .  .  I  
-       01 00 01 49 
-    // parsed:, offset 172, len 5, h: 0010: nat{st_i1:I}
-    // .  .  .  .  .  
-       0c 00 0e 00 0f 
-    // parsed:, offset 177, len 3, h: 0011: type{java.lang.Object}
-    // .  .  .  
-       07 00 04 
-// parsed:, offset 180, len 0, h: end constant_pool
-// parsed:, offset 180, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 182, len 2, h: this_class: type{dxc.junit.opcodes.putfield.jm.T_putfield_17}
-// .  .  
-   00 0c 
-// parsed:, offset 184, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 11 
-// parsed:, offset 186, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 188, len 2, h: fields_count: 0001
-// .  .  
-   00 01 
-// ========== start-ParseMember:st_i1, offset 190, len:84,desc: I
-// parsed:, offset 190, len 0, h:  fields[0]: 
-    // parsed:, offset 190, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 192, len 2, h: name: st_i1
-    // .  .  
-       00 0e 
-    // parsed:, offset 194, len 2, h: descriptor: I
-    // .  .  
-       00 0f 
-    // parsed:, offset 196, len 2, h: attributes_count: 0000
-    // .  .  
-       00 00 
-// parsed:, offset 198, len 0, h: end fields[0] 
-// ========== end-ParseMember:st_i1, desc: I
-// parsed:, offset 198, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 200, len:74,desc: ()V
-// parsed:, offset 200, len 0, h:  methods[0]: 
-    // parsed:, offset 200, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 202, len 2, h: name: <init>
-    // .  .  
-       00 08 
-    // parsed:, offset 204, len 2, h: descriptor: ()V
-    // .  .  
-       00 0d 
-    // parsed:, offset 206, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 208, len 0, h:  attributes[0]: 
-        // parsed:, offset 208, len 2, h: name: Code
-        // .  .  
-           00 0b 
-        // parsed:, offset 210, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 214, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 216, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 218, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 227, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 229, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 231, len 0, h: end attributes[0] 
-// parsed:, offset 231, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 231, len:43,desc: ()V
-// parsed:, offset 231, len 0, h:  methods[1]: 
-    // parsed:, offset 231, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 233, len 2, h: name: run
-    // .  .  
-       00 09 
-    // parsed:, offset 235, len 2, h: descriptor: ()V
-    // .  .  
-       00 0d 
-    // parsed:, offset 237, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 239, len 0, h:  attributes[0]: 
-        // parsed:, offset 239, len 2, h: name: Code
-        // .  .  
-           00 0b 
-        // parsed:, offset 241, len 4, h: length: 00000013
-        // .  .  .  .  
-           00 00 00 13 
-        // parsed:, offset 245, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 247, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 249, len 4, h: code_length: 00000007
-        // .  .  .  .  
-           00 00 00 07 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 2, h: 0001: ldc #+000f4240
-        // .  .  
-           12 06 
-        // parsed:, offset 3, len 3, h: 0003: putfield field{dxc.junit.opcodes.putfield.jm.T_putfield_17.st_i1:I}
-        // .  .  .  
-//@mod           b5 00 02 
-           b5 00 06 
-        // parsed:, offset 6, len 1, h: 0006: return
-        // .  
-           b1 
-        // parsed:, offset 260, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 262, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 264, len 0, h: end attributes[0] 
-// parsed:, offset 264, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()V
-// parsed:, offset 264, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 266, len 0, h:  attributes[0]: 
-    // parsed:, offset 266, len 2, h: name: SourceFile
-    // .  .  
-       00 07 
-    // parsed:, offset 268, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 272, len 2, h: source: utf8{"T_putfield_17.java"}
-    // .  .  
-       00 05 
-// parsed:, offset 274, len 0, h: end attributes[0] 
-// parsed:, offset 274, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_17.j b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_17.j
deleted file mode 100644
index 03b2c62..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_17.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putfield_17.java
-.class public dxc/junit/opcodes/putfield/jm/T_putfield_17
-.super java/lang/Object
-
-.field public st_i1 I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    .limit stack 2
-    aload_0
-    ldc 1000000
-    putfield dxc.junit.opcodes.putfield.jm.T_putfield_17.st_i1 I
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_17.java b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_17.java
deleted file mode 100644
index be58b94..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_17.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putfield.jm;
-
-public class T_putfield_17 {
-
-    public int st_i1;
-    
-    public void run() {
-        st_i1 = 1000000;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_18.j b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_18.j
deleted file mode 100644
index 602550d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_18.j
+++ /dev/null
@@ -1,48 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putfield_18.java
-.class public dxc/junit/opcodes/putfield/jm/T_putfield_18
-.super java/lang/Object
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-.end method
-
-
-
-.method public run()Ljava/lang/String;
-    .limit stack 2
-    .limit locals 2
-
-    new dxc/junit/opcodes/putfield/jm/TChild
-    dup
-    invokespecial dxc/junit/opcodes/putfield/jm/TChild/<init>()V
-    astore_1
-
-    aload_1
-    ldc "xyz"
-    putfield dxc.junit.opcodes.putfield.jm.TSuper.s Ljava/lang/String;
-
-    aload_1
-    getfield dxc.junit.opcodes.putfield.jm.TChild.s Ljava/lang/String;
-
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_18.java b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_18.java
deleted file mode 100644
index 617bac2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_18.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putfield.jm;
-
-public class T_putfield_18 {
-
-    public String run() {
-        TChild c = new TChild();
-        c.s = "xyz";
-        return c.s;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_19.j b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_19.j
deleted file mode 100644
index 3f61b8c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_19.j
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putfield_19.java
-.class public dxc/junit/opcodes/putfield/jm/T_putfield_19
-.super java/lang/Object
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-.end method
-
-
-
-.method public run()Ljava/lang/Object;
-    .limit stack 2
-    .limit locals 2
-
-    new dxc/junit/opcodes/putfield/jm/TSuper
-    dup
-    invokespecial dxc/junit/opcodes/putfield/jm/TSuper/<init>()V
-    astore_1
-
-    aload_1
-    getfield dxc.junit.opcodes.putfield.jm.TChild.o Ljava/lang/Object;
-
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_19.java b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_19.java
deleted file mode 100644
index fd9d29e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_19.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putfield.jm;
-
-public class T_putfield_19 {
-
-    public Object run() {
-        TChild c = new TChild();
-        return c.o;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_2.j b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_2.j
deleted file mode 100644
index 8414dfd..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_2.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putfield_2.java
-.class public dxc/junit/opcodes/putfield/jm/T_putfield_2
-.super java/lang/Object
-
-.field public st_d1 D
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    .limit stack 3
-    aload_0
-    ldc2_w 1000000.0
-    putfield dxc.junit.opcodes.putfield.jm.T_putfield_2.st_d1 D
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_2.java b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_2.java
deleted file mode 100644
index bd039eb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_2.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putfield.jm;
-
-public class T_putfield_2 {
-
-    public double st_d1;
-    
-    public void run() {
-        st_d1 = 1000000d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_20.j b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_20.j
deleted file mode 100644
index 7aaf9b5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_20.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putfield_20.java
-.class public dxc/junit/opcodes/putfield/jm/T_putfield_20
-.super java/lang/Object
-
-.field public v I
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-.end method
-
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 1
-
-    aload_0
-    ldc 3.14
-    
-    putfield dxc.junit.opcodes.putfield.jm.T_putfield_20.v I
-
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_20.java b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_20.java
deleted file mode 100644
index ebe55eb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_20.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putfield.jm;
-
-public class T_putfield_20 {
-
-    public int v;
-    
-    public void run() {
-        v = (int)3.14;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_3.cfh b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_3.cfh
deleted file mode 100644
index 887ad58..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_3.cfh
+++ /dev/null
@@ -1,216 +0,0 @@
-//@class:dxc/junit/opcodes/putfield/jm/T_putfield_3
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0012
-// .  .  
-   00 12 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0e 00 06 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 6, h: 0005: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 62, len 5, h: 0006: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 0b 
-    // parsed:, offset 67, len 7, h: 0007: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 74, len 5, h: 0008: field{dxc.junit.opcodes.putfield.jm.T_putfield_3.st_i1:I}
-    // .  .  .  .  .  
-       09 00 0f 00 0d 
-    // parsed:, offset 79, len 5, h: 0009: int{0x000f4240 / 1000000}
-    // .  .  .  B  @  
-       03 00 0f 42 40 
-    // parsed:, offset 84, len 20, h: 000a: utf8{"T_putfield_3.java"}
-    // .  .  .  T  _  p  u  t  f  i  e  l  d  _  3  .  j  a  v  a  
-       01 00 11 54 5f 70 75 74 66 69 65 6c 64 5f 33 2e 6a 61 76 61 
-    // parsed:, offset 104, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 110, len 8, h: 000c: utf8{"st_i1"}
-    // .  .  .  s  t  _  i  1  
-       01 00 05 73 74 5f 69 31 
-    // parsed:, offset 118, len 5, h: 000d: nat{st_i1:I}
-    // .  .  .  .  .  
-       0c 00 0c 00 10 
-    // parsed:, offset 123, len 3, h: 000e: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-    // parsed:, offset 126, len 3, h: 000f: type{dxc.junit.opcodes.putfield.jm.T_putfield_3}
-    // .  .  .  
-       07 00 11 
-    // parsed:, offset 129, len 4, h: 0010: utf8{"I"}
-    // .  .  .  I  
-       01 00 01 49 
-    // parsed:, offset 133, len 45, h: 0011: utf8{"dxc/junit/opcodes/putfield/jm/T_putfield_3"}
-    // .  .  *  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  p  u  t  f  i  e  l  d  /  j  m  /  T  _  p  u  t  f  i  e  l  d  _  3  
-       01 00 2a 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 70 75 74 66 69 65 6c 64 2f 6a 6d 2f 54 5f 70 75 74 66 69 65 6c 64 5f 33 
-// parsed:, offset 178, len 0, h: end constant_pool
-// parsed:, offset 178, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 180, len 2, h: this_class: type{dxc.junit.opcodes.putfield.jm.T_putfield_3}
-// .  .  
-   00 0f 
-// parsed:, offset 182, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0e 
-// parsed:, offset 184, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 186, len 2, h: fields_count: 0001
-// .  .  
-   00 01 
-// ========== start-ParseMember:st_i1, offset 188, len:84,desc: I
-// parsed:, offset 188, len 0, h:  fields[0]: 
-    // parsed:, offset 188, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 190, len 2, h: name: st_i1
-    // .  .  
-       00 0c 
-    // parsed:, offset 192, len 2, h: descriptor: I
-    // .  .  
-       00 10 
-    // parsed:, offset 194, len 2, h: attributes_count: 0000
-    // .  .  
-       00 00 
-// parsed:, offset 196, len 0, h: end fields[0] 
-// ========== end-ParseMember:st_i1, desc: I
-// parsed:, offset 196, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 198, len:74,desc: ()V
-// parsed:, offset 198, len 0, h:  methods[0]: 
-    // parsed:, offset 198, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 200, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 202, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 204, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 206, len 0, h:  attributes[0]: 
-        // parsed:, offset 206, len 2, h: name: Code
-        // .  .  
-           00 07 
-        // parsed:, offset 208, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 212, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 214, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 216, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 225, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 227, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 229, len 0, h: end attributes[0] 
-// parsed:, offset 229, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 229, len:43,desc: ()V
-// parsed:, offset 229, len 0, h:  methods[1]: 
-    // parsed:, offset 229, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 231, len 2, h: name: run
-    // .  .  
-       00 05 
-    // parsed:, offset 233, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 235, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 237, len 0, h:  attributes[0]: 
-        // parsed:, offset 237, len 2, h: name: Code
-        // .  .  
-           00 07 
-        // parsed:, offset 239, len 4, h: length: 00000013
-        // .  .  .  .  
-           00 00 00 13 
-        // parsed:, offset 243, len 2, h: max_stack: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 245, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 247, len 4, h: code_length: 00000007
-        // .  .  .  .  
-           00 00 00 07 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 2, h: 0001: ldc #+000f4240
-        // .  .  
-           12 09 
-        // parsed:, offset 3, len 3, h: 0003: putfield field{dxc.junit.opcodes.putfield.jm.T_putfield_3.st_i1:I}
-        // .  .  .  
-//@mod:           b5 00 08 
-           b5 01 08 
-        // parsed:, offset 6, len 1, h: 0006: return
-        // .  
-           b1 
-        // parsed:, offset 258, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 260, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 262, len 0, h: end attributes[0] 
-// parsed:, offset 262, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()V
-// parsed:, offset 262, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 264, len 0, h:  attributes[0]: 
-    // parsed:, offset 264, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 266, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 270, len 2, h: source: utf8{"T_putfield_3.java"}
-    // .  .  
-       00 0a 
-// parsed:, offset 272, len 0, h: end attributes[0] 
-// parsed:, offset 272, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_3.j b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_3.j
deleted file mode 100644
index 10d3f53..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_3.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putfield_3.java
-.class public dxc/junit/opcodes/putfield/jm/T_putfield_3
-.super java/lang/Object
-
-.field public st_i1 I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    .limit stack 2
-    aload_0
-    ldc 1000000
-    putfield dxc.junit.opcodes.putfield.jm.T_putfield_3.st_i1 I
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_3.java b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_3.java
deleted file mode 100644
index 6c7216e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_3.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putfield.jm;
-
-public class T_putfield_3 {
-
-    public int st_i1;
-    
-    public void run() {
-        st_i1 = 1000000;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_4.j b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_4.j
deleted file mode 100644
index 5a4195a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_4.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putfield_4.java
-.class public dxc/junit/opcodes/putfield/jm/T_putfield_4
-.super java/lang/Object
-
-.field public st_i1 I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    .limit stack 2
-    aload_0
-;    ldc 1000000
-    putfield dxc.junit.opcodes.putfield.jm.T_putfield_4.st_i1 I
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_4.java b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_4.java
deleted file mode 100644
index 142d193..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_4.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putfield.jm;
-
-public class T_putfield_4 {
-
-    public int st_i1;
-    
-    public void run() {
-        st_i1 = 1000000;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_5.j b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_5.j
deleted file mode 100644
index 6ccc8c0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_5.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putfield_5.java
-.class public dxc/junit/opcodes/putfield/jm/T_putfield_5
-.super java/lang/Object
-
-.field public st_i1 I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    .limit stack 2
-    aload_0
-;    ldc 1000000
-    fconst_1
-    putfield dxc.junit.opcodes.putfield.jm.T_putfield_5.st_i1 I
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_5.java b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_5.java
deleted file mode 100644
index 9be3923..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_5.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putfield.jm;
-
-public class T_putfield_5 {
-
-    public int st_i1;
-    
-    public void run() {
-        st_i1 = 1000000;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_6.j b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_6.j
deleted file mode 100644
index 916a084..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_6.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putfield_6.java
-.class public dxc/junit/opcodes/putfield/jm/T_putfield_6
-.super java/lang/Object
-
-.field public s Ljava/lang/String;
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 2
-
-    new java/lang/Object
-    dup
-    invokespecial java/lang/Object/<init>()V
-
-    aload_0
-    putfield dxc.junit.opcodes.putfield.jm.T_putfield_6.s Ljava/lang/String;
-
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_6.java b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_6.java
deleted file mode 100644
index 63855a0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_6.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putfield.jm;
-
-public class T_putfield_6 {
-
-    public String s;
-    
-    public void run() {
-        Object o = new Object();
-        s = (String)o;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_7.j b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_7.j
deleted file mode 100644
index a3088a5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_7.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putfield_7.java
-.class public dxc/junit/opcodes/putfield/jm/T_putfield_7
-.super java/lang/Object
-
-.field public static st_i1 I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    .limit stack 2
-    aload_0
-    ldc 1000000
-    putfield dxc.junit.opcodes.putfield.jm.T_putfield_7.st_i1 I
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_7.java b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_7.java
deleted file mode 100644
index 54bd49f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_7.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putfield.jm;
-
-public class T_putfield_7 {
-    public int st_i1;
-    
-    public void run() {
-        st_i1 = 1000000;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_8.j b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_8.j
deleted file mode 100644
index 07e9b12..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_8.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putfield_8.java
-.class public dxc/junit/opcodes/putfield/jm/T_putfield_8
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    .limit stack 2
-    
-    new dxc/junit/opcodes/putfield/TPutfield
-    dup
-    invokespecial dxc/junit/opcodes/putfield/TPutfield/<init>()V
-    
-    ldc 1000000
-    putfield dxc.junit.opcodes.putfield.TPutfield.TestStubField I
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_8.java b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_8.java
deleted file mode 100644
index 4860faf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_8.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putfield.jm;
-
-public class T_putfield_8 {
-    public void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_9.j b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_9.j
deleted file mode 100644
index 79bd8114..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_9.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putfield_9.java
-.class public dxc/junit/opcodes/putfield/jm/T_putfield_9
-.super java/lang/Object
-
-.field public st_i1 I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    .limit stack 2
-    aconst_null
-    ldc 1000000
-    putfield dxc.junit.opcodes.putfield.jm.T_putfield_9.st_i1 I
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_9.java b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_9.java
deleted file mode 100644
index 33b7c7a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/T_putfield_9.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putfield.jm;
-
-public class T_putfield_9 {
-    public void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/TestStubs.java b/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/TestStubs.java
deleted file mode 100644
index de2dcc6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putfield/jm/TestStubs.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putfield.jm;
-
-
-
-class TSuper {
-    public String s = "abc";
-}
-
-class TChild extends TSuper {
-    public Object o = null;    
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/TestStubs.java b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/TestStubs.java
deleted file mode 100644
index 64a481a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/TestStubs.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putstatic;
-
-public class TestStubs {
-    // used by testE2
-    static int TestStubField = 0;
-
-    // used by testE5
-    public static final int TestStubFieldFinal = 0;
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/Test_putstatic.java b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/Test_putstatic.java
deleted file mode 100644
index 9d438d8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/Test_putstatic.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putstatic;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.putstatic.jm.T_putstatic_1;
-import dxc.junit.opcodes.putstatic.jm.T_putstatic_10;
-import dxc.junit.opcodes.putstatic.jm.T_putstatic_11;
-import dxc.junit.opcodes.putstatic.jm.T_putstatic_12;
-import dxc.junit.opcodes.putstatic.jm.T_putstatic_13;
-import dxc.junit.opcodes.putstatic.jm.T_putstatic_14;
-import dxc.junit.opcodes.putstatic.jm.T_putstatic_15;
-import dxc.junit.opcodes.putstatic.jm.T_putstatic_16;
-import dxc.junit.opcodes.putstatic.jm.T_putstatic_2;
-import dxc.junit.opcodes.putstatic.jm.T_putstatic_7;
-import dxc.junit.opcodes.putstatic.jm.T_putstatic_8;
-import dxc.junit.opcodes.putstatic.jm.T_putstatic_9;
-
-public class Test_putstatic extends DxTestCase {
-
-    /**
-     * @title  type - int
-     */
-    public void testN1() {
-        T_putstatic_1 t = new T_putstatic_1();
-        assertEquals(0, T_putstatic_1.st_i1);
-        t.run();
-        assertEquals(1000000, T_putstatic_1.st_i1);
-    }
-
-    /**
-     * @title  type - double
-     */
-    public void testN2() {
-        T_putstatic_2 t = new T_putstatic_2();
-        assertEquals(0d, T_putstatic_2.st_d1);
-        t.run();
-        assertEquals(1000000d, T_putstatic_2.st_d1);
-    }
-
-    /**
-     * @title  modification of final field
-     */
-    public void testN3() {
-        T_putstatic_12 t = new T_putstatic_12();
-        assertEquals(0, T_putstatic_12.st_i1);
-        t.run();
-        assertEquals(1000000, T_putstatic_12.st_i1);
-    }
-
-    /**
-     * @title  modification of protected field from subclass
-     */
-    public void testN4() {
-        // @uses dxc.junit.opcodes.putstatic.jm.T_putstatic_1
-        T_putstatic_14 t = new T_putstatic_14();
-        assertEquals(0, T_putstatic_14.getProtectedField());
-        t.run();
-        assertEquals(1000000, T_putstatic_14.getProtectedField());
-    }
-
-    /**
-     * @title  assignment compatible references
-     */
-    public void testN5() {
-        T_putstatic_16 t = new T_putstatic_16();
-        assertNull(T_putstatic_16.o);
-        t.run();
-        assertEquals("", (String) T_putstatic_16.o);
-    }
-
-    /**
-     * @title  attempt to set non-static field
-     */
-    public void testE1() {
-        try {
-            T_putstatic_7 t = new T_putstatic_7();
-            t.run();
-            fail("expected IncompatibleClassChangeError");
-        } catch (IncompatibleClassChangeError e) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title  modification of non-accessible field
-     */
-    public void testE2() {
-        // @uses dxc.junit.opcodes.putstatic.TestStubs
-        try {
-            T_putstatic_8 t = new T_putstatic_8();
-            t.run();
-            fail("expected IllegalAccessError");
-        } catch (IllegalAccessError iae) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title expected NoClassDefFoundError
-     */
-    public void testE3() {
-        try {
-            T_putstatic_9 t = new T_putstatic_9();
-            t.run();
-            fail("expected NoClassDefFoundError");
-        } catch (NoClassDefFoundError e) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title expected NoSuchFieldError
-     */
-    public void testE4() {
-        try {
-            T_putstatic_10 t = new T_putstatic_10();
-            t.run();
-            fail("expected NoSuchFieldError");
-        } catch (NoSuchFieldError e) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title  Modification of final field in other class
-     */
-    public void testE5() {
-        // @uses dxc.junit.opcodes.putstatic.TestStubs
-        try {
-            T_putstatic_11 t = new T_putstatic_11();
-            t.run();
-            fail("expected IllegalAccessError");
-        } catch (IllegalAccessError iae) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @title  initialization of referenced class throws exception
-     */
-    public void testE6() {
-        // @uses dxc.junit.opcodes.putstatic.jm.StubInitError
-        T_putstatic_13 t = new T_putstatic_13();
-        try {
-            t.run();
-            fail("expected Error");
-        } catch (Error e) {
-            // expected
-        }
-    }
-
-    //  FIXME: "fail" commented out temporarily - check
-    /**
-     * @title  modification of superclass' private field from subclass
-     * FIXME: is this a bug in JVM?
-     */
-    public void testE7() {
-        // @uses dxc.junit.opcodes.putstatic.jm.T_putstatic_1
-        try {
-            assertEquals(0, T_putstatic_15.getPvtField());
-            T_putstatic_15 t = new T_putstatic_15();
-            t.run();
-            assertEquals(12321, T_putstatic_15.getPvtField());
-            //fail("expected IllegalAccessError");
-        } catch (IllegalAccessError e) {
-            // expected
-        } catch (VerifyError vfe) { 
-            // ok for dalvikvm; 
-            System.out.print("dvmvfe:"); 
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.12
-     * @title constant pool index
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.putstatic.jm.T_putstatic_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.putstatic.jm.T_putstatic_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.17
-     * @title type of argument - float instead of
-     * int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.putstatic.jm.T_putstatic_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.17
-     * @title type of argument - assignment
-     * incompatible references
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.putstatic.jm.T_putstatic_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.17
-     * @title type of argument - assignment
-     * incompatible values
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.putstatic.jm.T_putstatic_18");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-
-    /**
-     * @constraint 4.8.1.12
-     * @title constant pool type
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.putstatic.jm.T_putstatic_17");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_1.j b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_1.j
deleted file mode 100644
index b1a57ba..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_1.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putstatic_1.java
-.class public dxc/junit/opcodes/putstatic/jm/T_putstatic_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
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    ldc 1000000
-    putstatic dxc.junit.opcodes.putstatic.jm.T_putstatic_1.st_i1 I
-    return
-.end method
-
-.method public static getPvtField()I
-   getstatic dxc.junit.opcodes.putstatic.jm.T_putstatic_1.st_pvt1 I
-   ireturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_1.java b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_1.java
deleted file mode 100644
index 4876ea0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_1.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putstatic.jm;
-
-public class T_putstatic_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/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_10.j b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_10.j
deleted file mode 100644
index 6ffd777..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_10.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putstatic_10.java
-.class public dxc/junit/opcodes/putstatic/jm/T_putstatic_10
-.super java/lang/Object
-
-.field public st_i1 I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    ldc 1000000
-    putstatic dxc.junit.opcodes.putstatic.jm.T_putstatic_10.st_i1N I
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_10.java b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_10.java
deleted file mode 100644
index c1a6d75..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_10.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putstatic.jm;
-
-public class T_putstatic_10 {
-    public void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_11.j b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_11.j
deleted file mode 100644
index c60bb18..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_11.j
+++ /dev/null
@@ -1,29 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putstatic_11.java
-.class public dxc/junit/opcodes/putstatic/jm/T_putstatic_11
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    ldc 1000000
-    putstatic dxc.junit.opcodes.putstatic.TestStubs.TestStubFieldFinal I
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_11.java b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_11.java
deleted file mode 100644
index 6231867..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_11.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putstatic.jm;
-
-public class T_putstatic_11 {
-    public void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_12.j b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_12.j
deleted file mode 100644
index 044864b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_12.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putstatic_12.java
-.class public dxc/junit/opcodes/putstatic/jm/T_putstatic_12
-.super java/lang/Object
-
-.field public final static st_i1 I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    ldc 1000000
-    putstatic dxc.junit.opcodes.putstatic.jm.T_putstatic_12.st_i1 I
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_12.java b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_12.java
deleted file mode 100644
index 1261528..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_12.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putstatic.jm;
-
-public class T_putstatic_12 {
-    public static int st_i1;
-    
-    public void run() {
-        st_i1 = 1000000;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_13.j b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_13.j
deleted file mode 100644
index 5216b3f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_13.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putstatic_13.java
-.class public dxc/junit/opcodes/putstatic/jm/T_putstatic_13
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()I
-    .limit stack 1
-    .limit locals 1
-
-    getstatic dxc.junit.opcodes.putstatic.jm.StubInitError.value I
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_13.java b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_13.java
deleted file mode 100644
index 16afdc1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_13.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putstatic.jm;
-
-public class T_putstatic_13 {
-    
-    public int run() {
-        return StubInitError.value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_14.j b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_14.j
deleted file mode 100644
index c781c03..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_14.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putstatic_14.java
-.class public dxc/junit/opcodes/putstatic/jm/T_putstatic_14
-.super dxc/junit/opcodes/putstatic/jm/T_putstatic_1
-
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/putstatic/jm/T_putstatic_1/<init>()V
-    return
-.end method
-
-.method public run()V
-    ldc 1000000
-    putstatic dxc.junit.opcodes.putstatic.jm.T_putstatic_1.st_p1 I
-    return
-.end method
-
-.method public static getProtectedField()I
-   getstatic dxc.junit.opcodes.putstatic.jm.T_putstatic_1.st_p1 I
-   ireturn
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_14.java b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_14.java
deleted file mode 100644
index 80296f9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_14.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putstatic.jm;
-
-public class T_putstatic_14 extends T_putstatic_1{
-    
-    public void run() {
-        T_putstatic_1.st_p1 = 1000000;
-    }
-    
-    public static int getProtectedField(){
-        return T_putstatic_1.st_p1;
-    }
-    
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_15.j b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_15.j
deleted file mode 100644
index 44e8785..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_15.j
+++ /dev/null
@@ -1,29 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putstatic_15.java
-.class public dxc/junit/opcodes/putstatic/jm/T_putstatic_15
-.super dxc/junit/opcodes/putstatic/jm/T_putstatic_1
-
-.method public <init>()V
-    aload_0
-    invokespecial dxc/junit/opcodes/putstatic/jm/T_putstatic_1/<init>()V
-    return
-.end method
-
-.method public run()V
-    ldc 12321
-    putstatic dxc.junit.opcodes.putstatic.jm.T_putstatic_1.st_pvt1 I
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_15.java b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_15.java
deleted file mode 100644
index b2f4dae..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_15.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putstatic.jm;
-
-public class T_putstatic_15 extends T_putstatic_1{
-    
-    public void run() {
-        //
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_16.j b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_16.j
deleted file mode 100644
index 6b1d154..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_16.j
+++ /dev/null
@@ -1,55 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putstatic_16.java
-.class public dxc/junit/opcodes/putstatic/jm/T_putstatic_16
-.super java/lang/Object
-
-.field public static o Ljava/lang/Object;
-
-.method static <clinit>()V
-    .limit stack 1
-    .limit locals 0
-
-    aconst_null
-    putstatic dxc.junit.opcodes.putstatic.jm.T_putstatic_16.o Ljava/lang/Object;
-
-    return
-.end method
-
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-.end method
-
-
-
-.method public run()V
-    .limit stack 3
-    .limit locals 2
-
-    new java/lang/String
-    dup
-    ldc ""
-    invokespecial java/lang/String/<init>(Ljava/lang/String;)V
-
-    putstatic dxc.junit.opcodes.putstatic.jm.T_putstatic_16.o Ljava/lang/Object;
-
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_16.java b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_16.java
deleted file mode 100644
index b0d5d14..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_16.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putstatic.jm;
-
-public class T_putstatic_16 {
-
-    public static Object o = null;
-    
-    public void run() {
-        String s = new String("");
-        o = s;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_17.cfh b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_17.cfh
deleted file mode 100644
index e5e2de3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_17.cfh
+++ /dev/null
@@ -1,213 +0,0 @@
-//@class:dxc/junit/opcodes/putstatic/jm/T_putstatic_17
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0012
-// .  .  
-   00 12 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 11 00 08 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 5, h: 0003: int{0x000f4240 / 1000000}
-    // .  .  .  B  @  
-       03 00 0f 42 40 
-    // parsed:, offset 39, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 52, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 61, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 67, len 22, h: 0007: utf8{"T_putstatic_17.java"}
-    // .  .  .  T  _  p  u  t  s  t  a  t  i  c  _  1  7  .  j  a  v  a  
-       01 00 13 54 5f 70 75 74 73 74 61 74 69 63 5f 31 37 2e 6a 61 76 61 
-    // parsed:, offset 89, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0b 
-    // parsed:, offset 94, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 101, len 48, h: 000a: utf8{"dxc/junit/opcodes/putstatic/jm/T_putstatic_17"}
-    // .  .  -  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  p  u  t  s  t  a  t  i  c  /  j  m  /  T  _  p  u  t  s  t  a  t  i  c  _  1  7  
-       01 00 2d 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 70 75 74 73 74 61 74 69 63 2f 6a 6d 2f 54 5f 70 75 74 73 74 61 74 69 63 5f 31 37 
-    // parsed:, offset 149, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 155, len 8, h: 000c: utf8{"st_i1"}
-    // .  .  .  s  t  _  i  1  
-       01 00 05 73 74 5f 69 31 
-    // parsed:, offset 163, len 4, h: 000d: utf8{"I"}
-    // .  .  .  I  
-       01 00 01 49 
-    // parsed:, offset 167, len 3, h: 000e: type{dxc.junit.opcodes.putstatic.jm.T_putstatic_17}
-    // .  .  .  
-       07 00 0a 
-    // parsed:, offset 170, len 5, h: 000f: nat{st_i1:I}
-    // .  .  .  .  .  
-       0c 00 0c 00 0d 
-    // parsed:, offset 175, len 5, h: 0010: field{dxc.junit.opcodes.putstatic.jm.T_putstatic_17.st_i1:I}
-    // .  .  .  .  .  
-       09 00 0e 00 0f 
-    // parsed:, offset 180, len 3, h: 0011: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 183, len 0, h: end constant_pool
-// parsed:, offset 183, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 185, len 2, h: this_class: type{dxc.junit.opcodes.putstatic.jm.T_putstatic_17}
-// .  .  
-   00 0e 
-// parsed:, offset 187, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 11 
-// parsed:, offset 189, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 191, len 2, h: fields_count: 0001
-// .  .  
-   00 01 
-// ========== start-ParseMember:st_i1, offset 193, len:83,desc: I
-// parsed:, offset 193, len 0, h:  fields[0]: 
-    // parsed:, offset 193, len 2, h: access_flags: public|static
-    // .  .  
-       00 09 
-    // parsed:, offset 195, len 2, h: name: st_i1
-    // .  .  
-       00 0c 
-    // parsed:, offset 197, len 2, h: descriptor: I
-    // .  .  
-       00 0d 
-    // parsed:, offset 199, len 2, h: attributes_count: 0000
-    // .  .  
-       00 00 
-// parsed:, offset 201, len 0, h: end fields[0] 
-// ========== end-ParseMember:st_i1, desc: I
-// parsed:, offset 201, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 203, len:73,desc: ()V
-// parsed:, offset 203, len 0, h:  methods[0]: 
-    // parsed:, offset 203, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 205, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 207, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 209, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 211, len 0, h:  attributes[0]: 
-        // parsed:, offset 211, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 213, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 217, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 219, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 221, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 230, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 232, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 234, len 0, h: end attributes[0] 
-// parsed:, offset 234, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 234, len:42,desc: ()V
-// parsed:, offset 234, len 0, h:  methods[1]: 
-    // parsed:, offset 234, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 236, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 238, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 240, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 242, len 0, h:  attributes[0]: 
-        // parsed:, offset 242, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 244, len 4, h: length: 00000012
-        // .  .  .  .  
-           00 00 00 12 
-        // parsed:, offset 248, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 250, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 252, len 4, h: code_length: 00000006
-        // .  .  .  .  
-           00 00 00 06 
-        // parsed:, offset 0, len 2, h: 0000: ldc #+000f4240
-        // .  .  
-           12 03 
-        // parsed:, offset 2, len 3, h: 0002: putstatic field{dxc.junit.opcodes.putstatic.jm.T_putstatic_17.st_i1:I}
-        // .  .  .  
-//@mod           b3 00 10 
-           b3 00 03 
-        // parsed:, offset 5, len 1, h: 0005: return
-        // .  
-           b1 
-        // parsed:, offset 262, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 264, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 266, len 0, h: end attributes[0] 
-// parsed:, offset 266, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()V
-// parsed:, offset 266, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 268, len 0, h:  attributes[0]: 
-    // parsed:, offset 268, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 270, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 274, len 2, h: source: utf8{"T_putstatic_17.java"}
-    // .  .  
-       00 07 
-// parsed:, offset 276, len 0, h: end attributes[0] 
-// parsed:, offset 276, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_17.j b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_17.j
deleted file mode 100644
index 18b3e14..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_17.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putstatic_17.java
-.class public dxc/junit/opcodes/putstatic/jm/T_putstatic_17
-.super java/lang/Object
-
-.field public static st_i1 I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    ldc 1000000
-    putstatic dxc.junit.opcodes.putstatic.jm.T_putstatic_17.st_i1 I
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_17.java b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_17.java
deleted file mode 100644
index 28056a7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_17.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putstatic.jm;
-
-public class T_putstatic_17 {
-
-    public static int st_i1;
-    
-    public void run() {
-        st_i1 = 1000000;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_18.j b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_18.j
deleted file mode 100644
index 83d518a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_18.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putstatic_18.java
-.class public dxc/junit/opcodes/putstatic/jm/T_putstatic_18
-.super java/lang/Object
-
-.field public static v I
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-.end method
-
-
-
-.method public run()V
-    .limit stack 1
-    .limit locals 1
-
-    ldc 3.14
-    putstatic dxc.junit.opcodes.putstatic.jm.T_putstatic_18.v I
-
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_18.java b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_18.java
deleted file mode 100644
index 5293bcf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_18.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putstatic.jm;
-
-public class T_putstatic_18 {
-
-    public static int v;
-    
-    public void run() {
-        v = (int)3.14f;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_2.j b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_2.j
deleted file mode 100644
index 2b2ca2c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_2.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putstatic_2.java
-.class public dxc/junit/opcodes/putstatic/jm/T_putstatic_2
-.super java/lang/Object
-
-.field public static st_d1 D
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    .limit stack 2
-    ldc2_w 1000000.0
-    putstatic dxc.junit.opcodes.putstatic.jm.T_putstatic_2.st_d1 D
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_2.java b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_2.java
deleted file mode 100644
index eb40d35..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_2.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putstatic.jm;
-
-public class T_putstatic_2 {
-
-    public static double st_d1;
-    
-    public void run() {
-        st_d1 = 1000000d;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_3.cfh b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_3.cfh
deleted file mode 100644
index e200a7c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_3.cfh
+++ /dev/null
@@ -1,213 +0,0 @@
-//@class:dxc/junit/opcodes/putstatic/jm/T_putstatic_3
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 0012
-// .  .  
-   00 12 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0f 00 07 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 21, h: 0005: utf8{"T_putstatic_3.java"}
-    // .  .  .  T  _  p  u  t  s  t  a  t  i  c  _  3  .  j  a  v  a  
-       01 00 12 54 5f 70 75 74 73 74 61 74 69 63 5f 33 2e 6a 61 76 61 
-    // parsed:, offset 77, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 83, len 5, h: 0007: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 0c 
-    // parsed:, offset 88, len 47, h: 0008: utf8{"dxc/junit/opcodes/putstatic/jm/T_putstatic_3"}
-    // .  .  ,  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  p  u  t  s  t  a  t  i  c  /  j  m  /  T  _  p  u  t  s  t  a  t  i  c  _  3  
-       01 00 2c 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 70 75 74 73 74 61 74 69 63 2f 6a 6d 2f 54 5f 70 75 74 73 74 61 74 69 63 5f 33 
-    // parsed:, offset 135, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 142, len 5, h: 000a: int{0x000f4240 / 1000000}
-    // .  .  .  B  @  
-       03 00 0f 42 40 
-    // parsed:, offset 147, len 3, h: 000b: type{dxc.junit.opcodes.putstatic.jm.T_putstatic_3}
-    // .  .  .  
-       07 00 08 
-    // parsed:, offset 150, len 6, h: 000c: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 156, len 8, h: 000d: utf8{"st_i1"}
-    // .  .  .  s  t  _  i  1  
-       01 00 05 73 74 5f 69 31 
-    // parsed:, offset 164, len 5, h: 000e: nat{st_i1:I}
-    // .  .  .  .  .  
-       0c 00 0d 00 10 
-    // parsed:, offset 169, len 3, h: 000f: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-    // parsed:, offset 172, len 4, h: 0010: utf8{"I"}
-    // .  .  .  I  
-       01 00 01 49 
-    // parsed:, offset 176, len 5, h: 0011: field{dxc.junit.opcodes.putstatic.jm.T_putstatic_3.st_i1:I}
-    // .  .  .  .  .  
-       09 00 0b 00 0e 
-// parsed:, offset 181, len 0, h: end constant_pool
-// parsed:, offset 181, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 183, len 2, h: this_class: type{dxc.junit.opcodes.putstatic.jm.T_putstatic_3}
-// .  .  
-   00 0b 
-// parsed:, offset 185, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0f 
-// parsed:, offset 187, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 189, len 2, h: fields_count: 0001
-// .  .  
-   00 01 
-// ========== start-ParseMember:st_i1, offset 191, len:83,desc: I
-// parsed:, offset 191, len 0, h:  fields[0]: 
-    // parsed:, offset 191, len 2, h: access_flags: public|static
-    // .  .  
-       00 09 
-    // parsed:, offset 193, len 2, h: name: st_i1
-    // .  .  
-       00 0d 
-    // parsed:, offset 195, len 2, h: descriptor: I
-    // .  .  
-       00 10 
-    // parsed:, offset 197, len 2, h: attributes_count: 0000
-    // .  .  
-       00 00 
-// parsed:, offset 199, len 0, h: end fields[0] 
-// ========== end-ParseMember:st_i1, desc: I
-// parsed:, offset 199, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 201, len:73,desc: ()V
-// parsed:, offset 201, len 0, h:  methods[0]: 
-    // parsed:, offset 201, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 203, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 205, len 2, h: descriptor: ()V
-    // .  .  
-       00 0c 
-    // parsed:, offset 207, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 209, len 0, h:  attributes[0]: 
-        // parsed:, offset 209, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 211, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 215, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 217, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 219, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 228, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 230, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 232, len 0, h: end attributes[0] 
-// parsed:, offset 232, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 232, len:42,desc: ()V
-// parsed:, offset 232, len 0, h:  methods[1]: 
-    // parsed:, offset 232, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 234, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 236, len 2, h: descriptor: ()V
-    // .  .  
-       00 0c 
-    // parsed:, offset 238, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 240, len 0, h:  attributes[0]: 
-        // parsed:, offset 240, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 242, len 4, h: length: 00000012
-        // .  .  .  .  
-           00 00 00 12 
-        // parsed:, offset 246, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 248, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 250, len 4, h: code_length: 00000006
-        // .  .  .  .  
-           00 00 00 06 
-        // parsed:, offset 0, len 2, h: 0000: ldc #+000f4240
-        // .  .  
-           12 0a 
-        // parsed:, offset 2, len 3, h: 0002: putstatic field{dxc.junit.opcodes.putstatic.jm.T_putstatic_3.st_i1:I}
-        // .  .  .  
-//@mod           b3 00 11 
-           b3 01 11 
-        // parsed:, offset 5, len 1, h: 0005: return
-        // .  
-           b1 
-        // parsed:, offset 260, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 262, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 264, len 0, h: end attributes[0] 
-// parsed:, offset 264, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()V
-// parsed:, offset 264, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 266, len 0, h:  attributes[0]: 
-    // parsed:, offset 266, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 268, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 272, len 2, h: source: utf8{"T_putstatic_3.java"}
-    // .  .  
-       00 05 
-// parsed:, offset 274, len 0, h: end attributes[0] 
-// parsed:, offset 274, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_3.j b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_3.j
deleted file mode 100644
index b72a7b0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_3.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putstatic_3.java
-.class public dxc/junit/opcodes/putstatic/jm/T_putstatic_3
-.super java/lang/Object
-
-.field public static st_i1 I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    ldc 1000000
-    putstatic dxc.junit.opcodes.putstatic.jm.T_putstatic_3.st_i1 I
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_3.java b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_3.java
deleted file mode 100644
index 1ec204e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_3.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putstatic.jm;
-
-public class T_putstatic_3 {
-
-    public static int st_i1;
-    
-    public void run() {
-        st_i1 = 1000000;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_4.j b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_4.j
deleted file mode 100644
index 24fa5aa..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_4.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putstatic_4.java
-.class public dxc/junit/opcodes/putstatic/jm/T_putstatic_4
-.super java/lang/Object
-
-.field public static st_i1 I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-;    ldc 1000000
-    putstatic dxc.junit.opcodes.putstatic.jm.T_putstatic_4.st_i1 I
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_4.java b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_4.java
deleted file mode 100644
index f3c016a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_4.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putstatic.jm;
-
-public class T_putstatic_4 {
-
-    public static int st_i1;
-    
-    public void run() {
-        st_i1 = 1000000;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_5.j b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_5.j
deleted file mode 100644
index f8cb68d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_5.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putstatic_5.java
-.class public dxc/junit/opcodes/putstatic/jm/T_putstatic_5
-.super java/lang/Object
-
-.field public static st_i1 I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-;    ldc 1000000
-    fconst_1
-    putstatic dxc.junit.opcodes.putstatic.jm.T_putstatic_5.st_i1 I
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_5.java b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_5.java
deleted file mode 100644
index de12995..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_5.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putstatic.jm;
-
-public class T_putstatic_5 {
-
-    public static int st_i1;
-    
-    public void run() {
-        st_i1 = 1000000;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_6.j b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_6.j
deleted file mode 100644
index baef85a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_6.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putstatic_6.java
-.class public dxc/junit/opcodes/putstatic/jm/T_putstatic_6
-.super java/lang/Object
-
-.field public static s Ljava/lang/String;
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 2
-
-    new java/lang/Object
-    dup
-    invokespecial java/lang/Object/<init>()V
-
-    putstatic dxc.junit.opcodes.putstatic.jm.T_putstatic_6.s Ljava/lang/String;
-
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_6.java b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_6.java
deleted file mode 100644
index 1a625d6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_6.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putstatic.jm;
-
-public class T_putstatic_6 {
-
-    public static String s;
-    
-    public void run() {
-        Object o = new Object();
-        s = (String)o;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_7.j b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_7.j
deleted file mode 100644
index 806105a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_7.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putstatic_7.java
-.class public dxc/junit/opcodes/putstatic/jm/T_putstatic_7
-.super java/lang/Object
-
-.field public st_i1 I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    ldc 1000000
-    putstatic dxc.junit.opcodes.putstatic.jm.T_putstatic_7.st_i1 I
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_7.java b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_7.java
deleted file mode 100644
index 9fec90d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_7.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putstatic.jm;
-
-public class T_putstatic_7 {
-    public static int st_i1;
-    
-    public void run() {
-        st_i1 = 1000000;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_8.j b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_8.j
deleted file mode 100644
index acab0d1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_8.j
+++ /dev/null
@@ -1,29 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putstatic_8.java
-.class public dxc/junit/opcodes/putstatic/jm/T_putstatic_8
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    ldc 1000000
-    putstatic dxc.junit.opcodes.putstatic.TestStub.TestStubField I
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_8.java b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_8.java
deleted file mode 100644
index c78048a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_8.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putstatic.jm;
-
-public class T_putstatic_8 {
-    public void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_9.j b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_9.j
deleted file mode 100644
index 2a82450..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_9.j
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_putstatic_9.java
-.class public dxc/junit/opcodes/putstatic/jm/T_putstatic_9
-.super java/lang/Object
-
-.field public st_i1 I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    ldc 1000000
-    putstatic dxc.junit.opcodes.putstatic.jm.T_putstatic_91.st_i1 I
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_9.java b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_9.java
deleted file mode 100644
index 9defac3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/T_putstatic_9.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putstatic.jm;
-
-public class T_putstatic_9 {
-    public void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/TestStubs.java b/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/TestStubs.java
deleted file mode 100644
index 9cc2aa6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/putstatic/jm/TestStubs.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.putstatic.jm;
-
-
-class StubInitError{
-    public static int value = 5 / 0;
-}
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ret/Test_ret.java b/tools/dx-tests/src/dxc/junit/opcodes/ret/Test_ret.java
deleted file mode 100644
index a8b43ae..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ret/Test_ret.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ret;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.ret.jm.T_ret_1;
-import dxc.junit.opcodes.ret.jm.T_ret_1_w;
-
-public class Test_ret extends DxTestCase {
-
-    /**
-     * NORMAL RET VERSION
-     */
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_ret_1 t = new T_ret_1();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @constraint 4.8.1.21
-     * @title index operand
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.ret.jm.T_ret_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title variable referenced by index shall
-     * contain returnAddress
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.ret.jm.T_ret_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.24
-     * @title each returnAddress can be returned only
-     * once
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.ret.jm.T_ret_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.22
-     * @title single ret instruction
-     */
-    public void testVFE7() {
-        try {
-            Class.forName("dxc.junit.opcodes.ret.jm.T_ret_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * WIDE RET VERSION
-     */
-
-    /**
-     * @title 
-     */
-    public void testN2() {
-        T_ret_1_w t = new T_ret_1_w();
-        assertTrue(t.run());
-    }
-
-    /**
-     * @constraint 4.8.1.21
-     * @title index operand
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.ret.jm.T_ret_2_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title variable referenced by index shall
-     * contain returnAddress
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.ret.jm.T_ret_3_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.24
-     * @title each returnAddress can be returned only
-     * once
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.ret.jm.T_ret_4_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.22
-     * @title single ret instruction
-     */
-    public void testVFE8() {
-        try {
-            Class.forName("dxc.junit.opcodes.ret.jm.T_ret_5_w");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_1.j b/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_1.j
deleted file mode 100644
index f73f634..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_1.j
+++ /dev/null
@@ -1,56 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ret_1.java
-.class public dxc/junit/opcodes/ret/jm/T_ret_1
-.super java/lang/Object
-
-.field public i1 I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 2
-    .limit locals 2
-    
-    jsr SetField
-
-    aload_0
-    getfield dxc.junit.opcodes.ret.jm.T_ret_1.i1 I
-    sipush 1000
-    if_icmpne Label0
-    
-    iconst_1
-    ireturn
-    
-Label0:
-    iconst_0    
-    ireturn
-
-SetField:
-    astore_1
-    aload_0
-    sipush 1000
-    putfield dxc.junit.opcodes.ret.jm.T_ret_1.i1 I
-    ret 1
-; test that ret returns immediately
-    aload_0
-    sipush 2000
-    putfield dxc.junit.opcodes.ret.jm.T_ret_1.i1 I
-    ret 1
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_1.java b/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_1.java
deleted file mode 100644
index e0ee60c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_1.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ret.jm;
-
-public class T_ret_1 {
-
-    public int i1;
-    
-    private void setfield() {
-        i1 = 1000;
-    }
-    
-    public boolean run() {
-       setfield();
-       if(i1 == 1000)
-           return true;
-       return false;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_1_w.j b/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_1_w.j
deleted file mode 100644
index fd91e23..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_1_w.j
+++ /dev/null
@@ -1,56 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ret_1_w.java
-.class public dxc/junit/opcodes/ret/jm/T_ret_1_w
-.super java/lang/Object
-
-.field public i1 I
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 2
-    .limit locals 300
-    
-    jsr_w SetField
-
-    aload_0
-    getfield dxc.junit.opcodes.ret.jm.T_ret_1_w.i1 I
-    sipush 1000
-    if_icmpne Label0
-    
-    iconst_1
-    ireturn
-    
-Label0:
-    iconst_0    
-    ireturn
-
-SetField:
-    astore 270
-    aload_0
-    sipush 1000
-    putfield dxc.junit.opcodes.ret.jm.T_ret_1_w.i1 I
-    ret_w 270
-; test that ret returns immediately
-    aload_0
-    sipush 2000
-    putfield dxc.junit.opcodes.ret.jm.T_ret_1_w.i1 I
-    ret_w 270
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_1_w.java b/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_1_w.java
deleted file mode 100644
index 80d159a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_1_w.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ret.jm;
-
-public class T_ret_1_w {
-
-    public int i1;
-    
-    private void setfield() {
-        i1 = 1000;
-    }
-    
-    public boolean run() {
-       setfield();
-       if(i1 == 1000)
-           return true;
-       return false;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_2.j b/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_2.j
deleted file mode 100644
index 5850796..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_2.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ret_2.java
-.class public dxc/junit/opcodes/ret/jm/T_ret_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 2
-    .limit locals 2
-    
-    jsr SetField
-
-    iconst_0
-    ireturn
-    
-SetField:
-    astore_1
-    ret 10
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_2.java b/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_2.java
deleted file mode 100644
index 48719f3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_2.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ret.jm;
-
-public class T_ret_2 {
-
-    private void setfield() {
-    }
-    
-    public boolean run() {
-       setfield();
-       return false;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_2_w.j b/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_2_w.j
deleted file mode 100644
index c6ecab8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_2_w.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ret_2_w.java
-.class public dxc/junit/opcodes/ret/jm/T_ret_2_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 2
-    .limit locals 300
-    
-    jsr_w SetField
-
-    iconst_0
-    ireturn
-    
-SetField:
-    astore 269
-    ret_w 300
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_2_w.java b/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_2_w.java
deleted file mode 100644
index a10ec49..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_2_w.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ret.jm;
-
-public class T_ret_2_w {
-
-    private void setfield() {
-    }
-    
-    public boolean run() {
-       setfield();
-       return false;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_3.j b/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_3.j
deleted file mode 100644
index 1016b02..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_3.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ret_3.java
-.class public dxc/junit/opcodes/ret/jm/T_ret_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 2
-    .limit locals 3
-    
-    jsr SetField
-
-    iconst_0
-    ireturn
-    
-SetField:
-    astore_2
-    aload_0
-    astore_1
-    ret 1
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_3.java b/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_3.java
deleted file mode 100644
index 106f930..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_3.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ret.jm;
-
-public class T_ret_3 {
-
-    private void setfield() {
-    }
-    
-    public boolean run() {
-       setfield();
-       return false;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_3_w.j b/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_3_w.j
deleted file mode 100644
index dba7682..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_3_w.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ret_3_w.java
-.class public dxc/junit/opcodes/ret/jm/T_ret_3_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit stack 2
-    .limit locals 3
-    
-    jsr_w SetField
-
-    iconst_0
-    ireturn
-    
-SetField:
-    astore_2
-    aload_0
-    astore_1
-    ret_w 1
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_3_w.java b/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_3_w.java
deleted file mode 100644
index 5c20726..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_3_w.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ret.jm;
-
-public class T_ret_3_w {
-
-    private void setfield() {
-    }
-    
-    public boolean run() {
-       setfield();
-       return false;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_4.j b/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_4.j
deleted file mode 100644
index 8c72c1a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_4.j
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ret_4.java
-.class public dxc/junit/opcodes/ret/jm/T_ret_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit locals 5
-    .limit stack 5
-
-    goto Label1
-    
-Label3:
-    astore_1    
-    ret 1
-    
-Label2:
-    astore_1
-    jsr Label3
-    ret 1    
-    
-Label1:    
-    jsr Label2
-    
-    iconst_0
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_4.java b/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_4.java
deleted file mode 100644
index 96f1924..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_4.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ret.jm;
-
-public class T_ret_4 {
-
-    private void f2() {
-    }
-    
-    private void f1() {
-        f2();
-    }
-    
-    public boolean run() {
-       f1();
-       return false;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_4_w.j b/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_4_w.j
deleted file mode 100644
index 3cddbb8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_4_w.j
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ret_4_w.java
-.class public dxc/junit/opcodes/ret/jm/T_ret_4_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()Z
-    .limit locals 5
-    .limit stack 5
-
-    goto Label1
-    
-Label3:
-    astore_1    
-    ret_w 1
-    
-Label2:
-    astore_1
-    jsr_w Label3
-    ret_w 1    
-    
-Label1:    
-    jsr_w Label2
-    
-    iconst_0
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_4_w.java b/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_4_w.java
deleted file mode 100644
index d27e9d3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_4_w.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ret.jm;
-
-public class T_ret_4_w {
-
-    private void f2() {
-    }
-    
-    private void f1() {
-        f2();
-    }
-    
-    public boolean run() {
-       f1();
-       return false;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_5.j b/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_5.j
deleted file mode 100644
index d0eb53b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_5.j
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ret_5.java
-.class public dxc/junit/opcodes/ret/jm/T_ret_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    .limit locals 5
-    .limit stack 5
-
-    iconst_1
-    istore_2
-
-    jsr Label3
-
-    return
-    
-Label3:
-    astore_1    
-    
-    iload_2
-    iconst_0
-    if_icmpeq Label1
-    ret 1
-Label1:
-    ret 1    
-    
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_5.java b/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_5.java
deleted file mode 100644
index 60d0014..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_5.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ret.jm;
-
-public class T_ret_5 {
-
-    private void setfield() {
-    }
-    
-    public void run() {
-       setfield();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_5_w.j b/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_5_w.j
deleted file mode 100644
index b049cae..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_5_w.j
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_ret_5_w.java
-.class public dxc/junit/opcodes/ret/jm/T_ret_5_w
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()V
-    .limit locals 5
-    .limit stack 5
-
-    iconst_1
-    istore_2
-
-    jsr_w Label3
-
-    return
-    
-Label3:
-    astore_1    
-    
-    iload_2
-    iconst_0
-    if_icmpeq Label1
-    ret_w 1
-Label1:
-    ret_w 1    
-    
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_5_w.java b/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_5_w.java
deleted file mode 100644
index dfc10c6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/ret/jm/T_ret_5_w.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.ret.jm;
-
-public class T_ret_5_w {
-
-    private void setfield() {
-    }
-    
-    public void run() {
-       setfield();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/saload/Test_saload.java b/tools/dx-tests/src/dxc/junit/opcodes/saload/Test_saload.java
deleted file mode 100644
index 435a117..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/saload/Test_saload.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.saload;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.saload.jm.T_saload_1;
-
-public class Test_saload extends DxTestCase {
-
-    /**
-     * @title normal test. trying different indexes 
-     */
-    public void testN1() {
-        T_saload_1 t = new T_saload_1();
-        short[] arr = new short[2];
-        arr[1] = 10000;
-        assertEquals(10000, t.run(arr, 1));
-    }
-
-    /**
-     * @title normal test. trying different indexes
-     */
-    public void testN2() {
-        T_saload_1 t = new T_saload_1();
-        short[] arr = new short[2];
-        arr[0] = 10000;
-        assertEquals(10000, t.run(arr, 0));
-    }
-
-    /**
-     * @title expected ArrayIndexOutOfBoundsException
-     */
-    public void testE1() {
-        T_saload_1 t = new T_saload_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_saload_1 t = new T_saload_1();
-        try {
-            t.run(null, 2);
-            fail("expected NullPointerException");
-        } catch (NullPointerException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @title expected ArrayIndexOutOfBoundsException
-     */
-    public void testE3() {
-        T_saload_1 t = new T_saload_1();
-        short[] arr = new short[2];
-        try {
-            t.run(arr, -1);
-            fail("expected ArrayIndexOutOfBoundsException");
-        } catch (ArrayIndexOutOfBoundsException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.saload.jm.T_saload_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.saload.jm.T_saload_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, double
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.saload.jm.T_saload_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, long
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.saload.jm.T_saload_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - Object, int
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.saload.jm.T_saload_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double[], int
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.saload.jm.T_saload_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - int[], int
-     */
-    public void testVFE7() {
-        try {
-            Class.forName("dxc.junit.opcodes.saload.jm.T_saload_8");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, reference
-     */
-    public void testVFE8() {
-        try {
-            Class.forName("dxc.junit.opcodes.saload.jm.T_saload_9");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_1.j b/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_1.j
deleted file mode 100644
index 180c180..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_1.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_saload_1.java
-.class public dxc/junit/opcodes/saload/jm/T_saload_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([SI)S
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_2
-
-    saload
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_1.java b/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_1.java
deleted file mode 100644
index dd3083c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.saload.jm;
-
-public class T_saload_1 {
-    public short run(short[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_2.j b/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_2.j
deleted file mode 100644
index f38e43a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_2.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_saload_2.java
-.class public dxc/junit/opcodes/saload/jm/T_saload_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([SI)S
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-;    iload_2
-
-    saload
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_2.java b/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_2.java
deleted file mode 100644
index bef1b9b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_2.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.saload.jm;
-
-public class T_saload_2 {
-
-    public short run(short[] arr, int idx) {
-        return arr[idx];
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_3.j b/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_3.j
deleted file mode 100644
index aab2008..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_3.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_saload_3.java
-.class public dxc/junit/opcodes/saload/jm/T_saload_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([SI)S
-    .limit stack 3
-    .limit locals 4
-
-    ;aload_1
-    iload_2
-    saload
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_3.java b/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_3.java
deleted file mode 100644
index 4d2571c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_3.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.saload.jm;
-
-public class T_saload_3 {
-
-    public short run(short[] arr, int idx) {
-        return arr[idx];
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_4.j b/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_4.j
deleted file mode 100644
index 75cbfbf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_4.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_saload_4.java
-.class public dxc/junit/opcodes/saload/jm/T_saload_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run([SD)S
-    .limit stack 4
-    .limit locals 5
-
-    aload_1
-    dload_2
-;    d2i
-    saload
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_4.java b/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_4.java
deleted file mode 100644
index c482474..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_4.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.saload.jm;
-
-public class T_saload_4 {
-
-    public short run(short[] arr, double idx) {
-        return arr[(int)idx];
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_5.j b/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_5.j
deleted file mode 100644
index f528968..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_5.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_saload_5.java
-.class public dxc/junit/opcodes/saload/jm/T_saload_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run([SJ)S
-    .limit stack 4
-    .limit locals 5
-
-    aload_1
-    lload_2
-    saload
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_5.java b/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_5.java
deleted file mode 100644
index 4f95b0d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.saload.jm;
-
-public class T_saload_5 {
-
-    public short run(short[] arr, long idx) {
-        return arr[(int)idx];
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_6.j b/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_6.j
deleted file mode 100644
index 9682e21..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_6.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_saload_6.java
-.class public dxc/junit/opcodes/saload/jm/T_saload_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/Object;[SI)S
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_2
-
-    saload
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_6.java b/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_6.java
deleted file mode 100644
index 1c1cf0d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.saload.jm;
-
-public class T_saload_6 {
-
-    public short run(Object a, short[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_7.j b/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_7.j
deleted file mode 100644
index fac34c8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_7.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_saload_7.java
-.class public dxc/junit/opcodes/saload/jm/T_saload_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run([D[SI)S
-    .limit stack 2
-    .limit locals 4
-    aload_1
-    iload_3
-    saload
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_7.java b/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_7.java
deleted file mode 100644
index 5036d22..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.saload.jm;
-
-public class T_saload_7 {
-
-    public short run(double[] a, short[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_8.j b/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_8.j
deleted file mode 100644
index f5d15da..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_8.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_saload_8.java
-.class public dxc/junit/opcodes/saload/jm/T_saload_8
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run([I[SI)S
-    .limit stack 2
-    .limit locals 4
-    aload_1
-    iload_3
-    saload
-
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_8.java b/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_8.java
deleted file mode 100644
index 77bc620..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.saload.jm;
-
-public class T_saload_8 {
-
-    public short run(int[] a, short[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_9.j b/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_9.j
deleted file mode 100644
index af1e40d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_9.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_saload_9.java
-.class public dxc/junit/opcodes/saload/jm/T_saload_9
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([SI)S
-    .limit stack 2
-    .limit locals 3
-
-    aload_1
-    aload_0
-    saload
-    ireturn
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_9.java b/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_9.java
deleted file mode 100644
index 05b3f3e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/saload/jm/T_saload_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.saload.jm;
-
-public class T_saload_9 {
-    
-    public short run(short[] arr, int idx) {
-        return arr[idx];
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/sastore/Test_sastore.java b/tools/dx-tests/src/dxc/junit/opcodes/sastore/Test_sastore.java
deleted file mode 100644
index f4127c4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/sastore/Test_sastore.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.sastore;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.sastore.jm.T_sastore_1;
-
-public class Test_sastore extends DxTestCase {
-
-    /**
-     * @title normal test. trying different indexes 
-     */
-    public void testN1() {
-        T_sastore_1 t = new T_sastore_1();
-        short[] arr = new short[2];
-        t.run(arr, 1, (short) 10000);
-        assertEquals(10000, arr[1]);
-    }
-
-    /**
-     * @title normal test. trying different indexes 
-     */
-    public void testN2() {
-        T_sastore_1 t = new T_sastore_1();
-        short[] arr = new short[2];
-        t.run(arr, 0, (short) 10000);
-        assertEquals(10000, arr[0]);
-    }
-
-    /**
-     * @title expected ArrayIndexOutOfBoundsException
-     */
-    public void testE1() {
-        T_sastore_1 t = new T_sastore_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_sastore_1 t = new T_sastore_1();
-        try {
-            t.run(null, 2, (short) 10000);
-            fail("expected NullPointerException");
-        } catch (NullPointerException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @title expected ArrayIndexOutOfBoundsException
-     */
-    public void testE3() {
-        T_sastore_1 t = new T_sastore_1();
-        short[] arr = new short[2];
-        try {
-            t.run(arr, -1, (short) 10000);
-            fail("expected ArrayIndexOutOfBoundsException");
-        } catch (ArrayIndexOutOfBoundsException aie) {
-            // expected
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.sastore.jm.T_sastore_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.sastore.jm.T_sastore_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, double,
-     * int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.sastore.jm.T_sastore_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, int, long
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.sastore.jm.T_sastore_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - object, int, int
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.sastore.jm.T_sastore_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double[], int,
-     * int
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.sastore.jm.T_sastore_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long[], int, int
-     */
-    public void testVFE7() {
-        try {
-            Class.forName("dxc.junit.opcodes.sastore.jm.T_sastore_8");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - array, reference,
-     * int
-     */
-    public void testVFE8() {
-        try {
-            Class.forName("dxc.junit.opcodes.sastore.jm.T_sastore_9");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_1.j b/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_1.j
deleted file mode 100644
index 239c519..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_1.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_sastore_1.java
-.class public dxc/junit/opcodes/sastore/jm/T_sastore_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([SIS)V
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_2
-    iload_3
-    sastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_1.java b/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_1.java
deleted file mode 100644
index d55f755..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.sastore.jm;
-
-public class T_sastore_1 {
-    public void run(short[] arr, int idx, short value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_2.j b/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_2.j
deleted file mode 100644
index d72eb80..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_2.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_sastore_2.java
-.class public dxc/junit/opcodes/sastore/jm/T_sastore_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([SIS)V
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_2
-    ;iload_3
-    sastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_2.java b/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_2.java
deleted file mode 100644
index 5072930..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.sastore.jm;
-
-public class T_sastore_2 {
-
-    public void run(short[] arr, int idx, short value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_3.j b/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_3.j
deleted file mode 100644
index 19c93e3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_3.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_sastore_3.java
-.class public dxc/junit/opcodes/sastore/jm/T_sastore_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([SIS)V
-    .limit stack 3
-    .limit locals 4
-
-    ;aload_1
-    iload_2
-    iload_3
-    sastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_3.java b/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_3.java
deleted file mode 100644
index 9417fff..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.sastore.jm;
-
-public class T_sastore_3 {
-
-    public void run(short[] arr, int idx, short value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_4.j b/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_4.j
deleted file mode 100644
index 2fd5a51..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_4.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_sastore_4.java
-.class public dxc/junit/opcodes/sastore/jm/T_sastore_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run([SDI)V
-    .limit stack 4
-    .limit locals 5
-
-    aload_1
-    dload_2
-;    d2i
-    iload 4
-    sastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_4.java b/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_4.java
deleted file mode 100644
index 20e5619..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.sastore.jm;
-
-public class T_sastore_4 {
-
-    public void run(short[] arr, double idx, short value) {
-        arr[(int)idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_5.j b/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_5.j
deleted file mode 100644
index 1c26fe8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_5.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_sastore_5.java
-.class public dxc/junit/opcodes/sastore/jm/T_sastore_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run([SIJ)V
-    .limit stack 4
-    .limit locals 5
-
-    aload_1
-    iload_2
-    lload 3
-;   l2i
-;    i2s    
-    sastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_5.java b/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_5.java
deleted file mode 100644
index c235f95..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.sastore.jm;
-
-public class T_sastore_5 {
-
-    public void run(short[] arr, int idx, long value) {
-        arr[idx] = (short)value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_6.j b/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_6.j
deleted file mode 100644
index e7ba17c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_6.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_sastore_6.java
-.class public dxc/junit/opcodes/sastore/jm/T_sastore_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(Ljava/lang/Object;IS)V
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    iload_2
-    iload_3
-    sastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_6.java b/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_6.java
deleted file mode 100644
index 074ad48..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.sastore.jm;
-
-public class T_sastore_6 {
-
-    public void run(Object a, short[] arr, int idx, short value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_7.j b/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_7.j
deleted file mode 100644
index b2a3f8a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_7.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_sastore_7.java
-.class public dxc/junit/opcodes/sastore/jm/T_sastore_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([D[SIS)V
-    .limit stack 3
-    .limit locals 5
-    
-    aload_1
-    iload_3
-    iload 4
-    sastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_7.java b/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_7.java
deleted file mode 100644
index 88d61cf..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.sastore.jm;
-
-public class T_sastore_7 {
-
-    public void run(double a[], short[] arr, int idx, short value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_8.j b/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_8.j
deleted file mode 100644
index c6df01d..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_8.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_sastore_8.java
-.class public dxc/junit/opcodes/sastore/jm/T_sastore_8
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([J[SIS)V
-    .limit stack 3
-    .limit locals 5
-    
-    aload_1
-    iload_3
-    iload 4
-    sastore
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_8.java b/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_8.java
deleted file mode 100644
index bce0b50..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.sastore.jm;
-
-public class T_sastore_8 {
-
-    public void run(long a[], short[] arr, int idx, short value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_9.j b/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_9.j
deleted file mode 100644
index a0a551f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_9.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_sastore_9.java
-.class public dxc/junit/opcodes/sastore/jm/T_sastore_9
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run([SIS)V
-    .limit stack 3
-    .limit locals 4
-
-    aload_1
-    aload_0
-    iload_3
-    sastore
-    return
-
-.end method
\ No newline at end of file
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_9.java b/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_9.java
deleted file mode 100644
index 444da12..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/sastore/jm/T_sastore_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.sastore.jm;
-
-public class T_sastore_9 {
-    
-    public void run(short[] arr, int idx, short value) {
-        arr[idx] = value;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/sipush/Test_sipush.java b/tools/dx-tests/src/dxc/junit/opcodes/sipush/Test_sipush.java
deleted file mode 100644
index 2f414c4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/sipush/Test_sipush.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.sipush;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.sipush.jm.T_sipush_1;
-import dxc.junit.opcodes.sipush.jm.T_sipush_2;
-import dxc.junit.opcodes.sipush.jm.T_sipush_3;
-
-public class Test_sipush extends DxTestCase {
-
-    /**
-     * @title sipush -13570
-     */
-    public void testN1() {
-        T_sipush_1 t = new T_sipush_1();
-        assertEquals(-13570, t.run());
-    }
-
-    /**
-     * @title sipush 0
-     */
-    public void testB1() {
-        T_sipush_2 t = new T_sipush_2();
-        assertEquals(0, t.run());
-    }
-
-    /**
-     * @title sipush - 1
-     */
-    public void testB2() {
-        T_sipush_3 t = new T_sipush_3();
-        assertEquals(-1, t.run());
-    }
-
-    /**
-     * @constraint 4.8.2.5
-     * @title stack size
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.sipush.jm.T_sipush_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/sipush/jm/T_sipush_1.j b/tools/dx-tests/src/dxc/junit/opcodes/sipush/jm/T_sipush_1.j
deleted file mode 100644
index 93b611e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/sipush/jm/T_sipush_1.j
+++ /dev/null
@@ -1,28 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_sipush_1.java
-.class public dxc/junit/opcodes/sipush/jm/T_sipush_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()S
-    sipush -13570
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/sipush/jm/T_sipush_1.java b/tools/dx-tests/src/dxc/junit/opcodes/sipush/jm/T_sipush_1.java
deleted file mode 100644
index 32f714e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/sipush/jm/T_sipush_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.sipush.jm;
-
-public class T_sipush_1 {
-
-    public short run() {
-        return (short)0xcafe;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/sipush/jm/T_sipush_2.j b/tools/dx-tests/src/dxc/junit/opcodes/sipush/jm/T_sipush_2.j
deleted file mode 100644
index 590d92f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/sipush/jm/T_sipush_2.j
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_sipush_2.java
-.class public dxc/junit/opcodes/sipush/jm/T_sipush_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()S
-    .limit stack 1
-    .limit locals 1
-
-    sipush 0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/sipush/jm/T_sipush_2.java b/tools/dx-tests/src/dxc/junit/opcodes/sipush/jm/T_sipush_2.java
deleted file mode 100644
index adab916..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/sipush/jm/T_sipush_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.sipush.jm;
-
-public class T_sipush_2 {
-
-    public short run() {
-        return 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/sipush/jm/T_sipush_3.j b/tools/dx-tests/src/dxc/junit/opcodes/sipush/jm/T_sipush_3.j
deleted file mode 100644
index 415c159..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/sipush/jm/T_sipush_3.j
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_sipush_3.java
-.class public dxc/junit/opcodes/sipush/jm/T_sipush_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run()S
-    .limit stack 1
-    .limit locals 1
-
-    sipush -1
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/sipush/jm/T_sipush_3.java b/tools/dx-tests/src/dxc/junit/opcodes/sipush/jm/T_sipush_3.java
deleted file mode 100644
index 81ff83b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/sipush/jm/T_sipush_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.sipush.jm;
-
-public class T_sipush_3 {
-
-    public short run() {
-        return -1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/sipush/jm/T_sipush_4.j b/tools/dx-tests/src/dxc/junit/opcodes/sipush/jm/T_sipush_4.j
deleted file mode 100644
index f852a9a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/sipush/jm/T_sipush_4.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_sipush_4.java
-.class public dxc/junit/opcodes/sipush/jm/T_sipush_4
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()S
-    .limit stack 1
-;    .limit locals 1
-
-    sipush 1
-    sipush 1
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/sipush/jm/T_sipush_4.java b/tools/dx-tests/src/dxc/junit/opcodes/sipush/jm/T_sipush_4.java
deleted file mode 100644
index e3e540c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/sipush/jm/T_sipush_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.sipush.jm;
-
-public class T_sipush_4 {
-
-    public short run() {
-        return 1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/swap/Test_swap.java b/tools/dx-tests/src/dxc/junit/opcodes/swap/Test_swap.java
deleted file mode 100644
index b7d8208..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/swap/Test_swap.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.swap;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.swap.jm.T_swap_1;
-import dxc.junit.opcodes.swap.jm.T_swap_6;
-import dxc.junit.opcodes.swap.jm.T_swap_7;
-import dxc.junit.opcodes.swap.jm.T_swap_8;
-
-public class Test_swap extends DxTestCase {
-
-    /**
-     * @title  Integers
-     */
-    public void testN1() {
-        T_swap_1 t = new T_swap_1();
-        assertEquals(8, t.run(15, 8));
-    }
-
-    /**
-     * @title  Floats
-     */
-    public void testN2() {
-        T_swap_6 t = new T_swap_6();
-        assertEquals(8f, t.run(15f, 8f));
-    }
-
-    /**
-     * @title  References
-     */
-    public void testN3() {
-        T_swap_7 t = new T_swap_7();
-        int tmp[] = new int[1];
-        assertEquals(tmp, t.run(this, tmp));
-    }
-
-    /**
-     * @title  Reference & int
-     */
-    public void testN4() {
-        T_swap_8 t = new T_swap_8();
-        assertEquals(this, t.run(0xff, this));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.swap.jm.T_swap_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - double & int
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.swap.jm.T_swap_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long & int
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.swap.jm.T_swap_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title types of arguments - long & long
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.swap.jm.T_swap_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_1.j b/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_1.j
deleted file mode 100644
index 42cb0cc..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_1.j
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_swap_1.java
-.class public dxc/junit/opcodes/swap/jm/T_swap_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-    iload_2
-    iload_1
-    swap
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_1.java b/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_1.java
deleted file mode 100644
index a662235..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.swap.jm;
-
-public class T_swap_1 {
-
-    public int run(int a, int b) {
-        return b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_2.j b/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_2.j
deleted file mode 100644
index 77dca55..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_2.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_swap_2.java
-.class public dxc/junit/opcodes/swap/jm/T_swap_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run(II)I
-    .limit stack 2
-    .limit locals 3
-    iload_1
-;    iload_2
-    swap
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_2.java b/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_2.java
deleted file mode 100644
index f9ee17f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.swap.jm;
-
-public class T_swap_2 {
-
-    public int run(int a, int b) {
-        return b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_3.j b/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_3.j
deleted file mode 100644
index 3ea9627..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_3.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_swap_3.java
-.class public dxc/junit/opcodes/swap/jm/T_swap_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(DI)I
-    .limit stack 3
-    .limit locals 4
-
-    dload_1
-;    d2i
-    iload_3
-    swap
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_3.java b/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_3.java
deleted file mode 100644
index 34278c5..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.swap.jm;
-
-public class T_swap_3 {
-
-    public int run(double a, int b) {
-        return b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_4.j b/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_4.j
deleted file mode 100644
index 641c256..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_4.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_swap_4.java
-.class public dxc/junit/opcodes/swap/jm/T_swap_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(IJ)I
-    .limit stack 3
-    .limit locals 4
-
-    iload_1
-    lload_2
-    swap
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_4.java b/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_4.java
deleted file mode 100644
index ffd75d6..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.swap.jm;
-
-public class T_swap_4 {
-
-    public int run(int a, long b) {
-        return (int)b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_5.j b/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_5.j
deleted file mode 100644
index 53d03af..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_5.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_swap_5.java
-.class public dxc/junit/opcodes/swap/jm/T_swap_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(JJ)I
-    .limit stack 4
-    .limit locals 5
-
-    lload_1
-    lload_3
-    swap
-
-    iconst_0
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_5.java b/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_5.java
deleted file mode 100644
index d684944..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.swap.jm;
-
-public class T_swap_5 {
-
-    public int run(int a, long b) {
-        return (int)b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_6.j b/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_6.j
deleted file mode 100644
index 4b33952..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_6.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_swap_6.java
-.class public dxc/junit/opcodes/swap/jm/T_swap_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(FF)F
-    .limit stack 4
-    .limit locals 5
-
-    fload_2
-    fload_1
-    
-    swap
-
-    freturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_6.java b/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_6.java
deleted file mode 100644
index c52c8d3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.swap.jm;
-
-public class T_swap_6 {
-
-    public float run(float a, float b) {
-        return b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_7.j b/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_7.j
deleted file mode 100644
index 615a782..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_7.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_swap_7.java
-.class public dxc/junit/opcodes/swap/jm/T_swap_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-    .limit stack 4
-    .limit locals 5
-
-    aload_2
-    aload_1
-    
-    swap
-
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_7.java b/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_7.java
deleted file mode 100644
index 789077e..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.swap.jm;
-
-public class T_swap_7 {
-
-    public Object run(Object a, Object b) {
-        return b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_8.j b/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_8.j
deleted file mode 100644
index 81a647b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_8.j
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_swap_8.java
-.class public dxc/junit/opcodes/swap/jm/T_swap_8
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run(ILjava/lang/Object;)Ljava/lang/Object;
-    .limit stack 4
-    .limit locals 5
-
-    aload_2
-    iload_1
-    
-    swap
-
-    areturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_8.java b/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_8.java
deleted file mode 100644
index d4608bb..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/swap/jm/T_swap_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.swap.jm;
-
-public class T_swap_8 {
-
-    public Object run(int a, Object b) {
-        return b;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/Test_tableswitch.java b/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/Test_tableswitch.java
deleted file mode 100644
index 459fb72..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/Test_tableswitch.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.tableswitch;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.opcodes.tableswitch.jm.T_tableswitch_1;
-
-public class Test_tableswitch extends DxTestCase {
-
-    /**
-     * @title normal test
-     */
-    public void testN1() {
-        T_tableswitch_1 t = new T_tableswitch_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 check Integer.MAX_VALUE
-     */
-    public void testB1() {
-        T_tableswitch_1 t = new T_tableswitch_1();
-        assertEquals(-1, t.run(Integer.MAX_VALUE));
-    }
-
-    /**
-     * @title check Integer.MIN_VALUE
-     */
-    public void testB2() {
-        T_tableswitch_1 t = new T_tableswitch_1();
-        assertEquals(-1, t.run(Integer.MIN_VALUE));
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title number of arguments
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.tableswitch.jm.T_tableswitch_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - float
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.tableswitch.jm.T_tableswitch_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.8
-     * @title branch target shall be inside the
-     * method
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.opcodes.tableswitch.jm.T_tableswitch_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.8
-     * @title branch target shall not be "inside" wide
-     * instruction
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.opcodes.tableswitch.jm.T_tableswitch_5");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.8
-     * @title low value shall be less than high
-     * value
-     */
-    public void testVFE5() {
-        try {
-            Class.forName("dxc.junit.opcodes.tableswitch.jm.T_tableswitch_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.8
-     * @title non-zero padding
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dxc.junit.opcodes.tableswitch.jm.T_tableswitch_7");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.1
-     * @title type of argument - reference
-     */
-    public void testVFE7() {
-        try {
-            Class.forName("dxc.junit.opcodes.tableswitch.jm.T_tableswitch_8");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.8
-     * @title number of entries in jump table
-     */
-    public void testVFE8() {
-        try {
-            Class.forName("dxc.junit.opcodes.tableswitch.jm.T_tableswitch_9");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_1.j b/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_1.j
deleted file mode 100644
index e21d5c3..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_1.j
+++ /dev/null
@@ -1,48 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_tableswitch_1.java
-.class public dxc/junit/opcodes/tableswitch/jm/T_tableswitch_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-    iload_1
-    tableswitch -1 3
-            Label0
-            Label3
-            Label3
-            Label1
-            Label1
-            default: Label3
-
-    Label0:
-    iconst_2
-    ireturn
-
-    Label1:
-    bipush 20
-    ireturn
-
-    Label3:
-    iconst_m1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_1.java b/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_1.java
deleted file mode 100644
index 6feb6d8..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_1.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.tableswitch.jm;
-
-public class T_tableswitch_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/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_2.j b/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_2.j
deleted file mode 100644
index 4fbe7d7..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_2.j
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_tableswitch_2.java
-.class public dxc/junit/opcodes/tableswitch/jm/T_tableswitch_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-;    iload_1
-    tableswitch 1 3
-            Label0
-            Label1
-            Label1
-            default: Label3
-
-    Label0:
-    iconst_2
-    ireturn
-
-    Label1:
-    bipush 20
-    ireturn
-
-    Label3:
-    iconst_m1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_2.java b/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_2.java
deleted file mode 100644
index dd07d01..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_2.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.tableswitch.jm;
-
-public class T_tableswitch_2 {
-
-    public int run(int i) {
-        switch (i) {
-        case 1:
-            return 2;
-        case 2:
-        case 3:
-            return 20;
-        default:
-            return -1;
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_3.j b/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_3.j
deleted file mode 100644
index 14f6827..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_3.j
+++ /dev/null
@@ -1,48 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_tableswitch_3.java
-.class public dxc/junit/opcodes/tableswitch/jm/T_tableswitch_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-
-    fconst_1
-    
-    tableswitch 1 3
-            Label0
-            Label1
-            Label1
-            default: Label3
-
-    Label0:
-    iconst_2
-    ireturn
-
-    Label1:
-    bipush 20
-    ireturn
-
-    Label3:
-    iconst_m1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_3.java b/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_3.java
deleted file mode 100644
index fe2cfed..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_3.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.tableswitch.jm;
-
-public class T_tableswitch_3 {
-
-    public int run(int i) {
-        switch (i) {
-        case 1:
-            return 2;
-        case 2:
-        case 3:
-            return 20;
-        default:
-            return -1;
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_4.cfh b/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_4.cfh
deleted file mode 100644
index f70e16c..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_4.cfh
+++ /dev/null
@@ -1,200 +0,0 @@
-//@class:dxc/junit/opcodes/tableswitch/jm/T_tableswitch_4
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0c 00 08 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 6, h: 0005: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 62, len 51, h: 0006: utf8{"dxc/junit/opcodes/tableswitch/jm/T_tableswitch_4"}
-    // .  .  0  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  t  a  b  l  e  s  w  i  t  c  h  /  j  m  /  T  _  t  a  b  l  e  s  w  i  t  c  h  _  4  
-       01 00 30 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 74 61 62 6c 65 73 77 69 74 63 68 2f 6a 6d 2f 54 5f 74 61 62 6c 65 73 77 69 74 63 68 5f 34 
-    // parsed:, offset 113, len 23, h: 0007: utf8{"T_tableswitch_4.java"}
-    // .  .  .  T  _  t  a  b  l  e  s  w  i  t  c  h  _  4  .  j  a  v  a  
-       01 00 14 54 5f 74 61 62 6c 65 73 77 69 74 63 68 5f 34 2e 6a 61 76 61 
-    // parsed:, offset 136, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 0a 
-    // parsed:, offset 141, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 148, len 6, h: 000a: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 154, len 3, h: 000b: type{dxc.junit.opcodes.tableswitch.jm.T_tableswitch_4}
-    // .  .  .  
-       07 00 06 
-    // parsed:, offset 157, len 3, h: 000c: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-    // parsed:, offset 160, len 7, h: 000d: utf8{"(I)I"}
-    // .  .  .  (  I  )  I  
-       01 00 04 28 49 29 49 
-// parsed:, offset 167, len 0, h: end constant_pool
-// parsed:, offset 167, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 169, len 2, h: this_class: type{dxc.junit.opcodes.tableswitch.jm.T_tableswitch_4}
-// .  .  
-   00 0b 
-// parsed:, offset 171, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0c 
-// parsed:, offset 173, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 175, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 177, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 179, len:102,desc: ()V
-// parsed:, offset 179, len 0, h:  methods[0]: 
-    // parsed:, offset 179, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 181, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 183, len 2, h: descriptor: ()V
-    // .  .  
-       00 0a 
-    // parsed:, offset 185, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 187, len 0, h:  attributes[0]: 
-        // parsed:, offset 187, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 189, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 193, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 195, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 197, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 206, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 208, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 210, len 0, h: end attributes[0] 
-// parsed:, offset 210, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 210, len:71,desc: (I)I
-// parsed:, offset 210, len 0, h:  methods[1]: 
-    // parsed:, offset 210, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 212, len 2, h: name: run
-    // .  .  
-       00 05 
-    // parsed:, offset 214, len 2, h: descriptor: (I)I
-    // .  .  
-       00 0d 
-    // parsed:, offset 216, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 218, len 0, h:  attributes[0]: 
-        // parsed:, offset 218, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 220, len 4, h: length: 0000002f
-        // .  .  .  /  
-           00 00 00 2f 
-        // parsed:, offset 224, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 226, len 2, h: max_locals: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 228, len 4, h: code_length: 00000023
-        // .  .  .  #  
-           00 00 00 23 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 27, h: 0001: tableswitch   +00000001: 001c   +00000002: 001e   +00000003: 001e   default: 0021
-        // .  .  .  .  .  .     .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
-//@mod           aa 00 00 00 00 00 20 00 00 00 01 00 00 00 03 00 00 00 1b 00 00 00 1d 00 00 00 1d 
-           aa 00 00 00 00 00 20 00 00 00 01 00 00 00 03 00 00 00 1b 00 00 00 1d 00 00 00 ff 
-        // parsed:, offset 28, len 1, h: 001c: iconst_2 // #+02
-        // .  
-           05 
-        // parsed:, offset 29, len 1, h: 001d: ireturn
-        // .  
-           ac 
-        // parsed:, offset 30, len 2, h: 001e: bipush #+14
-        // .  .  
-           10 14 
-        // parsed:, offset 32, len 1, h: 0020: ireturn
-        // .  
-           ac 
-        // parsed:, offset 33, len 1, h: 0021: iconst_m1 // #-01
-        // .  
-           02 
-        // parsed:, offset 34, len 1, h: 0022: ireturn
-        // .  
-           ac 
-        // parsed:, offset 267, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 269, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 271, len 0, h: end attributes[0] 
-// parsed:, offset 271, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (I)I
-// parsed:, offset 271, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 273, len 0, h:  attributes[0]: 
-    // parsed:, offset 273, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 275, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 279, len 2, h: source: utf8{"T_tableswitch_4.java"}
-    // .  .  
-       00 07 
-// parsed:, offset 281, len 0, h: end attributes[0] 
-// parsed:, offset 281, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_4.j b/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_4.j
deleted file mode 100644
index b527e24..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_4.j
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_tableswitch_4.java
-.class public dxc/junit/opcodes/tableswitch/jm/T_tableswitch_4
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-    iload_1
-    
-    tableswitch 1 3
-            Label0
-            Label1
-            Label1
-            default: Label3
-
-    Label0:
-    iconst_2
-    ireturn
-
-    Label1:
-    bipush 20
-    ireturn
-
-    Label3:
-    iconst_m1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_4.java b/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_4.java
deleted file mode 100644
index ab0d8e1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_4.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.tableswitch.jm;
-
-public class T_tableswitch_4 {
-
-    public int run(int i) {
-        switch (i) {
-        case 1:
-            return 2;
-        case 2:
-        case 3:
-            return 20;
-        default:
-            return -1;
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_5.cfh b/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_5.cfh
deleted file mode 100644
index 9d8b286..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_5.cfh
+++ /dev/null
@@ -1,200 +0,0 @@
-//@class:dxc/junit/opcodes/tableswitch/jm/T_tableswitch_5
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0c 00 07 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 51, h: 0005: utf8{"dxc/junit/opcodes/tableswitch/jm/T_tableswitch_5"}
-    // .  .  0  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  t  a  b  l  e  s  w  i  t  c  h  /  j  m  /  T  _  t  a  b  l  e  s  w  i  t  c  h  _  5  
-       01 00 30 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 74 61 62 6c 65 73 77 69 74 63 68 2f 6a 6d 2f 54 5f 74 61 62 6c 65 73 77 69 74 63 68 5f 35 
-    // parsed:, offset 107, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 113, len 5, h: 0007: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 0a 
-    // parsed:, offset 118, len 7, h: 0008: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 125, len 23, h: 0009: utf8{"T_tableswitch_5.java"}
-    // .  .  .  T  _  t  a  b  l  e  s  w  i  t  c  h  _  5  .  j  a  v  a  
-       01 00 14 54 5f 74 61 62 6c 65 73 77 69 74 63 68 5f 35 2e 6a 61 76 61 
-    // parsed:, offset 148, len 6, h: 000a: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 154, len 3, h: 000b: type{dxc.junit.opcodes.tableswitch.jm.T_tableswitch_5}
-    // .  .  .  
-       07 00 05 
-    // parsed:, offset 157, len 3, h: 000c: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-    // parsed:, offset 160, len 7, h: 000d: utf8{"(I)I"}
-    // .  .  .  (  I  )  I  
-       01 00 04 28 49 29 49 
-// parsed:, offset 167, len 0, h: end constant_pool
-// parsed:, offset 167, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 169, len 2, h: this_class: type{dxc.junit.opcodes.tableswitch.jm.T_tableswitch_5}
-// .  .  
-   00 0b 
-// parsed:, offset 171, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0c 
-// parsed:, offset 173, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 175, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 177, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 179, len:105,desc: ()V
-// parsed:, offset 179, len 0, h:  methods[0]: 
-    // parsed:, offset 179, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 181, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 183, len 2, h: descriptor: ()V
-    // .  .  
-       00 0a 
-    // parsed:, offset 185, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 187, len 0, h:  attributes[0]: 
-        // parsed:, offset 187, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 189, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 193, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 195, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 197, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 206, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 208, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 210, len 0, h: end attributes[0] 
-// parsed:, offset 210, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 210, len:74,desc: (I)I
-// parsed:, offset 210, len 0, h:  methods[1]: 
-    // parsed:, offset 210, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 212, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 214, len 2, h: descriptor: (I)I
-    // .  .  
-       00 0d 
-    // parsed:, offset 216, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 218, len 0, h:  attributes[0]: 
-        // parsed:, offset 218, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 220, len 4, h: length: 00000032
-        // .  .  .  2  
-           00 00 00 32 
-        // parsed:, offset 224, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 226, len 2, h: max_locals: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 228, len 4, h: code_length: 00000026
-        // .  .  .  &  
-           00 00 00 26 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 27, h: 0001: tableswitch   +00000001: 001c   +00000002: 001e   +00000003: 001e   default: 0021
-        // .  .  .  .  .  .     .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
-//@mod           aa 00 00 00 00 00 20 00 00 00 01 00 00 00 03 00 00 00 1b 00 00 00 1d 00 00 00 1d 
-           aa 00 00 00 00 00 21 00 00 00 01 00 00 00 03 00 00 00 1b 00 00 00 1d 00 00 00 1d 
-        // parsed:, offset 28, len 1, h: 001c: iconst_2 // #+02
-        // .  
-           05 
-        // parsed:, offset 29, len 1, h: 001d: ireturn
-        // .  
-           ac 
-        // parsed:, offset 30, len 2, h: 001e: bipush #+14
-        // .  .  
-           10 14 
-        // parsed:, offset 32, len 1, h: 0020: ireturn
-        // .  
-           ac 
-        // parsed:, offset 33, len 4, h: 0021: wide iload 0001
-        // .  .  .  .  
-           c4 15 00 01 
-        // parsed:, offset 37, len 1, h: 0025: ireturn
-        // .  
-           ac 
-        // parsed:, offset 270, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 272, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 274, len 0, h: end attributes[0] 
-// parsed:, offset 274, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (I)I
-// parsed:, offset 274, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 276, len 0, h:  attributes[0]: 
-    // parsed:, offset 276, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 278, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 282, len 2, h: source: utf8{"T_tableswitch_5.java"}
-    // .  .  
-       00 09 
-// parsed:, offset 284, len 0, h: end attributes[0] 
-// parsed:, offset 284, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_5.j b/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_5.j
deleted file mode 100644
index e085f06..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_5.j
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_tableswitch_5.java
-.class public dxc/junit/opcodes/tableswitch/jm/T_tableswitch_5
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-    iload_1
-    
-    tableswitch 1 3
-            Label0
-            Label1
-            Label1
-            default: Label3
-
-    Label0:
-    iconst_2
-    ireturn
-
-    Label1:
-    bipush 20
-    ireturn
-
-    Label3:
-    iload_w 1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_5.java b/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_5.java
deleted file mode 100644
index 3702524..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_5.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.tableswitch.jm;
-
-public class T_tableswitch_5 {
-
-    public int run(int i) {
-        switch (i) {
-        case 1:
-            return 2;
-        case 2:
-        case 3:
-            return 20;
-        default:
-            return -1;
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_6.cfh b/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_6.cfh
deleted file mode 100644
index 51a3fad..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_6.cfh
+++ /dev/null
@@ -1,194 +0,0 @@
-//@class:dxc/junit/opcodes/tableswitch/jm/T_tableswitch_6
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0b 00 07 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 51, h: 0005: utf8{"dxc/junit/opcodes/tableswitch/jm/T_tableswitch_6"}
-    // .  .  0  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  t  a  b  l  e  s  w  i  t  c  h  /  j  m  /  T  _  t  a  b  l  e  s  w  i  t  c  h  _  6  
-       01 00 30 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 74 61 62 6c 65 73 77 69 74 63 68 2f 6a 6d 2f 54 5f 74 61 62 6c 65 73 77 69 74 63 68 5f 36 
-    // parsed:, offset 107, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 113, len 5, h: 0007: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 09 
-    // parsed:, offset 118, len 7, h: 0008: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 125, len 6, h: 0009: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 131, len 3, h: 000a: type{dxc.junit.opcodes.tableswitch.jm.T_tableswitch_6}
-    // .  .  .  
-       07 00 05 
-    // parsed:, offset 134, len 3, h: 000b: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-    // parsed:, offset 137, len 23, h: 000c: utf8{"T_tableswitch_6.java"}
-    // .  .  .  T  _  t  a  b  l  e  s  w  i  t  c  h  _  6  .  j  a  v  a  
-       01 00 14 54 5f 74 61 62 6c 65 73 77 69 74 63 68 5f 36 2e 6a 61 76 61 
-    // parsed:, offset 160, len 7, h: 000d: utf8{"(I)I"}
-    // .  .  .  (  I  )  I  
-       01 00 04 28 49 29 49 
-// parsed:, offset 167, len 0, h: end constant_pool
-// parsed:, offset 167, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 169, len 2, h: this_class: type{dxc.junit.opcodes.tableswitch.jm.T_tableswitch_6}
-// .  .  
-   00 0a 
-// parsed:, offset 171, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0b 
-// parsed:, offset 173, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 175, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 177, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 179, len:91,desc: ()V
-// parsed:, offset 179, len 0, h:  methods[0]: 
-    // parsed:, offset 179, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 181, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 183, len 2, h: descriptor: ()V
-    // .  .  
-       00 09 
-    // parsed:, offset 185, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 187, len 0, h:  attributes[0]: 
-        // parsed:, offset 187, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 189, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 193, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 195, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 197, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 206, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 208, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 210, len 0, h: end attributes[0] 
-// parsed:, offset 210, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 210, len:60,desc: (I)I
-// parsed:, offset 210, len 0, h:  methods[1]: 
-    // parsed:, offset 210, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 212, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 214, len 2, h: descriptor: (I)I
-    // .  .  
-       00 0d 
-    // parsed:, offset 216, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 218, len 0, h:  attributes[0]: 
-        // parsed:, offset 218, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 220, len 4, h: length: 00000024
-        // .  .  .  $  
-           00 00 00 24 
-        // parsed:, offset 224, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 226, len 2, h: max_locals: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 228, len 4, h: code_length: 00000018
-        // .  .  .  .  
-           00 00 00 18 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 19, h: 0001: tableswitch   +00000001: 0014   default: 0016
-        // .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
-//@mod           aa 00 00 00 00 00 15 00 00 00 01 00 00 00 01 00 00 00 13 
-                 aa 00 00 00 00 00 15 00 00 00 01 00 00 00 00 00 00 00 13 
-        // parsed:, offset 20, len 1, h: 0014: iconst_2 // #+02
-        // .  
-           05 
-        // parsed:, offset 21, len 1, h: 0015: ireturn
-        // .  
-           ac 
-        // parsed:, offset 22, len 1, h: 0016: iconst_m1 // #-01
-        // .  
-           02 
-        // parsed:, offset 23, len 1, h: 0017: ireturn
-        // .  
-           ac 
-        // parsed:, offset 256, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 258, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 260, len 0, h: end attributes[0] 
-// parsed:, offset 260, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (I)I
-// parsed:, offset 260, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 262, len 0, h:  attributes[0]: 
-    // parsed:, offset 262, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 264, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 268, len 2, h: source: utf8{"T_tableswitch_6.java"}
-    // .  .  
-       00 0c 
-// parsed:, offset 270, len 0, h: end attributes[0] 
-// parsed:, offset 270, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_6.j b/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_6.j
deleted file mode 100644
index b290972..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_6.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_tableswitch_6.java
-.class public dxc/junit/opcodes/tableswitch/jm/T_tableswitch_6
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-    iload_1
-    
-    tableswitch 1 1
-            Label0
-            default: Label3
-
-    Label0:
-    iconst_2
-    ireturn
-
-    Label3:
-    iconst_m1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_6.java b/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_6.java
deleted file mode 100644
index 038bd4f..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_6.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.tableswitch.jm;
-
-public class T_tableswitch_6 {
-
-    public int run(int i) {
-        switch (i) {
-        case 1:
-            return 2;
-        default:
-            return -1;
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_7.cfh b/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_7.cfh
deleted file mode 100644
index 74cf765..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_7.cfh
+++ /dev/null
@@ -1,200 +0,0 @@
-//@class:dxc/junit/opcodes/tableswitch/jm/T_tableswitch_7
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000e
-// .  .  
-   00 0e 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0c 00 08 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 51, h: 0004: utf8{"dxc/junit/opcodes/tableswitch/jm/T_tableswitch_7"}
-    // .  .  0  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  t  a  b  l  e  s  w  i  t  c  h  /  j  m  /  T  _  t  a  b  l  e  s  w  i  t  c  h  _  7  
-       01 00 30 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 74 61 62 6c 65 73 77 69 74 63 68 2f 6a 6d 2f 54 5f 74 61 62 6c 65 73 77 69 74 63 68 5f 37 
-    // parsed:, offset 98, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 107, len 23, h: 0006: utf8{"T_tableswitch_7.java"}
-    // .  .  .  T  _  t  a  b  l  e  s  w  i  t  c  h  _  7  .  j  a  v  a  
-       01 00 14 54 5f 74 61 62 6c 65 73 77 69 74 63 68 5f 37 2e 6a 61 76 61 
-    // parsed:, offset 130, len 6, h: 0007: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 136, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0b 
-    // parsed:, offset 141, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 148, len 3, h: 000a: type{dxc.junit.opcodes.tableswitch.jm.T_tableswitch_7}
-    // .  .  .  
-       07 00 04 
-    // parsed:, offset 151, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 157, len 3, h: 000c: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-    // parsed:, offset 160, len 7, h: 000d: utf8{"(I)I"}
-    // .  .  .  (  I  )  I  
-       01 00 04 28 49 29 49 
-// parsed:, offset 167, len 0, h: end constant_pool
-// parsed:, offset 167, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 169, len 2, h: this_class: type{dxc.junit.opcodes.tableswitch.jm.T_tableswitch_7}
-// .  .  
-   00 0a 
-// parsed:, offset 171, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0c 
-// parsed:, offset 173, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 175, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 177, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 179, len:105,desc: ()V
-// parsed:, offset 179, len 0, h:  methods[0]: 
-    // parsed:, offset 179, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 181, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 183, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 185, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 187, len 0, h:  attributes[0]: 
-        // parsed:, offset 187, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 189, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 193, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 195, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 197, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 206, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 208, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 210, len 0, h: end attributes[0] 
-// parsed:, offset 210, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 210, len:74,desc: (I)I
-// parsed:, offset 210, len 0, h:  methods[1]: 
-    // parsed:, offset 210, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 212, len 2, h: name: run
-    // .  .  
-       00 07 
-    // parsed:, offset 214, len 2, h: descriptor: (I)I
-    // .  .  
-       00 0d 
-    // parsed:, offset 216, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 218, len 0, h:  attributes[0]: 
-        // parsed:, offset 218, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 220, len 4, h: length: 00000032
-        // .  .  .  2  
-           00 00 00 32 
-        // parsed:, offset 224, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 226, len 2, h: max_locals: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 228, len 4, h: code_length: 00000026
-        // .  .  .  &  
-           00 00 00 26 
-        // parsed:, offset 0, len 1, h: 0000: iload_1 // 01
-        // .  
-           1b 
-        // parsed:, offset 1, len 27, h: 0001: tableswitch   +00000001: 001c   +00000002: 001e   +00000003: 001e   default: 0021
-        // .  .  .  .  .  .     .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
-//@mod           aa 00 00 00 00 00 20 00 00 00 01 00 00 00 03 00 00 00 1b 00 00 00 1d 00 00 00 1d 
-           aa 00 01 00 00 00 20 00 00 00 01 00 00 00 03 00 00 00 1b 00 00 00 1d 00 00 00 1d 
-        // parsed:, offset 28, len 1, h: 001c: iconst_2 // #+02
-        // .  
-           05 
-        // parsed:, offset 29, len 1, h: 001d: ireturn
-        // .  
-           ac 
-        // parsed:, offset 30, len 2, h: 001e: bipush #+14
-        // .  .  
-           10 14 
-        // parsed:, offset 32, len 1, h: 0020: ireturn
-        // .  
-           ac 
-        // parsed:, offset 33, len 4, h: 0021: wide iload 0001
-        // .  .  .  .  
-           c4 15 00 01 
-        // parsed:, offset 37, len 1, h: 0025: ireturn
-        // .  
-           ac 
-        // parsed:, offset 270, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 272, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 274, len 0, h: end attributes[0] 
-// parsed:, offset 274, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: (I)I
-// parsed:, offset 274, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 276, len 0, h:  attributes[0]: 
-    // parsed:, offset 276, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 278, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 282, len 2, h: source: utf8{"T_tableswitch_7.java"}
-    // .  .  
-       00 06 
-// parsed:, offset 284, len 0, h: end attributes[0] 
-// parsed:, offset 284, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_7.j b/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_7.j
deleted file mode 100644
index e944ce0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_7.j
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_tableswitch_7.java
-.class public dxc/junit/opcodes/tableswitch/jm/T_tableswitch_7
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-    iload_1
-    
-    tableswitch 1 3
-            Label0
-            Label1
-            Label1
-            default: Label3
-
-    Label0:
-    iconst_2
-    ireturn
-
-    Label1:
-    bipush 20
-    ireturn
-
-    Label3:
-    iload_w 1
-    ireturn
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_7.java b/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_7.java
deleted file mode 100644
index e36101b..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_7.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.tableswitch.jm;
-
-public class T_tableswitch_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/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_8.j b/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_8.j
deleted file mode 100644
index d9d3f2a..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_8.j
+++ /dev/null
@@ -1,54 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_tableswitch_8.java
-.class public dxc/junit/opcodes/tableswitch/jm/T_tableswitch_8
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-.method public run(I)I
-    .limit stack 1
-    .limit locals 2
-
-    aload_0
-    
-    tableswitch 1 3
-            Label0
-            Label1
-            Label1
-            default: Label3
-
-    Label0:
-.line 8
-    iconst_2
-    ireturn
-
-    Label1:
-.line 11
-    bipush 20
-    ireturn
-
-    Label3:
-.line 13
-    iconst_m1
-
-    Label5:
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_8.java b/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_8.java
deleted file mode 100644
index 205fec9..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_8.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.tableswitch.jm;
-
-public class T_tableswitch_8 {
-    
-    public int run(int i) {
-        switch (i) {
-        case 1:
-            return 2;
-        case 2:
-        case 3:
-            return 20;
-        default:
-            return -1;
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_9.cfh b/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_9.cfh
deleted file mode 100644
index ded5708..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_9.cfh
+++ /dev/null
@@ -1,185 +0,0 @@
-//@class:dxc/junit/opcodes/tableswitch/jm/T_tableswitch_9
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000d
-// .  .  
-   00 0d 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0c 00 07 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 51, h: 0003: utf8{"dxc/junit/opcodes/tableswitch/jm/T_tableswitch_9"}
-    // .  .  0  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  t  a  b  l  e  s  w  i  t  c  h  /  j  m  /  T  _  t  a  b  l  e  s  w  i  t  c  h  _  9  
-       01 00 30 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 74 61 62 6c 65 73 77 69 74 63 68 2f 6a 6d 2f 54 5f 74 61 62 6c 65 73 77 69 74 63 68 5f 39 
-    // parsed:, offset 85, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 98, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 107, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 113, len 5, h: 0007: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0a 
-    // parsed:, offset 118, len 7, h: 0008: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 125, len 3, h: 0009: type{dxc.junit.opcodes.tableswitch.jm.T_tableswitch_9}
-    // .  .  .  
-       07 00 03 
-    // parsed:, offset 128, len 6, h: 000a: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 134, len 23, h: 000b: utf8{"T_tableswitch_9.java"}
-    // .  .  .  T  _  t  a  b  l  e  s  w  i  t  c  h  _  9  .  j  a  v  a  
-       01 00 14 54 5f 74 61 62 6c 65 73 77 69 74 63 68 5f 39 2e 6a 61 76 61 
-    // parsed:, offset 157, len 3, h: 000c: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 160, len 0, h: end constant_pool
-// parsed:, offset 160, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 162, len 2, h: this_class: type{dxc.junit.opcodes.tableswitch.jm.T_tableswitch_9}
-// .  .  
-   00 09 
-// parsed:, offset 164, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0c 
-// parsed:, offset 166, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 168, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 170, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 172, len:89,desc: ()V
-// parsed:, offset 172, len 0, h:  methods[0]: 
-    // parsed:, offset 172, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 174, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 176, len 2, h: descriptor: ()V
-    // .  .  
-       00 0a 
-    // parsed:, offset 178, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 180, len 0, h:  attributes[0]: 
-        // parsed:, offset 180, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 182, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 186, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 188, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 190, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 199, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 201, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 203, len 0, h: end attributes[0] 
-// parsed:, offset 203, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 203, len:58,desc: ()V
-// parsed:, offset 203, len 0, h:  methods[1]: 
-    // parsed:, offset 203, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 205, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 207, len 2, h: descriptor: ()V
-    // .  .  
-       00 0a 
-    // parsed:, offset 209, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 211, len 0, h:  attributes[0]: 
-        // parsed:, offset 211, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 213, len 4, h: length: 00000022
-        // .  .  .  "  
-           00 00 00 22 
-        // parsed:, offset 217, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 219, len 2, h: max_locals: 0002
-        // .  .  
-           00 02 
-        // parsed:, offset 221, len 4, h: code_length: 00000016
-        // .  .  .  .  
-           00 00 00 16 
-        // parsed:, offset 0, len 1, h: 0000: iconst_1 // #+01
-        // .  
-           04 
-        // parsed:, offset 1, len 19, h: 0001: tableswitch   +00000001: 0014   default: 0015
-        // .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  
-//@mod           aa 00 00 00 00 00 14 00 00 00 01 00 00 00 01 00 00 00 13 
-           aa 00 00 00 00 00 14 00 00 00 01 00 00 00 02 00 00 00 13 
-        // parsed:, offset 20, len 1, h: 0014: return
-        // .  
-           b1 
-        // parsed:, offset 21, len 1, h: 0015: return
-        // .  
-           b1 
-        // parsed:, offset 247, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 249, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 251, len 0, h: end attributes[0] 
-// parsed:, offset 251, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()V
-// parsed:, offset 251, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 253, len 0, h:  attributes[0]: 
-    // parsed:, offset 253, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 255, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 259, len 2, h: source: utf8{"T_tableswitch_9.java"}
-    // .  .  
-       00 0b 
-// parsed:, offset 261, len 0, h: end attributes[0] 
-// parsed:, offset 261, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_9.j b/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_9.j
deleted file mode 100644
index 155aae4..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_9.j
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_tableswitch_9.java
-.class public dxc/junit/opcodes/tableswitch/jm/T_tableswitch_9
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()V
-    .limit stack 1
-    .limit locals 2
-
-    iconst_1
-    tableswitch 1 1
-            Label0
-            default: Label1
-
-Label0:
-    return
-
-Label1:
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_9.java b/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_9.java
deleted file mode 100644
index 39f83b1..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/tableswitch/jm/T_tableswitch_9.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.tableswitch.jm;
-
-public class T_tableswitch_9 {
-
-    public int run(int i) {
-        switch (i) {
-        case 1:
-            return 2;
-        }
-        return 0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/wide/Test_wide.java b/tools/dx-tests/src/dxc/junit/opcodes/wide/Test_wide.java
deleted file mode 100644
index c27db48..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/wide/Test_wide.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.wide;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-
-
-public class Test_wide extends DxTestCase {
-
-    /**
-     * Wide instruction is tested as part of wide version of particular
-     * instructions so here we just test if wide instruction can't be applied to
-     * wrong bytecode.
-     */
-
-    /**
-     * @constraint 4.8.1.5 (?)
-     * @title Wide instruction shall be applied only on defined
-     * instructions 
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.opcodes.wide.jm.T_wide_1");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.5 
-     * @title bytecode modified with wide instruction must not be
-     *          reachable directly
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.opcodes.wide.jm.T_wide_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/wide/jm/T_wide_1.cfh b/tools/dx-tests/src/dxc/junit/opcodes/wide/jm/T_wide_1.cfh
deleted file mode 100644
index 0906ca2..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/wide/jm/T_wide_1.cfh
+++ /dev/null
@@ -1,182 +0,0 @@
-//@class:dxc/junit/opcodes/wide/jm/T_wide_1
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000d
-// .  .  
-   00 0d 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0b 00 07 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 37, h: 0003: utf8{"dxc/junit/opcodes/wide/jm/T_wide_1"}
-    // .  .  "  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  w  i  d  e  /  j  m  /  T  _  w  i  d  e  _  1  
-       01 00 22 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 77 69 64 65 2f 6a 6d 2f 54 5f 77 69 64 65 5f 31 
-    // parsed:, offset 71, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 84, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 93, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 99, len 5, h: 0007: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 09 
-    // parsed:, offset 104, len 7, h: 0008: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 111, len 6, h: 0009: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 117, len 3, h: 000a: type{dxc.junit.opcodes.wide.jm.T_wide_1}
-    // .  .  .  
-       07 00 03 
-    // parsed:, offset 120, len 3, h: 000b: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-    // parsed:, offset 123, len 16, h: 000c: utf8{"T_wide_1.java"}
-    // .  .  .  T  _  w  i  d  e  _  1  .  j  a  v  a  
-       01 00 0d 54 5f 77 69 64 65 5f 31 2e 6a 61 76 61 
-// parsed:, offset 139, len 0, h: end constant_pool
-// parsed:, offset 139, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 141, len 2, h: this_class: type{dxc.junit.opcodes.wide.jm.T_wide_1}
-// .  .  
-   00 0a 
-// parsed:, offset 143, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0b 
-// parsed:, offset 145, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 147, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 149, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 151, len:70,desc: ()V
-// parsed:, offset 151, len 0, h:  methods[0]: 
-    // parsed:, offset 151, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 153, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 155, len 2, h: descriptor: ()V
-    // .  .  
-       00 09 
-    // parsed:, offset 157, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 159, len 0, h:  attributes[0]: 
-        // parsed:, offset 159, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 161, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 165, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 167, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 169, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 178, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 180, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 182, len 0, h: end attributes[0] 
-// parsed:, offset 182, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 182, len:39,desc: ()V
-// parsed:, offset 182, len 0, h:  methods[1]: 
-    // parsed:, offset 182, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 184, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 186, len 2, h: descriptor: ()V
-    // .  .  
-       00 09 
-    // parsed:, offset 188, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 190, len 0, h:  attributes[0]: 
-        // parsed:, offset 190, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 192, len 4, h: length: 0000000f
-        // .  .  .  .  
-           00 00 00 0f 
-        // parsed:, offset 196, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 198, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 200, len 4, h: code_length: 00000003
-        // .  .  .  .  
-           00 00 00 03 
-        // parsed:, offset 0, len 1, h: 0000: nop
-        // .  
-//@mod           00
-           c4 
-        // parsed:, offset 1, len 1, h: 0001: nop
-        // .  
-           00 
-        // parsed:, offset 2, len 1, h: 0002: return
-        // .  
-           b1 
-        // parsed:, offset 207, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 209, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 211, len 0, h: end attributes[0] 
-// parsed:, offset 211, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()V
-// parsed:, offset 211, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 213, len 0, h:  attributes[0]: 
-    // parsed:, offset 213, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 215, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 219, len 2, h: source: utf8{"T_wide_1.java"}
-    // .  .  
-       00 0c 
-// parsed:, offset 221, len 0, h: end attributes[0] 
-// parsed:, offset 221, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/wide/jm/T_wide_1.j b/tools/dx-tests/src/dxc/junit/opcodes/wide/jm/T_wide_1.j
deleted file mode 100644
index 7269f72..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/wide/jm/T_wide_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_wide_1.java
-.class public dxc/junit/opcodes/wide/jm/T_wide_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()V
-
-    nop
-    nop
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/wide/jm/T_wide_1.java b/tools/dx-tests/src/dxc/junit/opcodes/wide/jm/T_wide_1.java
deleted file mode 100644
index a5f3ee0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/wide/jm/T_wide_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.wide.jm;
-
-public class T_wide_1 {
-
-    public void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/wide/jm/T_wide_2.cfh b/tools/dx-tests/src/dxc/junit/opcodes/wide/jm/T_wide_2.cfh
deleted file mode 100644
index c6717db..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/wide/jm/T_wide_2.cfh
+++ /dev/null
@@ -1,182 +0,0 @@
-//@class:dxc/junit/opcodes/wide/jm/T_wide_2
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000d
-// .  .  
-   00 0d 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 37, h: 0001: utf8{"dxc/junit/opcodes/wide/jm/T_wide_2"}
-    // .  .  "  d  x  c  /  j  u  n  i  t  /  o  p  c  o  d  e  s  /  w  i  d  e  /  j  m  /  T  _  w  i  d  e  _  2  
-       01 00 22 64 78 63 2f 6a 75 6e 69 74 2f 6f 70 63 6f 64 65 73 2f 77 69 64 65 2f 6a 6d 2f 54 5f 77 69 64 65 5f 32 
-    // parsed:, offset 47, len 5, h: 0002: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0c 00 08 
-    // parsed:, offset 52, len 19, h: 0003: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 71, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 84, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 93, len 16, h: 0006: utf8{"T_wide_2.java"}
-    // .  .  .  T  _  w  i  d  e  _  2  .  j  a  v  a  
-       01 00 0d 54 5f 77 69 64 65 5f 32 2e 6a 61 76 61 
-    // parsed:, offset 109, len 6, h: 0007: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 115, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0a 
-    // parsed:, offset 120, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 127, len 6, h: 000a: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 133, len 3, h: 000b: type{dxc.junit.opcodes.wide.jm.T_wide_2}
-    // .  .  .  
-       07 00 01 
-    // parsed:, offset 136, len 3, h: 000c: type{java.lang.Object}
-    // .  .  .  
-       07 00 03 
-// parsed:, offset 139, len 0, h: end constant_pool
-// parsed:, offset 139, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 141, len 2, h: this_class: type{dxc.junit.opcodes.wide.jm.T_wide_2}
-// .  .  
-   00 0b 
-// parsed:, offset 143, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0c 
-// parsed:, offset 145, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 147, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 149, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 151, len:75,desc: ()V
-// parsed:, offset 151, len 0, h:  methods[0]: 
-    // parsed:, offset 151, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 153, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 155, len 2, h: descriptor: ()V
-    // .  .  
-       00 0a 
-    // parsed:, offset 157, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 159, len 0, h:  attributes[0]: 
-        // parsed:, offset 159, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 161, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 165, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 167, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 169, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 02 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 178, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 180, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 182, len 0, h: end attributes[0] 
-// parsed:, offset 182, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 182, len:44,desc: ()V
-// parsed:, offset 182, len 0, h:  methods[1]: 
-    // parsed:, offset 182, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 184, len 2, h: name: run
-    // .  .  
-       00 07 
-    // parsed:, offset 186, len 2, h: descriptor: ()V
-    // .  .  
-       00 0a 
-    // parsed:, offset 188, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 190, len 0, h:  attributes[0]: 
-        // parsed:, offset 190, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 192, len 4, h: length: 00000014
-        // .  .  .  .  
-           00 00 00 14 
-        // parsed:, offset 196, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 198, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 200, len 4, h: code_length: 00000008
-        // .  .  .  .  
-           00 00 00 08 
-        // parsed:, offset 0, len 3, h: 0000: goto 0003
-        // .  .  .  
-//@mod           a7 00 03 
-           a7 00 04 
-        // parsed:, offset 3, len 4, h: 0003: wide aload 0000
-        // .  .  .  .  
-           c4 19 00 00 
-        // parsed:, offset 7, len 1, h: 0007: return
-        // .  
-           b1 
-        // parsed:, offset 212, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 214, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 216, len 0, h: end attributes[0] 
-// parsed:, offset 216, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()V
-// parsed:, offset 216, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 218, len 0, h:  attributes[0]: 
-    // parsed:, offset 218, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 220, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 224, len 2, h: source: utf8{"T_wide_2.java"}
-    // .  .  
-       00 06 
-// parsed:, offset 226, len 0, h: end attributes[0] 
-// parsed:, offset 226, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/wide/jm/T_wide_2.j b/tools/dx-tests/src/dxc/junit/opcodes/wide/jm/T_wide_2.j
deleted file mode 100644
index 176ece0..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/wide/jm/T_wide_2.j
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_wide_2.java
-.class public dxc/junit/opcodes/wide/jm/T_wide_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()V
-
-    .limit stack 1
-    
-    goto Label0
-
-Label0:
-    aload_w 0
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/opcodes/wide/jm/T_wide_2.java b/tools/dx-tests/src/dxc/junit/opcodes/wide/jm/T_wide_2.java
deleted file mode 100644
index 50d5d46..0000000
--- a/tools/dx-tests/src/dxc/junit/opcodes/wide/jm/T_wide_2.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.opcodes.wide.jm;
-
-public class T_wide_2 {
-
-    public void run() {
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/AllTests.java b/tools/dx-tests/src/dxc/junit/verify/AllTests.java
deleted file mode 100644
index 790c0d8..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/AllTests.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.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 java vm: test that "
-                + "structurally damaged files are rejected by the verifier");
-        suite.addTestSuite(dxc.junit.verify.t481_1.Test_t481_1.class);
-        suite.addTestSuite(dxc.junit.verify.t481_2.Test_t481_2.class);
-        suite.addTestSuite(dxc.junit.verify.t481_3.Test_t481_3.class);
-        suite.addTestSuite(dxc.junit.verify.t481_4.Test_t481_4.class);
-        suite.addTestSuite(dxc.junit.verify.t481_6.Test_t481_6.class);
-
-        suite.addTestSuite(dxc.junit.verify.t482_2.Test_t482_2.class);
-        suite.addTestSuite(dxc.junit.verify.t482_3.Test_t482_3.class);
-        suite.addTestSuite(dxc.junit.verify.t482_4.Test_t482_4.class);
-        suite.addTestSuite(dxc.junit.verify.t482_8.Test_t482_8.class);
-        suite.addTestSuite(dxc.junit.verify.t482_9.Test_t482_9.class);
-        suite.addTestSuite(dxc.junit.verify.t482_10.Test_t482_10.class);
-        suite.addTestSuite(dxc.junit.verify.t482_11.Test_t482_11.class);
-        suite.addTestSuite(dxc.junit.verify.t482_14.Test_t482_14.class);
-        suite.addTestSuite(dxc.junit.verify.t482_20.Test_t482_20.class);
-
-        return suite;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t481_1/Test_t481_1.java b/tools/dx-tests/src/dxc/junit/verify/t481_1/Test_t481_1.java
deleted file mode 100644
index cf26b1f..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t481_1/Test_t481_1.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t481_1;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-
-/**
- * 
- */
-public class Test_t481_1 extends DxTestCase {
-
-    /**
-     * @constraint 4.8.1.1
-     * @title code_length must not be zero
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.verify.t481_1.jm.T_t481_1_1");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t481_1/jm/T_t481_1_1.cfh b/tools/dx-tests/src/dxc/junit/verify/t481_1/jm/T_t481_1_1.cfh
deleted file mode 100644
index 4785bad..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t481_1/jm/T_t481_1_1.cfh
+++ /dev/null
@@ -1,176 +0,0 @@
-//@class:dxc/junit/verify/t481_1/jm/T_t481_1_1
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000d
-// .  .  
-   00 0d 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0c 00 07 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 6, h: 0005: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 62, len 18, h: 0006: utf8{"T_t481_1_1.java"}
-    // .  .  .  T  _  t  4  8  1  _  1  _  1  .  j  a  v  a  
-       01 00 0f 54 5f 74 34 38 31 5f 31 5f 31 2e 6a 61 76 61 
-    // parsed:, offset 80, len 5, h: 0007: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 0a 
-    // parsed:, offset 85, len 7, h: 0008: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 92, len 40, h: 0009: utf8{"dxc/junit/verify/t481_1/jm/T_t481_1_1"}
-    // .  .  %  d  x  c  /  j  u  n  i  t  /  v  e  r  i  f  y  /  t  4  8  1  _  1  /  j  m  /  T  _  t  4  8  1  _  1  _  1  
-       01 00 25 64 78 63 2f 6a 75 6e 69 74 2f 76 65 72 69 66 79 2f 74 34 38 31 5f 31 2f 6a 6d 2f 54 5f 74 34 38 31 5f 31 5f 31 
-    // parsed:, offset 132, len 6, h: 000a: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 138, len 3, h: 000b: type{dxc.junit.verify.t481_1.jm.T_t481_1_1}
-    // .  .  .  
-       07 00 09 
-    // parsed:, offset 141, len 3, h: 000c: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 144, len 0, h: end constant_pool
-// parsed:, offset 144, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 146, len 2, h: this_class: type{dxc.junit.verify.t481_1.jm.T_t481_1_1}
-// .  .  
-   00 0b 
-// parsed:, offset 148, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0c 
-// parsed:, offset 150, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 152, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 154, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 156, len:68,desc: ()V
-// parsed:, offset 156, len 0, h:  methods[0]: 
-    // parsed:, offset 156, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 158, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 160, len 2, h: descriptor: ()V
-    // .  .  
-       00 0a 
-    // parsed:, offset 162, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 164, len 0, h:  attributes[0]: 
-        // parsed:, offset 164, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 166, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 170, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 172, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 174, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 183, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 185, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 187, len 0, h: end attributes[0] 
-// parsed:, offset 187, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 187, len:37,desc: ()V
-// parsed:, offset 187, len 0, h:  methods[1]: 
-    // parsed:, offset 187, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 189, len 2, h: name: run
-    // .  .  
-       00 05 
-    // parsed:, offset 191, len 2, h: descriptor: ()V
-    // .  .  
-       00 0a 
-    // parsed:, offset 193, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 195, len 0, h:  attributes[0]: 
-        // parsed:, offset 195, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 197, len 4, h: length: 0000000d
-        // .  .  .  .  
-           00 00 00 0d 
-        // parsed:, offset 201, len 2, h: max_stack: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 203, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 205, len 4, h: code_length: 00000001
-        // .  .  .  .  
-//@mod           00 00 00 01 
-           00 00 00 00 
-        // parsed:, offset 0, len 1, h: 0000: return
-        // .  
-           b1 
-        // parsed:, offset 210, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 212, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 214, len 0, h: end attributes[0] 
-// parsed:, offset 214, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()V
-// parsed:, offset 214, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 216, len 0, h:  attributes[0]: 
-    // parsed:, offset 216, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 218, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 222, len 2, h: source: utf8{"T_t481_1_1.java"}
-    // .  .  
-       00 06 
-// parsed:, offset 224, len 0, h: end attributes[0] 
-// parsed:, offset 224, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/verify/t481_1/jm/T_t481_1_1.j b/tools/dx-tests/src/dxc/junit/verify/t481_1/jm/T_t481_1_1.j
deleted file mode 100644
index fc6fad0..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t481_1/jm/T_t481_1_1.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_t481_1_1.java
-.class public dxc/junit/verify/t481_1/jm/T_t481_1_1
-.super java/lang/Object
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-
-.end method
-
-
-
-.method public run()V
-    .limit stack 0
-    .limit locals 1
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/verify/t481_1/jm/T_t481_1_1.java b/tools/dx-tests/src/dxc/junit/verify/t481_1/jm/T_t481_1_1.java
deleted file mode 100644
index 3da0228..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t481_1/jm/T_t481_1_1.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t481_1.jm;
-
-public class T_t481_1_1{
-    public void run(){
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t481_2/Test_t481_2.java b/tools/dx-tests/src/dxc/junit/verify/t481_2/Test_t481_2.java
deleted file mode 100644
index 4cabc23..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t481_2/Test_t481_2.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t481_2;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-
-/**
- * 
- */
-public class Test_t481_2 extends DxTestCase {
-
-    /**
-     * @constraint 4.8.1.2
-     * @title code_length must be less than 65536
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.verify.t481_2.jm.T_t481_2_1");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t481_2/jm/T_t481_2_1.cfh b/tools/dx-tests/src/dxc/junit/verify/t481_2/jm/T_t481_2_1.cfh
deleted file mode 100644
index 049d556..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t481_2/jm/T_t481_2_1.cfh
+++ /dev/null
@@ -1,176 +0,0 @@
-//@class:dxc/junit/verify/t481_2/jm/T_t481_2_1
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000d
-// .  .  
-   00 0d 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0c 00 09 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 40, h: 0004: utf8{"dxc/junit/verify/t481_2/jm/T_t481_2_1"}
-    // .  .  %  d  x  c  /  j  u  n  i  t  /  v  e  r  i  f  y  /  t  4  8  1  _  2  /  j  m  /  T  _  t  4  8  1  _  2  _  1  
-       01 00 25 64 78 63 2f 6a 75 6e 69 74 2f 76 65 72 69 66 79 2f 74 34 38 31 5f 32 2f 6a 6d 2f 54 5f 74 34 38 31 5f 32 5f 31 
-    // parsed:, offset 87, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 96, len 18, h: 0006: utf8{"T_t481_2_1.java"}
-    // .  .  .  T  _  t  4  8  1  _  2  _  1  .  j  a  v  a  
-       01 00 0f 54 5f 74 34 38 31 5f 32 5f 31 2e 6a 61 76 61 
-    // parsed:, offset 114, len 6, h: 0007: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 120, len 3, h: 0008: type{dxc.junit.verify.t481_2.jm.T_t481_2_1}
-    // .  .  .  
-       07 00 04 
-    // parsed:, offset 123, len 5, h: 0009: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0b 
-    // parsed:, offset 128, len 7, h: 000a: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 135, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 141, len 3, h: 000c: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 144, len 0, h: end constant_pool
-// parsed:, offset 144, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 146, len 2, h: this_class: type{dxc.junit.verify.t481_2.jm.T_t481_2_1}
-// .  .  
-   00 08 
-// parsed:, offset 148, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0c 
-// parsed:, offset 150, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 152, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 154, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 156, len:68,desc: ()V
-// parsed:, offset 156, len 0, h:  methods[0]: 
-    // parsed:, offset 156, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 158, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 160, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 162, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 164, len 0, h:  attributes[0]: 
-        // parsed:, offset 164, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 166, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 170, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 172, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 174, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 183, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 185, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 187, len 0, h: end attributes[0] 
-// parsed:, offset 187, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 187, len:37,desc: ()V
-// parsed:, offset 187, len 0, h:  methods[1]: 
-    // parsed:, offset 187, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 189, len 2, h: name: run
-    // .  .  
-       00 07 
-    // parsed:, offset 191, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 193, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 195, len 0, h:  attributes[0]: 
-        // parsed:, offset 195, len 2, h: name: Code
-        // .  .  
-           00 0a 
-        // parsed:, offset 197, len 4, h: length: 0000000d
-        // .  .  .  .  
-           00 00 00 0d 
-        // parsed:, offset 201, len 2, h: max_stack: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 203, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 205, len 4, h: code_length: 00000001
-        // .  .  .  .  
-//@mod           00 00 00 01 
-           00 01 00 00 
-        // parsed:, offset 0, len 1, h: 0000: return
-        // .  
-           b1 
-        // parsed:, offset 210, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 212, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 214, len 0, h: end attributes[0] 
-// parsed:, offset 214, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()V
-// parsed:, offset 214, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 216, len 0, h:  attributes[0]: 
-    // parsed:, offset 216, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 218, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 222, len 2, h: source: utf8{"T_t481_2_1.java"}
-    // .  .  
-       00 06 
-// parsed:, offset 224, len 0, h: end attributes[0] 
-// parsed:, offset 224, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/verify/t481_2/jm/T_t481_2_1.j b/tools/dx-tests/src/dxc/junit/verify/t481_2/jm/T_t481_2_1.j
deleted file mode 100644
index e167ae6..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t481_2/jm/T_t481_2_1.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_t481_2_1.java
-.class public dxc/junit/verify/t481_2/jm/T_t481_2_1
-.super java/lang/Object
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-
-.end method
-
-
-
-.method public run()V
-    .limit stack 0
-    .limit locals 1
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/verify/t481_2/jm/T_t481_2_1.java b/tools/dx-tests/src/dxc/junit/verify/t481_2/jm/T_t481_2_1.java
deleted file mode 100644
index 712596d..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t481_2/jm/T_t481_2_1.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t481_2.jm;
-
-public class T_t481_2_1{
-    public void run(){
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t481_3/Test_t481_3.java b/tools/dx-tests/src/dxc/junit/verify/t481_3/Test_t481_3.java
deleted file mode 100644
index 2180f89..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t481_3/Test_t481_3.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t481_3;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-
-/**
- * 
- */
-public class Test_t481_3 extends DxTestCase {
-
-    /**
-     * @constraint 4.8.1.3
-     * @title First opcode instruction shall be at offset 0. The idea of
-     * the test is to put invalid opcode at offset 0.
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.verify.t481_3.jm.T_t481_3_1");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t481_3/jm/T_t481_3_1.cfh b/tools/dx-tests/src/dxc/junit/verify/t481_3/jm/T_t481_3_1.cfh
deleted file mode 100644
index 9fdc97c..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t481_3/jm/T_t481_3_1.cfh
+++ /dev/null
@@ -1,185 +0,0 @@
-//@class:dxc/junit/verify/t481_3/jm/T_t481_3_1
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000d
-// .  .  
-   00 0d 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0b 00 06 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 6, h: 0005: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 62, len 5, h: 0006: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 08 
-    // parsed:, offset 67, len 7, h: 0007: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 74, len 6, h: 0008: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 80, len 18, h: 0009: utf8{"T_t481_3_1.java"}
-    // .  .  .  T  _  t  4  8  1  _  3  _  1  .  j  a  v  a  
-       01 00 0f 54 5f 74 34 38 31 5f 33 5f 31 2e 6a 61 76 61 
-    // parsed:, offset 98, len 40, h: 000a: utf8{"dxc/junit/verify/t481_3/jm/T_t481_3_1"}
-    // .  .  %  d  x  c  /  j  u  n  i  t  /  v  e  r  i  f  y  /  t  4  8  1  _  3  /  j  m  /  T  _  t  4  8  1  _  3  _  1  
-       01 00 25 64 78 63 2f 6a 75 6e 69 74 2f 76 65 72 69 66 79 2f 74 34 38 31 5f 33 2f 6a 6d 2f 54 5f 74 34 38 31 5f 33 5f 31 
-    // parsed:, offset 138, len 3, h: 000b: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-    // parsed:, offset 141, len 3, h: 000c: type{dxc.junit.verify.t481_3.jm.T_t481_3_1}
-    // .  .  .  
-       07 00 0a 
-// parsed:, offset 144, len 0, h: end constant_pool
-// parsed:, offset 144, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 146, len 2, h: this_class: type{dxc.junit.verify.t481_3.jm.T_t481_3_1}
-// .  .  
-   00 0c 
-// parsed:, offset 148, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0b 
-// parsed:, offset 150, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 152, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 154, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 156, len:71,desc: ()V
-// parsed:, offset 156, len 0, h:  methods[0]: 
-    // parsed:, offset 156, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 158, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 160, len 2, h: descriptor: ()V
-    // .  .  
-       00 08 
-    // parsed:, offset 162, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 164, len 0, h:  attributes[0]: 
-        // parsed:, offset 164, len 2, h: name: Code
-        // .  .  
-           00 07 
-        // parsed:, offset 166, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 170, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 172, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 174, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 183, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 185, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 187, len 0, h: end attributes[0] 
-// parsed:, offset 187, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 187, len:40,desc: ()V
-// parsed:, offset 187, len 0, h:  methods[1]: 
-    // parsed:, offset 187, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 189, len 2, h: name: run
-    // .  .  
-       00 05 
-    // parsed:, offset 191, len 2, h: descriptor: ()V
-    // .  .  
-       00 08 
-    // parsed:, offset 193, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 195, len 0, h:  attributes[0]: 
-        // parsed:, offset 195, len 2, h: name: Code
-        // .  .  
-           00 07 
-        // parsed:, offset 197, len 4, h: length: 00000010
-        // .  .  .  .  
-           00 00 00 10 
-        // parsed:, offset 201, len 2, h: max_stack: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 203, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 205, len 4, h: code_length: 00000004
-        // .  .  .  .  
-           00 00 00 04 
-        // parsed:, offset 0, len 1, h: 0000: nop
-        // .  
-//@mod           00 
-           ff 
-        // parsed:, offset 1, len 1, h: 0001: nop
-        // .  
-           00 
-        // parsed:, offset 2, len 1, h: 0002: nop
-        // .  
-           00 
-        // parsed:, offset 3, len 1, h: 0003: return
-        // .  
-           b1 
-        // parsed:, offset 213, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 215, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 217, len 0, h: end attributes[0] 
-// parsed:, offset 217, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()V
-// parsed:, offset 217, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 219, len 0, h:  attributes[0]: 
-    // parsed:, offset 219, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 221, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 225, len 2, h: source: utf8{"T_t481_3_1.java"}
-    // .  .  
-       00 09 
-// parsed:, offset 227, len 0, h: end attributes[0] 
-// parsed:, offset 227, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/verify/t481_3/jm/T_t481_3_1.j b/tools/dx-tests/src/dxc/junit/verify/t481_3/jm/T_t481_3_1.j
deleted file mode 100644
index fd5258f..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t481_3/jm/T_t481_3_1.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_t481_3_1.java
-.class public dxc/junit/verify/t481_3/jm/T_t481_3_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()V
-    .limit stack 0
-    .limit locals 1
-    
-    nop
-    nop
-    nop
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/verify/t481_3/jm/T_t481_3_1.java b/tools/dx-tests/src/dxc/junit/verify/t481_3/jm/T_t481_3_1.java
deleted file mode 100644
index 4cd3dcf..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t481_3/jm/T_t481_3_1.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t481_3.jm;
-
-public class T_t481_3_1{
-    public void run(){
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t481_4/Test_t481_4.java b/tools/dx-tests/src/dxc/junit/verify/t481_4/Test_t481_4.java
deleted file mode 100644
index d333420..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t481_4/Test_t481_4.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t481_4;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-
-/**
- * 
- */
-public class Test_t481_4 extends DxTestCase {
-
-    /**
-     * @constraint 4.8.1.4
-     * @title opcode 254 (0xfe) may not appear in code array
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.verify.t481_4.jm.T_t481_4_1");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.4
-     * @title opcode 255 (0xff) may not appear in code array
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.verify.t481_4.jm.T_t481_4_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.4
-     * @title opcode 202 (0xca) may not appear in code array
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.verify.t481_4.jm.T_t481_4_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.1.4
-     * @title undocumented opcode 240 (F0) may not appear in code array
-     */
-    public void testVFE4() {
-        try {
-            Class.forName("dxc.junit.verify.t481_4.jm.T_t481_4_4");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_1.cfh b/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_1.cfh
deleted file mode 100644
index 6f6a4d2..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_1.cfh
+++ /dev/null
@@ -1,185 +0,0 @@
-//@class:dxc/junit/verify/t481_4/jm/T_t481_4_1
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000d
-// .  .  
-   00 0d 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0c 00 07 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 40, h: 0005: utf8{"dxc/junit/verify/t481_4/jm/T_t481_4_1"}
-    // .  .  %  d  x  c  /  j  u  n  i  t  /  v  e  r  i  f  y  /  t  4  8  1  _  4  /  j  m  /  T  _  t  4  8  1  _  4  _  1  
-       01 00 25 64 78 63 2f 6a 75 6e 69 74 2f 76 65 72 69 66 79 2f 74 34 38 31 5f 34 2f 6a 6d 2f 54 5f 74 34 38 31 5f 34 5f 31 
-    // parsed:, offset 96, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 102, len 5, h: 0007: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 0a 
-    // parsed:, offset 107, len 7, h: 0008: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 114, len 3, h: 0009: type{dxc.junit.verify.t481_4.jm.T_t481_4_1}
-    // .  .  .  
-       07 00 05 
-    // parsed:, offset 117, len 6, h: 000a: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 123, len 18, h: 000b: utf8{"T_t481_4_1.java"}
-    // .  .  .  T  _  t  4  8  1  _  4  _  1  .  j  a  v  a  
-       01 00 0f 54 5f 74 34 38 31 5f 34 5f 31 2e 6a 61 76 61 
-    // parsed:, offset 141, len 3, h: 000c: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 144, len 0, h: end constant_pool
-// parsed:, offset 144, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 146, len 2, h: this_class: type{dxc.junit.verify.t481_4.jm.T_t481_4_1}
-// .  .  
-   00 09 
-// parsed:, offset 148, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0c 
-// parsed:, offset 150, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 152, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 154, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 156, len:71,desc: ()V
-// parsed:, offset 156, len 0, h:  methods[0]: 
-    // parsed:, offset 156, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 158, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 160, len 2, h: descriptor: ()V
-    // .  .  
-       00 0a 
-    // parsed:, offset 162, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 164, len 0, h:  attributes[0]: 
-        // parsed:, offset 164, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 166, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 170, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 172, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 174, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 183, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 185, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 187, len 0, h: end attributes[0] 
-// parsed:, offset 187, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 187, len:40,desc: ()V
-// parsed:, offset 187, len 0, h:  methods[1]: 
-    // parsed:, offset 187, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 189, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 191, len 2, h: descriptor: ()V
-    // .  .  
-       00 0a 
-    // parsed:, offset 193, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 195, len 0, h:  attributes[0]: 
-        // parsed:, offset 195, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 197, len 4, h: length: 00000010
-        // .  .  .  .  
-           00 00 00 10 
-        // parsed:, offset 201, len 2, h: max_stack: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 203, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 205, len 4, h: code_length: 00000004
-        // .  .  .  .  
-           00 00 00 04 
-        // parsed:, offset 0, len 1, h: 0000: nop
-        // .  
-           00 
-        // parsed:, offset 1, len 1, h: 0001: nop
-        // .  
-//@mod           00 
-           fe
-        // parsed:, offset 2, len 1, h: 0002: nop
-        // .  
-           00 
-        // parsed:, offset 3, len 1, h: 0003: return
-        // .  
-           b1 
-        // parsed:, offset 213, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 215, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 217, len 0, h: end attributes[0] 
-// parsed:, offset 217, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()V
-// parsed:, offset 217, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 219, len 0, h:  attributes[0]: 
-    // parsed:, offset 219, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 221, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 225, len 2, h: source: utf8{"T_t481_4_1.java"}
-    // .  .  
-       00 0b 
-// parsed:, offset 227, len 0, h: end attributes[0] 
-// parsed:, offset 227, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_1.j b/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_1.j
deleted file mode 100644
index f652640..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_1.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_t481_4_1.java
-.class public dxc/junit/verify/t481_4/jm/T_t481_4_1
-.super java/lang/Object
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-.end method
-
-
-
-.method public run()V
-    .limit stack 0
-    .limit locals 1
-    
-    nop
-    nop
-    nop
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_1.java b/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_1.java
deleted file mode 100644
index 8caaaca..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_1.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t481_4.jm;
-
-public class T_t481_4_1{
-    public void run(){
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_2.cfh b/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_2.cfh
deleted file mode 100644
index 13dee05..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_2.cfh
+++ /dev/null
@@ -1,185 +0,0 @@
-//@class:dxc/junit/verify/t481_4/jm/T_t481_4_2
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000d
-// .  .  
-   00 0d 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 18, h: 0001: utf8{"T_t481_4_2.java"}
-    // .  .  .  T  _  t  4  8  1  _  4  _  2  .  j  a  v  a  
-       01 00 0f 54 5f 74 34 38 31 5f 34 5f 32 2e 6a 61 76 61 
-    // parsed:, offset 28, len 5, h: 0002: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0c 00 08 
-    // parsed:, offset 33, len 19, h: 0003: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 52, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 65, len 40, h: 0005: utf8{"dxc/junit/verify/t481_4/jm/T_t481_4_2"}
-    // .  .  %  d  x  c  /  j  u  n  i  t  /  v  e  r  i  f  y  /  t  4  8  1  _  4  /  j  m  /  T  _  t  4  8  1  _  4  _  2  
-       01 00 25 64 78 63 2f 6a 75 6e 69 74 2f 76 65 72 69 66 79 2f 74 34 38 31 5f 34 2f 6a 6d 2f 54 5f 74 34 38 31 5f 34 5f 32 
-    // parsed:, offset 105, len 9, h: 0006: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 114, len 6, h: 0007: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 120, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 06 00 0b 
-    // parsed:, offset 125, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 132, len 3, h: 000a: type{dxc.junit.verify.t481_4.jm.T_t481_4_2}
-    // .  .  .  
-       07 00 05 
-    // parsed:, offset 135, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 141, len 3, h: 000c: type{java.lang.Object}
-    // .  .  .  
-       07 00 03 
-// parsed:, offset 144, len 0, h: end constant_pool
-// parsed:, offset 144, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 146, len 2, h: this_class: type{dxc.junit.verify.t481_4.jm.T_t481_4_2}
-// .  .  
-   00 0a 
-// parsed:, offset 148, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0c 
-// parsed:, offset 150, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 152, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 154, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 156, len:71,desc: ()V
-// parsed:, offset 156, len 0, h:  methods[0]: 
-    // parsed:, offset 156, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 158, len 2, h: name: <init>
-    // .  .  
-       00 06 
-    // parsed:, offset 160, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 162, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 164, len 0, h:  attributes[0]: 
-        // parsed:, offset 164, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 166, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 170, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 172, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 174, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 02 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 183, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 185, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 187, len 0, h: end attributes[0] 
-// parsed:, offset 187, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 187, len:40,desc: ()V
-// parsed:, offset 187, len 0, h:  methods[1]: 
-    // parsed:, offset 187, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 189, len 2, h: name: run
-    // .  .  
-       00 07 
-    // parsed:, offset 191, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 193, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 195, len 0, h:  attributes[0]: 
-        // parsed:, offset 195, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 197, len 4, h: length: 00000010
-        // .  .  .  .  
-           00 00 00 10 
-        // parsed:, offset 201, len 2, h: max_stack: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 203, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 205, len 4, h: code_length: 00000004
-        // .  .  .  .  
-           00 00 00 04 
-        // parsed:, offset 0, len 1, h: 0000: nop
-        // .  
-           00 
-        // parsed:, offset 1, len 1, h: 0001: nop
-        // .  
-//@mod           00 
-           ff 
-        // parsed:, offset 2, len 1, h: 0002: nop
-        // .  
-           00 
-        // parsed:, offset 3, len 1, h: 0003: return
-        // .  
-           b1 
-        // parsed:, offset 213, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 215, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 217, len 0, h: end attributes[0] 
-// parsed:, offset 217, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()V
-// parsed:, offset 217, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 219, len 0, h:  attributes[0]: 
-    // parsed:, offset 219, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 221, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 225, len 2, h: source: utf8{"T_t481_4_2.java"}
-    // .  .  
-       00 01 
-// parsed:, offset 227, len 0, h: end attributes[0] 
-// parsed:, offset 227, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_2.j b/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_2.j
deleted file mode 100644
index 1b5b83b..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_2.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_t481_4_2.java
-.class public dxc/junit/verify/t481_4/jm/T_t481_4_2
-.super java/lang/Object
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-.end method
-
-
-
-.method public run()V
-    .limit stack 0
-    .limit locals 1
-    
-    nop
-    nop
-    nop
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_2.java b/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_2.java
deleted file mode 100644
index bbc58a4..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_2.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t481_4.jm;
-
-public class T_t481_4_2{
-    public void run(){
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_3.cfh b/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_3.cfh
deleted file mode 100644
index c195228..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_3.cfh
+++ /dev/null
@@ -1,185 +0,0 @@
-//@class:dxc/junit/verify/t481_4/jm/T_t481_4_3
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000d
-// .  .  
-   00 0d 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0c 00 08 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 40, h: 0004: utf8{"dxc/junit/verify/t481_4/jm/T_t481_4_3"}
-    // .  .  %  d  x  c  /  j  u  n  i  t  /  v  e  r  i  f  y  /  t  4  8  1  _  4  /  j  m  /  T  _  t  4  8  1  _  4  _  3  
-       01 00 25 64 78 63 2f 6a 75 6e 69 74 2f 76 65 72 69 66 79 2f 74 34 38 31 5f 34 2f 6a 6d 2f 54 5f 74 34 38 31 5f 34 5f 33 
-    // parsed:, offset 87, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 96, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 102, len 18, h: 0007: utf8{"T_t481_4_3.java"}
-    // .  .  .  T  _  t  4  8  1  _  4  _  3  .  j  a  v  a  
-       01 00 0f 54 5f 74 34 38 31 5f 34 5f 33 2e 6a 61 76 61 
-    // parsed:, offset 120, len 5, h: 0008: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0b 
-    // parsed:, offset 125, len 7, h: 0009: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 132, len 3, h: 000a: type{dxc.junit.verify.t481_4.jm.T_t481_4_3}
-    // .  .  .  
-       07 00 04 
-    // parsed:, offset 135, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 141, len 3, h: 000c: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 144, len 0, h: end constant_pool
-// parsed:, offset 144, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 146, len 2, h: this_class: type{dxc.junit.verify.t481_4.jm.T_t481_4_3}
-// .  .  
-   00 0a 
-// parsed:, offset 148, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0c 
-// parsed:, offset 150, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 152, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 154, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 156, len:71,desc: ()V
-// parsed:, offset 156, len 0, h:  methods[0]: 
-    // parsed:, offset 156, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 158, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 160, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 162, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 164, len 0, h:  attributes[0]: 
-        // parsed:, offset 164, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 166, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 170, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 172, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 174, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 183, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 185, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 187, len 0, h: end attributes[0] 
-// parsed:, offset 187, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 187, len:40,desc: ()V
-// parsed:, offset 187, len 0, h:  methods[1]: 
-    // parsed:, offset 187, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 189, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 191, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 193, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 195, len 0, h:  attributes[0]: 
-        // parsed:, offset 195, len 2, h: name: Code
-        // .  .  
-           00 09 
-        // parsed:, offset 197, len 4, h: length: 00000010
-        // .  .  .  .  
-           00 00 00 10 
-        // parsed:, offset 201, len 2, h: max_stack: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 203, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 205, len 4, h: code_length: 00000004
-        // .  .  .  .  
-           00 00 00 04 
-        // parsed:, offset 0, len 1, h: 0000: nop
-        // .  
-           00 
-        // parsed:, offset 1, len 1, h: 0001: nop
-        // .  
-//@mod           00 
-           ca 
-        // parsed:, offset 2, len 1, h: 0002: nop
-        // .  
-           00 
-        // parsed:, offset 3, len 1, h: 0003: return
-        // .  
-           b1 
-        // parsed:, offset 213, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 215, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 217, len 0, h: end attributes[0] 
-// parsed:, offset 217, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()V
-// parsed:, offset 217, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 219, len 0, h:  attributes[0]: 
-    // parsed:, offset 219, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 221, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 225, len 2, h: source: utf8{"T_t481_4_3.java"}
-    // .  .  
-       00 07 
-// parsed:, offset 227, len 0, h: end attributes[0] 
-// parsed:, offset 227, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_3.j b/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_3.j
deleted file mode 100644
index 06cb586..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_3.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_t481_4_3.java
-.class public dxc/junit/verify/t481_4/jm/T_t481_4_3
-.super java/lang/Object
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-.end method
-
-
-
-.method public run()V
-    .limit stack 0
-    .limit locals 1
-    
-    nop
-    nop
-    nop
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_3.java b/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_3.java
deleted file mode 100644
index bd9df26..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_3.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t481_4.jm;
-
-public class T_t481_4_3{
-    public void run(){
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_4.cfh b/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_4.cfh
deleted file mode 100644
index 6b94100..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_4.cfh
+++ /dev/null
@@ -1,185 +0,0 @@
-//@class:dxc/junit/verify/t481_4/jm/T_t481_4_4
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000d
-// .  .  
-   00 0d 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0c 00 07 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 40, h: 0003: utf8{"dxc/junit/verify/t481_4/jm/T_t481_4_4"}
-    // .  .  %  d  x  c  /  j  u  n  i  t  /  v  e  r  i  f  y  /  t  4  8  1  _  4  /  j  m  /  T  _  t  4  8  1  _  4  _  4  
-       01 00 25 64 78 63 2f 6a 75 6e 69 74 2f 76 65 72 69 66 79 2f 74 34 38 31 5f 34 2f 6a 6d 2f 54 5f 74 34 38 31 5f 34 5f 34 
-    // parsed:, offset 74, len 13, h: 0004: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 87, len 9, h: 0005: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 96, len 6, h: 0006: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 102, len 5, h: 0007: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 05 00 0b 
-    // parsed:, offset 107, len 7, h: 0008: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 114, len 3, h: 0009: type{dxc.junit.verify.t481_4.jm.T_t481_4_4}
-    // .  .  .  
-       07 00 03 
-    // parsed:, offset 117, len 18, h: 000a: utf8{"T_t481_4_4.java"}
-    // .  .  .  T  _  t  4  8  1  _  4  _  4  .  j  a  v  a  
-       01 00 0f 54 5f 74 34 38 31 5f 34 5f 34 2e 6a 61 76 61 
-    // parsed:, offset 135, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 141, len 3, h: 000c: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 144, len 0, h: end constant_pool
-// parsed:, offset 144, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 146, len 2, h: this_class: type{dxc.junit.verify.t481_4.jm.T_t481_4_4}
-// .  .  
-   00 09 
-// parsed:, offset 148, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0c 
-// parsed:, offset 150, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 152, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 154, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 156, len:71,desc: ()V
-// parsed:, offset 156, len 0, h:  methods[0]: 
-    // parsed:, offset 156, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 158, len 2, h: name: <init>
-    // .  .  
-       00 05 
-    // parsed:, offset 160, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 162, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 164, len 0, h:  attributes[0]: 
-        // parsed:, offset 164, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 166, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 170, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 172, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 174, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 183, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 185, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 187, len 0, h: end attributes[0] 
-// parsed:, offset 187, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 187, len:40,desc: ()V
-// parsed:, offset 187, len 0, h:  methods[1]: 
-    // parsed:, offset 187, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 189, len 2, h: name: run
-    // .  .  
-       00 06 
-    // parsed:, offset 191, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 193, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 195, len 0, h:  attributes[0]: 
-        // parsed:, offset 195, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 197, len 4, h: length: 00000010
-        // .  .  .  .  
-           00 00 00 10 
-        // parsed:, offset 201, len 2, h: max_stack: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 203, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 205, len 4, h: code_length: 00000004
-        // .  .  .  .  
-           00 00 00 04 
-        // parsed:, offset 0, len 1, h: 0000: nop
-        // .  
-           00 
-        // parsed:, offset 1, len 1, h: 0001: nop
-        // .  
-//@mod           00 
-           f0 
-        // parsed:, offset 2, len 1, h: 0002: nop
-        // .  
-           00 
-        // parsed:, offset 3, len 1, h: 0003: return
-        // .  
-           b1 
-        // parsed:, offset 213, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 215, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 217, len 0, h: end attributes[0] 
-// parsed:, offset 217, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()V
-// parsed:, offset 217, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 219, len 0, h:  attributes[0]: 
-    // parsed:, offset 219, len 2, h: name: SourceFile
-    // .  .  
-       00 04 
-    // parsed:, offset 221, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 225, len 2, h: source: utf8{"T_t481_4_4.java"}
-    // .  .  
-       00 0a 
-// parsed:, offset 227, len 0, h: end attributes[0] 
-// parsed:, offset 227, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_4.j b/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_4.j
deleted file mode 100644
index 07e8168..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_4.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_t481_4_4.java
-.class public dxc/junit/verify/t481_4/jm/T_t481_4_4
-.super java/lang/Object
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-.end method
-
-
-
-.method public run()V
-    .limit stack 0
-    .limit locals 1
-    
-    nop
-    nop
-    nop
-    
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_4.java b/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_4.java
deleted file mode 100644
index 17fed6f..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t481_4/jm/T_t481_4_4.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t481_4.jm;
-
-public class T_t481_4_4{
-    public void run(){
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t481_6/Test_t481_6.java b/tools/dx-tests/src/dxc/junit/verify/t481_6/Test_t481_6.java
deleted file mode 100644
index 7dec5bd..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t481_6/Test_t481_6.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t481_6;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-
-/**
- * 
- */
-public class Test_t481_6 extends DxTestCase {
-
-    /**
-     * @constraint 4.8.1.6
-     * @title Last opcode instruction shall be at offset code_length -1.
-     * The idea of the test is to put invalid opcode at offset code_length -1.
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.verify.t481_6.jm.T_t481_6_1");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t481_6/jm/T_t481_6_1.cfh b/tools/dx-tests/src/dxc/junit/verify/t481_6/jm/T_t481_6_1.cfh
deleted file mode 100644
index 188b796..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t481_6/jm/T_t481_6_1.cfh
+++ /dev/null
@@ -1,185 +0,0 @@
-//@class:dxc/junit/verify/t481_6/jm/T_t481_6_1
-// parsed:, offset 0, len 0, h: begin classfile
-// parsed:, offset 0, len 4, h: magic: cafebabe
-// .  .  .  .  
-   ca fe ba be 
-// parsed:, offset 4, len 2, h: minor_version: 0003
-// .  .  
-   00 03 
-// parsed:, offset 6, len 2, h: major_version: 002d
-// .  -  
-   00 2d 
-// parsed:, offset 8, len 2, h: constant_pool_count: 000d
-// .  .  
-   00 0d 
-// parsed:, offset 10, len 0, h:  constant_pool:
-    // parsed:, offset 10, len 5, h: 0001: method{java.lang.Object.<init>:()V}
-    // .  .  .  .  .  
-       0a 00 0c 00 06 
-    // parsed:, offset 15, len 19, h: 0002: utf8{"java/lang/Object"}
-    // .  .  .  j  a  v  a  /  l  a  n  g  /  O  b  j  e  c  t  
-       01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 
-    // parsed:, offset 34, len 13, h: 0003: utf8{"SourceFile"}
-    // .  .  .  S  o  u  r  c  e  F  i  l  e  
-       01 00 0a 53 6f 75 72 63 65 46 69 6c 65 
-    // parsed:, offset 47, len 9, h: 0004: utf8{"<init>"}
-    // .  .  .  <  i  n  i  t  >  
-       01 00 06 3c 69 6e 69 74 3e 
-    // parsed:, offset 56, len 6, h: 0005: utf8{"run"}
-    // .  .  .  r  u  n  
-       01 00 03 72 75 6e 
-    // parsed:, offset 62, len 5, h: 0006: nat{<init>:()V}
-    // .  .  .  .  .  
-       0c 00 04 00 0b 
-    // parsed:, offset 67, len 18, h: 0007: utf8{"T_t481_6_1.java"}
-    // .  .  .  T  _  t  4  8  1  _  6  _  1  .  j  a  v  a  
-       01 00 0f 54 5f 74 34 38 31 5f 36 5f 31 2e 6a 61 76 61 
-    // parsed:, offset 85, len 7, h: 0008: utf8{"Code"}
-    // .  .  .  C  o  d  e  
-       01 00 04 43 6f 64 65 
-    // parsed:, offset 92, len 40, h: 0009: utf8{"dxc/junit/verify/t481_6/jm/T_t481_6_1"}
-    // .  .  %  d  x  c  /  j  u  n  i  t  /  v  e  r  i  f  y  /  t  4  8  1  _  6  /  j  m  /  T  _  t  4  8  1  _  6  _  1  
-       01 00 25 64 78 63 2f 6a 75 6e 69 74 2f 76 65 72 69 66 79 2f 74 34 38 31 5f 36 2f 6a 6d 2f 54 5f 74 34 38 31 5f 36 5f 31 
-    // parsed:, offset 132, len 3, h: 000a: type{dxc.junit.verify.t481_6.jm.T_t481_6_1}
-    // .  .  .  
-       07 00 09 
-    // parsed:, offset 135, len 6, h: 000b: utf8{"()V"}
-    // .  .  .  (  )  V  
-       01 00 03 28 29 56 
-    // parsed:, offset 141, len 3, h: 000c: type{java.lang.Object}
-    // .  .  .  
-       07 00 02 
-// parsed:, offset 144, len 0, h: end constant_pool
-// parsed:, offset 144, len 2, h: access_flags: public|super
-// .  !  
-   00 21 
-// parsed:, offset 146, len 2, h: this_class: type{dxc.junit.verify.t481_6.jm.T_t481_6_1}
-// .  .  
-   00 0a 
-// parsed:, offset 148, len 2, h: super_class: type{java.lang.Object}
-// .  .  
-   00 0c 
-// parsed:, offset 150, len 2, h: interfaces_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 152, len 2, h: fields_count: 0000
-// .  .  
-   00 00 
-// parsed:, offset 154, len 2, h: methods_count: 0002
-// .  .  
-   00 02 
-// ========== start-ParseMember:<init>, offset 156, len:71,desc: ()V
-// parsed:, offset 156, len 0, h:  methods[0]: 
-    // parsed:, offset 156, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 158, len 2, h: name: <init>
-    // .  .  
-       00 04 
-    // parsed:, offset 160, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 162, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 164, len 0, h:  attributes[0]: 
-        // parsed:, offset 164, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 166, len 4, h: length: 00000011
-        // .  .  .  .  
-           00 00 00 11 
-        // parsed:, offset 170, len 2, h: max_stack: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 172, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 174, len 4, h: code_length: 00000005
-        // .  .  .  .  
-           00 00 00 05 
-        // parsed:, offset 0, len 1, h: 0000: aload_0 // 00
-        // *  
-           2a 
-        // parsed:, offset 1, len 3, h: 0001: invokespecial method{java.lang.Object.<init>:()V}
-        // .  .  .  
-           b7 00 01 
-        // parsed:, offset 4, len 1, h: 0004: return
-        // .  
-           b1 
-        // parsed:, offset 183, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 185, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 187, len 0, h: end attributes[0] 
-// parsed:, offset 187, len 0, h: end methods[0] 
-// ========== end-ParseMember:<init>, desc: ()V
-// ========== start-ParseMember:run, offset 187, len:40,desc: ()V
-// parsed:, offset 187, len 0, h:  methods[1]: 
-    // parsed:, offset 187, len 2, h: access_flags: public
-    // .  .  
-       00 01 
-    // parsed:, offset 189, len 2, h: name: run
-    // .  .  
-       00 05 
-    // parsed:, offset 191, len 2, h: descriptor: ()V
-    // .  .  
-       00 0b 
-    // parsed:, offset 193, len 2, h: attributes_count: 0001
-    // .  .  
-       00 01 
-    // parsed:, offset 195, len 0, h:  attributes[0]: 
-        // parsed:, offset 195, len 2, h: name: Code
-        // .  .  
-           00 08 
-        // parsed:, offset 197, len 4, h: length: 00000010
-        // .  .  .  .  
-           00 00 00 10 
-        // parsed:, offset 201, len 2, h: max_stack: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 203, len 2, h: max_locals: 0001
-        // .  .  
-           00 01 
-        // parsed:, offset 205, len 4, h: code_length: 00000004
-        // .  .  .  .  
-           00 00 00 04 
-        // parsed:, offset 0, len 1, h: 0000: nop
-        // .  
-           00 
-        // parsed:, offset 1, len 1, h: 0001: nop
-        // .  
-           00 
-        // parsed:, offset 2, len 1, h: 0002: return
-        // .  
-           b1 
-        // parsed:, offset 3, len 1, h: 0003: nop
-        // .  
-//@mod           00 
-           ff 
-        // parsed:, offset 213, len 2, h: exception_table_length: 0000
-        // .  .  
-           00 00 
-        // parsed:, offset 215, len 2, h: attributes_count: 0000
-        // .  .  
-           00 00 
-    // parsed:, offset 217, len 0, h: end attributes[0] 
-// parsed:, offset 217, len 0, h: end methods[1] 
-// ========== end-ParseMember:run, desc: ()V
-// parsed:, offset 217, len 2, h: attributes_count: 0001
-// .  .  
-   00 01 
-// parsed:, offset 219, len 0, h:  attributes[0]: 
-    // parsed:, offset 219, len 2, h: name: SourceFile
-    // .  .  
-       00 03 
-    // parsed:, offset 221, len 4, h: length: 00000002
-    // .  .  .  .  
-       00 00 00 02 
-    // parsed:, offset 225, len 2, h: source: utf8{"T_t481_6_1.java"}
-    // .  .  
-       00 07 
-// parsed:, offset 227, len 0, h: end attributes[0] 
-// parsed:, offset 227, len 0, h: end classfile
diff --git a/tools/dx-tests/src/dxc/junit/verify/t481_6/jm/T_t481_6_1.j b/tools/dx-tests/src/dxc/junit/verify/t481_6/jm/T_t481_6_1.j
deleted file mode 100644
index 1635755..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t481_6/jm/T_t481_6_1.j
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_t481_6_1.java
-.class public dxc/junit/verify/t481_6/jm/T_t481_6_1
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()V
-    .limit stack 0
-    .limit locals 1
-    
-    nop
-    nop
-    return
-    nop
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/verify/t481_6/jm/T_t481_6_1.java b/tools/dx-tests/src/dxc/junit/verify/t481_6/jm/T_t481_6_1.java
deleted file mode 100644
index 0a119d7..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t481_6/jm/T_t481_6_1.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t481_6.jm;
-
-public class T_t481_6_1{
-    public void run(){
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_10/Test_t482_10.java b/tools/dx-tests/src/dxc/junit/verify/t482_10/Test_t482_10.java
deleted file mode 100644
index 8e1fa15..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_10/Test_t482_10.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t482_10;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-
-/**
- * 
- */
-public class Test_t482_10 extends DxTestCase {
-    /**
-     * @constraint 4.8.2.10
-     * @title Uninitialized local variable
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.verify.t482_10.jm.T_t482_10_1");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.10
-     * @title Uninitialized local variable
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.verify.t482_10.jm.T_t482_10_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_10/jm/T_t482_10_1.j b/tools/dx-tests/src/dxc/junit/verify/t482_10/jm/T_t482_10_1.j
deleted file mode 100644
index 6abfdb5..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_10/jm/T_t482_10_1.j
+++ /dev/null
@@ -1,92 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_t482_10_1.java
-.class public dxc/junit/verify/t482_10/jm/T_t482_10_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-.end method
-
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 5
-
-;    iconst_2
-;    newarray int
-;    astore_1
-
-    iconst_1
-    istore_2
-
-Label8:
-    iconst_3
-    newarray int
-    astore_1
-
-    iload_2
-    iconst_1
-    if_icmpne Label0
-
-    new java/lang/Exception
-    dup
-    invokespecial java/lang/Exception/<init>()V
-    athrow
-
-Label13:
-    goto Label0
-
-Label14:
-    astore_3
-
-Label10:
-    aload_1
-    iconst_0
-    iaload
-    istore_2
-
-Label11:
-    goto Label2
-
-Label16:
-    astore 4
-
-    iconst_1
-    istore_2
-
-    aload 4
-    athrow
-
-Label0:
-    iconst_1
-    istore_2
-
-    goto Label3
-
-Label2:
-    iconst_1
-    istore_2
-
-Label3:
-    return
-
-.catch java/lang/Exception from Label8 to Label13 using Label14
-.catch all from Label8 to Label16 using Label16
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_10/jm/T_t482_10_1.java b/tools/dx-tests/src/dxc/junit/verify/t482_10/jm/T_t482_10_1.java
deleted file mode 100644
index 38933b2..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_10/jm/T_t482_10_1.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t482_10.jm;
-
-public class T_t482_10_1 {
-    
-    public void run(){
-        
-        int arr[];
-        arr = new int[2];
-        int f = 1;
-        
-        try{
-            arr = new int[3];
-            if(f == 1)
-                throw new Exception();
-            
-        }catch(Exception e){
-            f = arr[0];
-        }
-        finally {
-            f = 1;
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_10/jm/T_t482_10_2.j b/tools/dx-tests/src/dxc/junit/verify/t482_10/jm/T_t482_10_2.j
deleted file mode 100644
index c8c7b32..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_10/jm/T_t482_10_2.j
+++ /dev/null
@@ -1,54 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_t482_10_2.java
-.class public dxc/junit/verify/t482_10/jm/T_t482_10_2
-.super java/lang/Object
-
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-.method public run()V
-    .limit stack 6
-    .limit locals 2
-
-    iconst_1
-    istore_1
-
-    new java/lang/Object
-    dup
-    invokespecial java/lang/Object/<init>()V
-
-Label1:        
-
-    invokevirtual java/lang/Object/getClass()Ljava/lang/Class;
-    pop
-
-Label3:
-    new java/lang/Object
-
-      iinc 1 1
-      iload_1
-      sipush 10
-      if_icmpne Label1
-
-    return
-
-.end method
-
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_10/jm/T_t482_10_2.java b/tools/dx-tests/src/dxc/junit/verify/t482_10/jm/T_t482_10_2.java
deleted file mode 100644
index 5c3fa5b..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_10/jm/T_t482_10_2.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t482_10.jm;
-
-public class T_t482_10_2 {
-    
-    public void run(){
-        
-        Object o = new Object();
-        o.getClass();
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_11/Test_t482_11.java b/tools/dx-tests/src/dxc/junit/verify/t482_11/Test_t482_11.java
deleted file mode 100644
index 75b8bf1..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_11/Test_t482_11.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t482_11;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-import dxc.junit.verify.t482_11.jm.T_t482_11_2;
-
-/**
- * 
- */
-public class Test_t482_11 extends DxTestCase {
-
-    /**
-     * @constraint 4.8.2.11
-     * @title  instance fields declared in the class may be accessed before
-     * calling <init>
-     */
-    public void testN1() {
-        // @uses dxc.junit.verify.t482_11.jm.TSuper
-        T_t482_11_2 t = new T_t482_11_2();
-        assertEquals(11, t.v);
-    }
-
-    /**
-     * @constraint 4.8.2.11
-     * @title  super.<init> or another <init> must be called
-     */
-    public void testVFE1() {
-        // @uses dxc.junit.verify.t482_11.jm.TSuper
-        try {
-            Class.forName("dxc.junit.verify.t482_11.jm.T_t482_11_1");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.11
-     * @title only instance fields declared in the class may be accessed
-     * before calling <init>
-     */
-    public void testVFE2() {
-        // @uses dxc.junit.verify.t482_11.jm.TSuper
-        try {
-            Class.forName("dxc.junit.verify.t482_11.jm.T_t482_11_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_11/jm/TSuper.java b/tools/dx-tests/src/dxc/junit/verify/t482_11/jm/TSuper.java
deleted file mode 100644
index 2b3641b..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_11/jm/TSuper.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t482_11.jm;
-
-public class TSuper {
-    public int s;
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_11/jm/T_t482_11_1.j b/tools/dx-tests/src/dxc/junit/verify/t482_11/jm/T_t482_11_1.j
deleted file mode 100644
index c773656..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_11/jm/T_t482_11_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_t482_11_1.java
-.class public dxc/junit/verify/t482_11/jm/T_t482_11_1
-.super dxc/junit/verify/t482_11/jm/TSuper
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-
-;    aload_0
-;    invokespecial dxc/junit/verify/t482_11/jm/TSuper/<init>()V
-
-    return
-.end method
-
-
-
-.method public run()V
-    .limit stack 0
-    .limit locals 1
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_11/jm/T_t482_11_1.java b/tools/dx-tests/src/dxc/junit/verify/t482_11/jm/T_t482_11_1.java
deleted file mode 100644
index 7262049..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_11/jm/T_t482_11_1.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t482_11.jm;
-
-public class T_t482_11_1 extends TSuper{
-    public void run(){
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_11/jm/T_t482_11_2.j b/tools/dx-tests/src/dxc/junit/verify/t482_11/jm/T_t482_11_2.j
deleted file mode 100644
index 78b1d64..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_11/jm/T_t482_11_2.j
+++ /dev/null
@@ -1,55 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_t482_11_2.java
-.class public dxc/junit/verify/t482_11/jm/T_t482_11_2
-.super dxc/junit/verify/t482_11/jm/TSuper
-
-.field public v I
-
-.method public <init>()V
-    .limit stack 2
-    .limit locals 1
-
-    aload_0
-    sipush 11
-    invokespecial dxc/junit/verify/t482_11/jm/T_t482_11_2/<init>(I)V
-
-    return
-.end method
-
-
-.method  <init>(I)V
-    .limit stack 2
-    .limit locals 2
-    
-    aload_0
-    iload_1
-    putfield dxc/junit/verify/t482_11/jm/T_t482_11_2/v I
-    
-    aload_0
-    invokespecial dxc/junit/verify/t482_11/jm/TSuper/<init>()V
-
-    return
-.end method
-
-
-
-.method public run()V
-    .limit stack 0
-    .limit locals 1
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_11/jm/T_t482_11_2.java b/tools/dx-tests/src/dxc/junit/verify/t482_11/jm/T_t482_11_2.java
deleted file mode 100644
index 4d0920a..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_11/jm/T_t482_11_2.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t482_11.jm;
-
-public class T_t482_11_2 extends TSuper{
-    public int v;
-    
-    public T_t482_11_2(){
-        this(11);
-    }
-    
-    T_t482_11_2(int i){
-        v = i;
-    }
-    
-    public void run(){
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_11/jm/T_t482_11_3.j b/tools/dx-tests/src/dxc/junit/verify/t482_11/jm/T_t482_11_3.j
deleted file mode 100644
index a25f0bf..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_11/jm/T_t482_11_3.j
+++ /dev/null
@@ -1,55 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_t482_11_3.java
-.class public dxc/junit/verify/t482_11/jm/T_t482_11_3
-.super dxc/junit/verify/t482_11/jm/TSuper
-
-.field public v I
-
-.method public <init>()V
-    .limit stack 2
-    .limit locals 1
-
-    aload_0
-    sipush 11
-    invokespecial dxc/junit/verify/t482_11/jm/T_t482_11_3/<init>(I)V
-
-    return
-.end method
-
-
-.method  <init>(I)V
-    .limit stack 2
-    .limit locals 2
-
-    aload_0
-    iload_1
-    putfield dxc/junit/verify/t482_11/jm/T_t482_11_3/s I
-    
-    aload_0
-    invokespecial dxc/junit/verify/t482_11/jm/TSuper/<init>()V
-
-    return
-.end method
-
-
-
-.method public run()V
-    .limit stack 0
-    .limit locals 1
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_11/jm/T_t482_11_3.java b/tools/dx-tests/src/dxc/junit/verify/t482_11/jm/T_t482_11_3.java
deleted file mode 100644
index 64acc18..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_11/jm/T_t482_11_3.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t482_11.jm;
-
-public class T_t482_11_3 extends TSuper{
-    public int v;
-    
-    public T_t482_11_3(){
-        this(11);
-    }
-    
-    T_t482_11_3(int i){
-        s = i;
-    }
-    
-    public void run(){
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_14/Test_t482_14.java b/tools/dx-tests/src/dxc/junit/verify/t482_14/Test_t482_14.java
deleted file mode 100644
index 501b2ee..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_14/Test_t482_14.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t482_14;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-
-/**
- * 
- */
-public class Test_t482_14 extends DxTestCase {
-    /**
-     * @constraint 4.8.2.14
-     * @title <init> may not return a value
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.verify.t482_14.jm.T_t482_14_1");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.14
-     * @title <clinit> may not return a value
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.verify.t482_14.jm.T_t482_14_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_14/jm/T_t482_14_1.j b/tools/dx-tests/src/dxc/junit/verify/t482_14/jm/T_t482_14_1.j
deleted file mode 100644
index 335dfa3..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_14/jm/T_t482_14_1.j
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_t482_14_1.java
-.class public dxc/junit/verify/t482_14/jm/T_t482_14_1
-.super java/lang/Object
-
-.field  v I
-
-.method public <init>()I
-    .limit stack 2
-    .limit locals 1
-    
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    aload_0
-    iconst_0
-    putfield dxc.junit.verify.t482_14.jm.T_t482_14_1.v I
-    
-    iconst_1
-    ireturn
-
-.end method
-
-.method public run()V
-    .limit stack 0
-    .limit locals 1
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_14/jm/T_t482_14_1.java b/tools/dx-tests/src/dxc/junit/verify/t482_14/jm/T_t482_14_1.java
deleted file mode 100644
index 94afb9f..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_14/jm/T_t482_14_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t482_14.jm;
-
-public class T_t482_14_1 {
-    int v = 0;
-
-    public void run(){
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_14/jm/T_t482_14_2.j b/tools/dx-tests/src/dxc/junit/verify/t482_14/jm/T_t482_14_2.j
deleted file mode 100644
index 49124fb..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_14/jm/T_t482_14_2.j
+++ /dev/null
@@ -1,56 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_t482_14_2.java
-.class public dxc/junit/verify/t482_14/jm/T_t482_14_2
-.super java/lang/Object
-
-.field static v I
-
-
-.method static <clinit>()I
-    .limit stack 1
-    .limit locals 0
-
-    
-    iconst_0
-    putstatic dxc.junit.verify.t482_14.jm.T_t482_14_2.v I
-
-    iconst_1
-    ireturn
-
-.end method
-
-
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-
-.method public run()V
-    .limit stack 0
-    .limit locals 1
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_14/jm/T_t482_14_2.java b/tools/dx-tests/src/dxc/junit/verify/t482_14/jm/T_t482_14_2.java
deleted file mode 100644
index 7ca5de2..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_14/jm/T_t482_14_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t482_14.jm;
-
-public class T_t482_14_2 {
-    static int v = 0;
-
-    public void run(){
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_2/Test_t482_2.java b/tools/dx-tests/src/dxc/junit/verify/t482_2/Test_t482_2.java
deleted file mode 100644
index fb6406a..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_2/Test_t482_2.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t482_2;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-
-/**
- * 
- */
-public class Test_t482_2 extends DxTestCase {
-
-    /**
-     * @constraint 4.8.2.2
-     * @title operand stack depth
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.verify.t482_2.jm.T_t482_2_1");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_2/jm/T_t482_2_1.j b/tools/dx-tests/src/dxc/junit/verify/t482_2/jm/T_t482_2_1.j
deleted file mode 100644
index c180dd8..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_2/jm/T_t482_2_1.j
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_t482_2_1.java
-.class public dxc/junit/verify/t482_2/jm/T_t482_2_1
-.super java/lang/Object
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-
-.end method
-
-
-
-.method public run(I)I
-    .limit stack 3
-    .limit locals 2
-    
-    iload_1
-    ifne Label1
-    iconst_1
-    
-Label1:
-    iconst_2
-    iconst_3
-    iadd    
-
-    ireturn
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_2/jm/T_t482_2_1.java b/tools/dx-tests/src/dxc/junit/verify/t482_2/jm/T_t482_2_1.java
deleted file mode 100644
index 8f5146b..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_2/jm/T_t482_2_1.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t482_2.jm;
-
-public class T_t482_2_1{
-    public void run(){
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_20/Test_t482_20.java b/tools/dx-tests/src/dxc/junit/verify/t482_20/Test_t482_20.java
deleted file mode 100644
index 963bb0f..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_20/Test_t482_20.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t482_20;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-
-/**
- * 
- */
-public class Test_t482_20 extends DxTestCase {
-    /**
-     * @constraint 4.8.2.20
-     * @title no return instruction in the method
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.verify.t482_20.jm.T_t482_20_1");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_20/jm/T_t482_20_1.j b/tools/dx-tests/src/dxc/junit/verify/t482_20/jm/T_t482_20_1.j
deleted file mode 100644
index f803fbd..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_20/jm/T_t482_20_1.j
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_t482_20_1.java
-.class public dxc/junit/verify/t482_20/jm/T_t482_20_1
-.super java/lang/Object
-
-.method public <init>()V
-    .limit stack 1
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-.end method
-
-
-
-.method public run()V
-    .limit stack 1
-    .limit locals 1
-
-    iconst_1
-    pop
-    
-;    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_20/jm/T_t482_20_1.java b/tools/dx-tests/src/dxc/junit/verify/t482_20/jm/T_t482_20_1.java
deleted file mode 100644
index 6e16f99..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_20/jm/T_t482_20_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t482_20.jm;
-
-public class T_t482_20_1 {
-    
-    public void run(){
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_3/Test_t482_3.java b/tools/dx-tests/src/dxc/junit/verify/t482_3/Test_t482_3.java
deleted file mode 100644
index af89d34..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_3/Test_t482_3.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t482_3;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-
-/**
- * 
- */
-public class Test_t482_3 extends DxTestCase {
-    /**
-     * @constraint 4.8.2.3
-     * @title attempt to split long
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.verify.t482_3.jm.T_t482_3_1");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.3
-     * @title attempt to split double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.verify.t482_3.jm.T_t482_3_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_3/jm/T_t482_3_1.j b/tools/dx-tests/src/dxc/junit/verify/t482_3/jm/T_t482_3_1.j
deleted file mode 100644
index 202e692..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_3/jm/T_t482_3_1.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_t482_3_1.java
-.class public dxc/junit/verify/t482_3/jm/T_t482_3_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 3
-
-    ldc2_w 123
-    lstore_1
-    
-    iload_1
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_3/jm/T_t482_3_1.java b/tools/dx-tests/src/dxc/junit/verify/t482_3/jm/T_t482_3_1.java
deleted file mode 100644
index f61df7e..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_3/jm/T_t482_3_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t482_3.jm;
-
-public class T_t482_3_1 {
-    public void run(){
-        long a = 123;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_3/jm/T_t482_3_2.j b/tools/dx-tests/src/dxc/junit/verify/t482_3/jm/T_t482_3_2.j
deleted file mode 100644
index 08920f0..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_3/jm/T_t482_3_2.j
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_t482_3_2.java
-.class public dxc/junit/verify/t482_3/jm/T_t482_3_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 3
-
-    ldc2_w 123.0
-    dstore_1
-    
-    fload_2
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_3/jm/T_t482_3_2.java b/tools/dx-tests/src/dxc/junit/verify/t482_3/jm/T_t482_3_2.java
deleted file mode 100644
index a3be92e..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_3/jm/T_t482_3_2.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t482_3.jm;
-
-public class T_t482_3_2 {
-    public void run(){
-        double a = 123.0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_4/Test_t482_4.java b/tools/dx-tests/src/dxc/junit/verify/t482_4/Test_t482_4.java
deleted file mode 100644
index 68f8c7e..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_4/Test_t482_4.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t482_4;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-
-/**
- * 
- */
-public class Test_t482_4 extends DxTestCase {
-    /**
-     * @constraint 4.8.2.4
-     * @title attempt to access uninitialized int
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.verify.t482_4.jm.T_t482_4_1");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.4
-     * @title attempt to access uninitialized double
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.verify.t482_4.jm.T_t482_4_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.4
-     * @title attempt to access uninitialized reference
-     */
-    public void testVFE3() {
-        try {
-            Class.forName("dxc.junit.verify.t482_4.jm.T_t482_4_3");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_4/jm/T_t482_4_1.j b/tools/dx-tests/src/dxc/junit/verify/t482_4/jm/T_t482_4_1.j
deleted file mode 100644
index 1c0bb5e..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_4/jm/T_t482_4_1.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_t482_4_1.java
-.class public dxc/junit/verify/t482_4/jm/T_t482_4_1
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 3
-
-    iload_1
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_4/jm/T_t482_4_1.java b/tools/dx-tests/src/dxc/junit/verify/t482_4/jm/T_t482_4_1.java
deleted file mode 100644
index 82d41c4..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_4/jm/T_t482_4_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t482_4.jm;
-
-public class T_t482_4_1 {
-    public void run(){
-        long a = 123;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_4/jm/T_t482_4_2.j b/tools/dx-tests/src/dxc/junit/verify/t482_4/jm/T_t482_4_2.j
deleted file mode 100644
index 969c69e..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_4/jm/T_t482_4_2.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_t482_4_2.java
-.class public dxc/junit/verify/t482_4/jm/T_t482_4_2
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 3
-
-    dload_1
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_4/jm/T_t482_4_2.java b/tools/dx-tests/src/dxc/junit/verify/t482_4/jm/T_t482_4_2.java
deleted file mode 100644
index 8683f50..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_4/jm/T_t482_4_2.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t482_4.jm;
-
-public class T_t482_4_2 {
-    public void run(){
-        double a = 123.0;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_4/jm/T_t482_4_3.j b/tools/dx-tests/src/dxc/junit/verify/t482_4/jm/T_t482_4_3.j
deleted file mode 100644
index 3f7c2ce..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_4/jm/T_t482_4_3.j
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_t482_4_3.java
-.class public dxc/junit/verify/t482_4/jm/T_t482_4_3
-.super java/lang/Object
-
-.method public <init>()V
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-    return
-.end method
-
-
-
-.method public run()V
-    .limit stack 2
-    .limit locals 3
-
-    aload_1
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_4/jm/T_t482_4_3.java b/tools/dx-tests/src/dxc/junit/verify/t482_4/jm/T_t482_4_3.java
deleted file mode 100644
index d7aa2ae..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_4/jm/T_t482_4_3.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t482_4.jm;
-
-public class T_t482_4_3 {
-    public void run(){
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_8/Test_t482_8.java b/tools/dx-tests/src/dxc/junit/verify/t482_8/Test_t482_8.java
deleted file mode 100644
index 2f61e6c..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_8/Test_t482_8.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t482_8;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-
-/**
- * 
- */
-public class Test_t482_8 extends DxTestCase {
-    /**
-     * @constraint 4.8.2.8
-     * @title uninitialized class instance must be on the stack
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.verify.t482_8.jm.T_t482_8_1");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.8
-     * @title attempt to initialize initialized class
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.verify.t482_8.jm.T_t482_8_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_8/jm/T_t482_8_1.j b/tools/dx-tests/src/dxc/junit/verify/t482_8/jm/T_t482_8_1.j
deleted file mode 100644
index c52c248..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_8/jm/T_t482_8_1.j
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_t482_8_1.java
-.class public dxc/junit/verify/t482_8/jm/T_t482_8_1
-.super java/lang/Object
-
-
-.method  <init>(I)V
-    .limit stack 1
-    .limit locals 2
-
-;    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    return
-
-.end method
-
-
-
-.method public run()V
-    .limit stack 3
-    .limit locals 2
-
-    new dxc/junit/verify/t482_8/jm/T_t482_8_1
-    dup
-    iconst_1
-    invokespecial dxc/junit/verify/t482_8/jm/T_t482_8_1/<init>(I)V
-    astore_1
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_8/jm/T_t482_8_1.java b/tools/dx-tests/src/dxc/junit/verify/t482_8/jm/T_t482_8_1.java
deleted file mode 100644
index 5f658cf..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_8/jm/T_t482_8_1.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t482_8.jm;
-
-public class T_t482_8_1 {
-    T_t482_8_1(int a){
-        
-    }
-    
-    public void run(){
-        T_t482_8_1 t = new T_t482_8_1(1);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_8/jm/T_t482_8_2.j b/tools/dx-tests/src/dxc/junit/verify/t482_8/jm/T_t482_8_2.j
deleted file mode 100644
index 8b89868..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_8/jm/T_t482_8_2.j
+++ /dev/null
@@ -1,49 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_t482_8_2.java
-.class public dxc/junit/verify/t482_8/jm/T_t482_8_2
-.super java/lang/Object
-
-
-.method  <init>(I)V
-    .limit stack 1
-    .limit locals 2
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-
-    return
-
-.end method
-
-
-
-.method public run()V
-    .limit stack 3
-    .limit locals 2
-
-    new dxc/junit/verify/t482_8/jm/T_t482_8_1
-    dup
-    iconst_1
-    invokespecial dxc/junit/verify/t482_8/jm/T_t482_8_1/<init>(I)V
-    astore_1
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_8/jm/T_t482_8_2.java b/tools/dx-tests/src/dxc/junit/verify/t482_8/jm/T_t482_8_2.java
deleted file mode 100644
index e14959a..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_8/jm/T_t482_8_2.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t482_8.jm;
-
-public class T_t482_8_2 {
-    T_t482_8_2(int a){
-        
-    }
-    
-    public void run(){
-        T_t482_8_2 t = new T_t482_8_2(1);
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_9/Test_t482_9.java b/tools/dx-tests/src/dxc/junit/verify/t482_9/Test_t482_9.java
deleted file mode 100644
index 949b772..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_9/Test_t482_9.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t482_9;
-
-import dxc.junit.DxTestCase;
-import dxc.junit.DxUtil;
-
-/**
- * 
- */
-public class Test_t482_9 extends DxTestCase {
-    /**
-     * @constraint 4.8.2.9
-     * @title attempt to access field of uninitialized class instance
-     */
-    public void testVFE1() {
-        try {
-            Class.forName("dxc.junit.verify.t482_9.jm.T_t482_9_1");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     * @constraint 4.8.2.9
-     * @title attempt to use method of uninitialized class instance
-     */
-    public void testVFE2() {
-        try {
-            Class.forName("dxc.junit.verify.t482_9.jm.T_t482_9_2");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_9/jm/T_t482_9_1.j b/tools/dx-tests/src/dxc/junit/verify/t482_9/jm/T_t482_9_1.j
deleted file mode 100644
index ad10f28..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_9/jm/T_t482_9_1.j
+++ /dev/null
@@ -1,50 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_t482_9_1.java
-.class public dxc/junit/verify/t482_9/jm/T_t482_9_1
-.super java/lang/Object
-
-.field  v I
-
-.method public <init>()V
-    .limit stack 2
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    aload_0
-    iconst_0
-    putfield dxc.junit.verify.t482_9.jm.T_t482_9_1.v I
-
-    return
-
-.end method
-
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 1
-
-    new dxc/junit/verify/t482_9/jm/T_t482_9_1
-;    dup
-;    invokespecial dxc/junit/verify/t482_9/jm/T_t482_9_1/<init>()V
-
-    iconst_1
-    putfield dxc.junit.verify.t482_9.jm.T_t482_9_1.v I
-
-    return
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_9/jm/T_t482_9_1.java b/tools/dx-tests/src/dxc/junit/verify/t482_9/jm/T_t482_9_1.java
deleted file mode 100644
index 2ecbbe5..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_9/jm/T_t482_9_1.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t482_9.jm;
-
-public class T_t482_9_1 {
-    int v = 0;
-    
-    public static void run(){
-        T_t482_9_1 t = new T_t482_9_1();
-        t.v = 1;
-    }
-}
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_9/jm/T_t482_9_2.j b/tools/dx-tests/src/dxc/junit/verify/t482_9/jm/T_t482_9_2.j
deleted file mode 100644
index 69a9fed..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_9/jm/T_t482_9_2.j
+++ /dev/null
@@ -1,57 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-; See the License for the specific language governing permissions and
-; limitations under the License.
-
-.source T_t482_9_2.java
-.class public dxc/junit/verify/t482_9/jm/T_t482_9_2
-.super java/lang/Object
-
-.field  v I
-
-.method public <init>()V
-    .limit stack 2
-    .limit locals 1
-
-    aload_0
-    invokespecial java/lang/Object/<init>()V
-
-    aload_0
-    iconst_0
-    putfield dxc.junit.verify.t482_9.jm.T_t482_9_2.v I
-
-    return
-.end method
-
-
-
-.method  test()V
-    .limit stack 0
-    .limit locals 1
-    return
-.end method
-
-
-
-.method public static run()V
-    .limit stack 2
-    .limit locals 1
-
-    new dxc/junit/verify/t482_9/jm/T_t482_9_2
-;    dup
-;    invokespecial dxc/junit/verify/t482_9/jm/T_t482_9_2/<init>()V
-
-    invokevirtual dxc/junit/verify/t482_9/jm/T_t482_9_2/test()V
-
-    return
-
-.end method
diff --git a/tools/dx-tests/src/dxc/junit/verify/t482_9/jm/T_t482_9_2.java b/tools/dx-tests/src/dxc/junit/verify/t482_9/jm/T_t482_9_2.java
deleted file mode 100644
index 3ed6819..0000000
--- a/tools/dx-tests/src/dxc/junit/verify/t482_9/jm/T_t482_9_2.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package dxc.junit.verify.t482_9.jm;
-
-public class T_t482_9_2 {
-    int v = 0;
-    
-    void test() {
-        
-    }
-    
-    public static void run(){
-        T_t482_9_2 t = new T_t482_9_2();
-        t.test();
-    }
-}
diff --git a/tools/dx-tests/src/util/CollectAllTests.java b/tools/dx-tests/src/util/CollectAllTests.java
deleted file mode 100644
index 028ec27..0000000
--- a/tools/dx-tests/src/util/CollectAllTests.java
+++ /dev/null
@@ -1,530 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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;
-
-import dxc.junit.AllTests;
-
-import junit.framework.TestCase;
-import junit.framework.TestResult;
-import junit.textui.TestRunner;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Scanner;
-import java.util.Set;
-import java.util.TreeMap;
-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>/data/scriptdata will be generated<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 CollectAllTests {
-
-    private static String PROJECT_FOLDER = "";
-    private static String PROJECT_FOLDER_OUT = "missing out folder!";
-    private static String JAVASRC_FOLDER = PROJECT_FOLDER + "/src";
-    private static HashSet<String> OPCODES = null;
-
-    /*
-     * a map. key: fully qualified class name, value: a list of test methods for
-     * the given class
-     */
-    private TreeMap<String, List<String>> map = new TreeMap<String, List<String>>();
-
-    private int testClassCnt = 0;
-    private int testMethodsCnt = 0;
-
-    private class MethodData {
-        String methodBody, constraint, title;
-    }
-
-    /**
-     * @param args
-     *            args 0 must be the project root folder (where src, lib etc.
-     *            resides)
-     *            args 1 must be the project out root folder (where the Main_*.java files
-     *            are put, and also data/scriptdata)
-     */
-    public static void main(String[] args) {
-        if (args.length >= 2) {
-            PROJECT_FOLDER = args[0];
-            PROJECT_FOLDER_OUT = args[1];
-            JAVASRC_FOLDER = PROJECT_FOLDER + "/src";
-        } else {
-            System.out.println("usage: args 0 must be the project root folder (where src, lib etc. resides)" +
-                    "and args 1 must be the project out root folder (where the Main_*.java file" +
-                    " are put, and also data/scriptdata)");
-            return;
-        }
-        
-
-        for (int i = 2; i < args.length; i++) {
-            if (OPCODES == null) {
-                OPCODES = new HashSet<String>();
-            }
-            OPCODES.add(args[i]);
-        }
-        
-        System.out.println("using java src:"+JAVASRC_FOLDER);
-        CollectAllTests cat = new CollectAllTests();
-        cat.compose();
-    }
-
-    public void compose() {
-        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
-        // etc.
-        // class in the respective package.
-        // for the report make sure all N... tests are called first, then B,
-        // then
-        // E, then VFE test methods.
-        // so we need x Main_xxxx methods in a package, and x entries in the
-        // global scriptdata file (read by a bash script for the tests)
-        // e.g. dxc.junit.opcodes.aaload.Test_aaload - testN1() ->
-        // File Main_testN1.java in package dxc.junit.opcodes.aaload
-        // and entry dxc.junit.opcodes.aaload.Main_testN1 in class execution
-        // table.
-        //
-        handleTests();
-    }
-
-    private void addToTests(TestCase test) {
-        
-        String packageName = test.getClass().getPackage().getName();
-        packageName = packageName.substring(packageName.lastIndexOf('.')+1);
-        if (OPCODES != null && !OPCODES.contains(packageName)) {
-            return;
-        }
-
-        
-        String method = test.getName(); // e.g. testVFE2
-        String fqcn = test.getClass().getName(); // e.g.
-        // dxc.junit.opcodes.iload_3.Test_iload_3
-        // order: take the order of the test-suites for the classes,
-        // TODO and for methods: take Nx, then Bx, then Ex, then VFEx
-        //System.out.println("collecting test:" + test.getName() + ", class "
-        //        + test.getClass().getName());
-        testMethodsCnt++;
-        List<String> li = map.get(fqcn);
-        if (li == null) {
-            testClassCnt++;
-            li = new ArrayList<String>();
-            map.put(fqcn, li);
-        }
-        li.add(method);
-    }
-
-    private void handleTests() {
-        System.out.println("collected "+testMethodsCnt+" test methods in "+testClassCnt+" junit test classes");
-        String datafileContent = "";
-
-        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 + "()";
-            
-            String[] nameParts = pName.split("\\.");
-            if (nameParts.length != 4) {
-                throw new RuntimeException(
-                        "package name does not comply to naming scheme: " + pName);
-            }
-            
-           
-            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);
-                
-                if (dependentTestClassNames.isEmpty())
-                {
-                    continue;
-                }
-                
-
-                String content = "//autogenerated by "
-                        + this.getClass().getName()
-                        + ", do not change\n"
-                        + "package "
-                        + pName
-                        + ";\n"
-                        + "import "
-                        + pName
-                        + ".jm.*;\n"
-                        + "import dxc.junit.*;\n"
-                        + "public class Main_"
-                        + method
-                        + " extends DxAbstractMain {\n"
-                        + "public static void main(String[] args) throws Exception {\n"
-                        + "new Main_" + method + "()." + method + "();\n"
-                        + "}\n" + methodContent + "\n}\n";
-
-                writeToFile(getFileFromPackage(pName, method), content);
-
-                // prepare the entry in the data file for the bash script.
-                // e.g.
-                // main class to execute; opcode/constraint; test purpose
-                // dxc.junit.opcodes.aaload.Main_testN1;aaload;normal case test
-                // (#1)
-
-                char ca = method.charAt("test".length()); // either N,B,E, oradd_double
-                // V (VFE)
-                String comment;
-                switch (ca) {
-                case 'N':
-                    comment = "Normal #" + method.substring(5);
-                    break;
-                case 'B':
-                    comment = "Boundary #" + method.substring(5);
-                    break;
-                case 'E':
-                    comment = "Exception #" + method.substring(5);
-                    break;
-                case 'V':
-                    comment = "Verifier #" + method.substring(7);
-                    break;
-                default:
-                    throw new RuntimeException("unknown test abbreviation:"
-                            + method + " for " + fqcn);
-                }
-
-                String opcConstr = pName.substring(pName.lastIndexOf('.') + 1);
-                // beautify test title
-                if (opcConstr.startsWith("t4")) {
-                    opcConstr = "verifier"; //  + opcConstr.substring(1);
-                } else if (opcConstr.startsWith("pargs")) {
-                    opcConstr = "sanity";
-                } else if (opcConstr.startsWith("opc_")) {
-                    // unescape reserved words
-                    opcConstr = opcConstr.substring(4);
-                }
-                
-                String line = pName + ".Main_" + method + ";";                
-                for (String className : dependentTestClassNames) {
-                    try {
-                        Class.forName(className);
-                    } catch (ClassNotFoundException e) {
-                        throw new RuntimeException(
-                                "dependent class not found : " + className);
-                    } catch (Throwable e) {
-                        // ignore
-                    }
-                    
-                    line += className + " ";
-                }
-                
-                String details = (md.title != null ? md.title : "");
-                if (md.constraint != null) {
-                    details = "Constraint " + md.constraint + ", " + details;
-                }
-                if (details.length() != 0) {
-                    details = details.substring(0, 1).toUpperCase() 
-                            + details.substring(1);
-                }
-
-                line += ";" + opcConstr + ";"+ comment + ";" + details;
-                
-                datafileContent += line + "\n";
-                
-            }
-
-
-        }
-        new File(PROJECT_FOLDER_OUT + "/data").mkdirs();
-        writeToFile(new File(PROJECT_FOLDER_OUT + "/data/scriptdata"),
-                datafileContent);
-    }
-
-
-
-    /**
-     * 
-     * @param pName
-     * @param classOnlyName
-     * @param methodSource
-     * @return a set
-     */
-    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);
-            return entries;
-        }
-
-        MatchResult result = scanner.match();
-
-        entries.add((pName + ".jm." + 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 dx.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 from 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 from file: "
-                    + e.getClass().getName() + ", msg:" + e.getMessage());
-        }
-        
-        // using platform's default charset
-        String all = new String(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) {
-	    scanner2.close();
-	}
-        return md;
-    }
-
-    private void writeToFile(File file, String content) {
-        //System.out.println("writing file " + file.getAbsolutePath());
-        try {
-            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) {
-        // e.g. dxc.junit.argsreturns.pargsreturn
-        String path = pname.replaceAll("\\.", "/");
-        String absPath = PROJECT_FOLDER_OUT + "/" + path;
-        new File(absPath).mkdirs();
-        return new File(absPath + "/Main_" + methodName + ".java");
-    }
-    
-    private byte[] readFile(File file) {
-        int len = (int) file.length();
-        byte[] res = new byte[len];
-        try {
-            FileInputStream in = new FileInputStream(file);
-            int pos = 0;
-            while (len > 0) {
-                int br = in.read(res, pos, len);
-                if (br == -1) {
-                    throw new RuntimeException("unexpected EOF for file: "+file);
-                }
-                pos += br;
-                len -= br;
-            }
-            in.close();
-        } catch (IOException ex) {
-            throw new RuntimeException("error reading file:"+file, ex);
-        }
-        return res;
-    }
-}
diff --git a/tools/dx-tests/src/util/CompileAllJasmin.java b/tools/dx-tests/src/util/CompileAllJasmin.java
deleted file mode 100644
index 834662b..0000000
--- a/tools/dx-tests/src/util/CompileAllJasmin.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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;
-
-import java.io.FileInputStream;
-import java.util.Iterator;
-import java.util.Properties;
-
-import jasmin.Main;
-
-public class CompileAllJasmin {
-
-    /**
-     * @param args args[0] the (absolute or relative to the working dir) 
-     * path to the (properties) file containing line by line
-     * all jasmin files which need to be compiled.
-     * args[1] is the target directory where to put the compiled .class files to
-     */
-    public static void main(String[] args) throws Exception {
-        System.out.println("reading from "+args[0]+" and writing to "+args[1]);
-        Properties p = new Properties();
-        p.load(new FileInputStream(args[0]));
-        
-        //System.out.println("p:::"+p.toString());
-        int i=0;
-        for (Iterator<Object> it_keys = p.keySet().iterator(); it_keys.hasNext();) {
-            String file = (String) it_keys.next();
-            Main m = new jasmin.Main();
-            //java -jar $project_lib/jasmin.jar -d $javac_out $ajasminfile
-            if (i ==0) {
-                m.main(new String[] {"-d" ,args[1], file });
-            } else {
-                // leave away -d option since saved into static field
-                m.main(new String[] {file });
-            }
-            i++;
-        }
-    }
-
-}
diff --git a/tools/dx-tests/utilclasses/util/CompileAllJasmin.class b/tools/dx-tests/utilclasses/util/CompileAllJasmin.class
deleted file mode 100644
index 2b866b2..0000000
--- a/tools/dx-tests/utilclasses/util/CompileAllJasmin.class
+++ /dev/null
Binary files differ
diff --git a/tools/tradefed-host/.classpath b/tools/tradefed-host/.classpath
index 197543c..275ecf9 100644
--- a/tools/tradefed-host/.classpath
+++ b/tools/tradefed-host/.classpath
@@ -6,7 +6,7 @@
 	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/ddmlib"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/tradefederation"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/hosttestlib"/>
-	<classpathentry combineaccessrules="false" exported="true" kind="src" path="/ctsdeviceinfolib"/>
+	<classpathentry exported="true" kind="var" path="CTS_SRC_ROOT/out/host/common/obj/JAVA_LIBRARIES/ctsdeviceinfolib_intermediates/javalib.jar"/>
+	<classpathentry exported="true" kind="var" path="CTS_SRC_ROOT/out/host/common/obj/JAVA_LIBRARIES/hosttestlib_intermediates/javalib.jar"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/tools/tradefed-host/res/report/cts_result.css b/tools/tradefed-host/res/report/cts_result.css
index d7ce510..f825d7a 100644
--- a/tools/tradefed-host/res/report/cts_result.css
+++ b/tools/tradefed-host/res/report/cts_result.css
@@ -22,18 +22,8 @@
     margin:10;
 }
 
-table {
-    font-size:1em;
-    margin:0 0 1em;
-    padding:0;
-    border-collapse:collapse;
-    border-width:0;
-    empty-cells:show;
-    width: 95%;
-}
-
 /* Report logo and device name */
-#title table {
+table.title {
     padding:5px;
     border-width: 0px;
     margin-left:auto;
@@ -41,120 +31,82 @@
     vertical-align:middle;
 }
 
-/* Device and test plan summary below the title */
-#summary table {
+table.summary {
     background-color: rgb(212, 233, 169);
-    -moz-border-radius:5px;
-    border-radius:5px;
-    padding:5px;
-    border-color: #A5C639 #A5C639 #A5C639 #A5C639;
-    border-width: 0px 0px 0px 0px;
+    border-collapse:collapse;
+    border: 0px solid #A5C639;
     margin-left:auto;
     margin-right:auto;
-    width:80%;
 }
 
-#summary th {
+table.summary th {
     background-color: #A5C639;
-    font-size:1.2em;
-    height: 2em;
-    width: 50%;
+    font-size: 1.2em;
+    padding: 0.5em;
 }
 
-#summary td {
+table.summary td {
     border-width: 0px 0px 0px 0px;
     border-color: gray;
     border-style: inset;
-    font-size:1em;
+    font-size: 1em;
+    padding: 0.5em;
     vertical-align: top;
 }
 
-#summaryinfo table {
+table.testsummary {
     background-color: rgb(212, 233, 169);
-    padding:5px;
-    border-width:0;
+    border-collapse:collapse;
     margin-left:auto;
     margin-right:auto;
 }
 
-#summaryinfo td {
-    padding:1px;
-    border-width: 0px 0px 0px 0px;
-    vertical-align: top;
-}
-
-/* The test summary */
-#testsummary table {
-    background-color: rgb(212, 233, 169);
-    padding:5px;
-    border-width:1;
-    border-color: #A5C639;
-    margin-left:auto;
-    margin-right:auto;
-    width: 40%;
-}
-
-#testsummary th {
+table.testsummary th {
     background-color: #A5C639;
-    border-width: 1px;
-    border-color: gray;
-    border-style: outset;
-    height: 2em;
+    border: 1px outset gray;
+    padding: 0.5em;
 }
 
-#testsummary td {
-    border-width: 1px;
-    border-color: #A5C639;
-    border-style: outset;
+table.testsummary td {
+    border: 1px outset #A5C639;
+    padding: 0.5em;
     text-align: center;
 }
 
-/* The test details */
-#testdetail table {
+table.testdetails {
     background-color: rgb(212, 233, 169);
-    padding:5px;
+    border-collapse:collapse;
     border-width:1;
     border-color: #A5C639;
     margin-left:auto;
     margin-right:auto;
-    width: 95%;
-    table-layout:fixed;
+    margin-bottom: 2em;
     vertical-align: top;
+    width: 95%;
 }
 
-#testdetail th {
+table.testdetails th {
     background-color: #A5C639;
     border-width: 1px;
     border-color: gray;
     border-style: outset;
     height: 2em;
+    padding: 0.2em;
 }
 
-#testdetail td {
+table.testdetails td {
     border-width: 1px;
     border-color: #A5C639;
     border-style: outset;
     text-align: left;
     vertical-align: top;
-    padding:1;
+    padding: 0.2em;
 }
 
-/* The test package name */
-#none table {
-    border-width:0;
-    border-color: white;
+table.testdetails td.package {
     background-color: white;
-    text-align:left;
-    border-collapse:collapse;
-}
-
-#none td {
-    border-width:0;
-    border-color: white;
-    background-color: white;
-    text-align:left;
-    border-collapse:collapse;
-    font-weight:bold;
+    border: 0px;
+    font-weight: bold;
 }
 
 /* Test cell details */
@@ -224,7 +176,7 @@
     font-weight:bold;
 }
 
-#details {
+div.details {
     white-space: pre-wrap;       /* css-3 */
     white-space: -moz-pre-wrap;  /* Mozilla, since 1999 */
     white-space: -pre-wrap;      /* Opera 4-6 */
diff --git a/tools/tradefed-host/res/report/cts_result.xsl b/tools/tradefed-host/res/report/cts_result.xsl
index 6fe7cec..fd2b732 100644
--- a/tools/tradefed-host/res/report/cts_result.xsl
+++ b/tools/tradefed-host/res/report/cts_result.xsl
@@ -21,14 +21,21 @@
     <xsl:template match="/">
 
         <html>
-            <STYLE type="text/css">
-                @import "cts_result.css";
-            </STYLE>
-
+            <head>
+                <title>Test Report for <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@build_model" /> - <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@deviceID"/></title>
+                <script>
+                    function toggle(id) {
+                        e = document.getElementById(id)
+                        e.style.display = e.style.display == "none" ? "block" : "none"
+                    }
+                </script>
+                <STYLE type="text/css">
+                    @import "cts_result.css";
+                </STYLE>
+            </head>
             <body>
-                <!-- Title of the Report -->
-                <DIV id="title">
-                    <TABLE>
+                <DIV>
+                    <TABLE class="title">
                         <TR>
                             <TD width="40%" align="left"><img src="logo.gif"></img></TD>
                             <TD width="60%" align="left">
@@ -42,325 +49,328 @@
                 <img src="newrule-green.png" align="left"></img>
 
                 <br></br>
+
+                <center>
+                    <a href="#" onclick="toggle('summary');">Show Device Information</a>
+                </center>
+
                 <br></br>
 
-                <!-- Header with phone and plan information -->
-                <DIV id="summary">
-                    <TABLE width="90%" frame="none">
+                <DIV id="summary" style="display: none">
+                    <TABLE class="summary">
                         <TR>
-                            <TH>Device Information</TH>
-                            <TH>Test Summary</TH>
+                            <TH colspan="2">Device Information</TH>
                         </TR>
-
                         <TR>
-                            <TD>
+                            <TD width="50%">
                                 <!-- Device information -->
-                                <div id="summaryinfo">
-                                    <TABLE width="75%">
-                                        <TR>
-                                            <TD class="rowtitle">Build Model</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@build_model"/>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Build Name</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@buildName"/>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Build Brand</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@build_brand"/>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Build Manufacturer</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@build_manufacturer"/>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Device ID</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@deviceID"/>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Firmware Version</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@buildVersion"/>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Firmware Build Number</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@buildID"/>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Build Fingerprint</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@build_fingerprint"/>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Build ABI</TD>
-                                            <TD>
-                                                <xsl:value-of
-                                                  select="TestResult/DeviceInfo/BuildInfo/@build_abi"/>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Build ABI2</TD>
-                                            <TD>
-                                                <xsl:value-of
-                                                  select="TestResult/DeviceInfo/BuildInfo/@build_abi2"/>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Android Platform Version</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@androidPlatformVersion"/>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Supported Locales</TD>
-                                            <TD>
-                                                <xsl:call-template name="formatDelimitedString">
-                                                    <xsl:with-param name="string" select="TestResult/DeviceInfo/BuildInfo/@locales"/>
-                                                </xsl:call-template>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Screen Size</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/DeviceInfo/Screen/@screen_size"/>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Resolution</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/DeviceInfo/Screen/@resolution"/>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Density</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/DeviceInfo/Screen/@screen_density"/>
-                                                (<xsl:value-of select="TestResult/DeviceInfo/Screen/@screen_density_bucket"/>)
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Phone number</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/DeviceInfo/PhoneSubInfo/@subscriberId"/>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">X dpi</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@Xdpi"/>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Y dpi</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@Ydpi"/>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Touch</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@touch"/>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Navigation</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@navigation"/>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Keypad</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@keypad"/>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Network</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@network"/>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">IMEI</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@imei"/>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">IMSI</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@imsi"/>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Open GL ES Version</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@openGlEsVersion"/>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Open GL Compressed Texture Formats</TD>
-                                            <TD>
-                                                <UL>
-                                                    <xsl:for-each select="TestResult/DeviceInfo/OpenGLCompressedTextureFormatsInfo/TextureFormat">
-                                                        <LI><xsl:value-of select="@name" /></LI>
-                                                    </xsl:for-each>
-                                                </UL>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Features</TD>
-                                            <TD>
-                                                <xsl:for-each select="TestResult/DeviceInfo/FeatureInfo/Feature[@type='sdk']">
-                                                    <xsl:text>[</xsl:text>
-                                                    <xsl:choose>
-                                                        <xsl:when test="@available = 'true'">
-                                                            <xsl:text>X</xsl:text>
-                                                        </xsl:when>
-                                                        <xsl:otherwise>
-                                                            <xsl:text>_</xsl:text>
-                                                        </xsl:otherwise>
-                                                    </xsl:choose>
-                                                    <xsl:text>] </xsl:text>
-
-                                                    <xsl:value-of select="@name" />
-                                                    <br />
+                                <TABLE>
+                                    <TR>
+                                        <TD class="rowtitle">Build Model</TD>
+                                        <TD>
+                                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@build_model"/>
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">Build Name</TD>
+                                        <TD>
+                                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@buildName"/>
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">Build Brand</TD>
+                                        <TD>
+                                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@build_brand"/>
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">Build Manufacturer</TD>
+                                        <TD>
+                                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@build_manufacturer"/>
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">Device ID</TD>
+                                        <TD>
+                                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@deviceID"/>
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">Firmware Version</TD>
+                                        <TD>
+                                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@buildVersion"/>
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">Firmware Build Number</TD>
+                                        <TD>
+                                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@buildID"/>
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">Build Fingerprint</TD>
+                                        <TD>
+                                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@build_fingerprint"/>
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">Build ABI</TD>
+                                        <TD>
+                                            <xsl:value-of
+                                              select="TestResult/DeviceInfo/BuildInfo/@build_abi"/>
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">Build ABI2</TD>
+                                        <TD>
+                                            <xsl:value-of
+                                              select="TestResult/DeviceInfo/BuildInfo/@build_abi2"/>
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">Android Platform Version</TD>
+                                        <TD>
+                                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@androidPlatformVersion"/>
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">Supported Locales</TD>
+                                        <TD>
+                                            <xsl:call-template name="formatDelimitedString">
+                                                <xsl:with-param name="string" select="TestResult/DeviceInfo/BuildInfo/@locales"/>
+                                            </xsl:call-template>
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">Screen Size</TD>
+                                        <TD>
+                                            <xsl:value-of select="TestResult/DeviceInfo/Screen/@screen_size"/>
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">Resolution</TD>
+                                        <TD>
+                                            <xsl:value-of select="TestResult/DeviceInfo/Screen/@resolution"/>
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">Density</TD>
+                                        <TD>
+                                            <xsl:value-of select="TestResult/DeviceInfo/Screen/@screen_density"/>
+                                            (<xsl:value-of select="TestResult/DeviceInfo/Screen/@screen_density_bucket"/>)
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">Phone number</TD>
+                                        <TD>
+                                            <xsl:value-of select="TestResult/DeviceInfo/PhoneSubInfo/@subscriberId"/>
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">X dpi</TD>
+                                        <TD>
+                                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@Xdpi"/>
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">Y dpi</TD>
+                                        <TD>
+                                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@Ydpi"/>
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">Touch</TD>
+                                        <TD>
+                                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@touch"/>
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">Navigation</TD>
+                                        <TD>
+                                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@navigation"/>
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">Keypad</TD>
+                                        <TD>
+                                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@keypad"/>
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">Network</TD>
+                                        <TD>
+                                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@network"/>
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">IMEI</TD>
+                                        <TD>
+                                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@imei"/>
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">IMSI</TD>
+                                        <TD>
+                                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@imsi"/>
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">Open GL ES Version</TD>
+                                        <TD>
+                                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@openGlEsVersion"/>
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">Open GL Compressed Texture Formats</TD>
+                                        <TD>
+                                            <UL>
+                                                <xsl:for-each select="TestResult/DeviceInfo/OpenGLCompressedTextureFormatsInfo/TextureFormat">
+                                                    <LI><xsl:value-of select="@name" /></LI>
                                                 </xsl:for-each>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Other Features</TD>
-                                            <TD>
-                                                <UL>
-                                                    <xsl:for-each select="TestResult/DeviceInfo/FeatureInfo/Feature[@type='other']">
-                                                        <LI><xsl:value-of select="@name" /></LI>
-                                                    </xsl:for-each>
-                                                </UL>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Root Processes</TD>
-                                            <TD>
-                                                <UL>
-                                                    <xsl:for-each select="TestResult/DeviceInfo/ProcessInfo/Process[@uid='0']">
-                                                        <LI><xsl:value-of select="@name" /></LI>
-                                                    </xsl:for-each>
-                                                </UL>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Partitions</TD>
-                                            <TD>
-                                                <UL>
-                                                    <pre>
-                                                        <xsl:call-template name="formatDelimitedString">
-                                                            <xsl:with-param name="string" select="TestResult/DeviceInfo/BuildInfo/@partitions" />
-                                                            <xsl:with-param name="numTokensPerRow" select="1" />
-                                                        </xsl:call-template>
-                                                    </pre>
-                                                </UL>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">System Libraries</TD>
-                                            <TD>
-                                                <UL>
-                                                    <xsl:for-each select="TestResult/DeviceInfo/SystemLibrariesInfo/Library">
-                                                        <LI><xsl:value-of select="@name" /></LI>
-                                                    </xsl:for-each>
-                                                </UL>
-                                            </TD>
-                                        </TR>
-                                    </TABLE>
-                                </div>
+                                            </UL>
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">Root Processes</TD>
+                                        <TD>
+                                            <UL>
+                                                <xsl:for-each select="TestResult/DeviceInfo/ProcessInfo/Process[@uid='0']">
+                                                    <LI><xsl:value-of select="@name" /></LI>
+                                                </xsl:for-each>
+                                            </UL>
+                                        </TD>
+                                    </TR>
+
+                                </TABLE>
                             </TD>
 
-                            <!-- plan information -->
-                            <TD>
-                                <div id="summaryinfo">
-                                    <TABLE width="75%">
-                                        <TR>
-                                            <TD class="rowtitle">CTS version</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/HostInfo/Cts/@version"/>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Test timeout</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/HostInfo/Cts/IntValue[@name='testStatusTimeoutMs']/@value" /> ms
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Host Info</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/HostInfo/@name"/>
-                                                (<xsl:value-of select="TestResult/HostInfo/Os/@name"/> - 
-                                                  <xsl:value-of select="TestResult/HostInfo/Os/@version"/>)
-                                            </TD>
-                                        </TR>
-                                        <TR><TD><BR></BR></TD><TD></TD></TR>
-                                        <TR>
-                                            <TD class="rowtitle">Plan name</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/@testPlan"/>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Start time</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/@starttime"/>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">End time</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/@endtime"/>
-                                            </TD>
-                                        </TR>
+                            <TD width="50%">
+                                <TABLE>
 
-                                        <!-- Test Summary -->
-                                        <TR><TD><BR></BR></TD><TD></TD></TR>
-                                        <TR>
-                                            <TD class="rowtitle">Tests Passed</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/Summary/@pass"/>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Tests Failed</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/Summary/@failed"/>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Tests Timed out</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/Summary/@timeout"/>
-                                            </TD>
-                                        </TR>
-                                        <TR>
-                                            <TD class="rowtitle">Tests Not Executed</TD>
-                                            <TD>
-                                                <xsl:value-of select="TestResult/Summary/@notExecuted"/>
-                                            </TD>
-                                        </TR>
-                                    </TABLE>
-                                </div>
+                                    <TR>
+                                        <TD class="rowtitle">Features</TD>
+                                        <TD>
+                                            <xsl:for-each select="TestResult/DeviceInfo/FeatureInfo/Feature[@type='sdk']">
+                                                <xsl:text>[</xsl:text>
+                                                <xsl:choose>
+                                                    <xsl:when test="@available = 'true'">
+                                                        <xsl:text>X</xsl:text>
+                                                    </xsl:when>
+                                                    <xsl:otherwise>
+                                                        <xsl:text>_</xsl:text>
+                                                    </xsl:otherwise>
+                                                </xsl:choose>
+                                                <xsl:text>] </xsl:text>
+
+                                                <xsl:value-of select="@name" />
+                                                <br />
+                                            </xsl:for-each>
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">Other Features</TD>
+                                        <TD>
+                                            <UL>
+                                                <xsl:for-each select="TestResult/DeviceInfo/FeatureInfo/Feature[@type='other']">
+                                                    <LI><xsl:value-of select="@name" /></LI>
+                                                </xsl:for-each>
+                                            </UL>
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">System Libraries</TD>
+                                        <TD>
+                                            <UL>
+                                                <xsl:for-each select="TestResult/DeviceInfo/SystemLibrariesInfo/Library">
+                                                    <LI><xsl:value-of select="@name" /></LI>
+                                                </xsl:for-each>
+                                            </UL>
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">Partitions</TD>
+                                        <TD>
+                                            <pre>
+                                                <xsl:call-template name="formatDelimitedString">
+                                                    <xsl:with-param name="string" select="TestResult/DeviceInfo/BuildInfo/@partitions" />
+                                                    <xsl:with-param name="numTokensPerRow" select="1" />
+                                                </xsl:call-template>
+                                            </pre>
+                                        </TD>
+                                    </TR>
+                                </TABLE>
+                            </TD>
+                        </TR>
+                    </TABLE>
+                    <br />
+                    <br />
+                </DIV>
+
+                <DIV>
+                    <TABLE class="summary">
+                        <TR>
+                            <TH colspan="2">Test Summary</TH>
+                        </TR>
+                        <TR>
+                            <TD class="rowtitle">CTS version</TD>
+                            <TD>
+                                <xsl:value-of select="TestResult/HostInfo/Cts/@version"/>
+                            </TD>
+                        </TR>
+                        <TR>
+                            <TD class="rowtitle">Test timeout</TD>
+                            <TD>
+                                <xsl:value-of select="TestResult/HostInfo/Cts/IntValue[@name='testStatusTimeoutMs']/@value" /> ms
+                            </TD>
+                        </TR>
+                        <TR>
+                            <TD class="rowtitle">Host Info</TD>
+                            <TD>
+                                <xsl:value-of select="TestResult/HostInfo/@name"/>
+                                (<xsl:value-of select="TestResult/HostInfo/Os/@name"/> - 
+                                  <xsl:value-of select="TestResult/HostInfo/Os/@version"/>)
+                            </TD>
+                        </TR>
+                        <TR>
+                            <TD class="rowtitle">Plan name</TD>
+                            <TD>
+                                <xsl:value-of select="TestResult/@testPlan"/>
+                            </TD>
+                        </TR>
+                        <TR>
+                            <TD class="rowtitle">Start time</TD>
+                            <TD>
+                                <xsl:value-of select="TestResult/@starttime"/>
+                            </TD>
+                        </TR>
+                        <TR>
+                            <TD class="rowtitle">End time</TD>
+                            <TD>
+                                <xsl:value-of select="TestResult/@endtime"/>
+                            </TD>
+                        </TR>
+                        <TR>
+                            <TD class="rowtitle">Tests Passed</TD>
+                            <TD>
+                                <xsl:value-of select="TestResult/Summary/@pass"/>
+                            </TD>
+                        </TR>
+                        <TR>
+                            <TD class="rowtitle">Tests Failed</TD>
+                            <TD>
+                                <xsl:value-of select="TestResult/Summary/@failed"/>
+                            </TD>
+                        </TR>
+                        <TR>
+                            <TD class="rowtitle">Tests Timed out</TD>
+                            <TD>
+                                <xsl:value-of select="TestResult/Summary/@timeout"/>
+                            </TD>
+                        </TR>
+                        <TR>
+                            <TD class="rowtitle">Tests Not Executed</TD>
+                            <TD>
+                                <xsl:value-of select="TestResult/Summary/@notExecuted"/>
                             </TD>
                         </TR>
                     </TABLE>
@@ -368,8 +378,8 @@
 
                 <!-- High level summary of test execution -->
                 <h2 align="center">Test Summary by Package</h2>
-                <DIV id="testsummary">
-                    <TABLE>
+                <DIV>
+                    <TABLE class="testsummary">
                         <TR>
                             <TH>Test Package</TH>
                             <TH>Passed</TH>
@@ -435,26 +445,23 @@
 
     <xsl:template name="detailedTestReport">
         <xsl:param name="resultFilter" />
-        <DIV id="testdetail">
+        <DIV>
             <xsl:for-each select="TestResult/TestPackage">
                 <xsl:if test="$resultFilter=''
                         or count(TestSuite//TestCase/Test[@result=$resultFilter]) &gt; 0">
-                    <DIV id="none">
-                        <TABLE>
-                            <TR>
-                                <TD class="none" align="left">
-                                    <xsl:variable name="href"><xsl:value-of select="@appPackageName"/></xsl:variable>
-                                    <a name="{$href}">Compatibility Test Package: <xsl:value-of select="@appPackageName"/></a>
-                                </TD>
-                            </TR>
-                        </TABLE>
-                    </DIV>
 
-                    <TABLE>
+                    <TABLE class="testdetails">
                         <TR>
-                            <TH width="25%">Test</TH>
-                            <TH width="7%">Result</TH>
-                            <TH width="68%">Failure Details</TH>
+                            <TD class="package" colspan="3">
+                                <xsl:variable name="href"><xsl:value-of select="@appPackageName"/></xsl:variable>
+                                <a name="{$href}">Compatibility Test Package: <xsl:value-of select="@appPackageName"/></a>
+                            </TD>
+                        </TR>
+
+                        <TR>
+                            <TH width="30%">Test</TH>
+                            <TH width="5%">Result</TH>
+                            <TH>Failure Details</TH>
                         </TR>
 
                         <!-- test case -->
@@ -505,7 +512,7 @@
                                                         </div>
                                                     </TD>
                                                    <TD class="failuredetails">
-                                                        <div id="details">
+                                                        <div class="details">
                                                             A test that was a known failure actually passed. Please check.
                                                         </div>
                                                    </TD>
@@ -529,7 +536,7 @@
                                                         </div>
                                                     </TD>
                                                     <TD class="failuredetails">
-                                                        <div id="details">
+                                                        <div class="details">
                                                             <xsl:value-of select="FailedScene/@message"/>
                                                         </div>
                                                     </TD>
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 5945cd8..8029b75 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
@@ -135,7 +135,7 @@
     /**
      * @return a {@link File} representing the test plan directory
      */
-    public File getTestPlansDir() throws FileNotFoundException {
+    public File getTestPlansDir() {
         return new File(getRepositoryDir(), "plans");
     }
 
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildProvider.java b/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildProvider.java
index c28631b..f53507d 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildProvider.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildProvider.java
@@ -31,7 +31,7 @@
     @Option(name="cts-install-path", description="the path to the cts installation to use")
     private String mCtsRootDirPath = System.getProperty("CTS_ROOT");
 
-    public static final String CTS_BUILD_VERSION = "4.0.3_r1";
+    public static final String CTS_BUILD_VERSION = "4.0_r1";
 
     /**
      * {@inheritDoc}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/command/CtsConsole.java b/tools/tradefed-host/src/com/android/cts/tradefed/command/CtsConsole.java
index bd7a983..2f0e872 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/command/CtsConsole.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/command/CtsConsole.java
@@ -183,18 +183,13 @@
                 return name.endsWith(".xml");
             }
         };
-        try {
-            for (File planFile : ctsBuild.getTestPlansDir().listFiles(xmlFilter)) {
-                printLine(FileUtil.getBaseName(planFile.getName()));
-            }
-        }
-        catch (FileNotFoundException e) {
-            printLine("Could not find CTS plan folder");
+        for (File planFile : ctsBuild.getTestPlansDir().listFiles(xmlFilter)) {
+            printLine(FileUtil.getBaseName(planFile.getName()));
         }
     }
 
     private void listPackages(CtsBuildHelper ctsBuild) {
-        ITestPackageRepo testCaseRepo = new TestPackageRepo(ctsBuild.getTestCasesDir());
+        ITestPackageRepo testCaseRepo = new TestPackageRepo(ctsBuild.getTestCasesDir(), false);
         for (String packageUri : testCaseRepo.getPackageNames()) {
             printLine(packageUri);
         }
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/result/DeviceInfoResult.java b/tools/tradefed-host/src/com/android/cts/tradefed/result/DeviceInfoResult.java
index 17b62ca..56b3913 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/result/DeviceInfoResult.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/result/DeviceInfoResult.java
@@ -15,14 +15,14 @@
  */
 package com.android.cts.tradefed.result;
 
-import android.tests.getinfo.DeviceInfoConstants;
-
 import com.android.tradefed.log.LogUtil.CLog;
 
 import org.kxml2.io.KXmlSerializer;
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
+import android.tests.getinfo.DeviceInfoConstants;
+
 import java.io.IOException;
 import java.util.Collections;
 import java.util.HashMap;
@@ -42,20 +42,25 @@
     static final String BUILD_TAG = "BuildInfo";
     private static final String PHONE_TAG = "PhoneSubInfo";
     private static final String SCREEN_TAG = "Screen";
+
     private static final String FEATURE_INFO_TAG = "FeatureInfo";
     private static final String FEATURE_TAG = "Feature";
     private static final String FEATURE_ATTR_DELIM = ":";
     private static final String FEATURE_DELIM = ";";
+
     private static final String OPENGL_TEXTURE_FORMATS_INFO_TAG =
             "OpenGLCompressedTextureFormatsInfo";
     private static final String OPENGL_TEXTURE_FORMAT_TAG = "TextureFormat";
     private static final String OPENGL_TEXTURE_FORMAT_DELIM = ";";
+
     private static final String SYSLIB_INFO_TAG = "SystemLibrariesInfo";
     private static final String SYSLIB_TAG = "Library";
     private static final String SYSLIB_DELIM = ";";
+
     private static final String PROCESS_INFO_TAG = "ProcessInfo";
     private static final String PROCESS_TAG = "Process";
     private static final String PROCESS_DELIM = ";";
+    private static final String PROCESS_ATTR_DELIM = ":";
 
     private Map<String, String> mMetrics = new HashMap<String, String>();
 
@@ -125,141 +130,74 @@
         return value;
     }
 
-    /**
-     * Prints XML indicating what features are supported by the device. It parses a string from the
-     * featureData argument that is in the form of "feature1:true;feature2:false;featuer3;true;"
-     * with a trailing semi-colon.
-     *
-     * <pre>
-     *  <FeatureInfo>
-     *     <Feature name="android.name.of.feature" available="true" />
-     *     ...
-     *   </FeatureInfo>
-     * </pre>
-     *
-     * @param serializer used to create XML
-     * @param featureData raw unparsed feature data
-     */
     private void serializeFeatureInfo(KXmlSerializer serializer, String featureData)
             throws IOException {
-        serializer.startTag(ns, FEATURE_INFO_TAG);
-
-        if (featureData == null) {
-            featureData = "";
-        }
-
-        String[] featurePairs = featureData.split(FEATURE_DELIM);
-        for (String featurePair : featurePairs) {
-            String[] nameTypeAvailability = featurePair.split(FEATURE_ATTR_DELIM);
-            if (nameTypeAvailability.length >= 3) {
-                serializer.startTag(ns, FEATURE_TAG);
-                serializer.attribute(ns, "name", nameTypeAvailability[0]);
-                serializer.attribute(ns, "type", nameTypeAvailability[1]);
-                serializer.attribute(ns, "available", nameTypeAvailability[2]);
-                serializer.endTag(ns, FEATURE_TAG);
-            }
-        }
-        serializer.endTag(ns, FEATURE_INFO_TAG);
+        serialize(serializer, FEATURE_INFO_TAG, FEATURE_TAG, FEATURE_DELIM, FEATURE_ATTR_DELIM,
+                featureData, "name", "type", "available");
     }
 
-    /**
-     * Prints XML data indicating what particular processes of interest were running on the device.
-     * It parses a string from the rootProcesses argument that is in the form of
-     * "processName1;processName2;..." with a trailing semi-colon.
-     *
-     * <pre>
-     *   <ProcessInfo>
-     *     <Process name="long_cat_viewer" uid="0" />
-     *     ...
-     *   </ProcessInfo>
-     * </pre>
-     */
     private void serializeProcessInfo(KXmlSerializer serializer, String rootProcesses)
             throws IOException {
-        serializer.startTag(ns, PROCESS_INFO_TAG);
-
-        if (rootProcesses == null) {
-            rootProcesses = "";
-        }
-
-        String[] processNames = rootProcesses.split(PROCESS_DELIM);
-        for (String processName : processNames) {
-            processName = processName.trim();
-            if (processName.length() > 0) {
-                serializer.startTag(ns, PROCESS_TAG);
-                serializer.attribute(ns, "name", processName);
-                serializer.attribute(ns, "uid", "0");
-                serializer.endTag(ns, PROCESS_TAG);
-            }
-        }
-        serializer.endTag(ns, PROCESS_INFO_TAG);
+        serialize(serializer, PROCESS_INFO_TAG, PROCESS_TAG, PROCESS_DELIM, PROCESS_ATTR_DELIM,
+                rootProcesses, "name", "uid");
     }
 
-    /**
-     * Prints XML data in two level hierarchy.
-     * It parses a string from the root argument that is in the form of
-     * "element1-delimiter-element2-delimiter..." with a trailing delimiter
-     *
-     * <pre>
-     *   <infoTag>
-     *     <elementTag name="element1" />
-     *     ...
-     *   </infoTag>
-     * </pre>
-     */
-    private void serializeSimpleInfo(KXmlSerializer serializer, String root,
-            String infoTag, String elementTag, String delimiter)
-            throws IOException {
-        serializer.startTag(ns, infoTag);
-
-        if (root == null) {
-            root = "";
-        }
-
-        String[] elemNames = root.split(delimiter);
-        for (String elemName : elemNames) {
-            elemName = elemName.trim();
-            if (elemName.length() > 0) {
-                serializer.startTag(ns, elementTag);
-                serializer.attribute(ns, "name", elemName);
-                serializer.endTag(ns, elementTag);
-            }
-        }
-        serializer.endTag(ns, infoTag);
-    }
-
-    /**
-     * Prints XML data listing available OpenGL Compressed Texture Formats.
-     *
-     * <pre>
-     *   <OpenGLCompressedTextureFormatsInfo>
-     *     <TextureFormat name="abc" />
-     *     ...
-     *   </OpenGLCompressedTextureFormatsInfo>
-     * </pre>
-     */
     private void serializeOpenGLCompressedTextureFormatsInfo(KXmlSerializer serializer,
-            String root) throws IOException {
-        serializeSimpleInfo(serializer, root, OPENGL_TEXTURE_FORMATS_INFO_TAG,
-                OPENGL_TEXTURE_FORMAT_TAG,
-                OPENGL_TEXTURE_FORMAT_DELIM);
+            String formats) throws IOException {
+        serialize(serializer, OPENGL_TEXTURE_FORMATS_INFO_TAG, OPENGL_TEXTURE_FORMAT_TAG,
+                OPENGL_TEXTURE_FORMAT_DELIM, null, formats, "name");
+    }
+
+    private void serializeSystemLibrariesInfo(KXmlSerializer serializer, String libs)
+            throws IOException {
+        serialize(serializer, SYSLIB_INFO_TAG, SYSLIB_TAG, SYSLIB_DELIM, null, libs, "name");
     }
 
     /**
-     * Prints XML data listing available system libraries.
-     * It parses a string from the rootLibraries argument that is in the form of
-     * "libName1;libName2;..." with a trailing semi-colon.
+     * Serializes a XML structure where there is an outer tag with tags inside it.
      *
      * <pre>
-     *   <SystemLibrariesInfo>
-     *     <Library name="a.b.c" />
-     *     ...
-     *   </SystemLibrariesInfo>
+     *   Input: value1:value2;value3:value4
+     *
+     *   Output:
+     *   <OuterTag>
+     *     <SubTag attr1="value1" attr2="value2" />
+     *     <SubTag attr1="value3" attr2="value4" />
+     *   </OuterTag>
      * </pre>
+     *
+     * @param serializer to do it
+     * @param tag would be "OuterTag"
+     * @param subTag would be "SubTag"
+     * @param delim would be ";"
+     * @param attrDelim would be ":" in the example but can be null if only one attrName given
+     * @param data would be "value1:value2;value3:value4"
+     * @param attrNames would be an array with "attr1", "attr2"
+     * @throws IOException if there is a problem
      */
-    private void serializeSystemLibrariesInfo(KXmlSerializer serializer, String rootLibraries)
-            throws IOException {
-        serializeSimpleInfo(serializer, rootLibraries, SYSLIB_INFO_TAG, SYSLIB_TAG, SYSLIB_DELIM);
+    private void serialize(KXmlSerializer serializer, String tag, String subTag,
+            String delim, String attrDelim, String data, String... attrNames) throws IOException {
+        serializer.startTag(ns, tag);
+
+        if (data == null) {
+            data = "";
+        }
+
+        String[] values = data.split(delim);
+        for (String value : values) {
+            if (!value.isEmpty()) {
+                String[] attrValues = attrDelim != null ? value.split(attrDelim) : new String[] {value};
+                if (attrValues.length == attrNames.length) {
+                    serializer.startTag(ns, subTag);
+                    for (int i = 0; i < attrNames.length; i++) {
+                        serializer.attribute(ns, attrNames[i], attrValues[i]);
+                    }
+                    serializer.endTag(ns,  subTag);
+                }
+            }
+        }
+
+        serializer.endTag(ns, tag);
     }
 
     /**
@@ -282,20 +220,12 @@
                         parser.getName().equals(BUILD_TAG)) {
                     addMetricsFromAttributes(parser);
                 } else if (parser.getName().equals(FEATURE_INFO_TAG)) {
-                    // store features into metrics map, in the same format as when collected from
-                    // device
                     mMetrics.put(DeviceInfoConstants.FEATURES, parseFeatures(parser));
                 } else if (parser.getName().equals(PROCESS_INFO_TAG)) {
-                    // store processes into metrics map, in the same format as when collected from
-                    // device
                     mMetrics.put(DeviceInfoConstants.PROCESSES, parseProcess(parser));
                 } else if (parser.getName().equals(SYSLIB_INFO_TAG)) {
-                    // store system libs into metrics map, in the same format as when collected from
-                    // device
                     mMetrics.put(DeviceInfoConstants.SYS_LIBRARIES, parseSystemLibraries(parser));
                 } else if (parser.getName().equals(OPENGL_TEXTURE_FORMATS_INFO_TAG)) {
-                    // store OpenGL texture formats into metrics map, in the same format as when
-                    // collected from device
                     mMetrics.put(DeviceInfoConstants.OPEN_GL_COMPRESSED_TEXTURE_FORMATS,
                             parseOpenGLCompressedTextureFormats(parser));
                 }
@@ -306,99 +236,77 @@
         }
     }
 
-    /**
-     * Parse process XML, and return its contents as a delimited String
-     */
-    private String parseProcess(XmlPullParser parser) throws XmlPullParserException, IOException {
-        if (!parser.getName().equals(PROCESS_INFO_TAG)) {
-            throw new XmlPullParserException(String.format(
-                    "invalid XML: Expected %s tag but received %s", PROCESS_INFO_TAG,
-                    parser.getName()));
-        }
-        StringBuilder processString = new StringBuilder();
-        int eventType = parser.getEventType();
-        while (eventType != XmlPullParser.END_DOCUMENT) {
-            if (eventType == XmlPullParser.START_TAG && parser.getName().equals(PROCESS_TAG)) {
-                processString.append(getAttribute(parser, "name"));
-                processString.append(PROCESS_DELIM);
-            } else if (eventType == XmlPullParser.END_TAG && parser.getName().equals(
-                    PROCESS_INFO_TAG)) {
-                return processString.toString();
-            }
-            eventType = parser.next();
-        }
-        return processString.toString();
-    }
-
-    /**
-     * Parse feature XML, and return its contents as a delimited String
-     */
     private String parseFeatures(XmlPullParser parser) throws XmlPullParserException, IOException {
-        if (!parser.getName().equals(FEATURE_INFO_TAG)) {
-            throw new XmlPullParserException(String.format(
-                    "invalid XML: Expected %s tag but received %s", FEATURE_INFO_TAG,
-                    parser.getName()));
-        }
-        StringBuilder featureString = new StringBuilder();
-        int eventType = parser.getEventType();
-        while (eventType != XmlPullParser.END_DOCUMENT) {
-            if (eventType == XmlPullParser.START_TAG && parser.getName().equals(FEATURE_TAG)) {
-                featureString.append(getAttribute(parser, "name"));
-                featureString.append(FEATURE_ATTR_DELIM);
-                featureString.append(getAttribute(parser, "type"));
-                featureString.append(FEATURE_ATTR_DELIM);
-                featureString.append(getAttribute(parser, "available"));
-                featureString.append(FEATURE_DELIM);
-            } else if (eventType == XmlPullParser.END_TAG
-                    && parser.getName().equals(FEATURE_INFO_TAG)) {
-                return featureString.toString();
-            }
-            eventType = parser.next();
-        }
-        return featureString.toString();
-
+        return parseTag(parser, FEATURE_INFO_TAG, FEATURE_TAG, FEATURE_DELIM, FEATURE_ATTR_DELIM,
+                "name", "type", "available");
     }
 
-    /**
-     * Parse two-level hierarchy XML, and return its contents as a delimited String
-     */
-    private String parseSimpleInfo(XmlPullParser parser, String infoTag, String elementTag,
-            String delimiter) throws XmlPullParserException, IOException {
-        if (!parser.getName().equals(infoTag)) {
-            throw new XmlPullParserException(String.format(
-                    "invalid XML: Expected %s tag but received %s", infoTag,
-                    parser.getName()));
-        }
-        StringBuilder result = new StringBuilder();
-        int eventType = parser.getEventType();
-        while (eventType != XmlPullParser.END_DOCUMENT) {
-            if (eventType == XmlPullParser.START_TAG && parser.getName().equals(elementTag)) {
-                result.append(getAttribute(parser, "name"));
-                result.append(delimiter);
-            } else if (eventType == XmlPullParser.END_TAG && parser.getName().equals(
-                    infoTag)) {
-                return result.toString();
-            }
-            eventType = parser.next();
-        }
-        return result.toString();
+    private String parseProcess(XmlPullParser parser) throws XmlPullParserException, IOException {
+        return parseTag(parser, PROCESS_INFO_TAG, PROCESS_TAG, PROCESS_DELIM,
+                PROCESS_ATTR_DELIM, "name", "uid");
     }
 
-    /**
-     * Parse JavaLibrariesInfo XML, and return its contents as a delimited String
-     */
     private String parseOpenGLCompressedTextureFormats(XmlPullParser parser)
             throws XmlPullParserException, IOException {
-        return parseSimpleInfo(parser, OPENGL_TEXTURE_FORMATS_INFO_TAG, OPENGL_TEXTURE_FORMAT_TAG,
-                OPENGL_TEXTURE_FORMAT_DELIM);
+        return parseTag(parser, OPENGL_TEXTURE_FORMATS_INFO_TAG, OPENGL_TEXTURE_FORMAT_TAG,
+                OPENGL_TEXTURE_FORMAT_DELIM, null, "name");
+    }
+
+    private String parseSystemLibraries(XmlPullParser parser)
+            throws XmlPullParserException, IOException {
+        return parseTag(parser, SYSLIB_INFO_TAG, SYSLIB_TAG, SYSLIB_DELIM, null, "name");
     }
 
     /**
-     * Parse JavaLibrariesInfo XML, and return its contents as a delimited String
+     * Converts XML into a flattened string.
+     *
+     * <pre>
+     *   Input:
+     *   <OuterTag>
+     *     <SubTag attr1="value1" attr2="value2" />
+     *     <SubTag attr1="value3" attr2="value4" />
+     *   </OuterTag>
+     *
+     *   Output: value1:value2;value3:value4
+     * </pre>
+     *
+     * @param parser that parses the xml
+     * @param tag like "OuterTag"
+     * @param subTag like "SubTag"
+     * @param delim like ";"
+     * @param attrDelim like ":" or null if tehre is only one attribute
+     * @param attrNames like "attr1", "attr2"
+     * @return flattened string like "value1:value2;value3:value4"
+     * @throws XmlPullParserException
+     * @throws IOException
      */
-    private String parseSystemLibraries(XmlPullParser parser)
-            throws XmlPullParserException, IOException {
-        return parseSimpleInfo(parser, SYSLIB_INFO_TAG, SYSLIB_TAG, SYSLIB_DELIM);
+    private String parseTag(XmlPullParser parser, String tag, String subTag, String delim,
+            String attrDelim, String... attrNames) throws XmlPullParserException, IOException {
+        if (!parser.getName().equals(tag)) {
+            throw new XmlPullParserException(String.format(
+                    "invalid XML: Expected %s tag but received %s", tag,
+                    parser.getName()));
+        }
+        StringBuilder flattened = new StringBuilder();
+
+        for (int eventType = parser.getEventType();
+                eventType != XmlPullParser.END_DOCUMENT;
+                eventType = parser.next()) {
+
+            if (eventType == XmlPullParser.START_TAG && parser.getName().equals(subTag)) {
+                for (int i = 0; i < attrNames.length; i++) {
+                    flattened.append(getAttribute(parser, attrNames[i]));
+                    if (i + 1 < attrNames.length) {
+                        flattened.append(attrDelim);
+                    }
+                }
+                flattened.append(delim);
+            } else if (eventType == XmlPullParser.END_TAG && parser.getName().equals(tag)) {
+                break;
+            }
+        }
+
+        return flattened.toString();
     }
 
     /**
@@ -416,8 +324,6 @@
      * <p/>
      * Check that the provided device info metrics are consistent with the currently stored metrics.
      * If any inconsistencies occur, logs errors and stores error messages in the metrics map
-     *
-     * @param runResult
      */
     public void populateMetrics(Map<String, String> metrics) {
         if (mMetrics.isEmpty()) {
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/result/PlanCreator.java b/tools/tradefed-host/src/com/android/cts/tradefed/result/PlanCreator.java
index 5e0dcb8..d263bc8 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/result/PlanCreator.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/result/PlanCreator.java
@@ -16,6 +16,7 @@
 package com.android.cts.tradefed.result;
 
 import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.cts.tradefed.testtype.CtsTest;
 import com.android.cts.tradefed.testtype.ITestPackageDef;
 import com.android.cts.tradefed.testtype.ITestPackageRepo;
 import com.android.cts.tradefed.testtype.ITestPlan;
@@ -55,6 +56,9 @@
             importance=Importance.IF_UNSET)
     private String mResultFilterString = null;
 
+    @Option(name = CtsTest.RUN_KNOWN_FAILURES_OPTION)
+    private boolean mIncludeKnownFailures = false;
+
     private CtsTestStatus mResultFilter = null;
     private TestResults mResult = null;
 
@@ -63,7 +67,8 @@
     /**
      * Create an empty {@link PlanCreator}.
      * <p/>
-     * All {@link Option} fields must be populated via {@link ArgsOptionParser}
+     * All {@link Option} fields must be populated via
+     * {@link com.android.tradefed.config.ArgsOptionParser}
      */
     public PlanCreator() {
     }
@@ -102,12 +107,13 @@
      * {@link Option} values must all be set before this is called.
      *
      * @param build
-     * @return
+     * @return test plan
      * @throws ConfigurationException
      */
     public ITestPlan createDerivedPlan(CtsBuildHelper build) throws ConfigurationException {
         checkFields(build);
-        ITestPackageRepo pkgDefRepo = new TestPackageRepo(build.getTestCasesDir());
+        ITestPackageRepo pkgDefRepo = new TestPackageRepo(build.getTestCasesDir(),
+                mIncludeKnownFailures);
         ITestPlan derivedPlan = new TestPlan(mPlanName);
         for (TestPackageResult pkg : mResult.getPackages()) {
             Collection<TestIdentifier> filteredTests = pkg.getTestsWithStatus(mResultFilter);
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 c78b71b..8142036 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
@@ -41,8 +41,6 @@
 import com.android.tradefed.testtype.IShardableTest;
 import com.android.tradefed.util.xml.AbstractXmlParser.ParseException;
 
-import junit.framework.Test;
-
 import java.io.BufferedInputStream;
 import java.io.File;
 import java.io.FileInputStream;
@@ -59,6 +57,8 @@
 import java.util.Queue;
 import java.util.Set;
 
+import junit.framework.Test;
+
 /**
  * A {@link Test} for running CTS tests.
  * <p/>
@@ -72,6 +72,7 @@
     private static final String CLASS_OPTION = "class";
     private static final String METHOD_OPTION = "method";
     public static final String CONTINUE_OPTION = "continue-session";
+    public static final String RUN_KNOWN_FAILURES_OPTION = "run-known-failures";
 
     public static final String PACKAGE_NAME_METRIC = "packageName";
     public static final String PACKAGE_DIGEST_METRIC = "packageDigest";
@@ -127,6 +128,10 @@
         "Warning: can potentially use a lot of disk space.")
     private boolean mBugreport = false;
 
+    @Option(name = RUN_KNOWN_FAILURES_OPTION, shortName = 'k', description =
+        "run tests including known failures")
+    private boolean mIncludeKnownFailures;
+
     /** data structure for a {@link IRemoteTest} and its known tests */
     class TestPackage {
         private final IRemoteTest mTestForPackage;
@@ -584,7 +589,7 @@
      * Exposed for unit testing
      */
     ITestPackageRepo createTestCaseRepo() {
-        return new TestPackageRepo(mCtsBuild.getTestCasesDir());
+        return new TestPackageRepo(mCtsBuild.getTestCasesDir(), mIncludeKnownFailures);
     }
 
     /**
@@ -634,10 +639,6 @@
         if (mCtsBuild == null) {
             throw new IllegalArgumentException("missing CTS build");
         }
-        if ("CTS".equals(mPlanName)) {
-            CLog.i("Switching to CTS-TF plan instead of CTS plan for faster execution of vm-tests");
-            mPlanName = "CTS-TF";
-        }
     }
 
     /**
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 8cccab0..d6e9ec6 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,6 +41,10 @@
  */
 class TestPackageDef implements ITestPackageDef {
 
+    public static final String HOST_SIDE_ONLY_TEST = "hostSideOnly";
+    public static final String NATIVE_TEST = "native";
+    public static final String VM_HOST_TEST = "vmHostTest";
+
     private static final String SIGNATURE_TEST_METHOD = "testSignature";
     private static final String SIGNATURE_TEST_CLASS = "android.tests.sigtest.SimpleSignatureTest";
 
@@ -48,14 +52,10 @@
     private String mAppNameSpace = null;
     private String mName = null;
     private String mRunner = null;
-    private boolean mIsHostSideTest = false;
     private boolean mIsVMHostTest = false;
     private String mTestType = null;
     private String mJarPath = null;
     private boolean mIsSignatureTest = false;
-    private boolean mIsReferenceAppTest = false;
-    private String mPackageToTest = null;
-    private String mApkToTestName = null;
     private String mTestPackageName = null;
     private String mDigest = null;
 
@@ -112,28 +112,14 @@
         return mRunner;
     }
 
-    void setIsHostSideTest(boolean hostSideTest) {
-        mIsHostSideTest = hostSideTest;
-
-    }
-
-    boolean isHostSideTest() {
-        return mIsHostSideTest;
-    }
-
-    void setIsVMHostTest(boolean vmHostTest) {
-        mIsVMHostTest = vmHostTest;
-
-    }
-
-    boolean isVMHostTest() {
-        return mIsVMHostTest;
-    }
-
     void setTestType(String testType) {
         mTestType = testType;
     }
 
+    String getTestType() {
+        return mTestType;
+    }
+
     void setJarPath(String jarPath) {
         mJarPath = jarPath;
     }
@@ -150,26 +136,10 @@
         return mIsSignatureTest;
     }
 
-    void setIsReferenceApp(boolean isReferenceApp) {
-        mIsReferenceAppTest = isReferenceApp;
-    }
-
-    boolean isReferenceApp() {
-        return mIsReferenceAppTest;
-    }
-
-    void setPackageToTest(String packageName) {
-        mPackageToTest = packageName;
-    }
-
     void setTestPackageName(String testPackageName) {
         mTestPackageName = testPackageName;
     }
 
-    void setApkToTest(String apkName) {
-        mApkToTestName = apkName;
-    }
-
     void setTargetBinaryName(String targetBinaryName) {
         mTargetBinaryName = targetBinaryName;
     }
@@ -219,7 +189,7 @@
         mExcludedTestFilter.setTestInclusion(mClassName, mMethodName);
         mTests = filterTests();
 
-        if (mIsHostSideTest) {
+        if (HOST_SIDE_ONLY_TEST.equals(mTestType)) {
             CLog.d("Creating host test for %s", mName);
             JarHostTest hostTest = new JarHostTest();
             hostTest.setRunName(getUri());
@@ -227,7 +197,7 @@
             hostTest.setTests(mTests);
             mDigest = generateDigest(testCaseDir, mJarPath);
             return hostTest;
-        } else if (mIsVMHostTest) {
+        } else if (VM_HOST_TEST.equals(mTestType)) {
             CLog.d("Creating vm host test for %s", mName);
             VMHostTest vmHostTest = new VMHostTest();
             vmHostTest.setRunName(getUri());
@@ -235,7 +205,7 @@
             vmHostTest.setTests(mTests);
             mDigest = generateDigest(testCaseDir, mJarPath);
             return vmHostTest;
-        } else if ("native".equals(mTestType)) {
+        } else if (NATIVE_TEST.equals(mTestType)) {
             return new GeeTest(mUri, mName);
         } else if (mIsSignatureTest) {
             // TODO: hardcode the runner/class/method for now, since current package xml points to
@@ -255,11 +225,6 @@
             instrTest.addInstallApk(String.format("%s.apk", mName), mAppNameSpace);
             mDigest = generateDigest(testCaseDir, String.format("%s.apk", mName));
             return instrTest;
-        } else if (mIsReferenceAppTest) {
-            // a reference app test is just a InstrumentationTest with one extra apk to install
-            InstrumentationApkTest instrTest = new InstrumentationApkTest();
-            instrTest.addInstallApk(String.format("%s.apk", mApkToTestName), mPackageToTest);
-            return setInstrumentationTest(instrTest, testCaseDir);
         } else {
             CLog.d("Creating instrumentation test for %s", mName);
             InstrumentationApkTest instrTest = new InstrumentationApkTest();
@@ -271,8 +236,6 @@
      * Populates given {@link InstrumentationApkTest} with data from the package xml.
      *
      * @param testCaseDir
-     * @param className
-     * @param methodName
      * @param instrTest
      * @return the populated {@link InstrumentationTest} or <code>null</code>
      */
@@ -324,9 +287,9 @@
     }
 
     /**
-     * Add a {@link TestDef} to the list of tests in this package.
+     * Add a {@link TestIdentifier} to the list of tests in this package.
      *
-     * @param testdef
+     * @param testDef
      */
     void addTest(TestIdentifier testDef) {
         mTests.add(testDef);
@@ -367,7 +330,8 @@
             MessageDigest md = MessageDigest.getInstance(algorithm);
             d = new DigestInputStream(fileStream, md);
             byte[] buffer = new byte[8196];
-            while (d.read(buffer) != -1);
+            while (d.read(buffer) != -1) {
+            }
             return toHexString(md.digest());
         } catch (NoSuchAlgorithmException e) {
             return algorithm + " not found";
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageRepo.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageRepo.java
index 77fa996..0f3704d 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageRepo.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageRepo.java
@@ -38,19 +38,22 @@
 
     private static final String LOG_TAG = "TestCaseRepo";
 
-    private File mTestCaseDir;
+    private final File mTestCaseDir;
 
     /** mapping of uri to test definition */
-    private Map<String, TestPackageDef> mTestMap;
+    private final Map<String, TestPackageDef> mTestMap;
+
+    private final boolean mIncludeKnownFailures;
 
     /**
      * Creates a {@link TestPackageRepo}, initialized from provided repo files
      *
      * @param testCaseDir directory containing all test case definition xml and build files
      */
-    public TestPackageRepo(File testCaseDir) {
+    public TestPackageRepo(File testCaseDir, boolean includeKnownFailures) {
         mTestCaseDir = testCaseDir;
         mTestMap = new Hashtable<String, TestPackageDef>();
+        mIncludeKnownFailures = includeKnownFailures;
         parse(mTestCaseDir);
     }
 
@@ -64,12 +67,8 @@
         }
     }
 
-    /**
-     * @param xmlFile
-     * @throws ParseException
-     */
     private void parseTestFromXml(File xmlFile)  {
-        TestPackageXmlParser parser = new TestPackageXmlParser();
+        TestPackageXmlParser parser = new TestPackageXmlParser(mIncludeKnownFailures);
         try {
             parser.parse(createStreamFromFile(xmlFile));
             TestPackageDef def = parser.getTestPackageDef();
@@ -96,7 +95,7 @@
      * Exposed for unit testing
      *
      * @param xmlFile
-     * @return
+     * @return stream to read data
      *
      */
     InputStream createStreamFromFile(File xmlFile) throws FileNotFoundException {
@@ -108,6 +107,7 @@
         /**
          * {@inheritDoc}
          */
+        @Override
         public boolean accept(File dir, String name) {
             return name.endsWith(".xml");
         }
@@ -135,9 +135,9 @@
     }
 
     /**
-     * Return a list of all package names found in repo.
-     * @return
+     * @return list of all package names found in repo
      */
+    @Override
     public Collection<String> getPackageNames() {
         List<String> packageNames = new ArrayList<String>();
         packageNames.addAll(mTestMap.keySet());
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 f1b6ed0..35bdfd2 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
@@ -20,7 +20,6 @@
 import com.android.tradefed.util.xml.AbstractXmlParser;
 
 import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
 import org.xml.sax.helpers.DefaultHandler;
 
 import java.util.Iterator;
@@ -36,8 +35,14 @@
 
     private static final String LOG_TAG = "TestPackageXmlParser";
 
+    private final boolean mIncludeKnownFailures;
+
     private TestPackageDef mPackageDef;
 
+    public TestPackageXmlParser(boolean includeKnownFailures) {
+        mIncludeKnownFailures = includeKnownFailures;
+    }
+
     /**
      * SAX callback object. Handles parsing data from the xml tags.
      * <p/>
@@ -58,22 +63,15 @@
         private Stack<String> mClassNameStack = new Stack<String>();
 
         @Override
-        public void startElement(String uri, String localName, String name, Attributes attributes)
-                throws SAXException {
+        public void startElement(String uri, String localName, String name, Attributes attributes) {
             if (TEST_PACKAGE_TAG.equals(localName)) {
                 // appPackageName is used as the uri
                 final String entryUriValue = attributes.getValue("appPackageName");
                 final String testPackageNameSpace = attributes.getValue("appNameSpace");
                 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 testType = attributes.getValue("testType");
                 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");
                 final String targetBinaryName = attributes.getValue("targetBinaryName");
                 final String targetNameSpace = attributes.getValue("targetNameSpace");
@@ -83,14 +81,9 @@
                 mPackageDef.setAppNameSpace(testPackageNameSpace);
                 mPackageDef.setName(packageName);
                 mPackageDef.setRunner(runnerName);
-                mPackageDef.setIsHostSideTest(parseBoolean(hostSideTest));
-                mPackageDef.setIsVMHostTest(parseBoolean(vmHostTest));
-                mPackageDef.setTestType(testType);
+                mPackageDef.setTestType(getTestType(attributes));
                 mPackageDef.setJarPath(jarPath);
                 mPackageDef.setIsSignatureCheck(parseBoolean(signatureCheck));
-                mPackageDef.setIsReferenceApp(parseBoolean(referenceApp));
-                mPackageDef.setApkToTest(apkToTest);
-                mPackageDef.setPackageToTest(packageToTest);
                 mPackageDef.setTestPackageName(javaPackageFilter);
                 mPackageDef.setTargetBinaryName(targetBinaryName);
                 mPackageDef.setTargetNameSpace(targetNameSpace);
@@ -131,16 +124,30 @@
                             classNameBuilder.append(".");
                         }
                     }
-                    TestIdentifier testdef = new TestIdentifier(classNameBuilder.toString(),
+
+                    TestIdentifier testId = new TestIdentifier(classNameBuilder.toString(),
                             methodName);
-                    mPackageDef.addTest(testdef);
+                    boolean isKnownFailure = "failure".equals(attributes.getValue("expectation"));
+                    if (!isKnownFailure || mIncludeKnownFailures) {
+                        mPackageDef.addTest(testId);
+                    }
                 }
             }
 
         }
 
+        private String getTestType(Attributes attributes) {
+            if (parseBoolean(attributes.getValue("hostSideOnly"))) {
+                return TestPackageDef.HOST_SIDE_ONLY_TEST;
+            } else if (parseBoolean(attributes.getValue("vmHostTest"))) {
+                return TestPackageDef.VM_HOST_TEST;
+            } else {
+                return attributes.getValue("testType");
+            }
+        }
+
         @Override
-        public void endElement (String uri, String localName, String qName) throws SAXException {
+        public void endElement (String uri, String localName, String qName) {
             if (TEST_SUITE_TAG.equals(localName) || TEST_CASE_TAG.equals(localName)) {
                 mClassNameStack.pop();
             }
diff --git a/tools/tradefed-host/tests/.classpath b/tools/tradefed-host/tests/.classpath
index b130096..10ad23c 100644
--- a/tools/tradefed-host/tests/.classpath
+++ b/tools/tradefed-host/tests/.classpath
@@ -3,9 +3,9 @@
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/easymock"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/ddmlib"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/tradefederation"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/cts-tradefed-host"/>
+	<classpathentry kind="var" path="CTS_SRC_ROOT/out/host/common/obj/JAVA_LIBRARIES/easymock_intermediates/javalib.jar" sourcepath="/CTS_SRC_ROOT/external/easymock/src"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/tools/tradefed-host/tests/run_unit_tests.sh b/tools/tradefed-host/tests/run_unit_tests.sh
new file mode 100755
index 0000000..fc19a02
--- /dev/null
+++ b/tools/tradefed-host/tests/run_unit_tests.sh
@@ -0,0 +1,49 @@
+#!/bin/bash
+
+# Copyright (C) 2012 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# helper script for running the cts-tradefed unit tests
+
+checkFile() {
+    if [ ! -f "$1" ]; then
+        echo "Unable to locate $1"
+        exit
+    fi;
+}
+
+# check if in Android build env
+if [ ! -z ${ANDROID_BUILD_TOP} ]; then
+    HOST=`uname`
+    if [ "$HOST" == "Linux" ]; then
+        OS="linux-x86"
+    elif [ "$HOST" == "Darwin" ]; then
+        OS="darwin-x86"
+    else
+        echo "Unrecognized OS"
+        exit
+    fi;
+fi;
+
+JAR_DIR=${ANDROID_BUILD_TOP}/out/host/$OS/framework
+JARS="ddmlib-prebuilt.jar tradefed-prebuilt.jar hosttestlib.jar cts-tradefed.jar cts-tradefed-tests.jar"
+
+for JAR in $JARS; do
+    checkFile ${JAR_DIR}/${JAR}
+    JAR_PATH=${JAR_PATH}:${JAR_DIR}/${JAR}
+done
+
+java $RDBG_FLAG \
+  -cp ${JAR_PATH} com.android.tradefed.command.Console run singleCommand host -n --class com.android.cts.tradefed.UnitTests "$@"
+
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/UnitTests.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/UnitTests.java
index 0dc7257..7dfac13 100644
--- a/tools/tradefed-host/tests/src/com/android/cts/tradefed/UnitTests.java
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/UnitTests.java
@@ -16,9 +16,14 @@
 package com.android.cts.tradefed;
 
 import com.android.cts.tradefed.result.CtsXmlResultReporterTest;
+import com.android.cts.tradefed.result.DeviceInfoResultTest;
+import com.android.cts.tradefed.result.TestPackageResultTest;
+import com.android.cts.tradefed.result.TestResultsTest;
+import com.android.cts.tradefed.result.TestSummaryXmlTest;
 import com.android.cts.tradefed.result.TestTest;
 import com.android.cts.tradefed.testtype.CtsTestTest;
 import com.android.cts.tradefed.testtype.JarHostTestTest;
+import com.android.cts.tradefed.testtype.TestFilterTest;
 import com.android.cts.tradefed.testtype.TestPackageDefTest;
 import com.android.cts.tradefed.testtype.TestPackageXmlParserTest;
 import com.android.cts.tradefed.testtype.TestPlanTest;
@@ -36,13 +41,22 @@
 
     public UnitTests() {
         super();
+
+        // result package
         addTestSuite(CtsXmlResultReporterTest.class);
-        addTestSuite(JarHostTestTest.class);
-        addTestSuite(CtsTestTest.class);
-        addTestSuite(TestPlanTest.class);
-        addTestSuite(TestPackageXmlParserTest.class);
-        addTestSuite(TestPackageDefTest.class);
+        addTestSuite(DeviceInfoResultTest.class);
+        addTestSuite(TestPackageResultTest.class);
+        addTestSuite(TestResultsTest.class);
+        addTestSuite(TestSummaryXmlTest.class);
         addTestSuite(TestTest.class);
+
+        // testtype package
+        addTestSuite(CtsTestTest.class);
+        addTestSuite(JarHostTestTest.class);
+        addTestSuite(TestFilterTest.class);
+        addTestSuite(TestPackageDefTest.class);
+        addTestSuite(TestPackageXmlParserTest.class);
+        addTestSuite(TestPlanTest.class);
     }
 
     public static Test suite() {
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/result/CtsXmlResultReporterTest.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/result/CtsXmlResultReporterTest.java
index 94b7344..9515446 100644
--- a/tools/tradefed-host/tests/src/com/android/cts/tradefed/result/CtsXmlResultReporterTest.java
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/result/CtsXmlResultReporterTest.java
@@ -66,6 +66,8 @@
         mReportDir = FileUtil.createTempDir("foo");
         mResultReporter.setReportDir(mReportDir);
         mMockBuild = EasyMock.createNiceMock(IFolderBuildInfo.class);
+        EasyMock.expect(mMockBuild.getDeviceSerial()).andStubReturn(null);
+        EasyMock.replay(mMockBuild);
     }
 
     @Override
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/result/DeviceInfoResultTest.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/result/DeviceInfoResultTest.java
index a0388b2..fa36430 100644
--- a/tools/tradefed-host/tests/src/com/android/cts/tradefed/result/DeviceInfoResultTest.java
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/result/DeviceInfoResultTest.java
@@ -15,20 +15,22 @@
  */
 package com.android.cts.tradefed.result;
 
-import android.tests.getinfo.DeviceInfoConstants;
-
-import junit.framework.TestCase;
+import com.android.tradefed.util.xml.AbstractXmlParser.ParseException;
 
 import org.kxml2.io.KXmlSerializer;
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
+import android.tests.getinfo.DeviceInfoConstants;
+
 import java.io.IOException;
 import java.io.StringReader;
 import java.io.StringWriter;
 import java.util.HashMap;
 import java.util.Map;
 
+import junit.framework.TestCase;
+
 /**
  * Unit tests for {@link DeviceInfoResult}
  */
@@ -55,31 +57,40 @@
         };
     }
 
-    /**
-     * Test the roundtrip setting of device process details, serializing and parsing from/to XML.
-     */
-    public void testProcess() throws Exception {
-        final String processString = "ueventd;netd;";
-        DeviceInfoResult serializedInfo = new DeviceInfoResult();
-        addMetric(DeviceInfoConstants.PROCESSES, processString, serializedInfo);
-        String serializedOutput = serialize(serializedInfo);
-        mDeserializingInfo.parse(new StringReader(serializedOutput));
-        assertEquals(processString, mDeserializingInfo.getMetrics().get(
-                DeviceInfoConstants.PROCESSES));
+    public void testFeatures() throws Exception {
+        assertSerializeParse(DeviceInfoConstants.FEATURES, "");
+        assertSerializeParse(DeviceInfoConstants.FEATURES,
+                "android.hardware.audio.low_latency:sdk:false;");
+        assertSerializeParse(DeviceInfoConstants.FEATURES, "android.hardware.audio.low_latency:"
+                + "sdk:false;android.hardware.bluetooth:sdk:true;");
     }
 
-    /**
-     * Test the roundtrip setting of device feature details, serializing and parsing from/to XML.
-     */
-    public void testFeature() throws Exception {
-        final String featureString =
-            "android.hardware.audio.low_latency:sdk:false;android.hardware.bluetooth:sdk:true;";
+    public void testProcesses() throws Exception {
+        assertSerializeParse(DeviceInfoConstants.PROCESSES, "");
+        assertSerializeParse(DeviceInfoConstants.PROCESSES, "ueventd:0;");
+        assertSerializeParse(DeviceInfoConstants.PROCESSES, "ueventd:0;netd:0;");
+    }
+
+    public void testOpenGlTextureFormats() throws Exception {
+        assertSerializeParse(DeviceInfoConstants.OPEN_GL_COMPRESSED_TEXTURE_FORMATS, "");
+        assertSerializeParse(DeviceInfoConstants.OPEN_GL_COMPRESSED_TEXTURE_FORMATS, "texture1;");
+        assertSerializeParse(DeviceInfoConstants.OPEN_GL_COMPRESSED_TEXTURE_FORMATS,
+                "texture1;texture2;");
+    }
+
+    public void testSystemLibraries() throws Exception {
+        assertSerializeParse(DeviceInfoConstants.SYS_LIBRARIES, "");
+        assertSerializeParse(DeviceInfoConstants.SYS_LIBRARIES, "lib1;");
+        assertSerializeParse(DeviceInfoConstants.SYS_LIBRARIES, "lib1;lib2;");
+    }
+
+    private void assertSerializeParse(String name, String value)
+            throws IOException, ParseException {
         DeviceInfoResult serializedInfo = new DeviceInfoResult();
-        addMetric(DeviceInfoConstants.FEATURES, featureString, serializedInfo);
+        addMetric(name, value, serializedInfo);
         String serializedOutput = serialize(serializedInfo);
         mDeserializingInfo.parse(new StringReader(serializedOutput));
-        assertEquals(featureString, mDeserializingInfo.getMetrics().get(
-                DeviceInfoConstants.FEATURES));
+        assertEquals(value, mDeserializingInfo.getMetrics().get(name));
     }
 
     /**
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/TestPackageXmlParserTest.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/TestPackageXmlParserTest.java
index b24c0e3..ac3d394 100644
--- a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/TestPackageXmlParserTest.java
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/TestPackageXmlParserTest.java
@@ -42,7 +42,7 @@
         "        <TestSuite name=\"example\" >\n" +
         "            <TestCase name=\"ExampleTest\" >\n" +
         "                <Test name=\"testFoo\" />\n" +
-        "                <Test name=\"testFoo2\" />\n" +
+        "                <Test name=\"testFoo2\" expectation=\"failure\" />\n" +
         "            </TestCase>\n" +
         "        </TestSuite>\n" +
         "        <TestSuite name=\"example2\" >\n" +
@@ -57,6 +57,10 @@
         "<TestPackage hostSideOnly=\"blah\" >" +
         "</TestPackage>";
 
+    private static String VM_HOST_TEST_XML = "<TestPackage vmHostTest=\"true\"></TestPackage>";
+
+    private static String NATIVE_TEST_XML = "<TestPackage testType=\"native\"></TestPackage>";
+
     private static String NO_TEST_DATA =
         "<invalid />";
 
@@ -64,7 +68,7 @@
      * Test parsing test case xml containing an instrumentation test definition.
      */
     public void testParse_instrPackage() throws ParseException  {
-        TestPackageXmlParser parser = new TestPackageXmlParser();
+        TestPackageXmlParser parser = new TestPackageXmlParser(true);
         parser.parse(getStringAsStream(INSTR_TEST_DATA));
         TestPackageDef def = parser.getTestPackageDef();
         assertEquals("com.example", def.getAppNameSpace());
@@ -76,10 +80,10 @@
      * Test parsing test case xml containing an host test attribute and test data.
      */
     public void testParse_hostTest() throws ParseException  {
-        TestPackageXmlParser parser = new TestPackageXmlParser();
+        TestPackageXmlParser parser = new TestPackageXmlParser(true);
         parser.parse(getStringAsStream(HOST_TEST_DATA));
         TestPackageDef def = parser.getTestPackageDef();
-        assertTrue(def.isHostSideTest());
+        assertEquals(TestPackageDef.HOST_SIDE_ONLY_TEST, def.getTestType());
         assertEquals(3, def.getTests().size());
         Iterator<TestIdentifier> iterator = def.getTests().iterator();
 
@@ -94,23 +98,59 @@
         TestIdentifier thirdTest = iterator.next();
         assertEquals("com.example2.Example2Test", thirdTest.getClassName());
         assertEquals("testFoo", thirdTest.getTestName());
+
+        assertFalse(iterator.hasNext());
+    }
+
+    public void testParse_hostTest_noKnownFailures() throws ParseException  {
+        TestPackageXmlParser parser = new TestPackageXmlParser(false);
+        parser.parse(getStringAsStream(HOST_TEST_DATA));
+        TestPackageDef def = parser.getTestPackageDef();
+        assertEquals(TestPackageDef.HOST_SIDE_ONLY_TEST, def.getTestType());
+        assertEquals(2, def.getTests().size());
+        Iterator<TestIdentifier> iterator = def.getTests().iterator();
+
+        TestIdentifier firstTest = iterator.next();
+        assertEquals("com.example.ExampleTest", firstTest.getClassName());
+        assertEquals("testFoo", firstTest.getTestName());
+
+        TestIdentifier thirdTest = iterator.next();
+        assertEquals("com.example2.Example2Test", thirdTest.getClassName());
+        assertEquals("testFoo", thirdTest.getTestName());
+
+        assertFalse(iterator.hasNext());
     }
 
     /**
      * Test parsing test case xml containing an invalid host test attribute.
      */
     public void testParse_badHostTest() throws ParseException  {
-        TestPackageXmlParser parser = new TestPackageXmlParser();
+        TestPackageXmlParser parser = new TestPackageXmlParser(true);
         parser.parse(getStringAsStream(BAD_HOST_TEST_DATA));
         TestPackageDef def = parser.getTestPackageDef();
-        assertFalse(def.isHostSideTest());
+        assertFalse(TestPackageDef.HOST_SIDE_ONLY_TEST.equals(def.getTestType()));
+    }
+
+    public void testParse_vmHostTest() throws ParseException  {
+        assertTestType(TestPackageDef.VM_HOST_TEST, VM_HOST_TEST_XML);
+    }
+
+    public void testParse_nativeTest() throws ParseException  {
+        assertTestType(TestPackageDef.NATIVE_TEST, NATIVE_TEST_XML);
+    }
+
+    private void assertTestType(String expectedType, String xml) throws ParseException {
+        TestPackageXmlParser parser = new TestPackageXmlParser(true);
+        parser.parse(getStringAsStream(xml));
+        TestPackageDef def = parser.getTestPackageDef();
+        assertEquals(expectedType, def.getTestType());
     }
 
     /**
      * Test parsing a test case xml with no test package data.
      */
     public void testParse_noData() throws ParseException  {
-        TestPackageXmlParser parser = new TestPackageXmlParser();
+        TestPackageXmlParser parser = new TestPackageXmlParser(true);
         parser.parse(getStringAsStream(NO_TEST_DATA));
         assertNull(parser.getTestPackageDef());
     }
diff --git a/tools/utils/buildCts.py b/tools/utils/buildCts.py
index 98978fd..60c9084 100755
--- a/tools/utils/buildCts.py
+++ b/tools/utils/buildCts.py
@@ -74,22 +74,16 @@
 
   def GenerateTestDescriptions(self):
     """Generate test descriptions for all packages."""
-    pool = Pool(processes=16)
+    pool = Pool(processes=2)
 
     # individually generate descriptions not following conventions
     pool.apply_async(GenerateSignatureCheckDescription, [self.test_repository])
-    pool.apply_async(GenerateReferenceAppDescription, [self.test_repository])
-    pool.apply_async(GenerateAppSecurityDescription, [self.temp_dir,
-        self.test_repository, self.android_root, self.doclet_path])
 
     # generate test descriptions for android tests
-    android_packages = GetSubDirectories(self.test_root)
-    for package in android_packages:
-      pool.apply_async(GenerateTestDescription, [self.test_root, self.temp_dir,
-          self.test_repository, self.android_root, self.doclet_path, package])
-
+    results = []
     pool.close()
     pool.join()
+    return sum(map(lambda result: result.get(), results))
 
   def __WritePlan(self, plan, plan_name):
     print 'Generating test plan %s' % plan_name
@@ -106,11 +100,9 @@
       packages.append(doc.GetAttr('TestPackage', 'appPackageName'))
 
     plan = tools.TestPlan(packages)
-    plan.Exclude('android\.core\.vm-tests')
     plan.Exclude('android\.performance.*')
-    plan.Include(r'android\.core\.vm-tests-tf')
-    self.__WritePlan(plan, 'CTS-TF')
     self.__WritePlan(plan, 'CTS')
+    self.__WritePlan(plan, 'CTS-TF')
 
     plan.Exclude(r'android\.tests\.sigtest')
     plan.Exclude(r'android\.core.*')
@@ -129,10 +121,6 @@
     self.__WritePlan(plan, 'Signature')
 
     plan = tools.TestPlan(packages)
-    plan.Include(r'android\.apidemos\.cts')
-    self.__WritePlan(plan, 'RefApp')
-
-    plan = tools.TestPlan(packages)
     plan.Include(r'android\.tests\.appsecurity')
     self.__WritePlan(plan, 'AppSecurity')
 
@@ -151,162 +139,9 @@
   package.WriteDescription(description)
   description.close()
 
-def GenerateReferenceAppDescription(test_repository):
-  """Generate the test description for the reference app tests."""
-  LogGenerateDescription('android.apidemos.cts')
-  package = tools.TestPackage('ApiDemosReferenceTest', 'android.apidemos.cts')
-  package.AddAttribute('appNameSpace', 'android.apidemos.cts')
-  package.AddAttribute('packageToTest', 'com.example.android.apis')
-  package.AddAttribute('apkToTestName', 'ApiDemos')
-  package.AddAttribute('runner', 'android.test.InstrumentationTestRunner')
-  package.AddAttribute('referenceAppTest', 'true')
-  package.AddTest('android.apidemos.cts.ApiDemosTest.testNumberOfItemsInListView')
-  description = open(os.path.join(test_repository, 'ApiDemosReferenceTest.xml'), 'w')
-  package.WriteDescription(description)
-  description.close()
-
-def GenerateAppSecurityDescription(temp_dir, test_repository, android_root, doclet_path):
-  """Generate the test description for the application security tests."""
-  test_root = 'cts/tests/appsecurity-tests'
-  makefile_name = os.path.join(test_root, 'Android.mk')
-  makefile_vars = GetMakeFileVars(makefile_name)
-  name = makefile_vars['LOCAL_MODULE']
-  package_name = 'android.tests.appsecurity'
-  LogGenerateDescription(package_name)
-  temp_desc = os.path.join(temp_dir, 'description.xml')
-  RunDescriptionGeneratorDoclet(android_root, doclet_path,
-      os.path.join(test_root, 'src'), temp_desc)
-  doc = dom.parse(temp_desc)
-  test_description = doc.getElementsByTagName('TestPackage')[0]
-  test_description.setAttribute('name', package_name)
-  test_description.setAttribute('appPackageName', package_name)
-  test_description.setAttribute('hostSideOnly', 'true')
-  test_description.setAttribute('jarPath', name + '.jar')
-  description = open(os.path.join(test_repository, package_name + '.xml'), 'w')
-  doc.writexml(description, addindent='    ', encoding='UTF-8')
-  description.close()
-
-
-def GenerateTestDescription(test_root, temp_dir, test_repository, android_root,
-                            doclet_path, package):
-
-  app_package_name = 'android.' + package
-  package_root = os.path.join(test_root, package)
-
-  makefile_name = os.path.join(package_root, 'Android.mk')
-  if not os.path.exists(makefile_name):
-    print 'Skipping directory "%s" due to missing Android.mk' % package_root
-    return
-  makefile_vars = GetMakeFileVars(makefile_name)
-
-  manifest_name = os.path.join(package_root, 'AndroidManifest.xml')
-  if not os.path.exists(manifest_name):
-    print 'Skipping directory "%s" due to missing AndroidManifest.xml' % package_root
-    return
-  manifest = tools.XmlFile(manifest_name)
-
-  LogGenerateDescription(app_package_name)
-
-  # Run the description generator doclet to get the test package structure
-  # TODO: The Doclet does not currently add all required attributes. Instead of rewriting
-  # the document below, additional attributes should be passed to the Doclet as arguments.
-  temp_desc = os.path.join(temp_dir, app_package_name + '-description.xml')
-
-  RunDescriptionGeneratorDoclet(android_root, doclet_path, package_root, temp_desc)
-
-  # obtain missing attribute values from the makefile and manifest
-  package_name = makefile_vars['LOCAL_PACKAGE_NAME']
-  runner = manifest.GetAndroidAttr('instrumentation', 'name')
-  target_package = manifest.GetAndroidAttr('instrumentation', 'targetPackage')
-  target_binary_name = makefile_vars.get('LOCAL_INSTRUMENTATION_FOR')
-
-  # add them to the document
-  doc = dom.parse(temp_desc)
-  test_description = doc.getElementsByTagName('TestPackage')[0]
-  test_description.setAttribute('name', package_name)
-  test_description.setAttribute('runner', runner)
-  test_package = manifest.GetAttr('manifest', 'package')
-  test_description.setAttribute('appNameSpace', test_package)
-  test_description.setAttribute('appPackageName', app_package_name)
-  if not test_package == target_package:
-    test_description.setAttribute('targetNameSpace', target_package)
-    test_description.setAttribute('targetBinaryName', target_binary_name)
-  description = open(os.path.join(test_repository, package_name + '.xml'), 'w')
-  doc.writexml(description, addindent='    ', encoding='UTF-8')
-  description.close()
-
-def RunDescriptionGeneratorDoclet(android_root, doclet_path, source_root, output_file):
-  """Generate a test package description by running the DescriptionGenerator doclet.
-
-  Args:
-    android_root: Root directory of the Android source tree.
-    doclet_path: Class path where the DescriptionGenerator doclet can be found.
-    source_root: Directory under which tests should be searched.
-    output_file: Name of the file where the description gets written.
-
-  Returns:
-    The exit code of the DescriptionGenerator doclet run.
-  """
-  # Make sure sourceRoot is relative to  self.android_root
-  source_root = RelPath(source_root, android_root)
-
-  # To determine whether a class is a JUnit test, the Doclet needs to have all intermediate
-  # subclasses of TestCase as well as the JUnit framework itself on the source path.
-  # Annotation classes are also required, since test annotations go into the description.
-  sourcepath = [
-      'frameworks/base/core/java',            # android test classes
-      'frameworks/base/test-runner/src',      # test runner
-      'libcore/junit/src/main/java',          # junit classes
-      'development/tools/hosttestlib/src',    # hosttestlib TestCase extensions
-      'libcore/dalvik/src/main/java',         # test annotations
-      'cts/tests/src',                        # cts test stubs
-      source_root                             # the source for this package
-  ]
-  sourcepath = [os.path.join(android_root, x) for x in sourcepath]
-  classpath = [
-      'prebuilt/common/tradefed/tradefed-prebuilt.jar',
-  ]
-  classpath = [os.path.join(android_root, x) for x in classpath]
-  cmd = ('javadoc -o %s -J-Xmx512m -quiet -doclet DescriptionGenerator -docletpath %s'
-         ' -sourcepath %s -classpath %s ') % (output_file, doclet_path, ':'.join(sourcepath),
-         ':'.join(classpath))
-  sources = []
-
-  def AddFile(sources, folder, names):
-    """Find *.java."""
-    sources.extend([os.path.join(folder, name) for name in names if name.endswith('.java')])
-
-  os.path.walk(os.path.join(android_root, source_root), AddFile, sources)
-  cmd += ' '.join(sources)
-  proc = subprocess.Popen(cmd, shell=True, stderr=subprocess.STDOUT, stdout=subprocess.PIPE)
-  # read and discard any output
-  proc.communicate()
-  # wait for process to terminate and return exit value
-  return proc.wait()
-
-def RelPath(path, start=os.getcwd()):
-  """Get a relative version of a path.
-
-  This is equivalent to os.path.relpath, which is only available since Python 2.6.
-
-  Args:
-    path: The path to transform.
-    start: The base path. Defaults to the current working directory.
-
-  Returns:
-    A transformed path that is relative to start.
-  """
-  path_dirs = os.path.abspath(path).split(os.path.sep)
-  start_dirs = os.path.abspath(start).split(os.path.sep)
-
-  num_common = len(os.path.commonprefix([start_dirs, path_dirs]))
-
-  result_dirs = ['..'] * (len(start_dirs) - num_common) + path_dirs[num_common:]
-  if result_dirs:
-    return os.path.join(*result_dirs)
-  return start
-
 if __name__ == '__main__':
   builder = CtsBuilder(sys.argv)
-  builder.GenerateTestDescriptions()
+  result = builder.GenerateTestDescriptions()
+  if result != 0:
+    sys.exit(result)
   builder.GenerateTestPlans()
diff --git a/tools/utils/host_config.xml b/tools/utils/host_config.xml
deleted file mode 100644
index 1a99e75..0000000
--- a/tools/utils/host_config.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<HostConfiguration version="1.0">
-    <Repository>
-        <!-- Specific OEM test plan directory (optional) -->
-        <TestPlan path="plans" />
-        <!-- Specific OEM test case directory (optional) -->
-        <TestCase path="testcases" />
-        <!-- Specific OEM test result directory (optional) -->
-        <TestResult path="results" />
-    </Repository>
-
-    <!-- Number of tests executed between reboots. A value <= 0 disables reboots. -->
-    <IntValue name="maxTestCount" value="200" />
-    <!-- Max size [tests] for a package to be run in batch mode. -->
-    <IntValue name="maxTestsInBatchMode" value="5000" />
-
-    <!-- Max time [ms] between test status updates. -->
-    <IntValue name="testStatusTimeoutMs" value="600000" />
-    <!-- Max time [ms] from start of package in batch mode and the first test status update. -->
-    <IntValue name="batchStartTimeoutMs" value="1800000" />
-    <!-- Max time [ms] from start of test in individual mode to the first test status update. -->
-    <IntValue name="individualStartTimeoutMs" value="600000" />
-    <!-- Timeout [ms] for the signature check. -->
-    <IntValue name="signatureTestTimeoutMs" value="600000" />
-    <!-- Timeout [ms] for package installations. -->
-    <IntValue name="packageInstallTimeoutMs" value="120000" />
-    <!-- Time to wait [ms] after a package installation or removal. -->
-    <IntValue name="postInstallWaitMs" value="10000" />
-
-</HostConfiguration>
diff --git a/tools/utils/startcts b/tools/utils/startcts
deleted file mode 100755
index 4db28b2..0000000
--- a/tools/utils/startcts
+++ /dev/null
@@ -1,97 +0,0 @@
-#! /bin/bash
-
-# 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.
-
-if [ -z "${CTS_ROOT}" ]; then
-# CONFIGURATION
-# Set this variable to the root of unzipped CTS directory
-# This only needs to be changed if this script has been moved
-CTS_ROOT="$(dirname $0)/.."
-fi;
-
-# ----------------------------------------------------------------------------
-# END OF CONFIGURATION SECTION
-# ----------------------------------------------------------------------------
-
-checkDir() {
-    if [ ! -d $1 ]; then
-        echo "$2"
-        exit
-    fi;
-}
-
-
-checkFile() {
-    if [ ! -f "$1" ]; then
-        echo "Unable to locate $1."
-        exit
-    fi;
-}
-
-checkPath() {
-    if ! type -P $1 &> /dev/null; then
-        echo "Unable to find $1 in path."
-        exit
-    fi;
-}
-
-checkDir ${CTS_ROOT} "Error: Cannot locate CTS in \"${CTS_DIR}\". Please check your configuration in $0"
-
-DDM_LIB=${CTS_ROOT}/tools/ddmlib-prebuilt.jar
-CTS_LIB=${CTS_ROOT}/tools/cts.jar
-JUNIT_LIB=${CTS_ROOT}/tools/junit.jar
-HOSTTEST_LIB=${CTS_ROOT}/tools/hosttestlib.jar
-
-checkFile ${DDM_LIB}
-checkFile ${CTS_LIB}
-checkFile ${JUNIT_LIB}
-checkFile ${HOSTTEST_LIB}
-
-JARS=${CTS_LIB}:${DDM_LIB}:${JUNIT_LIB}:${HOSTTEST_LIB}
-
-# Add SDK_ROOT to the PATH for backwards compatibility with prior startcts
-# commands that required SDK_ROOT to find adb.
-if [ -n "${SDK_ROOT}" ]; then
-  PATH=${SDK_ROOT}/platform-tools:${SDK_ROOT}/tools:${PATH}
-fi
-
-checkPath adb
-
-# options for the JVM
-JAVA_OPTS="-Xmx512M"
-# configuration supplied as single argument
-CONFIG=
-# configuration supplied with --config option
-DDCONFIG=
-
-if [ $# -eq 1 ]; then
-    # single argument specifies configuration file
-    :
-else
-    if [ $(echo "$*" | grep -c -e --config -) -gt 0 ]; then
-        # --config supplied on command line
-        :
-    else
-        if [ $# -eq 0 ]; then
-            # no arguments; supply config as single argument
-            CONFIG=${CTS_ROOT}/repository/host_config.xml
-        else
-            # no config; append --config to existing command line
-            DDCONFIG="--config ${CTS_ROOT}/repository/host_config.xml"
-        fi;
-    fi;
-fi;
-
-java ${JAVA_OPTS} -cp ${JARS} com.android.cts.TestHost ${CONFIG} "$@" ${DDCONFIG}
diff --git a/tools/vm-tests-tf/Android.mk b/tools/vm-tests-tf/Android.mk
index bfc47d7..07a3cf8 100644
--- a/tools/vm-tests-tf/Android.mk
+++ b/tools/vm-tests-tf/Android.mk
@@ -31,7 +31,7 @@
 LOCAL_MODULE_CLASS := JAVA_LIBRARIES
 LOCAL_MODULE_TAGS := optional
 
-LOCAL_JAVA_LIBRARIES := dx dasm cfassembler
+LOCAL_JAVA_LIBRARIES := dx dasm cfassembler junit
 LOCAL_CLASSPATH := $(HOST_JDK_TOOLS_JAR)
 
 include $(BUILD_HOST_JAVA_LIBRARY)
@@ -63,7 +63,7 @@
 $(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
+$(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 $(HOST_OUT_JAVA_LIBRARIES)/junit.jar
 
 	$(hide) mkdir -p $@
 	$(hide) mkdir -p $(PRIVATE_INTERMEDIATES_HOSTJUNIT_FILES)/dot/junit
diff --git a/tools/vm-tests/Android.mk b/tools/vm-tests/Android.mk
deleted file mode 100644
index f807774..0000000
--- a/tools/vm-tests/Android.mk
+++ /dev/null
@@ -1,117 +0,0 @@
-# Copyright (C) 2008 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT 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 := hostSideOnly
-LOCAL_JAR_PATH := android.core.vm-tests.jar
-
-LOCAL_SRC_FILES := $(call all-src-files)
-
-LOCAL_MODULE := cts-dalvik-buildutil
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-
-LOCAL_JAVA_LIBRARIES := dx dasm cfassembler hosttestlib ddmlib
-LOCAL_CLASSPATH := $(HOST_JDK_TOOLS_JAR)
-
-include $(BUILD_HOST_JAVA_LIBRARY)
-
-$(LOCAL_BUILT_MODULE): PRIVATE_CLASS_INTERMEDIATES_DIR := $(intermediates)/classes
-
-BUILD_UTIL_INTERMEDIATES_CLASSES := $(intermediates)/classes
-
-include $(CLEAR_VARS)
-
-LOCAL_IS_HOST_MODULE := true
-LOCAL_MODULE_CLASS := EXECUTABLES
-LOCAL_MODULE := vm-tests
-
-include $(BUILD_SYSTEM)/base_rules.mk
-
-$(LOCAL_BUILT_MODULE): $(LOCAL_PATH)/etc/starttests | $(ACP)
-	@echo "Copy: $(PRIVATE_MODULE) ($@)"
-	$(copy-file-to-new-target)
-	$(hide) chmod 755 $@
-
-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-dalvik-buildutil.jar $(HOST_OUT_JAVA_LIBRARIES)/dasm.jar $(HOST_OUT_JAVA_LIBRARIES)/dx.jar $(HOST_OUT_JAVA_LIBRARIES)/cfassembler.jar  $(HOST_OUT_JAVA_LIBRARIES)/hosttestlib.jar $(HOST_OUT_JAVA_LIBRARIES)/ddmlib.jar
-
-	$(hide) mkdir -p $@
-# copy Util class to compile later together with the generated host side junit tests	
-	$(hide) mkdir -p $(PRIVATE_INTERMEDIATES_HOSTJUNIT_FILES)/dot/junit && cp $(PRIVATE_SRC_FOLDER)/util/build/DeviceUtil.java.template $(PRIVATE_INTERMEDIATES_HOSTJUNIT_FILES)/dot/junit/DeviceUtil.java
-# 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)/hosttestlib.jar:$(HOST_OUT_JAVA_LIBRARIES)/ddmlib.jar $(PRIVATE_INTERMEDIATES_MAIN_FILES) $(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/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
-	$(hide) $(ACP) -r $(PRIVATE_INTERMEDIATES)/data $(dir $@)
-	@touch $@
-
-$(intermediates)/android.core.vm-tests.jar: PRIVATE_INTERMEDIATES := $(intermediates)
-$(intermediates)/android.core.vm-tests.jar: $(INSTALLED_TESTS)
-	$(hide) cd $(PRIVATE_INTERMEDIATES)/hostjunit_files/classes && \
-	zip -q -r ../../android.core.vm-tests.jar . && \
-	cd -
-	$(hide) cd $(PRIVATE_INTERMEDIATES) && \
-	zip -q -r android.core.vm-tests.jar tests && \
-	cd -
-	
-
-define get-class-path
-	$(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-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,$(BUILD_UTIL_INTERMEDIATES_CLASSES),dot/junit/DxUtil.class dot/junit/DxAbstractMain.class)
-
diff --git a/tools/vm-tests/etc/starttests b/tools/vm-tests/etc/starttests
deleted file mode 100755
index 8d9633b..0000000
--- a/tools/vm-tests/etc/starttests
+++ /dev/null
@@ -1,310 +0,0 @@
-#!/bin/bash
-#
-# Copyright (C) 2008 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Set up prog to be the path of this script, including following symlinks,
-# and set up progdir to be the fully-qualified pathname of its directory.
-
-prog="$0"
-while [ -h "${prog}" ]; do
-    newProg=`/bin/ls -ld "${prog}"`
-    newProg=`expr "${newProg}" : ".* -> \(.*\)$"`
-    if expr "x${newProg}" : 'x/' >/dev/null; then
-        prog="${newProg}"
-    else
-        progdir=`dirname "${prog}"`
-        prog="${progdir}/${newProg}"
-    fi
-done
-oldwd=`pwd`
-progdir=`dirname "${prog}"`
-cd "${progdir}"
-progdir=`pwd`
-prog="${progdir}"/`basename "${prog}"`
-cd "${oldwd}"
-
-libdir=`dirname $progdir`/framework
-
-javaOpts=""
-while expr "x$1" : 'x-J' >/dev/null; do
-    opt=`expr "$1" : '-J\(.*\)'`
-    javaOpts="${javaOpts} -${opt}"
-    shift
-done
-
-
-#######################################################################
-# Original content of invocation script follows. Uses values cleverly
-# deduced by the above code.
-#######################################################################
-
-selection=$1
-interpreter="fast"
-if [ "$selection" = "--portable" ]; then
-    selection=$2;
-    interpreter="portable"
-fi
-
-dalviktest=$progdir/../cts_dalviktests
-dalviktestdir=$dalviktest/tests
-dexcore=$dalviktest/tests/dot/junit/dexcore.jar
-scriptdata=$dalviktest/data/scriptdata
-report=$dalviktest/report.html
-curdate=`date`
-curmode=""
-datadir=/tmp/${USER}
-base=$OUT
-framework=$base/system/framework
-export ANDROID_PRINTF_LOG=tag
-export ANDROID_LOG_TAGS='*:s' # was: jdwp:i dalvikvm:i dalvikvmi:i'
-export ANDROID_DATA=$datadir
-export ANDROID_ROOT=$base/system
-export LD_LIBRARY_PATH=$base/system/lib
-export DYLD_LIBRARY_PATH=$base/system/lib
-debug_opts="-Xcheck:jni -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n"
-exe=$base/system/bin/dalvikvm
-bpath=$framework/core.jar
-
-echo "--------------------------------------------------"
-echo "Dalvik VM Test Suite"
-echo "Version 1.0"
-echo "Copyright (c) 2008 The Android Open Source Project"
-echo ""
-
-if [ "$selection" = "--help" ]; then
-    echo "Usage: vm-tests [--help|--portable] [<mnemonic>]"
-    echo ""
-    echo "    --help      prints this help message"
-    echo "    --portable  uses the portable interpreter;"
-    echo "                default is the fast one"
-    echo ""
-    echo "    <mnemonic>  specifies the instruction to test;"
-    echo "                default is to run all tests"
-    echo ""
-    exit 1;
-fi
-
-rm -rf --preserve-root $datadir/dalvik-cache
-mkdir -p $datadir
-mkdir -p $datadir/dalvik-cache
- 
-if [ "$TARGET_SIMULATOR" = "true" ]; then
-    echo "Simulator mode, $interpreter interpreter";
-    curmode="simulator"
-    if [ -f $exe ]; then
-        version=`${exe} -version 2> /dev/null | grep -o "version.*$"`
-        echo "Using Dalvik VM ${version}"
-    else
-        echo "No Dalvik VM found at $exe";
-        exit 1;
-    fi
-else
-    echo "Emulator mode, $interpreter interpreter";
-    curmode="emulator"
-    version=`adb shell dalvikvm -version 2> /dev/null | grep -o "version.*$"`
-    if [ "${version}" != "" ]; then
-        echo "Using Dalvik VM ${version}"
-    else
-        echo "No emulator or device found";
-        exit 1;
-    fi
-fi
-
-echo ""
-
-pre_report="<html><head><style>
-table tr.ok { background:#a0ffa0; }
-table tr.nok { background:#ffa0a0; }
-table tr.wok { background:#ffffa0; }
-table tr.lok { background:#aaaaff; }
-</style></head>
-<body>
-<h1>Dalvik VM test suite results</h1>
-Generated $curdate (using the $curmode)
-<p>
-<table width='100%'>
-<tr><td>Status</td><td>Target</td><td>Category</td><td>Details</td></tr>"
-post_report="</body></html>"
-
-rm -f $report
-echo $pre_report > $report
-
-# ----------- running each opcode test ------------
-
-export jpassedcnt=0
-export jfailedcnt=0
-export jvfefailedcnt=0
-export jwarningcnt=0
-export jallcnt=0
-export jcolumns=0
-
-# TODO unhack
-if [ "$TARGET_SIMULATOR" = "true" ]; then
-    echo -n ""
-else
-    adb push $dexcore /data/dexcore.jar >> /dev/null 2>&1
-fi
-
-function classnameToJar()
-{
-    echo $1 | sed -e 's#\.#/#g;s#$#.jar#'
-}
-
-while read -u 3 myline;
-do
-    # dot.junit.opcodes.add_double.Main_testB1;dot.junit.opcodes.add_double.d.T_add_double_1 ;opcode add_double;test B #1 (border edge case)
-    # ->
-    # mainclass: dot.junit.opcodes.add_double.Main_testB1
-    # testcasedir: opcodes/add_double
-    # testname: testB1 ->
-    # dir dot/junit/opcodes/add_double/testB1
-    
-    # e.g dot.junit.opcodes.add_double.Main_testB1
-    mainclass=`echo $myline | cut -d";" -f1`
-    # e.g dot.junit.opcodes.add_double.d.T_add_double_1, space sep. >=1 entries
-    deps=`echo $myline | cut -d";" -f2`
-    
-    jtitle=`echo $myline | cut -d";" -f3`
-    jcomment=`echo $myline | cut -d";" -f4`
-    details=`echo $myline | cut -d";" -f5`
-    
-    if [ "$selection" == "" ] || [ "$jtitle" == "$selection" ]; then
-    
-        (( jallcnt += 1 ))   
-        
-        cd $dalviktestdir
-        rm -f $datadir/dalvikout
-        # write dalvik output to file
-        echo -n "mk_b:" > $datadir/dalvikout
-        
-        if [ "$TARGET_SIMULATOR" = "true" ]; then
-            classpath=`classnameToJar ${mainclass}`
-            for dep in ${deps}; do
-                depJar=`classnameToJar ${dep}`
-                classpath=${classpath}:${depJar}
-            done
-            $valgrind $exe -Xint:$interpreter -Xmx512M -Xss32K -Xbootclasspath:$bpath $debug_opts \
-                -classpath $dexcore:$classpath $mainclass >> $datadir/dalvikout 2>&1
-    
-            RESULTCODE=$?
-            if [ ${RESULTCODE} -ne 0 ]; then
-                echo "Dalvik VM failed, result=${RESULTCODE}" >> $datadir/dalvikout 2>&1
-            fi
-        else
-            classpath="/data/dexcore.jar"
-            deps=${deps}" "${mainclass}
-            pushedjars=""
-            for dep in ${deps}; do
-                depJar=`classnameToJar ${dep}`
-                depFileName=`basename ${depJar}`
-                deviceFileName=/data/${depFileName}
-                adb push ${depJar} ${deviceFileName} &> /dev/null
-                classpath=${classpath}:${deviceFileName}
-                pushedjars=${pushedjars}" "${deviceFileName}
-            done
-        
-            adb shell dalvikvm -Xint:$interpreter -Xmx512M -Xss32K -Djava.io.tmpdir=/data/local/tmp \
-                -classpath $classpath $mainclass >> $datadir/dalvikout 2>&1 && \
-                echo -n dvmpassed: >> $datadir/dalvikout 2>&1
-    
-            for jar in ${pushedjars}; do
-                adb shell rm ${jar} &> /dev/null
-            done
-        fi
-        
-        echo -n "mk_s:" >> $datadir/dalvikout
-        # Verify tmpout only contains mkdxc_start;mkdxc_stop -> no system.out/err
-        # because of exception. If ok -> green report line else red report with info
-        # between mkdxc_start and stop
-        vmresult=`cat $datadir/dalvikout`
-    
-        if [[ ("$vmresult" == "mk_b:mk_s:") || ("$vmresult" == "mk_b:dvmpassed:mk_s:") ]]; then
-            (( jpassedcnt += 1 )) 
-            echo -n "<tr class=\"ok\"><td>Success</td><td>$jtitle</td>" >> $report
-            echo "<td>$jcomment</td><td>$details</td></tr>" >> $report
-            echo -n "."
-        else
-            vmres=`cat $datadir/dalvikout | sed -e 's/mk_b://;s/mk_s://'`
-            vmres="$details<br><pre>$vmres</pre>"
-            
-            stacktraces=`echo $vmresult | grep "java\.lang\." | grep -c "at dot\.junit\."`
-            if [[ $stacktraces > 0 ]]; then
-                jtype=`echo "$mainclass" | sed -e 's/.*_test\([^0-9]*\)[0-9].*/\1/' `
-                if [ "$jtype" == "VFE" ]; then
-                    (( jvfefailedcnt += 1 ))
-                    echo -n "V"
-                else
-                    (( jfailedcnt += 1 )) 
-                    echo -n "F"
-                fi
-
-                echo "<tr class=\"nok\"><td>Failure</td><td>$jtitle</td><td>" >> $report
-                echo "$jcomment</td><td>$vmres</td></tr>" >> $report
-            else
-                (( jwarningcnt += 1 ))
-                echo "<tr class=\"wok\"><td>Failure</td><td>$jtitle</td><td>" >> $report
-                echo "$jcomment</td><td>(No stacktrace, but errors on console)" >> $report
-                echo "<br>$vmres</td></tr>" >> $report
-                echo -n "C"
-            fi
-        fi
-        
-        (( jcolumns += 1 ))
-        if [ ${jcolumns} -eq 40 ]; then
-            echo ""
-            (( jcolumns = 0 ))
-        fi
-
-    fi
-# Use fd nr 3 to avoid subshelling via cat since this looses all
-# variables(and thus also the counters we are interested in).
-done 3<$scriptdata 
-
-echo "</table>" >> $report
-let jallcalccnt=$jpassedcnt+$jfailedcnt+$jvfefailedcnt+$jwarningcnt
-if [ $jallcalccnt -ne $jallcnt ]; then
-    echo "<br>error: green & red != total , $jallcalccnt -ne $jallcnt" >> $report
-    exit 1;
-fi
-
-echo $post_report >> $report
-
-echo "<br>Tests run: ${jallcnt}" >> $report
-echo "<br>Functional failures: ${jfailedcnt}" >> $report
-echo "<br>Verifier failures: ${jvfefailedcnt}" >> $report
-echo "<br>Console errors: ${jwarningcnt}" >> $report
-
-echo $post_report >> $report
-
-if [[ jcolumns -ne 0 ]]; then
-    echo ""
-fi
-
-echo ""
-
-if [[ jallcnt -eq jpassedcnt ]]; then
-    echo "OK (${jpassedcnt} tests)"
-else
-    echo "FAILURES!!!"
-    echo ""
-    echo "Tests run          : ${jallcnt}"
-    echo "Functional failures: ${jfailedcnt}"
-    echo "Verifier failures  : ${jvfefailedcnt}"
-    echo "Console errors     : ${jwarningcnt}"
-fi
-
-echo ""
-echo "Please see complete report in ${report}"
-echo "--------------------------------------------------"
diff --git a/tools/vm-tests/lib/junit.jar b/tools/vm-tests/lib/junit.jar
deleted file mode 100644
index 674d71e..0000000
--- a/tools/vm-tests/lib/junit.jar
+++ /dev/null
Binary files differ
diff --git a/tools/vm-tests/src/dot/Main.java b/tools/vm-tests/src/dot/Main.java
deleted file mode 100644
index 62e8e29..0000000
--- a/tools/vm-tests/src/dot/Main.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR 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/src/dot/junit/AllTests.java b/tools/vm-tests/src/dot/junit/AllTests.java
deleted file mode 100644
index fd54824..0000000
--- a/tools/vm-tests/src/dot/junit/AllTests.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS 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/src/dot/junit/DxAbstractMain.java b/tools/vm-tests/src/dot/junit/DxAbstractMain.java
deleted file mode 100644
index d40fb94..0000000
--- a/tools/vm-tests/src/dot/junit/DxAbstractMain.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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/src/dot/junit/DxTestCase.java b/tools/vm-tests/src/dot/junit/DxTestCase.java
deleted file mode 100644
index 00eb6fe..0000000
--- a/tools/vm-tests/src/dot/junit/DxTestCase.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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/src/dot/junit/DxUtil.java b/tools/vm-tests/src/dot/junit/DxUtil.java
deleted file mode 100644
index cba0d54..0000000
--- a/tools/vm-tests/src/dot/junit/DxUtil.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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/src/dot/junit/format/AllTests.java b/tools/vm-tests/src/dot/junit/format/AllTests.java
deleted file mode 100644
index 30cc091..0000000
--- a/tools/vm-tests/src/dot/junit/format/AllTests.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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/src/dot/junit/format/f1/Test_f1.java b/tools/vm-tests/src/dot/junit/format/f1/Test_f1.java
deleted file mode 100644
index 7751833..0000000
--- a/tools/vm-tests/src/dot/junit/format/f1/Test_f1.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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/src/dot/junit/format/f1/d/T_f1_0.java b/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_0.java
deleted file mode 100644
index dda0585..0000000
--- a/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_0.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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/src/dot/junit/format/f1/d/T_f1_1.d b/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_1.d
deleted file mode 100644
index e674f34..0000000
--- a/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_1.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/format/f1/d/T_f1_1.dfh b/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_1.dfh
deleted file mode 100644
index 9f57983..0000000
--- a/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_1.dfh
+++ /dev/null
@@ -1,50 +0,0 @@
-// 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/src/dot/junit/format/f1/d/T_f1_10.d b/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_10.d
deleted file mode 100644
index c06a20e..0000000
--- a/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_10.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/format/f1/d/T_f1_10.dfh b/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_10.dfh
deleted file mode 100644
index 302ade9..0000000
--- a/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_10.dfh
+++ /dev/null
@@ -1,250 +0,0 @@
-// 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/src/dot/junit/format/f1/d/T_f1_11.d b/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_11.d
deleted file mode 100644
index 4ad888f..0000000
--- a/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_11.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/format/f1/d/T_f1_11.dfh b/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_11.dfh
deleted file mode 100644
index 520eecd..0000000
--- a/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_11.dfh
+++ /dev/null
@@ -1,249 +0,0 @@
-// 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/src/dot/junit/format/f1/d/T_f1_12.d b/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_12.d
deleted file mode 100644
index e6e053d..0000000
--- a/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_12.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/format/f1/d/T_f1_12.dfh b/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_12.dfh
deleted file mode 100644
index 4676340..0000000
--- a/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_12.dfh
+++ /dev/null
@@ -1,250 +0,0 @@
-// 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/src/dot/junit/format/f1/d/T_f1_2.d b/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_2.d
deleted file mode 100644
index 72ed9ac..0000000
--- a/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_2.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/format/f1/d/T_f1_2.dfh b/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_2.dfh
deleted file mode 100644
index 8bb38ee..0000000
--- a/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_2.dfh
+++ /dev/null
@@ -1,249 +0,0 @@
-// 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/src/dot/junit/format/f1/d/T_f1_3.d b/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_3.d
deleted file mode 100644
index f98d9fa..0000000
--- a/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_3.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/format/f1/d/T_f1_3.dfh b/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_3.dfh
deleted file mode 100644
index cdfa4a8..0000000
--- a/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_3.dfh
+++ /dev/null
@@ -1,249 +0,0 @@
-// 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/src/dot/junit/format/f1/d/T_f1_4.d b/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_4.d
deleted file mode 100644
index 22611e3..0000000
--- a/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_4.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/format/f1/d/T_f1_4.dfh b/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_4.dfh
deleted file mode 100644
index ea0b607..0000000
--- a/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_4.dfh
+++ /dev/null
@@ -1,249 +0,0 @@
-// 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/src/dot/junit/format/f1/d/T_f1_5.d b/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_5.d
deleted file mode 100644
index e3a993f..0000000
--- a/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_5.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/format/f1/d/T_f1_5.dfh b/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_5.dfh
deleted file mode 100644
index 99ffd13..0000000
--- a/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_5.dfh
+++ /dev/null
@@ -1,249 +0,0 @@
-// 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/src/dot/junit/format/f1/d/T_f1_6.d b/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_6.d
deleted file mode 100644
index 6bb0bf0..0000000
--- a/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_6.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/format/f1/d/T_f1_6.dfh b/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_6.dfh
deleted file mode 100644
index 375a9ac..0000000
--- a/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_6.dfh
+++ /dev/null
@@ -1,249 +0,0 @@
-// 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/src/dot/junit/format/f1/d/T_f1_7.d b/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_7.d
deleted file mode 100644
index 61f31b1..0000000
--- a/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_7.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/format/f1/d/T_f1_7.dfh b/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_7.dfh
deleted file mode 100644
index 1845c7a..0000000
--- a/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_7.dfh
+++ /dev/null
@@ -1,249 +0,0 @@
-// 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/src/dot/junit/format/f1/d/T_f1_8.d b/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_8.d
deleted file mode 100644
index c622eb0..0000000
--- a/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_8.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/format/f1/d/T_f1_8.dfh b/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_8.dfh
deleted file mode 100644
index 3ebff78..0000000
--- a/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_8.dfh
+++ /dev/null
@@ -1,251 +0,0 @@
-// 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/src/dot/junit/format/f1/d/T_f1_9.d b/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_9.d
deleted file mode 100644
index 9a44f4e..0000000
--- a/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_9.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/format/f1/d/T_f1_9.dfh b/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_9.dfh
deleted file mode 100644
index f3e4dd1..0000000
--- a/tools/vm-tests/src/dot/junit/format/f1/d/T_f1_9.dfh
+++ /dev/null
@@ -1,250 +0,0 @@
-// 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/src/dot/junit/opcodes/AllTests.java b/tools/vm-tests/src/dot/junit/opcodes/AllTests.java
deleted file mode 100644
index 282ac42..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/AllTests.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_double/Test_add_double.java b/tools/vm-tests/src/dot/junit/opcodes/add_double/Test_add_double.java
deleted file mode 100644
index 8887d50..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_double/Test_add_double.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_double/d/T_add_double_1.d b/tools/vm-tests/src/dot/junit/opcodes/add_double/d/T_add_double_1.d
deleted file mode 100644
index f3d3653..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_double/d/T_add_double_1.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_double/d/T_add_double_1.java b/tools/vm-tests/src/dot/junit/opcodes/add_double/d/T_add_double_1.java
deleted file mode 100644
index 530fbd2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_double/d/T_add_double_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_double/d/T_add_double_2.d b/tools/vm-tests/src/dot/junit/opcodes/add_double/d/T_add_double_2.d
deleted file mode 100644
index da30626..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_double/d/T_add_double_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_double/d/T_add_double_3.d b/tools/vm-tests/src/dot/junit/opcodes/add_double/d/T_add_double_3.d
deleted file mode 100644
index ebdc492..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_double/d/T_add_double_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_double/d/T_add_double_3.java b/tools/vm-tests/src/dot/junit/opcodes/add_double/d/T_add_double_3.java
deleted file mode 100644
index fadc09e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_double/d/T_add_double_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_double/d/T_add_double_4.d b/tools/vm-tests/src/dot/junit/opcodes/add_double/d/T_add_double_4.d
deleted file mode 100644
index 7acfdfd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_double/d/T_add_double_4.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_double/d/T_add_double_5.d b/tools/vm-tests/src/dot/junit/opcodes/add_double/d/T_add_double_5.d
deleted file mode 100644
index 64b8613..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_double/d/T_add_double_5.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_double/d/T_add_double_6.d b/tools/vm-tests/src/dot/junit/opcodes/add_double/d/T_add_double_6.d
deleted file mode 100644
index 424bd3f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_double/d/T_add_double_6.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_double_2addr/Test_add_double_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/add_double_2addr/Test_add_double_2addr.java
deleted file mode 100644
index f0a17a2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_double_2addr/Test_add_double_2addr.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_1.d
deleted file mode 100644
index 44d1f78..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_1.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_1.java
deleted file mode 100644
index 33ac19a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_2.d
deleted file mode 100644
index 3633e01..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_3.d
deleted file mode 100644
index 62f4198..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_3.java b/tools/vm-tests/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_3.java
deleted file mode 100644
index 860bfc9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_4.d
deleted file mode 100644
index a9f2625..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_4.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_5.d
deleted file mode 100644
index 521f02b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_5.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_6.d b/tools/vm-tests/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_6.d
deleted file mode 100644
index cd95033..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_double_2addr/d/T_add_double_2addr_6.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_float/Test_add_float.java b/tools/vm-tests/src/dot/junit/opcodes/add_float/Test_add_float.java
deleted file mode 100644
index b821daa..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_float/Test_add_float.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_float/d/T_add_float_1.d b/tools/vm-tests/src/dot/junit/opcodes/add_float/d/T_add_float_1.d
deleted file mode 100644
index 502b435..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_float/d/T_add_float_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_float/d/T_add_float_1.java b/tools/vm-tests/src/dot/junit/opcodes/add_float/d/T_add_float_1.java
deleted file mode 100644
index efe39a4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_float/d/T_add_float_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_float/d/T_add_float_2.d b/tools/vm-tests/src/dot/junit/opcodes/add_float/d/T_add_float_2.d
deleted file mode 100644
index 627036b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_float/d/T_add_float_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_float/d/T_add_float_3.d b/tools/vm-tests/src/dot/junit/opcodes/add_float/d/T_add_float_3.d
deleted file mode 100644
index 7de8486..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_float/d/T_add_float_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_float/d/T_add_float_4.d b/tools/vm-tests/src/dot/junit/opcodes/add_float/d/T_add_float_4.d
deleted file mode 100644
index 443ed0f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_float/d/T_add_float_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_float/d/T_add_float_5.d b/tools/vm-tests/src/dot/junit/opcodes/add_float/d/T_add_float_5.d
deleted file mode 100644
index efcd143..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_float/d/T_add_float_5.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_float/d/T_add_float_5.java b/tools/vm-tests/src/dot/junit/opcodes/add_float/d/T_add_float_5.java
deleted file mode 100644
index 403a198..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_float/d/T_add_float_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_float/d/T_add_float_6.d b/tools/vm-tests/src/dot/junit/opcodes/add_float/d/T_add_float_6.d
deleted file mode 100644
index 061a4da..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_float/d/T_add_float_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_float_2addr/Test_add_float_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/add_float_2addr/Test_add_float_2addr.java
deleted file mode 100644
index 5824a70..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_float_2addr/Test_add_float_2addr.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_1.d
deleted file mode 100644
index 38344b4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_1.java
deleted file mode 100644
index a872040..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_2.d
deleted file mode 100644
index dd35d2d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_3.d
deleted file mode 100644
index 6c0eb9a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_4.d
deleted file mode 100644
index c9832e7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_5.d
deleted file mode 100644
index 281b673..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_5.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_5.java b/tools/vm-tests/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_5.java
deleted file mode 100644
index afdfb51..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_6.d b/tools/vm-tests/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_6.d
deleted file mode 100644
index 2aa078c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_float_2addr/d/T_add_float_2addr_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int/Test_add_int.java b/tools/vm-tests/src/dot/junit/opcodes/add_int/Test_add_int.java
deleted file mode 100644
index f952b82..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int/Test_add_int.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int/d/T_add_int_1.d b/tools/vm-tests/src/dot/junit/opcodes/add_int/d/T_add_int_1.d
deleted file mode 100644
index bd71e35..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int/d/T_add_int_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int/d/T_add_int_1.java b/tools/vm-tests/src/dot/junit/opcodes/add_int/d/T_add_int_1.java
deleted file mode 100644
index 6b9c617..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int/d/T_add_int_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int/d/T_add_int_2.d b/tools/vm-tests/src/dot/junit/opcodes/add_int/d/T_add_int_2.d
deleted file mode 100644
index 83cb90c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int/d/T_add_int_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int/d/T_add_int_3.d b/tools/vm-tests/src/dot/junit/opcodes/add_int/d/T_add_int_3.d
deleted file mode 100644
index 84db6e9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int/d/T_add_int_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int/d/T_add_int_4.d b/tools/vm-tests/src/dot/junit/opcodes/add_int/d/T_add_int_4.d
deleted file mode 100644
index 0ce8bbc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int/d/T_add_int_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int/d/T_add_int_5.d b/tools/vm-tests/src/dot/junit/opcodes/add_int/d/T_add_int_5.d
deleted file mode 100644
index a92add0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int/d/T_add_int_5.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int/d/T_add_int_5.java b/tools/vm-tests/src/dot/junit/opcodes/add_int/d/T_add_int_5.java
deleted file mode 100644
index fa7efca..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int/d/T_add_int_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int/d/T_add_int_6.d b/tools/vm-tests/src/dot/junit/opcodes/add_int/d/T_add_int_6.d
deleted file mode 100644
index 3dac6df..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int/d/T_add_int_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_2addr/Test_add_int_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_2addr/Test_add_int_2addr.java
deleted file mode 100644
index 4804246..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_2addr/Test_add_int_2addr.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_1.d
deleted file mode 100644
index 980379c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_1.java
deleted file mode 100644
index d5dc9c8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_2.d
deleted file mode 100644
index bc0c3ba..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_3.d
deleted file mode 100644
index c47322e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_4.d
deleted file mode 100644
index 7b4adf8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_5.d
deleted file mode 100644
index 042e671..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_5.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_5.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_5.java
deleted file mode 100644
index 5161361..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_6.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_6.d
deleted file mode 100644
index 50a14a9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_2addr/d/T_add_int_2addr_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit16/Test_add_int_lit16.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/Test_add_int_lit16.java
deleted file mode 100644
index 1400145..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/Test_add_int_lit16.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_1.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_1.d
deleted file mode 100644
index b79b0f6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_1.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_1.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_1.java
deleted file mode 100644
index 93da1b1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_10.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_10.d
deleted file mode 100644
index c8b348a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_10.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_10.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_10.java
deleted file mode 100644
index 2b30e1d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_10.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_11.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_11.d
deleted file mode 100644
index 26fe8ec..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_11.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_11.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_11.java
deleted file mode 100644
index e9e8461..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_12.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_12.d
deleted file mode 100644
index 34af2a7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_12.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_12.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_12.java
deleted file mode 100644
index bbed57b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_12.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_13.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_13.d
deleted file mode 100644
index 95fd121..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_13.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_14.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_14.d
deleted file mode 100644
index dfa3742..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_14.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_15.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_15.d
deleted file mode 100644
index 6cc4b57..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_15.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_16.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_16.d
deleted file mode 100644
index ba09106..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_16.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_16.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_16.java
deleted file mode 100644
index 50fd369..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_16.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_17.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_17.d
deleted file mode 100644
index bc66cbd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_17.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_2.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_2.d
deleted file mode 100644
index d80497f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_2.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_2.java
deleted file mode 100644
index 3a6c2c7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_3.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_3.d
deleted file mode 100644
index 3a9009d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_3.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_3.java
deleted file mode 100644
index c523fd1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_4.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_4.d
deleted file mode 100644
index 141d546..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_4.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_4.java
deleted file mode 100644
index 980de4a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_5.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_5.d
deleted file mode 100644
index 54f42ac..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_5.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_5.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_5.java
deleted file mode 100644
index f22579d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_6.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_6.d
deleted file mode 100644
index b103f66..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_6.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_6.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_6.java
deleted file mode 100644
index 342df4b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_7.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_7.d
deleted file mode 100644
index b4d689f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_7.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_7.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_7.java
deleted file mode 100644
index afd6e25..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_8.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_8.d
deleted file mode 100644
index e1aa77e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_8.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_8.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_8.java
deleted file mode 100644
index c63d9e3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_9.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_9.d
deleted file mode 100644
index 74d8cc0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_9.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_9.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_9.java
deleted file mode 100644
index 71613ff..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit16/d/T_add_int_lit16_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int_lit8/Test_add_int_lit8.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/Test_add_int_lit8.java
deleted file mode 100644
index f9b3eef..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/Test_add_int_lit8.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_1.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_1.d
deleted file mode 100644
index 5286f6e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_1.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_1.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_1.java
deleted file mode 100644
index 732ee8d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_10.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_10.d
deleted file mode 100644
index 9ef34ff..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_10.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_10.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_10.java
deleted file mode 100644
index 68c301d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_10.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_11.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_11.d
deleted file mode 100644
index 88c76b3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_11.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_11.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_11.java
deleted file mode 100644
index 43b33cc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_12.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_12.d
deleted file mode 100644
index a8776f7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_12.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_12.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_12.java
deleted file mode 100644
index cfb1577..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_12.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_13.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_13.d
deleted file mode 100644
index d5a468b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_13.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_14.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_14.d
deleted file mode 100644
index 873fff0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_14.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_15.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_15.d
deleted file mode 100644
index 28b894e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_15.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_16.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_16.d
deleted file mode 100644
index 3d4d8c1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_16.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_16.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_16.java
deleted file mode 100644
index c482a64..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_16.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_17.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_17.d
deleted file mode 100644
index 6bdf030..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_17.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_2.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_2.d
deleted file mode 100644
index ef0a0fa..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_2.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_2.java
deleted file mode 100644
index acf2a79..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_3.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_3.d
deleted file mode 100644
index 9a49def..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_3.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_3.java
deleted file mode 100644
index 8c10f8f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_4.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_4.d
deleted file mode 100644
index a3fd7dc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_4.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_4.java
deleted file mode 100644
index 06a8fad..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_5.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_5.d
deleted file mode 100644
index ab9f0ae..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_5.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_5.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_5.java
deleted file mode 100644
index 6691276..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_6.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_6.d
deleted file mode 100644
index 4ea7fdb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_6.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_6.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_6.java
deleted file mode 100644
index 122a899..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_7.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_7.d
deleted file mode 100644
index 01fdc0c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_7.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_7.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_7.java
deleted file mode 100644
index 7ec523e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_8.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_8.d
deleted file mode 100644
index 75d74b0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_8.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_8.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_8.java
deleted file mode 100644
index 957ccee..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_9.d b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_9.d
deleted file mode 100644
index a28afd0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_9.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_9.java b/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_9.java
deleted file mode 100644
index bdc657c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_int_lit8/d/T_add_int_lit8_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_long/Test_add_long.java b/tools/vm-tests/src/dot/junit/opcodes/add_long/Test_add_long.java
deleted file mode 100644
index 301879a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_long/Test_add_long.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_long/d/T_add_long_1.d b/tools/vm-tests/src/dot/junit/opcodes/add_long/d/T_add_long_1.d
deleted file mode 100644
index 2dc5518..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_long/d/T_add_long_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_long/d/T_add_long_1.java b/tools/vm-tests/src/dot/junit/opcodes/add_long/d/T_add_long_1.java
deleted file mode 100644
index a6bd026..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_long/d/T_add_long_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_long/d/T_add_long_2.d b/tools/vm-tests/src/dot/junit/opcodes/add_long/d/T_add_long_2.d
deleted file mode 100644
index 83eaa73..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_long/d/T_add_long_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_long/d/T_add_long_3.d b/tools/vm-tests/src/dot/junit/opcodes/add_long/d/T_add_long_3.d
deleted file mode 100644
index 3935188..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_long/d/T_add_long_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_long/d/T_add_long_4.d b/tools/vm-tests/src/dot/junit/opcodes/add_long/d/T_add_long_4.d
deleted file mode 100644
index 9dab202..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_long/d/T_add_long_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_long/d/T_add_long_5.d b/tools/vm-tests/src/dot/junit/opcodes/add_long/d/T_add_long_5.d
deleted file mode 100644
index 5c57aeb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_long/d/T_add_long_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_long/d/T_add_long_6.d b/tools/vm-tests/src/dot/junit/opcodes/add_long/d/T_add_long_6.d
deleted file mode 100644
index 435256f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_long/d/T_add_long_6.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_long/d/T_add_long_6.java b/tools/vm-tests/src/dot/junit/opcodes/add_long/d/T_add_long_6.java
deleted file mode 100644
index 4cdc6c5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_long/d/T_add_long_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_long_2addr/Test_add_long_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/add_long_2addr/Test_add_long_2addr.java
deleted file mode 100644
index c3ef53c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_long_2addr/Test_add_long_2addr.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_1.d
deleted file mode 100644
index ec11b7a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_1.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_1.java
deleted file mode 100644
index e799c7f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_2.d
deleted file mode 100644
index 8172613..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_3.d
deleted file mode 100644
index e10a72a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_4.d
deleted file mode 100644
index 1073b6c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_5.d
deleted file mode 100644
index 3455016..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_6.d b/tools/vm-tests/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_6.d
deleted file mode 100644
index 7c842cc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_6.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_6.java b/tools/vm-tests/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_6.java
deleted file mode 100644
index 8badad9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/add_long_2addr/d/T_add_long_2addr_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aget/Test_aget.java b/tools/vm-tests/src/dot/junit/opcodes/aget/Test_aget.java
deleted file mode 100644
index d33e943..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget/Test_aget.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aget/d/T_aget_1.d b/tools/vm-tests/src/dot/junit/opcodes/aget/d/T_aget_1.d
deleted file mode 100644
index 549fdb5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget/d/T_aget_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget/d/T_aget_1.java b/tools/vm-tests/src/dot/junit/opcodes/aget/d/T_aget_1.java
deleted file mode 100644
index 75a2874..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget/d/T_aget_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aget/d/T_aget_2.d b/tools/vm-tests/src/dot/junit/opcodes/aget/d/T_aget_2.d
deleted file mode 100644
index 2d31759..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget/d/T_aget_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget/d/T_aget_3.d b/tools/vm-tests/src/dot/junit/opcodes/aget/d/T_aget_3.d
deleted file mode 100644
index 72731ad..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget/d/T_aget_3.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget/d/T_aget_4.d b/tools/vm-tests/src/dot/junit/opcodes/aget/d/T_aget_4.d
deleted file mode 100644
index 8e3b970..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget/d/T_aget_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget/d/T_aget_5.d b/tools/vm-tests/src/dot/junit/opcodes/aget/d/T_aget_5.d
deleted file mode 100644
index e0d2005..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget/d/T_aget_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget/d/T_aget_6.d b/tools/vm-tests/src/dot/junit/opcodes/aget/d/T_aget_6.d
deleted file mode 100644
index 41a009c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget/d/T_aget_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget/d/T_aget_7.d b/tools/vm-tests/src/dot/junit/opcodes/aget/d/T_aget_7.d
deleted file mode 100644
index 8b2c021..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget/d/T_aget_7.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget/d/T_aget_8.d b/tools/vm-tests/src/dot/junit/opcodes/aget/d/T_aget_8.d
deleted file mode 100644
index e91d276..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget/d/T_aget_8.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget/d/T_aget_8.java b/tools/vm-tests/src/dot/junit/opcodes/aget/d/T_aget_8.java
deleted file mode 100644
index 1174ced..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget/d/T_aget_8.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aget/d/T_aget_9.d b/tools/vm-tests/src/dot/junit/opcodes/aget/d/T_aget_9.d
deleted file mode 100644
index 51fe7a5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget/d/T_aget_9.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_boolean/Test_aget_boolean.java b/tools/vm-tests/src/dot/junit/opcodes/aget_boolean/Test_aget_boolean.java
deleted file mode 100644
index 3d8bd6b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_boolean/Test_aget_boolean.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_1.d b/tools/vm-tests/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_1.d
deleted file mode 100644
index 6fbf9bc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_1.java b/tools/vm-tests/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_1.java
deleted file mode 100644
index 5ab595d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_2.d b/tools/vm-tests/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_2.d
deleted file mode 100644
index e858a8d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_3.d b/tools/vm-tests/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_3.d
deleted file mode 100644
index 07133df..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_3.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_4.d b/tools/vm-tests/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_4.d
deleted file mode 100644
index 28f6cb1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_5.d b/tools/vm-tests/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_5.d
deleted file mode 100644
index e1c1ffe..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_6.d b/tools/vm-tests/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_6.d
deleted file mode 100644
index ef79c81..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_7.d b/tools/vm-tests/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_7.d
deleted file mode 100644
index da3663c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_7.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_8.d b/tools/vm-tests/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_8.d
deleted file mode 100644
index 5c36f5d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_8.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_8.java b/tools/vm-tests/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_8.java
deleted file mode 100644
index ff40523..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_8.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_9.d b/tools/vm-tests/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_9.d
deleted file mode 100644
index cbd51e9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_boolean/d/T_aget_boolean_9.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_byte/Test_aget_byte.java b/tools/vm-tests/src/dot/junit/opcodes/aget_byte/Test_aget_byte.java
deleted file mode 100644
index fcaeab4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_byte/Test_aget_byte.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_1.d b/tools/vm-tests/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_1.d
deleted file mode 100644
index 2fa8a9a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_1.java b/tools/vm-tests/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_1.java
deleted file mode 100644
index 72646a2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_2.d b/tools/vm-tests/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_2.d
deleted file mode 100644
index 11eba1a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_3.d b/tools/vm-tests/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_3.d
deleted file mode 100644
index c2b426b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_4.d b/tools/vm-tests/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_4.d
deleted file mode 100644
index 905f4b9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_5.d b/tools/vm-tests/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_5.d
deleted file mode 100644
index b65b94e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_6.d b/tools/vm-tests/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_6.d
deleted file mode 100644
index 6861fa4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_7.d b/tools/vm-tests/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_7.d
deleted file mode 100644
index 03ab879..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_7.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_8.d b/tools/vm-tests/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_8.d
deleted file mode 100644
index 92f0273..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_8.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_8.java b/tools/vm-tests/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_8.java
deleted file mode 100644
index af7c391..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_8.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_9.d b/tools/vm-tests/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_9.d
deleted file mode 100644
index b2d4ffd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_byte/d/T_aget_byte_9.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_char/Test_aget_char.java b/tools/vm-tests/src/dot/junit/opcodes/aget_char/Test_aget_char.java
deleted file mode 100644
index 8871a9e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_char/Test_aget_char.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aget_char/d/T_aget_char_1.d b/tools/vm-tests/src/dot/junit/opcodes/aget_char/d/T_aget_char_1.d
deleted file mode 100644
index 0789458..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_char/d/T_aget_char_1.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_char/d/T_aget_char_1.java b/tools/vm-tests/src/dot/junit/opcodes/aget_char/d/T_aget_char_1.java
deleted file mode 100644
index b15a052..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_char/d/T_aget_char_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aget_char/d/T_aget_char_2.d b/tools/vm-tests/src/dot/junit/opcodes/aget_char/d/T_aget_char_2.d
deleted file mode 100644
index ff1b8fd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_char/d/T_aget_char_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_char/d/T_aget_char_3.d b/tools/vm-tests/src/dot/junit/opcodes/aget_char/d/T_aget_char_3.d
deleted file mode 100644
index b197a3c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_char/d/T_aget_char_3.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_char/d/T_aget_char_4.d b/tools/vm-tests/src/dot/junit/opcodes/aget_char/d/T_aget_char_4.d
deleted file mode 100644
index 53904af..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_char/d/T_aget_char_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_char/d/T_aget_char_5.d b/tools/vm-tests/src/dot/junit/opcodes/aget_char/d/T_aget_char_5.d
deleted file mode 100644
index ed9a20d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_char/d/T_aget_char_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_char/d/T_aget_char_6.d b/tools/vm-tests/src/dot/junit/opcodes/aget_char/d/T_aget_char_6.d
deleted file mode 100644
index 04cee20..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_char/d/T_aget_char_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_char/d/T_aget_char_7.d b/tools/vm-tests/src/dot/junit/opcodes/aget_char/d/T_aget_char_7.d
deleted file mode 100644
index 508f6fb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_char/d/T_aget_char_7.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_char/d/T_aget_char_8.d b/tools/vm-tests/src/dot/junit/opcodes/aget_char/d/T_aget_char_8.d
deleted file mode 100644
index daaa044..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_char/d/T_aget_char_8.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_char/d/T_aget_char_8.java b/tools/vm-tests/src/dot/junit/opcodes/aget_char/d/T_aget_char_8.java
deleted file mode 100644
index 8cf681a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_char/d/T_aget_char_8.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aget_char/d/T_aget_char_9.d b/tools/vm-tests/src/dot/junit/opcodes/aget_char/d/T_aget_char_9.d
deleted file mode 100644
index 4053996..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_char/d/T_aget_char_9.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_object/Test_aget_object.java b/tools/vm-tests/src/dot/junit/opcodes/aget_object/Test_aget_object.java
deleted file mode 100644
index 691c57c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_object/Test_aget_object.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aget_object/d/T_aget_object_1.d b/tools/vm-tests/src/dot/junit/opcodes/aget_object/d/T_aget_object_1.d
deleted file mode 100644
index 8f4a03b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_object/d/T_aget_object_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_object/d/T_aget_object_1.java b/tools/vm-tests/src/dot/junit/opcodes/aget_object/d/T_aget_object_1.java
deleted file mode 100644
index 03345c9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_object/d/T_aget_object_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aget_object/d/T_aget_object_2.d b/tools/vm-tests/src/dot/junit/opcodes/aget_object/d/T_aget_object_2.d
deleted file mode 100644
index cbdd6b4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_object/d/T_aget_object_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_object/d/T_aget_object_3.d b/tools/vm-tests/src/dot/junit/opcodes/aget_object/d/T_aget_object_3.d
deleted file mode 100644
index c89b572..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_object/d/T_aget_object_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_object/d/T_aget_object_4.d b/tools/vm-tests/src/dot/junit/opcodes/aget_object/d/T_aget_object_4.d
deleted file mode 100644
index b881a16..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_object/d/T_aget_object_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_object/d/T_aget_object_5.d b/tools/vm-tests/src/dot/junit/opcodes/aget_object/d/T_aget_object_5.d
deleted file mode 100644
index 7db8d5b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_object/d/T_aget_object_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_object/d/T_aget_object_6.d b/tools/vm-tests/src/dot/junit/opcodes/aget_object/d/T_aget_object_6.d
deleted file mode 100644
index a349943..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_object/d/T_aget_object_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_object/d/T_aget_object_7.d b/tools/vm-tests/src/dot/junit/opcodes/aget_object/d/T_aget_object_7.d
deleted file mode 100644
index 8b904d2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_object/d/T_aget_object_7.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_object/d/T_aget_object_8.d b/tools/vm-tests/src/dot/junit/opcodes/aget_object/d/T_aget_object_8.d
deleted file mode 100644
index 89ee37d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_object/d/T_aget_object_8.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_object/d/T_aget_object_8.java b/tools/vm-tests/src/dot/junit/opcodes/aget_object/d/T_aget_object_8.java
deleted file mode 100644
index c8b33e2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_object/d/T_aget_object_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aget_object/d/T_aget_object_9.d b/tools/vm-tests/src/dot/junit/opcodes/aget_object/d/T_aget_object_9.d
deleted file mode 100644
index e977101..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_object/d/T_aget_object_9.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_short/Test_aget_short.java b/tools/vm-tests/src/dot/junit/opcodes/aget_short/Test_aget_short.java
deleted file mode 100644
index b0a12e5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_short/Test_aget_short.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aget_short/d/T_aget_short_1.d b/tools/vm-tests/src/dot/junit/opcodes/aget_short/d/T_aget_short_1.d
deleted file mode 100644
index 3a1d451..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_short/d/T_aget_short_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_short/d/T_aget_short_1.java b/tools/vm-tests/src/dot/junit/opcodes/aget_short/d/T_aget_short_1.java
deleted file mode 100644
index d3ff01a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_short/d/T_aget_short_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aget_short/d/T_aget_short_2.d b/tools/vm-tests/src/dot/junit/opcodes/aget_short/d/T_aget_short_2.d
deleted file mode 100644
index 67bb914..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_short/d/T_aget_short_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_short/d/T_aget_short_3.d b/tools/vm-tests/src/dot/junit/opcodes/aget_short/d/T_aget_short_3.d
deleted file mode 100644
index e55e873..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_short/d/T_aget_short_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_short/d/T_aget_short_4.d b/tools/vm-tests/src/dot/junit/opcodes/aget_short/d/T_aget_short_4.d
deleted file mode 100644
index 36e9428..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_short/d/T_aget_short_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_short/d/T_aget_short_5.d b/tools/vm-tests/src/dot/junit/opcodes/aget_short/d/T_aget_short_5.d
deleted file mode 100644
index 990a231..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_short/d/T_aget_short_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_short/d/T_aget_short_6.d b/tools/vm-tests/src/dot/junit/opcodes/aget_short/d/T_aget_short_6.d
deleted file mode 100644
index 5490c9f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_short/d/T_aget_short_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_short/d/T_aget_short_7.d b/tools/vm-tests/src/dot/junit/opcodes/aget_short/d/T_aget_short_7.d
deleted file mode 100644
index 06e1029..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_short/d/T_aget_short_7.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_short/d/T_aget_short_8.d b/tools/vm-tests/src/dot/junit/opcodes/aget_short/d/T_aget_short_8.d
deleted file mode 100644
index 92f0d1c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_short/d/T_aget_short_8.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_short/d/T_aget_short_8.java b/tools/vm-tests/src/dot/junit/opcodes/aget_short/d/T_aget_short_8.java
deleted file mode 100644
index d661d27..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_short/d/T_aget_short_8.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aget_short/d/T_aget_short_9.d b/tools/vm-tests/src/dot/junit/opcodes/aget_short/d/T_aget_short_9.d
deleted file mode 100644
index d337120..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_short/d/T_aget_short_9.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_wide/Test_aget_wide.java b/tools/vm-tests/src/dot/junit/opcodes/aget_wide/Test_aget_wide.java
deleted file mode 100644
index 73b3357..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_wide/Test_aget_wide.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_1.d b/tools/vm-tests/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_1.d
deleted file mode 100644
index 08d842a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_1.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_1.java b/tools/vm-tests/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_1.java
deleted file mode 100644
index fdc8575..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_10.d b/tools/vm-tests/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_10.d
deleted file mode 100644
index 5bbac0d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_10.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_10.java b/tools/vm-tests/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_10.java
deleted file mode 100644
index c5f66a2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_10.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_11.d b/tools/vm-tests/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_11.d
deleted file mode 100644
index e174a37..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_11.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_2.d b/tools/vm-tests/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_2.d
deleted file mode 100644
index 5372845..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_2.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_2.java b/tools/vm-tests/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_2.java
deleted file mode 100644
index 1b2aace..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_3.d b/tools/vm-tests/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_3.d
deleted file mode 100644
index cf462df..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_3.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_5.d b/tools/vm-tests/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_5.d
deleted file mode 100644
index 1c407ba..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_6.d b/tools/vm-tests/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_6.d
deleted file mode 100644
index 39054f3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_6.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_7.d b/tools/vm-tests/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_7.d
deleted file mode 100644
index ace153e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_7.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_8.d b/tools/vm-tests/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_8.d
deleted file mode 100644
index dfe1b21..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_8.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_9.d b/tools/vm-tests/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_9.d
deleted file mode 100644
index fe00c45..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aget_wide/d/T_aget_wide_9.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int/Test_and_int.java b/tools/vm-tests/src/dot/junit/opcodes/and_int/Test_and_int.java
deleted file mode 100644
index 1422844..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int/Test_and_int.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/and_int/d/T_and_int_1.d b/tools/vm-tests/src/dot/junit/opcodes/and_int/d/T_and_int_1.d
deleted file mode 100644
index b1f2984..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int/d/T_and_int_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int/d/T_and_int_1.java b/tools/vm-tests/src/dot/junit/opcodes/and_int/d/T_and_int_1.java
deleted file mode 100644
index 72c1c1e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int/d/T_and_int_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/and_int/d/T_and_int_2.d b/tools/vm-tests/src/dot/junit/opcodes/and_int/d/T_and_int_2.d
deleted file mode 100644
index f57ddbc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int/d/T_and_int_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int/d/T_and_int_3.d b/tools/vm-tests/src/dot/junit/opcodes/and_int/d/T_and_int_3.d
deleted file mode 100644
index 033b3af..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int/d/T_and_int_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int/d/T_and_int_4.d b/tools/vm-tests/src/dot/junit/opcodes/and_int/d/T_and_int_4.d
deleted file mode 100644
index 9759124..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int/d/T_and_int_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int/d/T_and_int_5.d b/tools/vm-tests/src/dot/junit/opcodes/and_int/d/T_and_int_5.d
deleted file mode 100644
index b7480ff..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int/d/T_and_int_5.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int/d/T_and_int_5.java b/tools/vm-tests/src/dot/junit/opcodes/and_int/d/T_and_int_5.java
deleted file mode 100644
index 4f547a4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int/d/T_and_int_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/and_int/d/T_and_int_6.d b/tools/vm-tests/src/dot/junit/opcodes/and_int/d/T_and_int_6.d
deleted file mode 100644
index 7a3d212..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int/d/T_and_int_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int_2addr/Test_and_int_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/and_int_2addr/Test_and_int_2addr.java
deleted file mode 100644
index bc8848b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_2addr/Test_and_int_2addr.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_1.d
deleted file mode 100644
index faf2f0f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_1.java
deleted file mode 100644
index 4df72cd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_2.d
deleted file mode 100644
index 5906582..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_3.d
deleted file mode 100644
index 4d26208..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_4.d
deleted file mode 100644
index 6bfff72..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_5.d
deleted file mode 100644
index c7183c6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_5.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_5.java b/tools/vm-tests/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_5.java
deleted file mode 100644
index 3cbb301..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_6.d b/tools/vm-tests/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_6.d
deleted file mode 100644
index b5d1901..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_2addr/d/T_and_int_2addr_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int_lit16/Test_and_int_lit16.java b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/Test_and_int_lit16.java
deleted file mode 100644
index c1c8bc6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/Test_and_int_lit16.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_1.d b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_1.d
deleted file mode 100644
index ebc9f85..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_1.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_1.java b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_1.java
deleted file mode 100644
index 1f166e3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_10.d b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_10.d
deleted file mode 100644
index ce46afc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_10.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_2.d b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_2.d
deleted file mode 100644
index a76ada7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_2.java b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_2.java
deleted file mode 100644
index aa93cc7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_3.d b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_3.d
deleted file mode 100644
index c5f54e3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_3.java b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_3.java
deleted file mode 100644
index 93558cf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_4.d b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_4.d
deleted file mode 100644
index 7f31097..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_4.java b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_4.java
deleted file mode 100644
index 12913cb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_5.d b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_5.d
deleted file mode 100644
index d7c68f3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_5.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_5.java b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_5.java
deleted file mode 100644
index 04e22b4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_6.d b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_6.d
deleted file mode 100644
index 9c94b7e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_6.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_7.d b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_7.d
deleted file mode 100644
index a272dfa..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_7.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_8.d b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_8.d
deleted file mode 100644
index 614d2b1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_8.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_9.d b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_9.d
deleted file mode 100644
index 23b9e82..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_9.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_9.java b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_9.java
deleted file mode 100644
index 0af1796..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit16/d/T_and_int_lit16_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/and_int_lit8/Test_and_int_lit8.java b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/Test_and_int_lit8.java
deleted file mode 100644
index 8fb6fbb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/Test_and_int_lit8.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_1.d b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_1.d
deleted file mode 100644
index c357564..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_1.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_1.java b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_1.java
deleted file mode 100644
index e5972bf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_10.d b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_10.d
deleted file mode 100644
index d9a6181..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_10.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_2.d b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_2.d
deleted file mode 100644
index 4161d0e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_2.java b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_2.java
deleted file mode 100644
index ed12bb0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_3.d b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_3.d
deleted file mode 100644
index 7b5fd5d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_3.java b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_3.java
deleted file mode 100644
index 194af5b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_4.d b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_4.d
deleted file mode 100644
index 5b2fd88..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_4.java b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_4.java
deleted file mode 100644
index ac41a53..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_5.d b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_5.d
deleted file mode 100644
index 9634339..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_5.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_5.java b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_5.java
deleted file mode 100644
index 7d1e6d0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_6.d b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_6.d
deleted file mode 100644
index 7e6a548..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_6.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_7.d b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_7.d
deleted file mode 100644
index e09f8bd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_7.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_8.d b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_8.d
deleted file mode 100644
index 78936ff..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_8.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_9.d b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_9.d
deleted file mode 100644
index cb63071..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_9.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_9.java b/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_9.java
deleted file mode 100644
index 27542f7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_int_lit8/d/T_and_int_lit8_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/and_long/Test_and_long.java b/tools/vm-tests/src/dot/junit/opcodes/and_long/Test_and_long.java
deleted file mode 100644
index e2ab252..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_long/Test_and_long.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/and_long/d/T_and_long_1.d b/tools/vm-tests/src/dot/junit/opcodes/and_long/d/T_and_long_1.d
deleted file mode 100644
index 9bdc34e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_long/d/T_and_long_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_long/d/T_and_long_1.java b/tools/vm-tests/src/dot/junit/opcodes/and_long/d/T_and_long_1.java
deleted file mode 100644
index 9e2b07b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_long/d/T_and_long_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/and_long/d/T_and_long_2.d b/tools/vm-tests/src/dot/junit/opcodes/and_long/d/T_and_long_2.d
deleted file mode 100644
index 7c9185c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_long/d/T_and_long_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_long/d/T_and_long_3.d b/tools/vm-tests/src/dot/junit/opcodes/and_long/d/T_and_long_3.d
deleted file mode 100644
index b68acff..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_long/d/T_and_long_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_long/d/T_and_long_4.d b/tools/vm-tests/src/dot/junit/opcodes/and_long/d/T_and_long_4.d
deleted file mode 100644
index 97a1bcb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_long/d/T_and_long_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_long/d/T_and_long_5.d b/tools/vm-tests/src/dot/junit/opcodes/and_long/d/T_and_long_5.d
deleted file mode 100644
index b6948ec..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_long/d/T_and_long_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_long/d/T_and_long_6.d b/tools/vm-tests/src/dot/junit/opcodes/and_long/d/T_and_long_6.d
deleted file mode 100644
index 26ae8a5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_long/d/T_and_long_6.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_long/d/T_and_long_6.java b/tools/vm-tests/src/dot/junit/opcodes/and_long/d/T_and_long_6.java
deleted file mode 100644
index 051a52a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_long/d/T_and_long_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/and_long_2addr/Test_and_long_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/and_long_2addr/Test_and_long_2addr.java
deleted file mode 100644
index 34d2fc7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_long_2addr/Test_and_long_2addr.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_1.d
deleted file mode 100644
index aa61af9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_1.java
deleted file mode 100644
index 3b6d259..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_2.d
deleted file mode 100644
index e1a4376..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_3.d
deleted file mode 100644
index ba10fe6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_4.d
deleted file mode 100644
index 9882eb3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_5.d
deleted file mode 100644
index e7bb059..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_6.d b/tools/vm-tests/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_6.d
deleted file mode 100644
index b7ee27e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_6.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_6.java b/tools/vm-tests/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_6.java
deleted file mode 100644
index dd6a41d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/and_long_2addr/d/T_and_long_2addr_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aput/Test_aput.java b/tools/vm-tests/src/dot/junit/opcodes/aput/Test_aput.java
deleted file mode 100644
index 52ea328..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput/Test_aput.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aput/d/T_aput_1.d b/tools/vm-tests/src/dot/junit/opcodes/aput/d/T_aput_1.d
deleted file mode 100644
index 0c46208..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput/d/T_aput_1.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput/d/T_aput_1.java b/tools/vm-tests/src/dot/junit/opcodes/aput/d/T_aput_1.java
deleted file mode 100644
index d9c47a5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput/d/T_aput_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aput/d/T_aput_2.d b/tools/vm-tests/src/dot/junit/opcodes/aput/d/T_aput_2.d
deleted file mode 100644
index 7ef7585..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput/d/T_aput_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput/d/T_aput_3.d b/tools/vm-tests/src/dot/junit/opcodes/aput/d/T_aput_3.d
deleted file mode 100644
index f2872a0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput/d/T_aput_3.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput/d/T_aput_4.d b/tools/vm-tests/src/dot/junit/opcodes/aput/d/T_aput_4.d
deleted file mode 100644
index 6070220..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput/d/T_aput_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput/d/T_aput_5.d b/tools/vm-tests/src/dot/junit/opcodes/aput/d/T_aput_5.d
deleted file mode 100644
index 9a37f62..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput/d/T_aput_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput/d/T_aput_6.d b/tools/vm-tests/src/dot/junit/opcodes/aput/d/T_aput_6.d
deleted file mode 100644
index 82dc6ac..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput/d/T_aput_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput/d/T_aput_7.d b/tools/vm-tests/src/dot/junit/opcodes/aput/d/T_aput_7.d
deleted file mode 100644
index 66017e3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput/d/T_aput_7.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput/d/T_aput_8.d b/tools/vm-tests/src/dot/junit/opcodes/aput/d/T_aput_8.d
deleted file mode 100644
index 1f56222..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput/d/T_aput_8.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput/d/T_aput_8.java b/tools/vm-tests/src/dot/junit/opcodes/aput/d/T_aput_8.java
deleted file mode 100644
index 87c6e5c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput/d/T_aput_8.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aput/d/T_aput_9.d b/tools/vm-tests/src/dot/junit/opcodes/aput/d/T_aput_9.d
deleted file mode 100644
index 73c5932..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput/d/T_aput_9.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_boolean/Test_aput_boolean.java b/tools/vm-tests/src/dot/junit/opcodes/aput_boolean/Test_aput_boolean.java
deleted file mode 100644
index 0ab9d04..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_boolean/Test_aput_boolean.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_1.d b/tools/vm-tests/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_1.d
deleted file mode 100644
index 0d97f3c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_1.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_1.java b/tools/vm-tests/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_1.java
deleted file mode 100644
index 15a0fcf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_10.d b/tools/vm-tests/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_10.d
deleted file mode 100644
index 64eb60e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_10.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_2.d b/tools/vm-tests/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_2.d
deleted file mode 100644
index 2f73747..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_3.d b/tools/vm-tests/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_3.d
deleted file mode 100644
index 9eae917..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_3.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_4.d b/tools/vm-tests/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_4.d
deleted file mode 100644
index 54f5a19..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_5.d b/tools/vm-tests/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_5.d
deleted file mode 100644
index ecaf950..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_6.d b/tools/vm-tests/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_6.d
deleted file mode 100644
index db2bf25..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_7.d b/tools/vm-tests/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_7.d
deleted file mode 100644
index 7e9ed2f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_7.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_8.d b/tools/vm-tests/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_8.d
deleted file mode 100644
index bf92b91..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_8.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_8.java b/tools/vm-tests/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_8.java
deleted file mode 100644
index 09606e6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_8.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_9.d b/tools/vm-tests/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_9.d
deleted file mode 100644
index e42fd3a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_9.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_byte/Test_aput_byte.java b/tools/vm-tests/src/dot/junit/opcodes/aput_byte/Test_aput_byte.java
deleted file mode 100644
index 3c43916..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_byte/Test_aput_byte.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_1.d b/tools/vm-tests/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_1.d
deleted file mode 100644
index 097ae50..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_1.java b/tools/vm-tests/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_1.java
deleted file mode 100644
index 57561be..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_10.d b/tools/vm-tests/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_10.d
deleted file mode 100644
index b65ae76..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_10.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_2.d b/tools/vm-tests/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_2.d
deleted file mode 100644
index 55f781e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_3.d b/tools/vm-tests/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_3.d
deleted file mode 100644
index 5684437..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_3.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_4.d b/tools/vm-tests/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_4.d
deleted file mode 100644
index 06e4eff..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_5.d b/tools/vm-tests/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_5.d
deleted file mode 100644
index 2835e5b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_6.d b/tools/vm-tests/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_6.d
deleted file mode 100644
index 66da57c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_7.d b/tools/vm-tests/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_7.d
deleted file mode 100644
index 4fb862b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_7.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_8.d b/tools/vm-tests/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_8.d
deleted file mode 100644
index 0c4914e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_8.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_8.java b/tools/vm-tests/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_8.java
deleted file mode 100644
index 00f9d64..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_8.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_9.d b/tools/vm-tests/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_9.d
deleted file mode 100644
index e644e87..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_9.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_char/Test_aput_char.java b/tools/vm-tests/src/dot/junit/opcodes/aput_char/Test_aput_char.java
deleted file mode 100644
index 4253346..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_char/Test_aput_char.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aput_char/d/T_aput_char_1.d b/tools/vm-tests/src/dot/junit/opcodes/aput_char/d/T_aput_char_1.d
deleted file mode 100644
index 409eade..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_char/d/T_aput_char_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_char/d/T_aput_char_1.java b/tools/vm-tests/src/dot/junit/opcodes/aput_char/d/T_aput_char_1.java
deleted file mode 100644
index 65f4cd3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_char/d/T_aput_char_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aput_char/d/T_aput_char_10.d b/tools/vm-tests/src/dot/junit/opcodes/aput_char/d/T_aput_char_10.d
deleted file mode 100644
index dd68792..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_char/d/T_aput_char_10.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_char/d/T_aput_char_2.d b/tools/vm-tests/src/dot/junit/opcodes/aput_char/d/T_aput_char_2.d
deleted file mode 100644
index 0408006..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_char/d/T_aput_char_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_char/d/T_aput_char_3.d b/tools/vm-tests/src/dot/junit/opcodes/aput_char/d/T_aput_char_3.d
deleted file mode 100644
index 5010da6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_char/d/T_aput_char_3.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_char/d/T_aput_char_4.d b/tools/vm-tests/src/dot/junit/opcodes/aput_char/d/T_aput_char_4.d
deleted file mode 100644
index 67d67ec..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_char/d/T_aput_char_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_char/d/T_aput_char_5.d b/tools/vm-tests/src/dot/junit/opcodes/aput_char/d/T_aput_char_5.d
deleted file mode 100644
index cd0384a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_char/d/T_aput_char_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_char/d/T_aput_char_6.d b/tools/vm-tests/src/dot/junit/opcodes/aput_char/d/T_aput_char_6.d
deleted file mode 100644
index 2a2381d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_char/d/T_aput_char_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_char/d/T_aput_char_7.d b/tools/vm-tests/src/dot/junit/opcodes/aput_char/d/T_aput_char_7.d
deleted file mode 100644
index b1e4c9f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_char/d/T_aput_char_7.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_char/d/T_aput_char_8.d b/tools/vm-tests/src/dot/junit/opcodes/aput_char/d/T_aput_char_8.d
deleted file mode 100644
index f78376d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_char/d/T_aput_char_8.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_char/d/T_aput_char_8.java b/tools/vm-tests/src/dot/junit/opcodes/aput_char/d/T_aput_char_8.java
deleted file mode 100644
index ea02ba1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_char/d/T_aput_char_8.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aput_char/d/T_aput_char_9.d b/tools/vm-tests/src/dot/junit/opcodes/aput_char/d/T_aput_char_9.d
deleted file mode 100644
index 1077039..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_char/d/T_aput_char_9.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_object/Test_aput_object.java b/tools/vm-tests/src/dot/junit/opcodes/aput_object/Test_aput_object.java
deleted file mode 100644
index cb50224..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_object/Test_aput_object.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aput_object/d/T_aput_object_1.d b/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_1.d
deleted file mode 100644
index c629f3c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_1.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_object/d/T_aput_object_1.java b/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_1.java
deleted file mode 100644
index 1361e82..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aput_object/d/T_aput_object_10.d b/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_10.d
deleted file mode 100644
index a11e1ba..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_10.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_object/d/T_aput_object_11.d b/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_11.d
deleted file mode 100644
index 1b4f7ae..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_11.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_object/d/T_aput_object_12.d b/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_12.d
deleted file mode 100644
index 35160aa..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_12.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_object/d/T_aput_object_12.java b/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_12.java
deleted file mode 100644
index f55edbb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_12.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aput_object/d/T_aput_object_13.d b/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_13.d
deleted file mode 100644
index f9670ac..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_13.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_object/d/T_aput_object_2.d b/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_2.d
deleted file mode 100644
index 4e1cad0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_object/d/T_aput_object_2.java b/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_2.java
deleted file mode 100644
index 4b2204e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aput_object/d/T_aput_object_3.d b/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_3.d
deleted file mode 100644
index 4b2642d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_3.d
+++ /dev/null
@@ -1,132 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/aput_object/d/T_aput_object_3.java b/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_3.java
deleted file mode 100644
index 1a90fd1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aput_object/d/T_aput_object_4.d b/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_4.d
deleted file mode 100644
index f79b817..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_4.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_object/d/T_aput_object_4.java b/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_4.java
deleted file mode 100644
index 52e935b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_4.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aput_object/d/T_aput_object_5.d b/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_5.d
deleted file mode 100644
index 441ac56..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_5.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_object/d/T_aput_object_6.d b/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_6.d
deleted file mode 100644
index 5786bbb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_6.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_object/d/T_aput_object_7.d b/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_7.d
deleted file mode 100644
index dfdc953..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_7.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_object/d/T_aput_object_8.d b/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_8.d
deleted file mode 100644
index e6259bf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_8.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_object/d/T_aput_object_9.d b/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_9.d
deleted file mode 100644
index 96bced3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_object/d/T_aput_object_9.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_short/Test_aput_short.java b/tools/vm-tests/src/dot/junit/opcodes/aput_short/Test_aput_short.java
deleted file mode 100644
index 350d999..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_short/Test_aput_short.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aput_short/d/T_aput_short_1.d b/tools/vm-tests/src/dot/junit/opcodes/aput_short/d/T_aput_short_1.d
deleted file mode 100644
index f89cbb6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_short/d/T_aput_short_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_short/d/T_aput_short_1.java b/tools/vm-tests/src/dot/junit/opcodes/aput_short/d/T_aput_short_1.java
deleted file mode 100644
index 42cefa9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_short/d/T_aput_short_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aput_short/d/T_aput_short_10.d b/tools/vm-tests/src/dot/junit/opcodes/aput_short/d/T_aput_short_10.d
deleted file mode 100644
index bbb541c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_short/d/T_aput_short_10.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_short/d/T_aput_short_2.d b/tools/vm-tests/src/dot/junit/opcodes/aput_short/d/T_aput_short_2.d
deleted file mode 100644
index 9d63757..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_short/d/T_aput_short_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_short/d/T_aput_short_3.d b/tools/vm-tests/src/dot/junit/opcodes/aput_short/d/T_aput_short_3.d
deleted file mode 100644
index c9990b4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_short/d/T_aput_short_3.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_short/d/T_aput_short_4.d b/tools/vm-tests/src/dot/junit/opcodes/aput_short/d/T_aput_short_4.d
deleted file mode 100644
index 24b2d92..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_short/d/T_aput_short_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_short/d/T_aput_short_5.d b/tools/vm-tests/src/dot/junit/opcodes/aput_short/d/T_aput_short_5.d
deleted file mode 100644
index 4a9dabc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_short/d/T_aput_short_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_short/d/T_aput_short_6.d b/tools/vm-tests/src/dot/junit/opcodes/aput_short/d/T_aput_short_6.d
deleted file mode 100644
index ed8cfd3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_short/d/T_aput_short_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_short/d/T_aput_short_7.d b/tools/vm-tests/src/dot/junit/opcodes/aput_short/d/T_aput_short_7.d
deleted file mode 100644
index 9927025..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_short/d/T_aput_short_7.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_short/d/T_aput_short_8.d b/tools/vm-tests/src/dot/junit/opcodes/aput_short/d/T_aput_short_8.d
deleted file mode 100644
index 099de06..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_short/d/T_aput_short_8.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_short/d/T_aput_short_8.java b/tools/vm-tests/src/dot/junit/opcodes/aput_short/d/T_aput_short_8.java
deleted file mode 100644
index e973865..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_short/d/T_aput_short_8.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aput_short/d/T_aput_short_9.d b/tools/vm-tests/src/dot/junit/opcodes/aput_short/d/T_aput_short_9.d
deleted file mode 100644
index 46efab3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_short/d/T_aput_short_9.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_wide/Test_aput_wide.java b/tools/vm-tests/src/dot/junit/opcodes/aput_wide/Test_aput_wide.java
deleted file mode 100644
index 4b7f0ad..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_wide/Test_aput_wide.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_1.d b/tools/vm-tests/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_1.d
deleted file mode 100644
index 2890417..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_1.java b/tools/vm-tests/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_1.java
deleted file mode 100644
index 385db2e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_10.d b/tools/vm-tests/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_10.d
deleted file mode 100644
index bf314a2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_10.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_2.d b/tools/vm-tests/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_2.d
deleted file mode 100644
index 793338f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_2.java b/tools/vm-tests/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_2.java
deleted file mode 100644
index e333794..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_3.d b/tools/vm-tests/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_3.d
deleted file mode 100644
index 4486392..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_3.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_4.d b/tools/vm-tests/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_4.d
deleted file mode 100644
index 980724f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_5.d b/tools/vm-tests/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_5.d
deleted file mode 100644
index f4d3354..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_6.d b/tools/vm-tests/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_6.d
deleted file mode 100644
index e5f58d2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_6.java b/tools/vm-tests/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_6.java
deleted file mode 100644
index d1466a3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_6.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_7.d b/tools/vm-tests/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_7.d
deleted file mode 100644
index c862b0d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_7.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_8.d b/tools/vm-tests/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_8.d
deleted file mode 100644
index 06e1aa0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_8.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_9.d b/tools/vm-tests/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_9.d
deleted file mode 100644
index 41777df..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_9.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_9.java b/tools/vm-tests/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_9.java
deleted file mode 100644
index c08f9be..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/aput_wide/d/T_aput_wide_9.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/array_length/Test_array_length.java b/tools/vm-tests/src/dot/junit/opcodes/array_length/Test_array_length.java
deleted file mode 100644
index f49cccb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/array_length/Test_array_length.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/array_length/d/T_array_length_1.d b/tools/vm-tests/src/dot/junit/opcodes/array_length/d/T_array_length_1.d
deleted file mode 100644
index 3981009..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/array_length/d/T_array_length_1.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/array_length/d/T_array_length_1.java b/tools/vm-tests/src/dot/junit/opcodes/array_length/d/T_array_length_1.java
deleted file mode 100644
index fd30072..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/array_length/d/T_array_length_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/array_length/d/T_array_length_2.d b/tools/vm-tests/src/dot/junit/opcodes/array_length/d/T_array_length_2.d
deleted file mode 100644
index b1b015c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/array_length/d/T_array_length_2.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/array_length/d/T_array_length_3.d b/tools/vm-tests/src/dot/junit/opcodes/array_length/d/T_array_length_3.d
deleted file mode 100644
index 01bdaf0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/array_length/d/T_array_length_3.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/array_length/d/T_array_length_4.d b/tools/vm-tests/src/dot/junit/opcodes/array_length/d/T_array_length_4.d
deleted file mode 100644
index af48dfb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/array_length/d/T_array_length_4.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/array_length/d/T_array_length_4.java b/tools/vm-tests/src/dot/junit/opcodes/array_length/d/T_array_length_4.java
deleted file mode 100644
index b3fa51f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/array_length/d/T_array_length_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/array_length/d/T_array_length_5.d b/tools/vm-tests/src/dot/junit/opcodes/array_length/d/T_array_length_5.d
deleted file mode 100644
index c7b1f9e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/array_length/d/T_array_length_5.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/check_cast/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/check_cast/TestStubs.java
deleted file mode 100644
index 67f8f04..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/check_cast/TestStubs.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/check_cast/Test_check_cast.java b/tools/vm-tests/src/dot/junit/opcodes/check_cast/Test_check_cast.java
deleted file mode 100644
index 78a0479..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/check_cast/Test_check_cast.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/check_cast/d/T_check_cast_1.d b/tools/vm-tests/src/dot/junit/opcodes/check_cast/d/T_check_cast_1.d
deleted file mode 100644
index 9c2f074..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/check_cast/d/T_check_cast_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/check_cast/d/T_check_cast_1.java b/tools/vm-tests/src/dot/junit/opcodes/check_cast/d/T_check_cast_1.java
deleted file mode 100644
index 4387def..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/check_cast/d/T_check_cast_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/check_cast/d/T_check_cast_2.d b/tools/vm-tests/src/dot/junit/opcodes/check_cast/d/T_check_cast_2.d
deleted file mode 100644
index b7472cc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/check_cast/d/T_check_cast_2.d
+++ /dev/null
@@ -1,149 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/check_cast/d/T_check_cast_2.java b/tools/vm-tests/src/dot/junit/opcodes/check_cast/d/T_check_cast_2.java
deleted file mode 100644
index 5e55188..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/check_cast/d/T_check_cast_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/check_cast/d/T_check_cast_3.d b/tools/vm-tests/src/dot/junit/opcodes/check_cast/d/T_check_cast_3.d
deleted file mode 100644
index d269a31..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/check_cast/d/T_check_cast_3.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/check_cast/d/T_check_cast_3.java b/tools/vm-tests/src/dot/junit/opcodes/check_cast/d/T_check_cast_3.java
deleted file mode 100644
index 4c4f153..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/check_cast/d/T_check_cast_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/check_cast/d/T_check_cast_4.d b/tools/vm-tests/src/dot/junit/opcodes/check_cast/d/T_check_cast_4.d
deleted file mode 100644
index 77e28d2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/check_cast/d/T_check_cast_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/check_cast/d/T_check_cast_4.dfh b/tools/vm-tests/src/dot/junit/opcodes/check_cast/d/T_check_cast_4.dfh
deleted file mode 100644
index ed092c6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/check_cast/d/T_check_cast_4.dfh
+++ /dev/null
@@ -1,264 +0,0 @@
-// 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/src/dot/junit/opcodes/check_cast/d/T_check_cast_5.d b/tools/vm-tests/src/dot/junit/opcodes/check_cast/d/T_check_cast_5.d
deleted file mode 100644
index b76a68e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/check_cast/d/T_check_cast_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/check_cast/d/T_check_cast_6.d b/tools/vm-tests/src/dot/junit/opcodes/check_cast/d/T_check_cast_6.d
deleted file mode 100644
index 7e26639..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/check_cast/d/T_check_cast_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/check_cast/d/T_check_cast_7.d b/tools/vm-tests/src/dot/junit/opcodes/check_cast/d/T_check_cast_7.d
deleted file mode 100644
index 8c7af68..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/check_cast/d/T_check_cast_7.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/check_cast/d/T_check_cast_7.java b/tools/vm-tests/src/dot/junit/opcodes/check_cast/d/T_check_cast_7.java
deleted file mode 100644
index fa941a0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/check_cast/d/T_check_cast_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/check_cast/d/T_check_cast_8.d b/tools/vm-tests/src/dot/junit/opcodes/check_cast/d/T_check_cast_8.d
deleted file mode 100644
index 645436f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/check_cast/d/T_check_cast_8.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/check_cast/d/T_check_cast_9.d b/tools/vm-tests/src/dot/junit/opcodes/check_cast/d/T_check_cast_9.d
deleted file mode 100644
index e44cc10..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/check_cast/d/T_check_cast_9.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/check_cast/d/T_check_cast_9.dfh b/tools/vm-tests/src/dot/junit/opcodes/check_cast/d/T_check_cast_9.dfh
deleted file mode 100644
index 419f6e9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/check_cast/d/T_check_cast_9.dfh
+++ /dev/null
@@ -1,264 +0,0 @@
-// 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/src/dot/junit/opcodes/cmp_long/Test_cmp_long.java b/tools/vm-tests/src/dot/junit/opcodes/cmp_long/Test_cmp_long.java
deleted file mode 100644
index e2a1994..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmp_long/Test_cmp_long.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_1.d b/tools/vm-tests/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_1.d
deleted file mode 100644
index 60b9654..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_1.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_1.java b/tools/vm-tests/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_1.java
deleted file mode 100644
index 10a78e9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_1.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_2.d b/tools/vm-tests/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_2.d
deleted file mode 100644
index e3bdfd4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_2.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_2.java b/tools/vm-tests/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_2.java
deleted file mode 100644
index 4674e7a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_3.d b/tools/vm-tests/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_3.d
deleted file mode 100644
index 3d25d6b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_3.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_4.d b/tools/vm-tests/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_4.d
deleted file mode 100644
index 32c3050..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_5.d b/tools/vm-tests/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_5.d
deleted file mode 100644
index 9e86284..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_6.d b/tools/vm-tests/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_6.d
deleted file mode 100644
index 15ac1cd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmp_long/d/T_cmp_long_6.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/cmpg_double/Test_cmpg_double.java b/tools/vm-tests/src/dot/junit/opcodes/cmpg_double/Test_cmpg_double.java
deleted file mode 100644
index fbf47a3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpg_double/Test_cmpg_double.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_1.d b/tools/vm-tests/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_1.d
deleted file mode 100644
index a76c3b4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_1.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_1.java b/tools/vm-tests/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_1.java
deleted file mode 100644
index 8488914..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_1.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_2.d b/tools/vm-tests/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_2.d
deleted file mode 100644
index 5704511..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_3.d b/tools/vm-tests/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_3.d
deleted file mode 100644
index 78d65ac..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_3.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_3.java b/tools/vm-tests/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_3.java
deleted file mode 100644
index d5b8ca5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_4.d b/tools/vm-tests/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_4.d
deleted file mode 100644
index e38307c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_5.d b/tools/vm-tests/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_5.d
deleted file mode 100644
index bd43151..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_5.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_6.d b/tools/vm-tests/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_6.d
deleted file mode 100644
index 70c7f72..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpg_double/d/T_cmpg_double_6.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/cmpg_float/Test_cmpg_float.java b/tools/vm-tests/src/dot/junit/opcodes/cmpg_float/Test_cmpg_float.java
deleted file mode 100644
index 1ff20a5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpg_float/Test_cmpg_float.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_1.d b/tools/vm-tests/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_1.d
deleted file mode 100644
index a32772d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_1.java b/tools/vm-tests/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_1.java
deleted file mode 100644
index 9e3eb7e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_1.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_2.d b/tools/vm-tests/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_2.d
deleted file mode 100644
index abaed4c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_2.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_3.d b/tools/vm-tests/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_3.d
deleted file mode 100644
index f741d1e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_3.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_4.d b/tools/vm-tests/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_4.d
deleted file mode 100644
index f40f08e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_5.d b/tools/vm-tests/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_5.d
deleted file mode 100644
index 46a019a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_6.d b/tools/vm-tests/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_6.d
deleted file mode 100644
index 1051f14..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_6.java b/tools/vm-tests/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_6.java
deleted file mode 100644
index 8a785ca..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpg_float/d/T_cmpg_float_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/cmpl_double/Test_cmpl_double.java b/tools/vm-tests/src/dot/junit/opcodes/cmpl_double/Test_cmpl_double.java
deleted file mode 100644
index 9f54c52..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpl_double/Test_cmpl_double.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_1.d b/tools/vm-tests/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_1.d
deleted file mode 100644
index 03a840e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_1.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_1.java b/tools/vm-tests/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_1.java
deleted file mode 100644
index cb1587f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_1.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_2.d b/tools/vm-tests/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_2.d
deleted file mode 100644
index 49566ce..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_3.d b/tools/vm-tests/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_3.d
deleted file mode 100644
index e132fa0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_3.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_3.java b/tools/vm-tests/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_3.java
deleted file mode 100644
index 5f32c2c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_4.d b/tools/vm-tests/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_4.d
deleted file mode 100644
index cf01f55..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_5.d b/tools/vm-tests/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_5.d
deleted file mode 100644
index 453ee43..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_5.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_6.d b/tools/vm-tests/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_6.d
deleted file mode 100644
index 720ec7c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpl_double/d/T_cmpl_double_6.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/cmpl_float/Test_cmpl_float.java b/tools/vm-tests/src/dot/junit/opcodes/cmpl_float/Test_cmpl_float.java
deleted file mode 100644
index 3ca0b5b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpl_float/Test_cmpl_float.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_1.d b/tools/vm-tests/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_1.d
deleted file mode 100644
index 48f14e0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_1.java b/tools/vm-tests/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_1.java
deleted file mode 100644
index afd42d1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_1.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_2.d b/tools/vm-tests/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_2.d
deleted file mode 100644
index 67ed903..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_2.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_3.d b/tools/vm-tests/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_3.d
deleted file mode 100644
index b43f114..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_3.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_4.d b/tools/vm-tests/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_4.d
deleted file mode 100644
index a4aa08e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_5.d b/tools/vm-tests/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_5.d
deleted file mode 100644
index d496c11..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_6.d b/tools/vm-tests/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_6.d
deleted file mode 100644
index 05a9e62..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_6.java b/tools/vm-tests/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_6.java
deleted file mode 100644
index e41e14a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/cmpl_float/d/T_cmpl_float_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/const_16/Test_const_16.java b/tools/vm-tests/src/dot/junit/opcodes/const_16/Test_const_16.java
deleted file mode 100644
index 00e6b78..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_16/Test_const_16.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/const_16/d/T_const_16_1.d b/tools/vm-tests/src/dot/junit/opcodes/const_16/d/T_const_16_1.d
deleted file mode 100644
index 6078e06..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_16/d/T_const_16_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_16/d/T_const_16_1.java b/tools/vm-tests/src/dot/junit/opcodes/const_16/d/T_const_16_1.java
deleted file mode 100644
index 3285906..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_16/d/T_const_16_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/const_16/d/T_const_16_3.d b/tools/vm-tests/src/dot/junit/opcodes/const_16/d/T_const_16_3.d
deleted file mode 100644
index 4e0bfa7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_16/d/T_const_16_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_16/d/T_const_16_4.d b/tools/vm-tests/src/dot/junit/opcodes/const_16/d/T_const_16_4.d
deleted file mode 100644
index 4040879..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_16/d/T_const_16_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_4/Test_const_4.java b/tools/vm-tests/src/dot/junit/opcodes/const_4/Test_const_4.java
deleted file mode 100644
index d9bb26b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_4/Test_const_4.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/const_4/d/T_const_4_1.d b/tools/vm-tests/src/dot/junit/opcodes/const_4/d/T_const_4_1.d
deleted file mode 100644
index 77c522e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_4/d/T_const_4_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_4/d/T_const_4_1.java b/tools/vm-tests/src/dot/junit/opcodes/const_4/d/T_const_4_1.java
deleted file mode 100644
index a8b8ab3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_4/d/T_const_4_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/const_4/d/T_const_4_3.d b/tools/vm-tests/src/dot/junit/opcodes/const_4/d/T_const_4_3.d
deleted file mode 100644
index d435f16..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_4/d/T_const_4_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_4/d/T_const_4_4.d b/tools/vm-tests/src/dot/junit/opcodes/const_4/d/T_const_4_4.d
deleted file mode 100644
index 5ca94d5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_4/d/T_const_4_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_class/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/const_class/TestStubs.java
deleted file mode 100644
index 3897d2f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_class/TestStubs.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/const_class/Test_const_class.java b/tools/vm-tests/src/dot/junit/opcodes/const_class/Test_const_class.java
deleted file mode 100644
index 93f5ee4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_class/Test_const_class.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/const_class/d/T_const_class_1.d b/tools/vm-tests/src/dot/junit/opcodes/const_class/d/T_const_class_1.d
deleted file mode 100644
index 6359d92..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_class/d/T_const_class_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_class/d/T_const_class_1.java b/tools/vm-tests/src/dot/junit/opcodes/const_class/d/T_const_class_1.java
deleted file mode 100644
index d95f659..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_class/d/T_const_class_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/const_class/d/T_const_class_2.d b/tools/vm-tests/src/dot/junit/opcodes/const_class/d/T_const_class_2.d
deleted file mode 100644
index 39bb30e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_class/d/T_const_class_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_class/d/T_const_class_2.java b/tools/vm-tests/src/dot/junit/opcodes/const_class/d/T_const_class_2.java
deleted file mode 100644
index 030d3e2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_class/d/T_const_class_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/const_class/d/T_const_class_3.d b/tools/vm-tests/src/dot/junit/opcodes/const_class/d/T_const_class_3.d
deleted file mode 100644
index 50da342..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_class/d/T_const_class_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_class/d/T_const_class_4.d b/tools/vm-tests/src/dot/junit/opcodes/const_class/d/T_const_class_4.d
deleted file mode 100644
index 6f6b7b9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_class/d/T_const_class_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_class/d/T_const_class_5.d b/tools/vm-tests/src/dot/junit/opcodes/const_class/d/T_const_class_5.d
deleted file mode 100644
index 24186a5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_class/d/T_const_class_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_class/d/T_const_class_5.dfh b/tools/vm-tests/src/dot/junit/opcodes/const_class/d/T_const_class_5.dfh
deleted file mode 100644
index db89eba..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_class/d/T_const_class_5.dfh
+++ /dev/null
@@ -1,254 +0,0 @@
-// 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/src/dot/junit/opcodes/const_class/d/T_const_class_6.d b/tools/vm-tests/src/dot/junit/opcodes/const_class/d/T_const_class_6.d
deleted file mode 100644
index bd893c9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_class/d/T_const_class_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_class/d/T_const_class_6.java b/tools/vm-tests/src/dot/junit/opcodes/const_class/d/T_const_class_6.java
deleted file mode 100644
index 4dd4ad3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_class/d/T_const_class_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/const_class/d/T_const_class_7.d b/tools/vm-tests/src/dot/junit/opcodes/const_class/d/T_const_class_7.d
deleted file mode 100644
index 20d9749..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_class/d/T_const_class_7.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_class/d/T_const_class_7.java b/tools/vm-tests/src/dot/junit/opcodes/const_class/d/T_const_class_7.java
deleted file mode 100644
index b67d795..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_class/d/T_const_class_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/const_high16/Test_const_high16.java b/tools/vm-tests/src/dot/junit/opcodes/const_high16/Test_const_high16.java
deleted file mode 100644
index 68340a8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_high16/Test_const_high16.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/const_high16/d/T_const_high16_1.d b/tools/vm-tests/src/dot/junit/opcodes/const_high16/d/T_const_high16_1.d
deleted file mode 100644
index fcc1c2e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_high16/d/T_const_high16_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_high16/d/T_const_high16_1.java b/tools/vm-tests/src/dot/junit/opcodes/const_high16/d/T_const_high16_1.java
deleted file mode 100644
index df8cf3f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_high16/d/T_const_high16_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/const_high16/d/T_const_high16_3.d b/tools/vm-tests/src/dot/junit/opcodes/const_high16/d/T_const_high16_3.d
deleted file mode 100644
index e207c68..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_high16/d/T_const_high16_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_high16/d/T_const_high16_4.d b/tools/vm-tests/src/dot/junit/opcodes/const_high16/d/T_const_high16_4.d
deleted file mode 100644
index f8caefa..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_high16/d/T_const_high16_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_string/Test_const_string.java b/tools/vm-tests/src/dot/junit/opcodes/const_string/Test_const_string.java
deleted file mode 100644
index b5c778d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_string/Test_const_string.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/const_string/d/T_const_string_1.d b/tools/vm-tests/src/dot/junit/opcodes/const_string/d/T_const_string_1.d
deleted file mode 100644
index 11b3770..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_string/d/T_const_string_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_string/d/T_const_string_1.java b/tools/vm-tests/src/dot/junit/opcodes/const_string/d/T_const_string_1.java
deleted file mode 100644
index 0bb9508..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_string/d/T_const_string_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/const_string/d/T_const_string_3.d b/tools/vm-tests/src/dot/junit/opcodes/const_string/d/T_const_string_3.d
deleted file mode 100644
index 773bd80..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_string/d/T_const_string_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_string/d/T_const_string_4.d b/tools/vm-tests/src/dot/junit/opcodes/const_string/d/T_const_string_4.d
deleted file mode 100644
index d8b8519..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_string/d/T_const_string_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_string/d/T_const_string_5.d b/tools/vm-tests/src/dot/junit/opcodes/const_string/d/T_const_string_5.d
deleted file mode 100644
index 1ece763..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_string/d/T_const_string_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_string/d/T_const_string_5.dfh b/tools/vm-tests/src/dot/junit/opcodes/const_string/d/T_const_string_5.dfh
deleted file mode 100644
index 96a95b0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_string/d/T_const_string_5.dfh
+++ /dev/null
@@ -1,258 +0,0 @@
-// 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/src/dot/junit/opcodes/const_string_jumbo/Test_const_string_jumbo.java b/tools/vm-tests/src/dot/junit/opcodes/const_string_jumbo/Test_const_string_jumbo.java
deleted file mode 100644
index 6234730..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_string_jumbo/Test_const_string_jumbo.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_1.d b/tools/vm-tests/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_1.d
deleted file mode 100644
index 893baf2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_1.java b/tools/vm-tests/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_1.java
deleted file mode 100644
index 35b9b28..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_3.d b/tools/vm-tests/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_3.d
deleted file mode 100644
index c563141..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_4.d b/tools/vm-tests/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_4.d
deleted file mode 100644
index c4088d7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_5.d b/tools/vm-tests/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_5.d
deleted file mode 100644
index 649d3ce..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_5.dfh b/tools/vm-tests/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_5.dfh
deleted file mode 100644
index 6ffa6a4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_string_jumbo/d/T_const_string_jumbo_5.dfh
+++ /dev/null
@@ -1,258 +0,0 @@
-// 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/src/dot/junit/opcodes/const_wide/Test_const_wide.java b/tools/vm-tests/src/dot/junit/opcodes/const_wide/Test_const_wide.java
deleted file mode 100644
index 1ce3caa..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_wide/Test_const_wide.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/const_wide/d/T_const_wide_1.d b/tools/vm-tests/src/dot/junit/opcodes/const_wide/d/T_const_wide_1.d
deleted file mode 100644
index 6809530..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_wide/d/T_const_wide_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_wide/d/T_const_wide_1.java b/tools/vm-tests/src/dot/junit/opcodes/const_wide/d/T_const_wide_1.java
deleted file mode 100644
index b219a93..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_wide/d/T_const_wide_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/const_wide/d/T_const_wide_2.d b/tools/vm-tests/src/dot/junit/opcodes/const_wide/d/T_const_wide_2.d
deleted file mode 100644
index b2ddede..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_wide/d/T_const_wide_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_wide/d/T_const_wide_2.java b/tools/vm-tests/src/dot/junit/opcodes/const_wide/d/T_const_wide_2.java
deleted file mode 100644
index 0c9c438..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_wide/d/T_const_wide_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/const_wide/d/T_const_wide_3.d b/tools/vm-tests/src/dot/junit/opcodes/const_wide/d/T_const_wide_3.d
deleted file mode 100644
index 1fab9ef..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_wide/d/T_const_wide_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_wide/d/T_const_wide_4.d b/tools/vm-tests/src/dot/junit/opcodes/const_wide/d/T_const_wide_4.d
deleted file mode 100644
index 9493e94..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_wide/d/T_const_wide_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_wide_16/Test_const_wide_16.java b/tools/vm-tests/src/dot/junit/opcodes/const_wide_16/Test_const_wide_16.java
deleted file mode 100644
index 941b00d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_wide_16/Test_const_wide_16.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/const_wide_16/d/T_const_wide_16_1.d b/tools/vm-tests/src/dot/junit/opcodes/const_wide_16/d/T_const_wide_16_1.d
deleted file mode 100644
index 02c4e1c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_wide_16/d/T_const_wide_16_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_wide_16/d/T_const_wide_16_1.java b/tools/vm-tests/src/dot/junit/opcodes/const_wide_16/d/T_const_wide_16_1.java
deleted file mode 100644
index 708bf83..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_wide_16/d/T_const_wide_16_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/const_wide_16/d/T_const_wide_16_3.d b/tools/vm-tests/src/dot/junit/opcodes/const_wide_16/d/T_const_wide_16_3.d
deleted file mode 100644
index eebf570..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_wide_16/d/T_const_wide_16_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_wide_16/d/T_const_wide_16_4.d b/tools/vm-tests/src/dot/junit/opcodes/const_wide_16/d/T_const_wide_16_4.d
deleted file mode 100644
index c1d79b0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_wide_16/d/T_const_wide_16_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_wide_32/Test_const_wide_32.java b/tools/vm-tests/src/dot/junit/opcodes/const_wide_32/Test_const_wide_32.java
deleted file mode 100644
index 0847b3b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_wide_32/Test_const_wide_32.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/const_wide_32/d/T_const_wide_32_1.d b/tools/vm-tests/src/dot/junit/opcodes/const_wide_32/d/T_const_wide_32_1.d
deleted file mode 100644
index 1962b17..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_wide_32/d/T_const_wide_32_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_wide_32/d/T_const_wide_32_1.java b/tools/vm-tests/src/dot/junit/opcodes/const_wide_32/d/T_const_wide_32_1.java
deleted file mode 100644
index 38be11f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_wide_32/d/T_const_wide_32_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/const_wide_32/d/T_const_wide_32_3.d b/tools/vm-tests/src/dot/junit/opcodes/const_wide_32/d/T_const_wide_32_3.d
deleted file mode 100644
index 44821ef..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_wide_32/d/T_const_wide_32_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_wide_32/d/T_const_wide_32_4.d b/tools/vm-tests/src/dot/junit/opcodes/const_wide_32/d/T_const_wide_32_4.d
deleted file mode 100644
index afae8dc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_wide_32/d/T_const_wide_32_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_wide_high16/Test_const_wide_high16.java b/tools/vm-tests/src/dot/junit/opcodes/const_wide_high16/Test_const_wide_high16.java
deleted file mode 100644
index 2dd3e32..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_wide_high16/Test_const_wide_high16.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/const_wide_high16/d/T_const_wide_high16_1.d b/tools/vm-tests/src/dot/junit/opcodes/const_wide_high16/d/T_const_wide_high16_1.d
deleted file mode 100644
index c051462..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_wide_high16/d/T_const_wide_high16_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_wide_high16/d/T_const_wide_high16_1.java b/tools/vm-tests/src/dot/junit/opcodes/const_wide_high16/d/T_const_wide_high16_1.java
deleted file mode 100644
index 8a06f17..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_wide_high16/d/T_const_wide_high16_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/const_wide_high16/d/T_const_wide_high16_3.d b/tools/vm-tests/src/dot/junit/opcodes/const_wide_high16/d/T_const_wide_high16_3.d
deleted file mode 100644
index 24a577c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_wide_high16/d/T_const_wide_high16_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/const_wide_high16/d/T_const_wide_high16_4.d b/tools/vm-tests/src/dot/junit/opcodes/const_wide_high16/d/T_const_wide_high16_4.d
deleted file mode 100644
index 614e5a5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/const_wide_high16/d/T_const_wide_high16_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_double/Test_div_double.java b/tools/vm-tests/src/dot/junit/opcodes/div_double/Test_div_double.java
deleted file mode 100644
index 5ce7889..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_double/Test_div_double.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_double/d/T_div_double_1.d b/tools/vm-tests/src/dot/junit/opcodes/div_double/d/T_div_double_1.d
deleted file mode 100644
index 359ec34..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_double/d/T_div_double_1.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_double/d/T_div_double_1.java b/tools/vm-tests/src/dot/junit/opcodes/div_double/d/T_div_double_1.java
deleted file mode 100644
index 734f130..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_double/d/T_div_double_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_double/d/T_div_double_2.d b/tools/vm-tests/src/dot/junit/opcodes/div_double/d/T_div_double_2.d
deleted file mode 100644
index e09176a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_double/d/T_div_double_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_double/d/T_div_double_3.d b/tools/vm-tests/src/dot/junit/opcodes/div_double/d/T_div_double_3.d
deleted file mode 100644
index 02d7929..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_double/d/T_div_double_3.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_double/d/T_div_double_3.java b/tools/vm-tests/src/dot/junit/opcodes/div_double/d/T_div_double_3.java
deleted file mode 100644
index 0cad5bb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_double/d/T_div_double_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_double/d/T_div_double_4.d b/tools/vm-tests/src/dot/junit/opcodes/div_double/d/T_div_double_4.d
deleted file mode 100644
index 411b01a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_double/d/T_div_double_4.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_double/d/T_div_double_5.d b/tools/vm-tests/src/dot/junit/opcodes/div_double/d/T_div_double_5.d
deleted file mode 100644
index 2675538..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_double/d/T_div_double_5.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_double/d/T_div_double_6.d b/tools/vm-tests/src/dot/junit/opcodes/div_double/d/T_div_double_6.d
deleted file mode 100644
index 9ef0732..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_double/d/T_div_double_6.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_double_2addr/Test_div_double_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/div_double_2addr/Test_div_double_2addr.java
deleted file mode 100644
index 42332e5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_double_2addr/Test_div_double_2addr.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_1.d
deleted file mode 100644
index 541526e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_1.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_1.java
deleted file mode 100644
index e853239..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_2.d
deleted file mode 100644
index 5921ceb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_3.d
deleted file mode 100644
index 840ea8b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_3.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_3.java b/tools/vm-tests/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_3.java
deleted file mode 100644
index 96d1e60..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_4.d
deleted file mode 100644
index 5cee125..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_4.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_5.d
deleted file mode 100644
index 2ef12c6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_5.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_6.d b/tools/vm-tests/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_6.d
deleted file mode 100644
index 05fc08e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_double_2addr/d/T_div_double_2addr_6.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_float/Test_div_float.java b/tools/vm-tests/src/dot/junit/opcodes/div_float/Test_div_float.java
deleted file mode 100644
index 8671505..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_float/Test_div_float.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_float/d/T_div_float_1.d b/tools/vm-tests/src/dot/junit/opcodes/div_float/d/T_div_float_1.d
deleted file mode 100644
index 5d59692..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_float/d/T_div_float_1.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_float/d/T_div_float_1.java b/tools/vm-tests/src/dot/junit/opcodes/div_float/d/T_div_float_1.java
deleted file mode 100644
index b75e42b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_float/d/T_div_float_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_float/d/T_div_float_2.d b/tools/vm-tests/src/dot/junit/opcodes/div_float/d/T_div_float_2.d
deleted file mode 100644
index 4a82c48..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_float/d/T_div_float_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_float/d/T_div_float_3.d b/tools/vm-tests/src/dot/junit/opcodes/div_float/d/T_div_float_3.d
deleted file mode 100644
index 9a8b28b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_float/d/T_div_float_3.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_float/d/T_div_float_4.d b/tools/vm-tests/src/dot/junit/opcodes/div_float/d/T_div_float_4.d
deleted file mode 100644
index ed7b149..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_float/d/T_div_float_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_float/d/T_div_float_5.d b/tools/vm-tests/src/dot/junit/opcodes/div_float/d/T_div_float_5.d
deleted file mode 100644
index 4602631..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_float/d/T_div_float_5.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_float/d/T_div_float_5.java b/tools/vm-tests/src/dot/junit/opcodes/div_float/d/T_div_float_5.java
deleted file mode 100644
index 68d16fa..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_float/d/T_div_float_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_float/d/T_div_float_6.d b/tools/vm-tests/src/dot/junit/opcodes/div_float/d/T_div_float_6.d
deleted file mode 100644
index 4777687..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_float/d/T_div_float_6.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_float_2addr/Test_div_float_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/div_float_2addr/Test_div_float_2addr.java
deleted file mode 100644
index 3fdeb70..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_float_2addr/Test_div_float_2addr.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_1.d
deleted file mode 100644
index 93362fe..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_1.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_1.java
deleted file mode 100644
index bfa9c61..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_2.d
deleted file mode 100644
index 90ea869..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_3.d
deleted file mode 100644
index f9bddfd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_4.d
deleted file mode 100644
index 377cda1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_5.d
deleted file mode 100644
index 2f5a998..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_5.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_5.java b/tools/vm-tests/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_5.java
deleted file mode 100644
index fe4a948..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_6.d b/tools/vm-tests/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_6.d
deleted file mode 100644
index ed354e3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_float_2addr/d/T_div_float_2addr_6.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int/Test_div_int.java b/tools/vm-tests/src/dot/junit/opcodes/div_int/Test_div_int.java
deleted file mode 100644
index 14614a6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int/Test_div_int.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int/d/T_div_int_1.d b/tools/vm-tests/src/dot/junit/opcodes/div_int/d/T_div_int_1.d
deleted file mode 100644
index aaaf0a3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int/d/T_div_int_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int/d/T_div_int_1.java b/tools/vm-tests/src/dot/junit/opcodes/div_int/d/T_div_int_1.java
deleted file mode 100644
index b43738d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int/d/T_div_int_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int/d/T_div_int_2.d b/tools/vm-tests/src/dot/junit/opcodes/div_int/d/T_div_int_2.d
deleted file mode 100644
index 8fb324c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int/d/T_div_int_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int/d/T_div_int_3.d b/tools/vm-tests/src/dot/junit/opcodes/div_int/d/T_div_int_3.d
deleted file mode 100644
index 446cc2c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int/d/T_div_int_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int/d/T_div_int_4.d b/tools/vm-tests/src/dot/junit/opcodes/div_int/d/T_div_int_4.d
deleted file mode 100644
index c476934..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int/d/T_div_int_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int/d/T_div_int_5.d b/tools/vm-tests/src/dot/junit/opcodes/div_int/d/T_div_int_5.d
deleted file mode 100644
index ad4c79c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int/d/T_div_int_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int/d/T_div_int_5.java b/tools/vm-tests/src/dot/junit/opcodes/div_int/d/T_div_int_5.java
deleted file mode 100644
index 21ba362..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int/d/T_div_int_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int/d/T_div_int_6.d b/tools/vm-tests/src/dot/junit/opcodes/div_int/d/T_div_int_6.d
deleted file mode 100644
index 6da816d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int/d/T_div_int_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_2addr/Test_div_int_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_2addr/Test_div_int_2addr.java
deleted file mode 100644
index 276c840..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_2addr/Test_div_int_2addr.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_1.d
deleted file mode 100644
index 00b88e4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_1.java
deleted file mode 100644
index 67464ea..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_2.d
deleted file mode 100644
index 10e15fe..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_3.d
deleted file mode 100644
index 483865e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_4.d
deleted file mode 100644
index fbda213..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_5.d
deleted file mode 100644
index 2ee42a9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_5.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_5.java
deleted file mode 100644
index f206f22..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_6.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_6.d
deleted file mode 100644
index 7742df6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_2addr/d/T_div_int_2addr_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit16/Test_div_int_lit16.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/Test_div_int_lit16.java
deleted file mode 100644
index 02cc14a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/Test_div_int_lit16.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_1.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_1.d
deleted file mode 100644
index 6b57fb7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_1.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_1.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_1.java
deleted file mode 100644
index 3a1df06..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_10.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_10.d
deleted file mode 100644
index d665855..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_10.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_10.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_10.java
deleted file mode 100644
index 46925a9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_10.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_11.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_11.d
deleted file mode 100644
index 9f6cd95..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_11.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_11.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_11.java
deleted file mode 100644
index b0b3e69..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_12.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_12.d
deleted file mode 100644
index e99957a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_12.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_12.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_12.java
deleted file mode 100644
index be1428e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_12.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_13.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_13.d
deleted file mode 100644
index 4115385..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_13.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_13.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_13.java
deleted file mode 100644
index bbbab37..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_13.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_14.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_14.d
deleted file mode 100644
index 3731d36..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_14.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_15.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_15.d
deleted file mode 100644
index 27fba6e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_15.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_16.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_16.d
deleted file mode 100644
index 6caadaf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_16.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_17.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_17.d
deleted file mode 100644
index b60a81d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_17.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_17.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_17.java
deleted file mode 100644
index 71cee9a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_17.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_18.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_18.d
deleted file mode 100644
index 6215666..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_18.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_2.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_2.d
deleted file mode 100644
index dd4e3f6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_2.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_2.java
deleted file mode 100644
index 10a63dd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_3.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_3.d
deleted file mode 100644
index b3b4713..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_3.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_3.java
deleted file mode 100644
index ad3d6d4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_4.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_4.d
deleted file mode 100644
index e131fc4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_4.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_4.java
deleted file mode 100644
index cbf7f0b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_5.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_5.d
deleted file mode 100644
index b61badf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_5.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_5.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_5.java
deleted file mode 100644
index 3a1d497..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_6.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_6.d
deleted file mode 100644
index c97edff..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_6.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_6.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_6.java
deleted file mode 100644
index 7875953..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_7.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_7.d
deleted file mode 100644
index 66cc917..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_7.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_7.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_7.java
deleted file mode 100644
index 3fa111c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_8.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_8.d
deleted file mode 100644
index 6f2fd00..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_8.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_8.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_8.java
deleted file mode 100644
index 3389e8c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_9.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_9.d
deleted file mode 100644
index 68f757e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_9.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_9.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_9.java
deleted file mode 100644
index bf34419..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit16/d/T_div_int_lit16_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_lit8/Test_div_int_lit8.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/Test_div_int_lit8.java
deleted file mode 100644
index e2c4057..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/Test_div_int_lit8.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_1.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_1.d
deleted file mode 100644
index 4c6a389..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_1.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_1.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_1.java
deleted file mode 100644
index 04177b6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_10.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_10.d
deleted file mode 100644
index 25c0e77..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_10.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_10.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_10.java
deleted file mode 100644
index 8c71346..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_10.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_11.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_11.d
deleted file mode 100644
index 9522183..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_11.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_11.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_11.java
deleted file mode 100644
index 9e2d788..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_12.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_12.d
deleted file mode 100644
index cd72c52..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_12.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_12.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_12.java
deleted file mode 100644
index 9468233..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_12.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_13.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_13.d
deleted file mode 100644
index 1465ebc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_13.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_13.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_13.java
deleted file mode 100644
index 2e8cbcb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_13.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_14.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_14.d
deleted file mode 100644
index 492ccbc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_14.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_15.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_15.d
deleted file mode 100644
index 88d70a1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_15.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_16.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_16.d
deleted file mode 100644
index f93542a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_16.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_17.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_17.d
deleted file mode 100644
index b4169d5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_17.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_17.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_17.java
deleted file mode 100644
index 329612d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_17.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_18.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_18.d
deleted file mode 100644
index 10859c0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_18.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_2.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_2.d
deleted file mode 100644
index 96145c1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_2.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_2.java
deleted file mode 100644
index 496ac7d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_3.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_3.d
deleted file mode 100644
index a93a8b0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_3.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_3.java
deleted file mode 100644
index 29829ca..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_4.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_4.d
deleted file mode 100644
index 458cfb1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_4.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_4.java
deleted file mode 100644
index f92aed1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_5.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_5.d
deleted file mode 100644
index 3901a7c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_5.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_5.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_5.java
deleted file mode 100644
index bb60183..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_6.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_6.d
deleted file mode 100644
index 35f9c63..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_6.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_6.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_6.java
deleted file mode 100644
index d071b33..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_7.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_7.d
deleted file mode 100644
index 0d4f492..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_7.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_7.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_7.java
deleted file mode 100644
index 7f7180a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_8.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_8.d
deleted file mode 100644
index ee80b01..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_8.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_8.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_8.java
deleted file mode 100644
index 5563dd8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_9.d b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_9.d
deleted file mode 100644
index 466cf0a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_9.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_9.java b/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_9.java
deleted file mode 100644
index 5c62b29..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_int_lit8/d/T_div_int_lit8_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_long/Test_div_long.java b/tools/vm-tests/src/dot/junit/opcodes/div_long/Test_div_long.java
deleted file mode 100644
index b0e1d31..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_long/Test_div_long.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_long/d/T_div_long_1.d b/tools/vm-tests/src/dot/junit/opcodes/div_long/d/T_div_long_1.d
deleted file mode 100644
index fdf2445..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_long/d/T_div_long_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_long/d/T_div_long_1.java b/tools/vm-tests/src/dot/junit/opcodes/div_long/d/T_div_long_1.java
deleted file mode 100644
index 783d7ce..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_long/d/T_div_long_1.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_long/d/T_div_long_2.d b/tools/vm-tests/src/dot/junit/opcodes/div_long/d/T_div_long_2.d
deleted file mode 100644
index e72e2a8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_long/d/T_div_long_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_long/d/T_div_long_2.java b/tools/vm-tests/src/dot/junit/opcodes/div_long/d/T_div_long_2.java
deleted file mode 100644
index e6b3456..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_long/d/T_div_long_2.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_long/d/T_div_long_3.d b/tools/vm-tests/src/dot/junit/opcodes/div_long/d/T_div_long_3.d
deleted file mode 100644
index 6a43649..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_long/d/T_div_long_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_long/d/T_div_long_4.d b/tools/vm-tests/src/dot/junit/opcodes/div_long/d/T_div_long_4.d
deleted file mode 100644
index 409b45a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_long/d/T_div_long_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_long/d/T_div_long_5.d b/tools/vm-tests/src/dot/junit/opcodes/div_long/d/T_div_long_5.d
deleted file mode 100644
index 648b110..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_long/d/T_div_long_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_long/d/T_div_long_6.d b/tools/vm-tests/src/dot/junit/opcodes/div_long/d/T_div_long_6.d
deleted file mode 100644
index b2a6d0f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_long/d/T_div_long_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_long_2addr/Test_div_long_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/div_long_2addr/Test_div_long_2addr.java
deleted file mode 100644
index 5ba3dad..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_long_2addr/Test_div_long_2addr.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_1.d
deleted file mode 100644
index 0ae9ff3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_1.java
deleted file mode 100644
index 031cac2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_1.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_2.d
deleted file mode 100644
index f01fcf4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_2.java b/tools/vm-tests/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_2.java
deleted file mode 100644
index 674284e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_2.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_3.d
deleted file mode 100644
index 09e48c3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_4.d
deleted file mode 100644
index 6d91919..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_5.d
deleted file mode 100644
index ed7fdfb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_6.d b/tools/vm-tests/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_6.d
deleted file mode 100644
index 83e2b30..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/div_long_2addr/d/T_div_long_2addr_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/double_to_float/Test_double_to_float.java b/tools/vm-tests/src/dot/junit/opcodes/double_to_float/Test_double_to_float.java
deleted file mode 100644
index 780ffef..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/double_to_float/Test_double_to_float.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_1.d b/tools/vm-tests/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_1.d
deleted file mode 100644
index 24b332f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_1.java b/tools/vm-tests/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_1.java
deleted file mode 100644
index c2cf023..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_2.d b/tools/vm-tests/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_2.d
deleted file mode 100644
index 402cfac..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_3.d b/tools/vm-tests/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_3.d
deleted file mode 100644
index 1cbf6f9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_3.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_3.java b/tools/vm-tests/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_3.java
deleted file mode 100644
index f4be401..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_4.d b/tools/vm-tests/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_4.d
deleted file mode 100644
index 135e7ff..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_4.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_5.d b/tools/vm-tests/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_5.d
deleted file mode 100644
index 80adf03..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_6.d b/tools/vm-tests/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_6.d
deleted file mode 100644
index 9c65fb8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/double_to_float/d/T_double_to_float_6.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/double_to_int/Test_double_to_int.java b/tools/vm-tests/src/dot/junit/opcodes/double_to_int/Test_double_to_int.java
deleted file mode 100644
index 86a3cdc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/double_to_int/Test_double_to_int.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_1.d b/tools/vm-tests/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_1.d
deleted file mode 100644
index 82f2467..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_1.java b/tools/vm-tests/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_1.java
deleted file mode 100644
index 208a2bc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_2.d b/tools/vm-tests/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_2.d
deleted file mode 100644
index 7e3a98b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_2.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_3.d b/tools/vm-tests/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_3.d
deleted file mode 100644
index 07f855a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_3.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_3.java b/tools/vm-tests/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_3.java
deleted file mode 100644
index 03e205b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_4.d b/tools/vm-tests/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_4.d
deleted file mode 100644
index 1f62ffb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_4.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_5.d b/tools/vm-tests/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_5.d
deleted file mode 100644
index e4477d8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_6.d b/tools/vm-tests/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_6.d
deleted file mode 100644
index ecbe761..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/double_to_int/d/T_double_to_int_6.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/double_to_long/Test_double_to_long.java b/tools/vm-tests/src/dot/junit/opcodes/double_to_long/Test_double_to_long.java
deleted file mode 100644
index 089558e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/double_to_long/Test_double_to_long.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_1.d b/tools/vm-tests/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_1.d
deleted file mode 100644
index 677d352..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_1.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_1.java b/tools/vm-tests/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_1.java
deleted file mode 100644
index 11469d2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_2.d b/tools/vm-tests/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_2.d
deleted file mode 100644
index 54740b6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_2.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_3.d b/tools/vm-tests/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_3.d
deleted file mode 100644
index 1f2293d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_3.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_3.java b/tools/vm-tests/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_3.java
deleted file mode 100644
index 043a2ad..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_4.d b/tools/vm-tests/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_4.d
deleted file mode 100644
index df716b0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_4.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_5.d b/tools/vm-tests/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_5.d
deleted file mode 100644
index 8b11c73..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_5.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_6.d b/tools/vm-tests/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_6.d
deleted file mode 100644
index 6aeb8fd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/double_to_long/d/T_double_to_long_6.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/fill_array_data/Test_fill_array_data.java b/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/Test_fill_array_data.java
deleted file mode 100644
index 5bac3cd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/Test_fill_array_data.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_1.d b/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_1.d
deleted file mode 100644
index 1c97601..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_1.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_1.java b/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_1.java
deleted file mode 100644
index c2a43a2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_11.d b/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_11.d
deleted file mode 100644
index b462d1c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_11.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_11.dfh b/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_11.dfh
deleted file mode 100644
index bed70ce..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_11.dfh
+++ /dev/null
@@ -1,264 +0,0 @@
-// 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/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_12.d b/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_12.d
deleted file mode 100644
index c3ce952..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_12.d
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_13.d b/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_13.d
deleted file mode 100644
index 0066d29..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_13.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_13.dfh b/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_13.dfh
deleted file mode 100644
index 0d2fc68..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_13.dfh
+++ /dev/null
@@ -1,264 +0,0 @@
-// 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/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_2.d b/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_2.d
deleted file mode 100644
index 6167ef7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_2.d
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_2.java b/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_2.java
deleted file mode 100644
index 7c56ef0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_2.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_3.d b/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_3.d
deleted file mode 100644
index e6ecd1e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_3.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_4.d b/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_4.d
deleted file mode 100644
index 221ef8b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_4.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_5.d b/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_5.d
deleted file mode 100644
index cc98351..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_5.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_6.d b/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_6.d
deleted file mode 100644
index 61990a1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_6.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_7.d b/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_7.d
deleted file mode 100644
index 8ba5155..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_7.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_8.d b/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_8.d
deleted file mode 100644
index e90eb86..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_8.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_9.d b/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_9.d
deleted file mode 100644
index 0a5e008..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_9.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_9.dfh b/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_9.dfh
deleted file mode 100644
index 22cb9c0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/fill_array_data/d/T_fill_array_data_9.dfh
+++ /dev/null
@@ -1,264 +0,0 @@
-// 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/src/dot/junit/opcodes/filled_new_array/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/TestStubs.java
deleted file mode 100644
index 344f5c2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/TestStubs.java
+++ /dev/null
@@ -1,21 +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 dot.junit.opcodes.filled_new_array;
-
-// used by T_filled_new_array_11
-class TestStubs {
-}
diff --git a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/Test_filled_new_array.java b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/Test_filled_new_array.java
deleted file mode 100644
index b17c29b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/Test_filled_new_array.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_1.d b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_1.d
deleted file mode 100644
index 0c195eb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_1.java b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_1.java
deleted file mode 100644
index 05cd56f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_10.d b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_10.d
deleted file mode 100644
index ccfc7d6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_10.d
+++ /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.
-
-.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/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_10.java b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_10.java
deleted file mode 100644
index 4caf263..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_10.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_11.d b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_11.d
deleted file mode 100644
index dca1ca3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_11.d
+++ /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.
-
-.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/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_11.java b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_11.java
deleted file mode 100644
index f25d58f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_11.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_2.d b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_2.d
deleted file mode 100644
index 532158e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_2.java b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_2.java
deleted file mode 100644
index 0edab9b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_2.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_3.d b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_3.d
deleted file mode 100644
index 69d1f79..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_3.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_3.dfh b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_3.dfh
deleted file mode 100644
index deace06..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_3.dfh
+++ /dev/null
@@ -1,280 +0,0 @@
-// 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/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_4.d b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_4.d
deleted file mode 100644
index ac6b1b6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_5.d b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_5.d
deleted file mode 100644
index c2702a4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_6.d b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_6.d
deleted file mode 100644
index 6be462d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_6.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_7.d b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_7.d
deleted file mode 100644
index 129a800..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_7.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_8.d b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_8.d
deleted file mode 100644
index 951e06a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_8.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_8.dfh b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_8.dfh
deleted file mode 100644
index 343d149..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_8.dfh
+++ /dev/null
@@ -1,297 +0,0 @@
-// 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/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_9.d b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_9.d
deleted file mode 100644
index c7ba0ea..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_9.d
+++ /dev/null
@@ -1,34 +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.
-
-.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/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_9.java b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_9.java
deleted file mode 100644
index 46cac1a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array/d/T_filled_new_array_9.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/filled_new_array_range/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/TestStubs.java
deleted file mode 100644
index 47b87e4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/TestStubs.java
+++ /dev/null
@@ -1,21 +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 dot.junit.opcodes.filled_new_array_range;
-
-// used by T_filled_new_array_range_11
-class TestStubs {
-}
diff --git a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/Test_filled_new_array_range.java b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/Test_filled_new_array_range.java
deleted file mode 100644
index 84b1379..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/Test_filled_new_array_range.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_1.d b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_1.d
deleted file mode 100644
index 503c12a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_1.java b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_1.java
deleted file mode 100644
index 6e69a23..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_10.d b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_10.d
deleted file mode 100644
index 50a34b5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_10.d
+++ /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.
-
-.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/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_10.java b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_10.java
deleted file mode 100644
index 57075bd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_10.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_11.d b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_11.d
deleted file mode 100644
index e3a21e9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_11.d
+++ /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.
-
-.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/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_11.java b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_11.java
deleted file mode 100644
index f4ca611..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_11.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_2.d b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_2.d
deleted file mode 100644
index 2b2ef15..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_2.java b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_2.java
deleted file mode 100644
index 51d1d32..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_2.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_3.d b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_3.d
deleted file mode 100644
index f8c25f0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_3.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_3.dfh b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_3.dfh
deleted file mode 100644
index 1a620e5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_3.dfh
+++ /dev/null
@@ -1,280 +0,0 @@
-// 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/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_4.d b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_4.d
deleted file mode 100644
index ab3d24e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_5.d b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_5.d
deleted file mode 100644
index 6781fa1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_6.d b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_6.d
deleted file mode 100644
index 33233b5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_6.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_7.d b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_7.d
deleted file mode 100644
index f60043a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_7.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_8.d b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_8.d
deleted file mode 100644
index 7a93faf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_8.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_8.dfh b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_8.dfh
deleted file mode 100644
index c2696b5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_8.dfh
+++ /dev/null
@@ -1,280 +0,0 @@
-// 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/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_9.d b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_9.d
deleted file mode 100644
index 4218cbe..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_9.d
+++ /dev/null
@@ -1,34 +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.
-
-.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/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_9.java b/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_9.java
deleted file mode 100644
index 42ceba8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/filled_new_array_range/d/T_filled_new_array_range_9.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/float_to_double/Test_float_to_double.java b/tools/vm-tests/src/dot/junit/opcodes/float_to_double/Test_float_to_double.java
deleted file mode 100644
index 93b6df7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/float_to_double/Test_float_to_double.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_1.d b/tools/vm-tests/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_1.d
deleted file mode 100644
index 0854de3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_1.java b/tools/vm-tests/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_1.java
deleted file mode 100644
index c14f8aa..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_2.d b/tools/vm-tests/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_2.d
deleted file mode 100644
index c37c547..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_3.d b/tools/vm-tests/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_3.d
deleted file mode 100644
index 59217ee..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_4.d b/tools/vm-tests/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_4.d
deleted file mode 100644
index 32f2b0a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_5.d b/tools/vm-tests/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_5.d
deleted file mode 100644
index 77c3dc3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_6.d b/tools/vm-tests/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_6.d
deleted file mode 100644
index eac86d1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_7.d b/tools/vm-tests/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_7.d
deleted file mode 100644
index 71f3c83..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_7.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_7.java b/tools/vm-tests/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_7.java
deleted file mode 100644
index 9018914..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/float_to_double/d/T_float_to_double_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/float_to_int/Test_float_to_int.java b/tools/vm-tests/src/dot/junit/opcodes/float_to_int/Test_float_to_int.java
deleted file mode 100644
index 27caeaa..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/float_to_int/Test_float_to_int.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_1.d b/tools/vm-tests/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_1.d
deleted file mode 100644
index 35f2eef..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_1.java b/tools/vm-tests/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_1.java
deleted file mode 100644
index b07cb68..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_2.d b/tools/vm-tests/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_2.d
deleted file mode 100644
index 61a8c4f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_3.d b/tools/vm-tests/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_3.d
deleted file mode 100644
index 0401ffd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_4.d b/tools/vm-tests/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_4.d
deleted file mode 100644
index 94fb137..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_5.d b/tools/vm-tests/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_5.d
deleted file mode 100644
index 697a193..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_5.java b/tools/vm-tests/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_5.java
deleted file mode 100644
index 794d0d9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_6.d b/tools/vm-tests/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_6.d
deleted file mode 100644
index 6fa95c5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/float_to_int/d/T_float_to_int_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/float_to_long/Test_float_to_long.java b/tools/vm-tests/src/dot/junit/opcodes/float_to_long/Test_float_to_long.java
deleted file mode 100644
index 97e2325..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/float_to_long/Test_float_to_long.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_1.d b/tools/vm-tests/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_1.d
deleted file mode 100644
index a4a5c24..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_1.java b/tools/vm-tests/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_1.java
deleted file mode 100644
index 667a37b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_2.d b/tools/vm-tests/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_2.d
deleted file mode 100644
index ea3525a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_3.d b/tools/vm-tests/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_3.d
deleted file mode 100644
index 1fde1d8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_4.d b/tools/vm-tests/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_4.d
deleted file mode 100644
index 69d1e57..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_5.d b/tools/vm-tests/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_5.d
deleted file mode 100644
index 148381a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_6.d b/tools/vm-tests/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_6.d
deleted file mode 100644
index 99fa733..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_7.d b/tools/vm-tests/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_7.d
deleted file mode 100644
index 30c969c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_7.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_7.java b/tools/vm-tests/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_7.java
deleted file mode 100644
index 58ae745..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/float_to_long/d/T_float_to_long_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/goto_16/Test_goto_16.java b/tools/vm-tests/src/dot/junit/opcodes/goto_16/Test_goto_16.java
deleted file mode 100644
index 2891fc4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/goto_16/Test_goto_16.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/goto_16/d/T_goto_16_1.d b/tools/vm-tests/src/dot/junit/opcodes/goto_16/d/T_goto_16_1.d
deleted file mode 100644
index caa4ad0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/goto_16/d/T_goto_16_1.d
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/goto_16/d/T_goto_16_1.java b/tools/vm-tests/src/dot/junit/opcodes/goto_16/d/T_goto_16_1.java
deleted file mode 100644
index 381d04f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/goto_16/d/T_goto_16_1.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/goto_16/d/T_goto_16_2.d b/tools/vm-tests/src/dot/junit/opcodes/goto_16/d/T_goto_16_2.d
deleted file mode 100644
index 7162694..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/goto_16/d/T_goto_16_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/goto_16/d/T_goto_16_2.dfh b/tools/vm-tests/src/dot/junit/opcodes/goto_16/d/T_goto_16_2.dfh
deleted file mode 100644
index 9e83d7f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/goto_16/d/T_goto_16_2.dfh
+++ /dev/null
@@ -1,262 +0,0 @@
-// 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/src/dot/junit/opcodes/goto_16/d/T_goto_16_2.java b/tools/vm-tests/src/dot/junit/opcodes/goto_16/d/T_goto_16_2.java
deleted file mode 100644
index d9729a0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/goto_16/d/T_goto_16_2.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/goto_16/d/T_goto_16_3.d b/tools/vm-tests/src/dot/junit/opcodes/goto_16/d/T_goto_16_3.d
deleted file mode 100644
index fcaa68d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/goto_16/d/T_goto_16_3.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/goto_16/d/T_goto_16_3.dfh b/tools/vm-tests/src/dot/junit/opcodes/goto_16/d/T_goto_16_3.dfh
deleted file mode 100644
index 10045e8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/goto_16/d/T_goto_16_3.dfh
+++ /dev/null
@@ -1,262 +0,0 @@
-// 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/src/dot/junit/opcodes/goto_16/d/T_goto_16_4.d b/tools/vm-tests/src/dot/junit/opcodes/goto_16/d/T_goto_16_4.d
deleted file mode 100644
index 746c325..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/goto_16/d/T_goto_16_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/goto_16/d/T_goto_16_4.dfh b/tools/vm-tests/src/dot/junit/opcodes/goto_16/d/T_goto_16_4.dfh
deleted file mode 100644
index 1b43042..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/goto_16/d/T_goto_16_4.dfh
+++ /dev/null
@@ -1,262 +0,0 @@
-// 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/src/dot/junit/opcodes/goto_16/d/T_goto_16_4.java b/tools/vm-tests/src/dot/junit/opcodes/goto_16/d/T_goto_16_4.java
deleted file mode 100644
index 4a087dc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/goto_16/d/T_goto_16_4.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/goto_32/Test_goto_32.java b/tools/vm-tests/src/dot/junit/opcodes/goto_32/Test_goto_32.java
deleted file mode 100644
index 5f7a4dc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/goto_32/Test_goto_32.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/goto_32/d/T_goto_32_1.d b/tools/vm-tests/src/dot/junit/opcodes/goto_32/d/T_goto_32_1.d
deleted file mode 100644
index fd5335a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/goto_32/d/T_goto_32_1.d
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/goto_32/d/T_goto_32_1.java b/tools/vm-tests/src/dot/junit/opcodes/goto_32/d/T_goto_32_1.java
deleted file mode 100644
index 90067e9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/goto_32/d/T_goto_32_1.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/goto_32/d/T_goto_32_2.d b/tools/vm-tests/src/dot/junit/opcodes/goto_32/d/T_goto_32_2.d
deleted file mode 100644
index 1a76901..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/goto_32/d/T_goto_32_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/goto_32/d/T_goto_32_2.dfh b/tools/vm-tests/src/dot/junit/opcodes/goto_32/d/T_goto_32_2.dfh
deleted file mode 100644
index 4b28769..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/goto_32/d/T_goto_32_2.dfh
+++ /dev/null
@@ -1,260 +0,0 @@
-// 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/src/dot/junit/opcodes/goto_32/d/T_goto_32_2.java b/tools/vm-tests/src/dot/junit/opcodes/goto_32/d/T_goto_32_2.java
deleted file mode 100644
index 2f6d726..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/goto_32/d/T_goto_32_2.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/goto_32/d/T_goto_32_3.d b/tools/vm-tests/src/dot/junit/opcodes/goto_32/d/T_goto_32_3.d
deleted file mode 100644
index 6130ae8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/goto_32/d/T_goto_32_3.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/goto_32/d/T_goto_32_3.dfh b/tools/vm-tests/src/dot/junit/opcodes/goto_32/d/T_goto_32_3.dfh
deleted file mode 100644
index 4d69427..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/goto_32/d/T_goto_32_3.dfh
+++ /dev/null
@@ -1,260 +0,0 @@
-// 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/src/dot/junit/opcodes/goto_32/d/T_goto_32_4.d b/tools/vm-tests/src/dot/junit/opcodes/goto_32/d/T_goto_32_4.d
deleted file mode 100644
index 624dfaf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/goto_32/d/T_goto_32_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/if_eq/Test_if_eq.java b/tools/vm-tests/src/dot/junit/opcodes/if_eq/Test_if_eq.java
deleted file mode 100644
index ed9b9e9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eq/Test_if_eq.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/if_eq/d/T_if_eq_1.d b/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_1.d
deleted file mode 100644
index b9e4603..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_1.d
+++ /dev/null
@@ -1,24 +0,0 @@
-.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/src/dot/junit/opcodes/if_eq/d/T_if_eq_1.java b/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_1.java
deleted file mode 100644
index d9015d9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_1.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_eq/d/T_if_eq_10.d b/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_10.d
deleted file mode 100644
index a7f0474..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_10.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_eq/d/T_if_eq_10.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_10.dfh
deleted file mode 100644
index d0c3c14..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_10.dfh
+++ /dev/null
@@ -1,276 +0,0 @@
-// 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/src/dot/junit/opcodes/if_eq/d/T_if_eq_10.java b/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_10.java
deleted file mode 100644
index 6350454..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_10.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_eq/d/T_if_eq_11.d b/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_11.d
deleted file mode 100644
index f266a25..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_11.d
+++ /dev/null
@@ -1,26 +0,0 @@
-.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/src/dot/junit/opcodes/if_eq/d/T_if_eq_11.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_11.dfh
deleted file mode 100644
index b0293d7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_11.dfh
+++ /dev/null
@@ -1,276 +0,0 @@
-// 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/src/dot/junit/opcodes/if_eq/d/T_if_eq_11.java b/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_11.java
deleted file mode 100644
index 3c5f8fd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_11.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_eq/d/T_if_eq_12.d b/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_12.d
deleted file mode 100644
index 9f0d34f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_12.d
+++ /dev/null
@@ -1,24 +0,0 @@
-.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/src/dot/junit/opcodes/if_eq/d/T_if_eq_12.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_12.dfh
deleted file mode 100644
index f327ba6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_12.dfh
+++ /dev/null
@@ -1,272 +0,0 @@
-// 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/src/dot/junit/opcodes/if_eq/d/T_if_eq_2.d b/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_2.d
deleted file mode 100644
index 239ef80..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_2.d
+++ /dev/null
@@ -1,24 +0,0 @@
-.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/src/dot/junit/opcodes/if_eq/d/T_if_eq_2.java b/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_2.java
deleted file mode 100644
index 2e3f2e8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_2.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_eq/d/T_if_eq_3.d b/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_3.d
deleted file mode 100644
index 8cc6f7e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_3.d
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/if_eq/d/T_if_eq_3.java b/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_3.java
deleted file mode 100644
index e1d63c2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/if_eq/d/T_if_eq_4.d b/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_4.d
deleted file mode 100644
index 614b6b6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_4.d
+++ /dev/null
@@ -1,24 +0,0 @@
-.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/src/dot/junit/opcodes/if_eq/d/T_if_eq_4.java b/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_4.java
deleted file mode 100644
index 8a85025..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_4.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_eq/d/T_if_eq_5.d b/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_5.d
deleted file mode 100644
index 94dd327..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_5.d
+++ /dev/null
@@ -1,24 +0,0 @@
-.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/src/dot/junit/opcodes/if_eq/d/T_if_eq_6.d b/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_6.d
deleted file mode 100644
index 29f910b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_6.d
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/if_eq/d/T_if_eq_6.java b/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_6.java
deleted file mode 100644
index ab33d58..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/if_eq/d/T_if_eq_7.d b/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_7.d
deleted file mode 100644
index ded22b3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_7.d
+++ /dev/null
@@ -1,24 +0,0 @@
-.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/src/dot/junit/opcodes/if_eq/d/T_if_eq_8.d b/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_8.d
deleted file mode 100644
index 8e67f2d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_8.d
+++ /dev/null
@@ -1,24 +0,0 @@
-.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/src/dot/junit/opcodes/if_eq/d/T_if_eq_9.d b/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_9.d
deleted file mode 100644
index b158878..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eq/d/T_if_eq_9.d
+++ /dev/null
@@ -1,24 +0,0 @@
-.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/src/dot/junit/opcodes/if_eqz/Test_if_eqz.java b/tools/vm-tests/src/dot/junit/opcodes/if_eqz/Test_if_eqz.java
deleted file mode 100644
index 161ab3c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eqz/Test_if_eqz.java
+++ /dev/null
@@ -1,169 +0,0 @@
-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/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_1.d b/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_1.d
deleted file mode 100644
index c44b870..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_1.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_1.java b/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_1.java
deleted file mode 100644
index 69d7ec5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_1.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_10.d b/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_10.d
deleted file mode 100644
index 8c415d0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_10.d
+++ /dev/null
@@ -1,24 +0,0 @@
-.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/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_10.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_10.dfh
deleted file mode 100644
index 8720c5e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_10.dfh
+++ /dev/null
@@ -1,278 +0,0 @@
-// 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/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_11.d b/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_11.d
deleted file mode 100644
index af8ce95..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_11.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_11.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_11.dfh
deleted file mode 100644
index 9776e0d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_11.dfh
+++ /dev/null
@@ -1,274 +0,0 @@
-// 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/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_2.d b/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_2.d
deleted file mode 100644
index 2b44068..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_2.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_2.java b/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_2.java
deleted file mode 100644
index 288a1e0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_2.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_3.d b/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_3.d
deleted file mode 100644
index 84e6924..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_3.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_3.java b/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_3.java
deleted file mode 100644
index f328d0d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_3.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_4.d b/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_4.d
deleted file mode 100644
index 5d0c921..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_4.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_4.java b/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_4.java
deleted file mode 100644
index 5d83f7e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_4.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_5.d b/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_5.d
deleted file mode 100644
index 3ddc469..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_5.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_6.d b/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_6.d
deleted file mode 100644
index ff120fe..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_6.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_7.d b/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_7.d
deleted file mode 100644
index 2d2ccb7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_7.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_9.d b/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_9.d
deleted file mode 100644
index 4ff0e6d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_9.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_9.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_9.dfh
deleted file mode 100644
index ee8a145..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_eqz/d/T_if_eqz_9.dfh
+++ /dev/null
@@ -1,272 +0,0 @@
-// 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/src/dot/junit/opcodes/if_ge/Test_if_ge.java b/tools/vm-tests/src/dot/junit/opcodes/if_ge/Test_if_ge.java
deleted file mode 100644
index 5c22637..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ge/Test_if_ge.java
+++ /dev/null
@@ -1,176 +0,0 @@
-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/src/dot/junit/opcodes/if_ge/d/T_if_ge_1.d b/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_1.d
deleted file mode 100644
index 1279bbe..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_1.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_ge/d/T_if_ge_1.java b/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_1.java
deleted file mode 100644
index b507e37..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_1.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_ge/d/T_if_ge_10.d b/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_10.d
deleted file mode 100644
index d02659a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_10.d
+++ /dev/null
@@ -1,24 +0,0 @@
-.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/src/dot/junit/opcodes/if_ge/d/T_if_ge_10.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_10.dfh
deleted file mode 100644
index 090fea5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_10.dfh
+++ /dev/null
@@ -1,280 +0,0 @@
-// 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/src/dot/junit/opcodes/if_ge/d/T_if_ge_11.d b/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_11.d
deleted file mode 100644
index 667364d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_11.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/if_ge/d/T_if_ge_11.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_11.dfh
deleted file mode 100644
index 730462e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_11.dfh
+++ /dev/null
@@ -1,272 +0,0 @@
-// 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/src/dot/junit/opcodes/if_ge/d/T_if_ge_2.d b/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_2.d
deleted file mode 100644
index af33b07..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_2.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/if_ge/d/T_if_ge_2.java b/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_2.java
deleted file mode 100644
index 64014ea..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/if_ge/d/T_if_ge_3.d b/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_3.d
deleted file mode 100644
index 876dcdc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_3.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_ge/d/T_if_ge_3.java b/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_3.java
deleted file mode 100644
index d524e1c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_3.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_ge/d/T_if_ge_4.d b/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_4.d
deleted file mode 100644
index 3593702..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_4.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_ge/d/T_if_ge_5.d b/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_5.d
deleted file mode 100644
index ddf627e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_5.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_ge/d/T_if_ge_6.d b/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_6.d
deleted file mode 100644
index 74e3506..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_6.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_ge/d/T_if_ge_7.d b/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_7.d
deleted file mode 100644
index b3559bf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_7.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_ge/d/T_if_ge_9.d b/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_9.d
deleted file mode 100644
index 254da33..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_9.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_ge/d/T_if_ge_9.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_9.dfh
deleted file mode 100644
index 3f4b044..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ge/d/T_if_ge_9.dfh
+++ /dev/null
@@ -1,274 +0,0 @@
-// 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/src/dot/junit/opcodes/if_gez/Test_if_gez.java b/tools/vm-tests/src/dot/junit/opcodes/if_gez/Test_if_gez.java
deleted file mode 100644
index da97922..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gez/Test_if_gez.java
+++ /dev/null
@@ -1,151 +0,0 @@
-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/src/dot/junit/opcodes/if_gez/d/T_if_gez_1.d b/tools/vm-tests/src/dot/junit/opcodes/if_gez/d/T_if_gez_1.d
deleted file mode 100644
index 85145e0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gez/d/T_if_gez_1.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_gez/d/T_if_gez_1.java b/tools/vm-tests/src/dot/junit/opcodes/if_gez/d/T_if_gez_1.java
deleted file mode 100644
index 462ed6d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gez/d/T_if_gez_1.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_gez/d/T_if_gez_10.d b/tools/vm-tests/src/dot/junit/opcodes/if_gez/d/T_if_gez_10.d
deleted file mode 100644
index 503c0be..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gez/d/T_if_gez_10.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_gez/d/T_if_gez_10.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_gez/d/T_if_gez_10.dfh
deleted file mode 100644
index b4fa6dd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gez/d/T_if_gez_10.dfh
+++ /dev/null
@@ -1,274 +0,0 @@
-// 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/src/dot/junit/opcodes/if_gez/d/T_if_gez_2.d b/tools/vm-tests/src/dot/junit/opcodes/if_gez/d/T_if_gez_2.d
deleted file mode 100644
index 3d0a858..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gez/d/T_if_gez_2.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_gez/d/T_if_gez_2.java b/tools/vm-tests/src/dot/junit/opcodes/if_gez/d/T_if_gez_2.java
deleted file mode 100644
index 55d7605..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gez/d/T_if_gez_2.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_gez/d/T_if_gez_3.d b/tools/vm-tests/src/dot/junit/opcodes/if_gez/d/T_if_gez_3.d
deleted file mode 100644
index a4bda68..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gez/d/T_if_gez_3.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_gez/d/T_if_gez_4.d b/tools/vm-tests/src/dot/junit/opcodes/if_gez/d/T_if_gez_4.d
deleted file mode 100644
index 4a60845..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gez/d/T_if_gez_4.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_gez/d/T_if_gez_5.d b/tools/vm-tests/src/dot/junit/opcodes/if_gez/d/T_if_gez_5.d
deleted file mode 100644
index c3d88e0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gez/d/T_if_gez_5.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_gez/d/T_if_gez_6.d b/tools/vm-tests/src/dot/junit/opcodes/if_gez/d/T_if_gez_6.d
deleted file mode 100644
index 666d59f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gez/d/T_if_gez_6.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_gez/d/T_if_gez_7.d b/tools/vm-tests/src/dot/junit/opcodes/if_gez/d/T_if_gez_7.d
deleted file mode 100644
index 9534ba0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gez/d/T_if_gez_7.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/if_gez/d/T_if_gez_8.d b/tools/vm-tests/src/dot/junit/opcodes/if_gez/d/T_if_gez_8.d
deleted file mode 100644
index f1df2d6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gez/d/T_if_gez_8.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_gez/d/T_if_gez_8.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_gez/d/T_if_gez_8.dfh
deleted file mode 100644
index 307f59d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gez/d/T_if_gez_8.dfh
+++ /dev/null
@@ -1,272 +0,0 @@
-// 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/src/dot/junit/opcodes/if_gez/d/T_if_gez_9.d b/tools/vm-tests/src/dot/junit/opcodes/if_gez/d/T_if_gez_9.d
deleted file mode 100644
index a0b7545..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gez/d/T_if_gez_9.d
+++ /dev/null
@@ -1,24 +0,0 @@
-.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/src/dot/junit/opcodes/if_gez/d/T_if_gez_9.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_gez/d/T_if_gez_9.dfh
deleted file mode 100644
index 4c24707..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gez/d/T_if_gez_9.dfh
+++ /dev/null
@@ -1,276 +0,0 @@
-// 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/src/dot/junit/opcodes/if_gt/Test_if_gt.java b/tools/vm-tests/src/dot/junit/opcodes/if_gt/Test_if_gt.java
deleted file mode 100644
index 862ba4b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gt/Test_if_gt.java
+++ /dev/null
@@ -1,175 +0,0 @@
-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/src/dot/junit/opcodes/if_gt/d/T_if_gt_1.d b/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_1.d
deleted file mode 100644
index 293c1ec..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_1.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_gt/d/T_if_gt_1.java b/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_1.java
deleted file mode 100644
index b71142f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_1.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_gt/d/T_if_gt_10.d b/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_10.d
deleted file mode 100644
index 7dd9ab7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_10.d
+++ /dev/null
@@ -1,24 +0,0 @@
-.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/src/dot/junit/opcodes/if_gt/d/T_if_gt_10.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_10.dfh
deleted file mode 100644
index 6d0aaad..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_10.dfh
+++ /dev/null
@@ -1,280 +0,0 @@
-// 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/src/dot/junit/opcodes/if_gt/d/T_if_gt_11.d b/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_11.d
deleted file mode 100644
index 13fa794..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_11.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/if_gt/d/T_if_gt_11.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_11.dfh
deleted file mode 100644
index 9822137..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_11.dfh
+++ /dev/null
@@ -1,278 +0,0 @@
-// 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/src/dot/junit/opcodes/if_gt/d/T_if_gt_2.d b/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_2.d
deleted file mode 100644
index 30e3b81..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_2.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/if_gt/d/T_if_gt_2.java b/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_2.java
deleted file mode 100644
index 136d619..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/if_gt/d/T_if_gt_3.d b/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_3.d
deleted file mode 100644
index 75d4d17..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_3.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_gt/d/T_if_gt_3.java b/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_3.java
deleted file mode 100644
index 9d53767..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_3.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_gt/d/T_if_gt_4.d b/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_4.d
deleted file mode 100644
index f1ebef1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_4.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_gt/d/T_if_gt_5.d b/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_5.d
deleted file mode 100644
index 829291b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_5.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_gt/d/T_if_gt_6.d b/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_6.d
deleted file mode 100644
index 39b3541..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_6.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_gt/d/T_if_gt_7.d b/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_7.d
deleted file mode 100644
index 88b8364..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_7.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_gt/d/T_if_gt_8.d b/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_8.d
deleted file mode 100644
index 8325322..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_8.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/if_gt/d/T_if_gt_9.d b/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_9.d
deleted file mode 100644
index 198d870..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_9.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_gt/d/T_if_gt_9.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_9.dfh
deleted file mode 100644
index a9549db..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gt/d/T_if_gt_9.dfh
+++ /dev/null
@@ -1,274 +0,0 @@
-// 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/src/dot/junit/opcodes/if_gtz/Test_if_gtz.java b/tools/vm-tests/src/dot/junit/opcodes/if_gtz/Test_if_gtz.java
deleted file mode 100644
index 86a5535..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gtz/Test_if_gtz.java
+++ /dev/null
@@ -1,151 +0,0 @@
-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/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_1.d b/tools/vm-tests/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_1.d
deleted file mode 100644
index 2207436..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_1.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_1.java b/tools/vm-tests/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_1.java
deleted file mode 100644
index cca881f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_1.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_10.d b/tools/vm-tests/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_10.d
deleted file mode 100644
index 4119a6e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_10.d
+++ /dev/null
@@ -1,24 +0,0 @@
-.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/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_10.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_10.dfh
deleted file mode 100644
index 5007f63..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_10.dfh
+++ /dev/null
@@ -1,278 +0,0 @@
-// 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/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_2.d b/tools/vm-tests/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_2.d
deleted file mode 100644
index b57c6ab..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_2.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_2.java b/tools/vm-tests/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_2.java
deleted file mode 100644
index ea1def0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_2.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_3.d b/tools/vm-tests/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_3.d
deleted file mode 100644
index c2db4b7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_3.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_4.d b/tools/vm-tests/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_4.d
deleted file mode 100644
index 98e01e7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_4.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_5.d b/tools/vm-tests/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_5.d
deleted file mode 100644
index 29f8800..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_5.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_6.d b/tools/vm-tests/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_6.d
deleted file mode 100644
index a91668e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_6.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_7.d b/tools/vm-tests/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_7.d
deleted file mode 100644
index 71a5bfc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_7.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_8.d b/tools/vm-tests/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_8.d
deleted file mode 100644
index 5bf3d9c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_8.d
+++ /dev/null
@@ -1,24 +0,0 @@
-.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/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_8.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_8.dfh
deleted file mode 100644
index 2af60bc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_8.dfh
+++ /dev/null
@@ -1,276 +0,0 @@
-// 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/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_9.d b/tools/vm-tests/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_9.d
deleted file mode 100644
index 08e8ff9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_9.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_9.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_9.dfh
deleted file mode 100644
index 1c600fc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_gtz/d/T_if_gtz_9.dfh
+++ /dev/null
@@ -1,272 +0,0 @@
-// 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/src/dot/junit/opcodes/if_le/Test_if_le.java b/tools/vm-tests/src/dot/junit/opcodes/if_le/Test_if_le.java
deleted file mode 100644
index 852324b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_le/Test_if_le.java
+++ /dev/null
@@ -1,176 +0,0 @@
-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/src/dot/junit/opcodes/if_le/d/T_if_le_1.d b/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_1.d
deleted file mode 100644
index a9fbd14..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_1.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_le/d/T_if_le_1.java b/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_1.java
deleted file mode 100644
index 65d5da6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_1.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_le/d/T_if_le_10.d b/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_10.d
deleted file mode 100644
index 7c9ca12..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_10.d
+++ /dev/null
@@ -1,24 +0,0 @@
-.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/src/dot/junit/opcodes/if_le/d/T_if_le_10.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_10.dfh
deleted file mode 100644
index 9c55965..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_10.dfh
+++ /dev/null
@@ -1,280 +0,0 @@
-// 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/src/dot/junit/opcodes/if_le/d/T_if_le_11.d b/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_11.d
deleted file mode 100644
index aaeecc9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_11.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_le/d/T_if_le_11.java b/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_11.java
deleted file mode 100644
index b92d796..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_11.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_le/d/T_if_le_12.d b/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_12.d
deleted file mode 100644
index 2f9f581..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_12.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_le/d/T_if_le_12.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_12.dfh
deleted file mode 100644
index a8735cf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_12.dfh
+++ /dev/null
@@ -1,272 +0,0 @@
-// 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/src/dot/junit/opcodes/if_le/d/T_if_le_3.d b/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_3.d
deleted file mode 100644
index e389992..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_3.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/if_le/d/T_if_le_4.d b/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_4.d
deleted file mode 100644
index 514c26b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_4.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_le/d/T_if_le_5.d b/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_5.d
deleted file mode 100644
index a70e43f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_5.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_le/d/T_if_le_6.d b/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_6.d
deleted file mode 100644
index fb8bb3c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_6.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_le/d/T_if_le_7.d b/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_7.d
deleted file mode 100644
index cf76654..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_7.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_le/d/T_if_le_8.d b/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_8.d
deleted file mode 100644
index 34562f1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_8.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/if_le/d/T_if_le_9.d b/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_9.d
deleted file mode 100644
index 99fa7c4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_9.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_le/d/T_if_le_9.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_9.dfh
deleted file mode 100644
index 51da483..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_le/d/T_if_le_9.dfh
+++ /dev/null
@@ -1,274 +0,0 @@
-// 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/src/dot/junit/opcodes/if_lez/Test_if_lez.java b/tools/vm-tests/src/dot/junit/opcodes/if_lez/Test_if_lez.java
deleted file mode 100644
index 4f72938..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lez/Test_if_lez.java
+++ /dev/null
@@ -1,152 +0,0 @@
-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/src/dot/junit/opcodes/if_lez/d/T_if_lez_1.d b/tools/vm-tests/src/dot/junit/opcodes/if_lez/d/T_if_lez_1.d
deleted file mode 100644
index 6429797..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lez/d/T_if_lez_1.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_lez/d/T_if_lez_1.java b/tools/vm-tests/src/dot/junit/opcodes/if_lez/d/T_if_lez_1.java
deleted file mode 100644
index b3d7441..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lez/d/T_if_lez_1.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_lez/d/T_if_lez_10.d b/tools/vm-tests/src/dot/junit/opcodes/if_lez/d/T_if_lez_10.d
deleted file mode 100644
index 82a8268..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lez/d/T_if_lez_10.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_lez/d/T_if_lez_10.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_lez/d/T_if_lez_10.dfh
deleted file mode 100644
index 66ce09b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lez/d/T_if_lez_10.dfh
+++ /dev/null
@@ -1,274 +0,0 @@
-// 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/src/dot/junit/opcodes/if_lez/d/T_if_lez_2.d b/tools/vm-tests/src/dot/junit/opcodes/if_lez/d/T_if_lez_2.d
deleted file mode 100644
index cbe7f34..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lez/d/T_if_lez_2.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_lez/d/T_if_lez_2.java b/tools/vm-tests/src/dot/junit/opcodes/if_lez/d/T_if_lez_2.java
deleted file mode 100644
index 37ce198..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lez/d/T_if_lez_2.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_lez/d/T_if_lez_3.d b/tools/vm-tests/src/dot/junit/opcodes/if_lez/d/T_if_lez_3.d
deleted file mode 100644
index 4efd27a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lez/d/T_if_lez_3.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_lez/d/T_if_lez_4.d b/tools/vm-tests/src/dot/junit/opcodes/if_lez/d/T_if_lez_4.d
deleted file mode 100644
index 985254d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lez/d/T_if_lez_4.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_lez/d/T_if_lez_5.d b/tools/vm-tests/src/dot/junit/opcodes/if_lez/d/T_if_lez_5.d
deleted file mode 100644
index 705c855..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lez/d/T_if_lez_5.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_lez/d/T_if_lez_6.d b/tools/vm-tests/src/dot/junit/opcodes/if_lez/d/T_if_lez_6.d
deleted file mode 100644
index 596f1d0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lez/d/T_if_lez_6.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_lez/d/T_if_lez_7.d b/tools/vm-tests/src/dot/junit/opcodes/if_lez/d/T_if_lez_7.d
deleted file mode 100644
index 129b4bb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lez/d/T_if_lez_7.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/if_lez/d/T_if_lez_8.d b/tools/vm-tests/src/dot/junit/opcodes/if_lez/d/T_if_lez_8.d
deleted file mode 100644
index b21ab3e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lez/d/T_if_lez_8.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_lez/d/T_if_lez_8.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_lez/d/T_if_lez_8.dfh
deleted file mode 100644
index d1e27e4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lez/d/T_if_lez_8.dfh
+++ /dev/null
@@ -1,272 +0,0 @@
-// 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/src/dot/junit/opcodes/if_lez/d/T_if_lez_9.d b/tools/vm-tests/src/dot/junit/opcodes/if_lez/d/T_if_lez_9.d
deleted file mode 100644
index 5efdeba..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lez/d/T_if_lez_9.d
+++ /dev/null
@@ -1,24 +0,0 @@
-.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/src/dot/junit/opcodes/if_lez/d/T_if_lez_9.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_lez/d/T_if_lez_9.dfh
deleted file mode 100644
index 4ea81be..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lez/d/T_if_lez_9.dfh
+++ /dev/null
@@ -1,276 +0,0 @@
-// 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/src/dot/junit/opcodes/if_lt/Test_if_lt.java b/tools/vm-tests/src/dot/junit/opcodes/if_lt/Test_if_lt.java
deleted file mode 100644
index 26a3faa..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lt/Test_if_lt.java
+++ /dev/null
@@ -1,175 +0,0 @@
-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/src/dot/junit/opcodes/if_lt/d/T_if_lt_1.d b/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_1.d
deleted file mode 100644
index c81d8b3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_1.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_lt/d/T_if_lt_1.java b/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_1.java
deleted file mode 100644
index 5a2e8e1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_1.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_lt/d/T_if_lt_10.d b/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_10.d
deleted file mode 100644
index 4821984..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_10.d
+++ /dev/null
@@ -1,24 +0,0 @@
-.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/src/dot/junit/opcodes/if_lt/d/T_if_lt_10.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_10.dfh
deleted file mode 100644
index bb2ed5a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_10.dfh
+++ /dev/null
@@ -1,280 +0,0 @@
-// 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/src/dot/junit/opcodes/if_lt/d/T_if_lt_11.d b/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_11.d
deleted file mode 100644
index 7e80ecf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_11.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_lt/d/T_if_lt_11.java b/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_11.java
deleted file mode 100644
index cc3323f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_11.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_lt/d/T_if_lt_12.d b/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_12.d
deleted file mode 100644
index f9083cf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_12.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_lt/d/T_if_lt_12.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_12.dfh
deleted file mode 100644
index aed0448..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_12.dfh
+++ /dev/null
@@ -1,276 +0,0 @@
-// 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/src/dot/junit/opcodes/if_lt/d/T_if_lt_2.d b/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_2.d
deleted file mode 100644
index 94546c9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_2.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/if_lt/d/T_if_lt_2.java b/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_2.java
deleted file mode 100644
index 14e148c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/if_lt/d/T_if_lt_4.d b/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_4.d
deleted file mode 100644
index 9a93ac6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_4.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_lt/d/T_if_lt_5.d b/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_5.d
deleted file mode 100644
index 7d77ad9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_5.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_lt/d/T_if_lt_6.d b/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_6.d
deleted file mode 100644
index 9d1910e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_6.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_lt/d/T_if_lt_7.d b/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_7.d
deleted file mode 100644
index 8d126c7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_7.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_lt/d/T_if_lt_9.d b/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_9.d
deleted file mode 100644
index 8c2f2ee..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_9.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_lt/d/T_if_lt_9.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_9.dfh
deleted file mode 100644
index 10b38ab..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_lt/d/T_if_lt_9.dfh
+++ /dev/null
@@ -1,274 +0,0 @@
-// 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/src/dot/junit/opcodes/if_ltz/Test_if_ltz.java b/tools/vm-tests/src/dot/junit/opcodes/if_ltz/Test_if_ltz.java
deleted file mode 100644
index b70d16e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ltz/Test_if_ltz.java
+++ /dev/null
@@ -1,150 +0,0 @@
-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/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_1.d b/tools/vm-tests/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_1.d
deleted file mode 100644
index 7022a90..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_1.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_1.java b/tools/vm-tests/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_1.java
deleted file mode 100644
index 7e666cf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_1.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_2.d b/tools/vm-tests/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_2.d
deleted file mode 100644
index aa01356..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_2.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_2.java b/tools/vm-tests/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_2.java
deleted file mode 100644
index 0c0480e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_2.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_3.d b/tools/vm-tests/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_3.d
deleted file mode 100644
index d2405ed..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_3.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_4.d b/tools/vm-tests/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_4.d
deleted file mode 100644
index 804ef88..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_4.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_5.d b/tools/vm-tests/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_5.d
deleted file mode 100644
index af8e741..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_5.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_6.d b/tools/vm-tests/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_6.d
deleted file mode 100644
index c56730f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_6.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_7.d b/tools/vm-tests/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_7.d
deleted file mode 100644
index f14a551..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_7.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_7.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_7.dfh
deleted file mode 100644
index afb4652..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_7.dfh
+++ /dev/null
@@ -1,272 +0,0 @@
-// 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/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_8.d b/tools/vm-tests/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_8.d
deleted file mode 100644
index 650e299..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_8.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_8.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_8.dfh
deleted file mode 100644
index dc3b594..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_8.dfh
+++ /dev/null
@@ -1,272 +0,0 @@
-// 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/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_9.d b/tools/vm-tests/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_9.d
deleted file mode 100644
index 3b4a3dc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_9.d
+++ /dev/null
@@ -1,24 +0,0 @@
-.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/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_9.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_9.dfh
deleted file mode 100644
index dc5146c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ltz/d/T_if_ltz_9.dfh
+++ /dev/null
@@ -1,276 +0,0 @@
-// 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/src/dot/junit/opcodes/if_ne/Test_if_ne.java b/tools/vm-tests/src/dot/junit/opcodes/if_ne/Test_if_ne.java
deleted file mode 100644
index 610fe96..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ne/Test_if_ne.java
+++ /dev/null
@@ -1,205 +0,0 @@
-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/src/dot/junit/opcodes/if_ne/d/T_if_ne_1.d b/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_1.d
deleted file mode 100644
index cb84784..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_1.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_ne/d/T_if_ne_1.java b/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_1.java
deleted file mode 100644
index ebc05ac..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_1.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_ne/d/T_if_ne_10.d b/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_10.d
deleted file mode 100644
index f42d830..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_10.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_ne/d/T_if_ne_10.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_10.dfh
deleted file mode 100644
index f5f9427..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_10.dfh
+++ /dev/null
@@ -1,276 +0,0 @@
-// 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/src/dot/junit/opcodes/if_ne/d/T_if_ne_11.d b/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_11.d
deleted file mode 100644
index 65bb0d2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_11.d
+++ /dev/null
@@ -1,24 +0,0 @@
-.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/src/dot/junit/opcodes/if_ne/d/T_if_ne_11.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_11.dfh
deleted file mode 100644
index 8b5c5e6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_11.dfh
+++ /dev/null
@@ -1,280 +0,0 @@
-// 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/src/dot/junit/opcodes/if_ne/d/T_if_ne_12.d b/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_12.d
deleted file mode 100644
index 0893fa4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_12.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_ne/d/T_if_ne_12.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_12.dfh
deleted file mode 100644
index e78249f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_12.dfh
+++ /dev/null
@@ -1,276 +0,0 @@
-// 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/src/dot/junit/opcodes/if_ne/d/T_if_ne_2.d b/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_2.d
deleted file mode 100644
index 039f954..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_2.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_ne/d/T_if_ne_2.java b/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_2.java
deleted file mode 100644
index 79c7519..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_2.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_ne/d/T_if_ne_4.d b/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_4.d
deleted file mode 100644
index aaa66e8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_4.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_ne/d/T_if_ne_4.java b/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_4.java
deleted file mode 100644
index fbd1049..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_4.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_ne/d/T_if_ne_5.d b/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_5.d
deleted file mode 100644
index 4bfefaa..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_5.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_ne/d/T_if_ne_7.d b/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_7.d
deleted file mode 100644
index 5e57f66..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_7.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_ne/d/T_if_ne_8.d b/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_8.d
deleted file mode 100644
index 0001b04..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_8.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_ne/d/T_if_ne_9.d b/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_9.d
deleted file mode 100644
index 4f3f107..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_ne/d/T_if_ne_9.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_nez/Test_if_nez.java b/tools/vm-tests/src/dot/junit/opcodes/if_nez/Test_if_nez.java
deleted file mode 100644
index 1283f37..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_nez/Test_if_nez.java
+++ /dev/null
@@ -1,159 +0,0 @@
-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/src/dot/junit/opcodes/if_nez/d/T_if_nez_1.d b/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_1.d
deleted file mode 100644
index da15ff2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_1.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_nez/d/T_if_nez_1.java b/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_1.java
deleted file mode 100644
index 7e8aab3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_1.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_nez/d/T_if_nez_10.d b/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_10.d
deleted file mode 100644
index 4a5a9a1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_10.d
+++ /dev/null
@@ -1,24 +0,0 @@
-.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/src/dot/junit/opcodes/if_nez/d/T_if_nez_10.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_10.dfh
deleted file mode 100644
index c690b98..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_10.dfh
+++ /dev/null
@@ -1,278 +0,0 @@
-// 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/src/dot/junit/opcodes/if_nez/d/T_if_nez_11.d b/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_11.d
deleted file mode 100644
index 81ef2ba..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_11.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_nez/d/T_if_nez_11.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_11.dfh
deleted file mode 100644
index 07373f2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_11.dfh
+++ /dev/null
@@ -1,274 +0,0 @@
-// 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/src/dot/junit/opcodes/if_nez/d/T_if_nez_2.d b/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_2.d
deleted file mode 100644
index d95004a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_2.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_nez/d/T_if_nez_2.java b/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_2.java
deleted file mode 100644
index 802b021..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_2.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_nez/d/T_if_nez_3.d b/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_3.d
deleted file mode 100644
index ea90b8d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_3.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_nez/d/T_if_nez_3.java b/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_3.java
deleted file mode 100644
index 149b181..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_3.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_nez/d/T_if_nez_4.d b/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_4.d
deleted file mode 100644
index efe46b0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_4.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_nez/d/T_if_nez_4.java b/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_4.java
deleted file mode 100644
index 96b98a2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_4.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/if_nez/d/T_if_nez_5.d b/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_5.d
deleted file mode 100644
index 8640ec1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_5.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_nez/d/T_if_nez_6.d b/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_6.d
deleted file mode 100644
index 67348ad..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_6.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_nez/d/T_if_nez_7.d b/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_7.d
deleted file mode 100644
index b22102e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_7.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_nez/d/T_if_nez_9.d b/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_9.d
deleted file mode 100644
index 5ea760a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_9.d
+++ /dev/null
@@ -1,23 +0,0 @@
-.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/src/dot/junit/opcodes/if_nez/d/T_if_nez_9.dfh b/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_9.dfh
deleted file mode 100644
index acd19bc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/if_nez/d/T_if_nez_9.dfh
+++ /dev/null
@@ -1,272 +0,0 @@
-// 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/src/dot/junit/opcodes/iget/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/iget/TestStubs.java
deleted file mode 100644
index 07bb886..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/TestStubs.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget/Test_iget.java b/tools/vm-tests/src/dot/junit/opcodes/iget/Test_iget.java
deleted file mode 100644
index 50658ce..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/Test_iget.java
+++ /dev/null
@@ -1,311 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget/d/T_iget_1.d b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_1.d
deleted file mode 100644
index cac6528..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_1.d
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget/d/T_iget_1.java b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_1.java
deleted file mode 100644
index 1ce655a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_1.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget/d/T_iget_11.d b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_11.d
deleted file mode 100644
index 6e64e3c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_11.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget/d/T_iget_11.java b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_11.java
deleted file mode 100644
index 9d6b376..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget/d/T_iget_12.d b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_12.d
deleted file mode 100644
index 312dd9c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_12.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget/d/T_iget_12.java b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_12.java
deleted file mode 100644
index b9f40ae..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_12.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget/d/T_iget_13.d b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_13.d
deleted file mode 100644
index eed73b9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_13.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget/d/T_iget_13.java b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_13.java
deleted file mode 100644
index 1038f56..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_13.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget/d/T_iget_14.d b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_14.d
deleted file mode 100644
index faa6271..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_14.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget/d/T_iget_15.d b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_15.d
deleted file mode 100644
index d50305b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_15.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget/d/T_iget_16.d b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_16.d
deleted file mode 100644
index 8a5253b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_16.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget/d/T_iget_17.d b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_17.d
deleted file mode 100644
index 69d1af4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_17.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget/d/T_iget_18.d b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_18.d
deleted file mode 100644
index c081e55..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_18.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget/d/T_iget_19.d b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_19.d
deleted file mode 100644
index a555e94..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_19.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget/d/T_iget_2.d b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_2.d
deleted file mode 100644
index bf07640..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_2.d
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget/d/T_iget_2.java b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_2.java
deleted file mode 100644
index 3efa19d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_2.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget/d/T_iget_20.d b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_20.d
deleted file mode 100644
index b34faae..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_20.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget/d/T_iget_21.d b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_21.d
deleted file mode 100644
index 569458b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_21.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget/d/T_iget_21.java b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_21.java
deleted file mode 100644
index 31db5f1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_21.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget/d/T_iget_3.d b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_3.d
deleted file mode 100644
index f362d0f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget/d/T_iget_30.d b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_30.d
deleted file mode 100644
index 3564c81..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_30.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget/d/T_iget_4.d b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_4.d
deleted file mode 100644
index 8336a2e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget/d/T_iget_4.dfh b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_4.dfh
deleted file mode 100644
index c29f935..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_4.dfh
+++ /dev/null
@@ -1,266 +0,0 @@
-// 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/src/dot/junit/opcodes/iget/d/T_iget_5.d b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_5.d
deleted file mode 100644
index 7a7c3ea..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_5.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget/d/T_iget_5.java b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_5.java
deleted file mode 100644
index 053f013..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget/d/T_iget_6.d b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_6.d
deleted file mode 100644
index 8ea70c2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_6.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget/d/T_iget_6.java b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_6.java
deleted file mode 100644
index efb61d2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget/d/T_iget_7.d b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_7.d
deleted file mode 100644
index a68b0f0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_7.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget/d/T_iget_7.java b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_7.java
deleted file mode 100644
index 54b848f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget/d/T_iget_8.d b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_8.d
deleted file mode 100644
index 9fc3b75..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_8.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget/d/T_iget_8.java b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_8.java
deleted file mode 100644
index 249b4d0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget/d/T_iget_9.d b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_9.d
deleted file mode 100644
index 268398c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_9.d
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget/d/T_iget_9.java b/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_9.java
deleted file mode 100644
index 440ad6d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget/d/T_iget_9.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_boolean/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/TestStubs.java
deleted file mode 100644
index 8dcd427..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/TestStubs.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_boolean/Test_iget_boolean.java b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/Test_iget_boolean.java
deleted file mode 100644
index b23f330..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/Test_iget_boolean.java
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_1.d b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_1.d
deleted file mode 100644
index 23b0a93..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_1.d
+++ /dev/null
@@ -1,48 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_1.java b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_1.java
deleted file mode 100644
index b23b780..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_1.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_11.d b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_11.d
deleted file mode 100644
index 540ecc5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_11.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_11.java b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_11.java
deleted file mode 100644
index 2b2423e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_12.d b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_12.d
deleted file mode 100644
index e0a918f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_12.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_12.java b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_12.java
deleted file mode 100644
index 5af996f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_12.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_13.d b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_13.d
deleted file mode 100644
index 50ad238..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_13.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_13.java b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_13.java
deleted file mode 100644
index b652090..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_13.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_14.d b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_14.d
deleted file mode 100644
index 38a56f6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_14.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_15.d b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_15.d
deleted file mode 100644
index 9b165d9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_15.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_16.d b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_16.d
deleted file mode 100644
index 8eb7f27..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_16.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_17.d b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_17.d
deleted file mode 100644
index 499c796..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_17.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_18.d b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_18.d
deleted file mode 100644
index ab97074..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_18.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_19.d b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_19.d
deleted file mode 100644
index 2909f36..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_19.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_20.d b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_20.d
deleted file mode 100644
index e37f360..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_20.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_21.d b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_21.d
deleted file mode 100644
index c59f39d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_21.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_21.java b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_21.java
deleted file mode 100644
index 74e2da1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_21.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_3.d b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_3.d
deleted file mode 100644
index 7b6f6f0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_30.d b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_30.d
deleted file mode 100644
index 9f30d4d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_30.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_4.d b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_4.d
deleted file mode 100644
index 56747b1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_4.dfh b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_4.dfh
deleted file mode 100644
index a68f88b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_4.dfh
+++ /dev/null
@@ -1,266 +0,0 @@
-// 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_5.d b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_5.d
deleted file mode 100644
index f9bf929..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_5.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_5.java b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_5.java
deleted file mode 100644
index 5b275aa..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_6.d b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_6.d
deleted file mode 100644
index ae3a118..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_6.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_6.java b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_6.java
deleted file mode 100644
index 0d91cab..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_7.d b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_7.d
deleted file mode 100644
index cdec059..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_7.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_7.java b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_7.java
deleted file mode 100644
index 3ec333b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_8.d b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_8.d
deleted file mode 100644
index fd4ff0a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_8.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_8.java b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_8.java
deleted file mode 100644
index b87cf8d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_9.d b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_9.d
deleted file mode 100644
index 9b2b565..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_9.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_9.java b/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_9.java
deleted file mode 100644
index a5261bb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_boolean/d/T_iget_boolean_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_byte/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/TestStubs.java
deleted file mode 100644
index 90b1f13..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/TestStubs.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_byte/Test_iget_byte.java b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/Test_iget_byte.java
deleted file mode 100644
index de48192..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/Test_iget_byte.java
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_1.d b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_1.d
deleted file mode 100644
index 6dbe256..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_1.d
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_1.java b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_1.java
deleted file mode 100644
index 32df19e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_1.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_11.d b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_11.d
deleted file mode 100644
index 0a13a63..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_11.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_11.java b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_11.java
deleted file mode 100644
index 535c971..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_12.d b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_12.d
deleted file mode 100644
index 19d218b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_12.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_12.java b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_12.java
deleted file mode 100644
index 3927a5b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_12.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_13.d b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_13.d
deleted file mode 100644
index f09be61..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_13.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_13.java b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_13.java
deleted file mode 100644
index 755b896..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_13.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_14.d b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_14.d
deleted file mode 100644
index f33ce5d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_14.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_15.d b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_15.d
deleted file mode 100644
index 4564d6d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_15.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_16.d b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_16.d
deleted file mode 100644
index 0cd45ef..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_16.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_17.d b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_17.d
deleted file mode 100644
index fba56a4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_17.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_18.d b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_18.d
deleted file mode 100644
index 309001d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_18.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_19.d b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_19.d
deleted file mode 100644
index a1397ba..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_19.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_20.d b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_20.d
deleted file mode 100644
index 2373e00..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_20.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_21.d b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_21.d
deleted file mode 100644
index 40685ee..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_21.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_21.java b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_21.java
deleted file mode 100644
index 10deb39..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_21.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_3.d b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_3.d
deleted file mode 100644
index a7cf811..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_30.d b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_30.d
deleted file mode 100644
index 1c8e463..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_30.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_4.d b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_4.d
deleted file mode 100644
index 20f03c8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_4.dfh b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_4.dfh
deleted file mode 100644
index 26864a7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_4.dfh
+++ /dev/null
@@ -1,266 +0,0 @@
-// 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_5.d b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_5.d
deleted file mode 100644
index 65e6ed0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_5.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_5.java b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_5.java
deleted file mode 100644
index 75f7a5c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_6.d b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_6.d
deleted file mode 100644
index 0f761e0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_6.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_6.java b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_6.java
deleted file mode 100644
index 20af80f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_7.d b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_7.d
deleted file mode 100644
index a9df70b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_7.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_7.java b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_7.java
deleted file mode 100644
index f13071d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_8.d b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_8.d
deleted file mode 100644
index de3b7a0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_8.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_8.java b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_8.java
deleted file mode 100644
index 6f89bf3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_9.d b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_9.d
deleted file mode 100644
index 96eee86..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_9.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_9.java b/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_9.java
deleted file mode 100644
index 476ae5d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_byte/d/T_iget_byte_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_char/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/iget_char/TestStubs.java
deleted file mode 100644
index 5bf73ae..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/TestStubs.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_char/Test_iget_char.java b/tools/vm-tests/src/dot/junit/opcodes/iget_char/Test_iget_char.java
deleted file mode 100644
index c7516e8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/Test_iget_char.java
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_1.d b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_1.d
deleted file mode 100644
index 837dd6b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_1.d
+++ /dev/null
@@ -1,49 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_1.java b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_1.java
deleted file mode 100644
index 227f97a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_1.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_11.d b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_11.d
deleted file mode 100644
index 9d74992..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_11.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_11.java b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_11.java
deleted file mode 100644
index cdd08a7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_12.d b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_12.d
deleted file mode 100644
index 5194ff9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_12.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_12.java b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_12.java
deleted file mode 100644
index 611b24b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_12.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_13.d b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_13.d
deleted file mode 100644
index a7f5e58..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_13.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_13.java b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_13.java
deleted file mode 100644
index 33cae33..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_13.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_14.d b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_14.d
deleted file mode 100644
index 46f0e20..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_14.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_15.d b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_15.d
deleted file mode 100644
index e8c7195..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_15.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_16.d b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_16.d
deleted file mode 100644
index 34dbaf0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_16.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_17.d b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_17.d
deleted file mode 100644
index cde1b06..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_17.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_18.d b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_18.d
deleted file mode 100644
index f32f364..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_18.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_19.d b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_19.d
deleted file mode 100644
index 5efa5ba..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_19.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_20.d b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_20.d
deleted file mode 100644
index 895f42e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_20.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_21.d b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_21.d
deleted file mode 100644
index 4902259..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_21.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_21.java b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_21.java
deleted file mode 100644
index 6517824..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_21.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_3.d b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_3.d
deleted file mode 100644
index 7838f58..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_30.d b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_30.d
deleted file mode 100644
index bdc90d2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_30.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_4.d b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_4.d
deleted file mode 100644
index 428c14b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_4.dfh b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_4.dfh
deleted file mode 100644
index 270fbc7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_4.dfh
+++ /dev/null
@@ -1,266 +0,0 @@
-// 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_5.d b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_5.d
deleted file mode 100644
index 534412f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_5.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_5.java b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_5.java
deleted file mode 100644
index 4975e76..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_6.d b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_6.d
deleted file mode 100644
index 0d208b3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_6.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_6.java b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_6.java
deleted file mode 100644
index 8be8c2b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_7.d b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_7.d
deleted file mode 100644
index b2ca2ce..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_7.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_7.java b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_7.java
deleted file mode 100644
index 4ca80d7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_8.d b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_8.d
deleted file mode 100644
index 7a75de0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_8.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_8.java b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_8.java
deleted file mode 100644
index 49d35c6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_9.d b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_9.d
deleted file mode 100644
index 70eca20..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_9.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_char/d/T_iget_char_9.java b/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_9.java
deleted file mode 100644
index 6bbe1ca..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_char/d/T_iget_char_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_object/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/iget_object/TestStubs.java
deleted file mode 100644
index 0a68e56..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/TestStubs.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_object/Test_iget_object.java b/tools/vm-tests/src/dot/junit/opcodes/iget_object/Test_iget_object.java
deleted file mode 100644
index 3a735b6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/Test_iget_object.java
+++ /dev/null
@@ -1,318 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_1.d b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_1.d
deleted file mode 100644
index 5e4967f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_1.d
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_1.java b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_1.java
deleted file mode 100644
index a063f8e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_1.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_11.d b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_11.d
deleted file mode 100644
index 35a2de0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_11.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_11.java b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_11.java
deleted file mode 100644
index 5fdf44a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_12.d b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_12.d
deleted file mode 100644
index b2d7400..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_12.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_12.java b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_12.java
deleted file mode 100644
index f98c36a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_12.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_13.d b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_13.d
deleted file mode 100644
index 21414cc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_13.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_13.java b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_13.java
deleted file mode 100644
index 85a8761..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_13.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_14.d b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_14.d
deleted file mode 100644
index df2581c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_14.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_15.d b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_15.d
deleted file mode 100644
index 313ec7c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_15.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_16.d b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_16.d
deleted file mode 100644
index d9df4aa..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_16.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_17.d b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_17.d
deleted file mode 100644
index 82cb90e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_17.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_18.d b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_18.d
deleted file mode 100644
index 3dac91f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_18.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_19.d b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_19.d
deleted file mode 100644
index 19a9277..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_19.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_20.d b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_20.d
deleted file mode 100644
index 71751fb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_20.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_21.d b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_21.d
deleted file mode 100644
index 10143a7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_21.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_21.java b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_21.java
deleted file mode 100644
index e301893..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_21.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_22.d b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_22.d
deleted file mode 100644
index 2858934..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_22.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_22.java b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_22.java
deleted file mode 100644
index d9ad933..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_22.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_3.d b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_3.d
deleted file mode 100644
index 4999f1a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_30.d b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_30.d
deleted file mode 100644
index 621f235..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_30.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_4.d b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_4.d
deleted file mode 100644
index 9a05156..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_4.dfh b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_4.dfh
deleted file mode 100644
index a031623..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_4.dfh
+++ /dev/null
@@ -1,262 +0,0 @@
-// 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_5.d b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_5.d
deleted file mode 100644
index ed15e90..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_5.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_5.java b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_5.java
deleted file mode 100644
index 3626499..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_6.d b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_6.d
deleted file mode 100644
index e9082e0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_6.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_6.java b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_6.java
deleted file mode 100644
index a4ba515..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_7.d b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_7.d
deleted file mode 100644
index db5f6f0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_7.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_7.java b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_7.java
deleted file mode 100644
index 2940ca4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_8.d b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_8.d
deleted file mode 100644
index 67f7b82..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_8.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_8.java b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_8.java
deleted file mode 100644
index 3b5c4d7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_9.d b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_9.d
deleted file mode 100644
index 7899b37..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_9.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_object/d/T_iget_object_9.java b/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_9.java
deleted file mode 100644
index 7ff752e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_object/d/T_iget_object_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_short/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/iget_short/TestStubs.java
deleted file mode 100644
index 8580ec3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/TestStubs.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_short/Test_iget_short.java b/tools/vm-tests/src/dot/junit/opcodes/iget_short/Test_iget_short.java
deleted file mode 100644
index a7d3658..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/Test_iget_short.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_1.d b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_1.d
deleted file mode 100644
index 822f09e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_1.d
+++ /dev/null
@@ -1,48 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_1.java b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_1.java
deleted file mode 100644
index d70b7a5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_1.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_11.d b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_11.d
deleted file mode 100644
index 0dfd2f1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_11.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_11.java b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_11.java
deleted file mode 100644
index 0fd12c7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_12.d b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_12.d
deleted file mode 100644
index e47f6a6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_12.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_12.java b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_12.java
deleted file mode 100644
index be322f3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_12.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_13.d b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_13.d
deleted file mode 100644
index 22a94a5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_13.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_13.java b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_13.java
deleted file mode 100644
index 3b27d6c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_13.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_14.d b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_14.d
deleted file mode 100644
index 9e0367a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_14.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_15.d b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_15.d
deleted file mode 100644
index cf1fbf5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_15.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_16.d b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_16.d
deleted file mode 100644
index 635640a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_16.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_17.d b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_17.d
deleted file mode 100644
index 6a717be..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_17.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_18.d b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_18.d
deleted file mode 100644
index 70dda5b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_18.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_19.d b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_19.d
deleted file mode 100644
index cdaa952..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_19.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_20.d b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_20.d
deleted file mode 100644
index 5568f60..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_20.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_21.d b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_21.d
deleted file mode 100644
index eff1f49..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_21.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_21.java b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_21.java
deleted file mode 100644
index 5bb7f6e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_21.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_3.d b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_3.d
deleted file mode 100644
index 0de7441..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_30.d b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_30.d
deleted file mode 100644
index bc8bc9f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_30.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_4.d b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_4.d
deleted file mode 100644
index 9e2ffb6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_4.dfh b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_4.dfh
deleted file mode 100644
index 3716e2a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_4.dfh
+++ /dev/null
@@ -1,266 +0,0 @@
-// 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_5.d b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_5.d
deleted file mode 100644
index ac92c40..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_5.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_5.java b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_5.java
deleted file mode 100644
index 37c4351..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_6.d b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_6.d
deleted file mode 100644
index 764d42e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_6.java b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_6.java
deleted file mode 100644
index 5ac127b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_7.d b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_7.d
deleted file mode 100644
index 3a042d0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_7.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_7.java b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_7.java
deleted file mode 100644
index 7c81be5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_8.d b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_8.d
deleted file mode 100644
index 129d2e4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_8.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_8.java b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_8.java
deleted file mode 100644
index f22a81e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_9.d b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_9.d
deleted file mode 100644
index 8721333..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_9.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_short/d/T_iget_short_9.java b/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_9.java
deleted file mode 100644
index 178efc7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_short/d/T_iget_short_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_wide/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/TestStubs.java
deleted file mode 100644
index f90a470..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/TestStubs.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_wide/Test_iget_wide.java b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/Test_iget_wide.java
deleted file mode 100644
index 7e42d32..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/Test_iget_wide.java
+++ /dev/null
@@ -1,311 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_1.d b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_1.d
deleted file mode 100644
index 3919e04..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_1.d
+++ /dev/null
@@ -1,48 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_1.java b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_1.java
deleted file mode 100644
index 309671d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_1.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_11.d b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_11.d
deleted file mode 100644
index 9a6f454..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_11.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_11.java b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_11.java
deleted file mode 100644
index c93589e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_12.d b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_12.d
deleted file mode 100644
index 9a2cc44..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_12.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_12.java b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_12.java
deleted file mode 100644
index af3cbda..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_12.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_13.d b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_13.d
deleted file mode 100644
index 63affb6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_13.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_13.java b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_13.java
deleted file mode 100644
index 98086a6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_13.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_14.d b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_14.d
deleted file mode 100644
index 3ffdc18..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_14.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_15.d b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_15.d
deleted file mode 100644
index 5b7424b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_15.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_16.d b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_16.d
deleted file mode 100644
index ce37389..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_16.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_17.d b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_17.d
deleted file mode 100644
index 1181a48..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_17.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_18.d b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_18.d
deleted file mode 100644
index 03c2a0c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_18.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_19.d b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_19.d
deleted file mode 100644
index 1978e12..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_19.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_2.d b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_2.d
deleted file mode 100644
index 16f9f5a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_2.d
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_2.java b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_2.java
deleted file mode 100644
index 726f4b9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_2.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_20.d b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_20.d
deleted file mode 100644
index 1f3e225..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_20.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_21.d b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_21.d
deleted file mode 100644
index fea700d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_21.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_21.java b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_21.java
deleted file mode 100644
index affeadf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_21.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_3.d b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_3.d
deleted file mode 100644
index bb7026e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_30.d b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_30.d
deleted file mode 100644
index 432f376..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_30.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_4.d b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_4.d
deleted file mode 100644
index 8dd2d4e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_4.dfh b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_4.dfh
deleted file mode 100644
index 489efd2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_4.dfh
+++ /dev/null
@@ -1,266 +0,0 @@
-// 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_5.d b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_5.d
deleted file mode 100644
index cab5c10..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_5.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_5.java b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_5.java
deleted file mode 100644
index c4c130e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_6.d b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_6.d
deleted file mode 100644
index ba13f26..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_6.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_6.java b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_6.java
deleted file mode 100644
index 649795f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_7.d b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_7.d
deleted file mode 100644
index 572fdbe..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_7.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_7.java b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_7.java
deleted file mode 100644
index 0866645..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_8.d b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_8.d
deleted file mode 100644
index 96b8c56..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_8.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_8.java b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_8.java
deleted file mode 100644
index 570764d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_9.d b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_9.d
deleted file mode 100644
index 3cb12cc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_9.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_9.java b/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_9.java
deleted file mode 100644
index 6999d93..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iget_wide/d/T_iget_wide_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/instance_of/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/instance_of/TestStubs.java
deleted file mode 100644
index 9867d92..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/instance_of/TestStubs.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/instance_of/Test_instance_of.java b/tools/vm-tests/src/dot/junit/opcodes/instance_of/Test_instance_of.java
deleted file mode 100644
index b0a6cc6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/instance_of/Test_instance_of.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/instance_of/d/T_instance_of_1.d b/tools/vm-tests/src/dot/junit/opcodes/instance_of/d/T_instance_of_1.d
deleted file mode 100644
index 4741d35..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/instance_of/d/T_instance_of_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/instance_of/d/T_instance_of_1.java b/tools/vm-tests/src/dot/junit/opcodes/instance_of/d/T_instance_of_1.java
deleted file mode 100644
index bd9118a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/instance_of/d/T_instance_of_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/instance_of/d/T_instance_of_2.d b/tools/vm-tests/src/dot/junit/opcodes/instance_of/d/T_instance_of_2.d
deleted file mode 100644
index 1299b54..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/instance_of/d/T_instance_of_2.d
+++ /dev/null
@@ -1,119 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/instance_of/d/T_instance_of_2.java b/tools/vm-tests/src/dot/junit/opcodes/instance_of/d/T_instance_of_2.java
deleted file mode 100644
index e7f1940..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/instance_of/d/T_instance_of_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/instance_of/d/T_instance_of_3.d b/tools/vm-tests/src/dot/junit/opcodes/instance_of/d/T_instance_of_3.d
deleted file mode 100644
index 6705dcf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/instance_of/d/T_instance_of_3.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/instance_of/d/T_instance_of_3.java b/tools/vm-tests/src/dot/junit/opcodes/instance_of/d/T_instance_of_3.java
deleted file mode 100644
index 65a0165..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/instance_of/d/T_instance_of_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/instance_of/d/T_instance_of_4.d b/tools/vm-tests/src/dot/junit/opcodes/instance_of/d/T_instance_of_4.d
deleted file mode 100644
index fe8b891..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/instance_of/d/T_instance_of_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/instance_of/d/T_instance_of_4.dfh b/tools/vm-tests/src/dot/junit/opcodes/instance_of/d/T_instance_of_4.dfh
deleted file mode 100644
index cec381b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/instance_of/d/T_instance_of_4.dfh
+++ /dev/null
@@ -1,264 +0,0 @@
-// 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/src/dot/junit/opcodes/instance_of/d/T_instance_of_5.d b/tools/vm-tests/src/dot/junit/opcodes/instance_of/d/T_instance_of_5.d
deleted file mode 100644
index eac21b9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/instance_of/d/T_instance_of_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/instance_of/d/T_instance_of_6.d b/tools/vm-tests/src/dot/junit/opcodes/instance_of/d/T_instance_of_6.d
deleted file mode 100644
index 4c2e649..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/instance_of/d/T_instance_of_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/instance_of/d/T_instance_of_7.d b/tools/vm-tests/src/dot/junit/opcodes/instance_of/d/T_instance_of_7.d
deleted file mode 100644
index f0823e7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/instance_of/d/T_instance_of_7.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/instance_of/d/T_instance_of_7.java b/tools/vm-tests/src/dot/junit/opcodes/instance_of/d/T_instance_of_7.java
deleted file mode 100644
index adcd6f7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/instance_of/d/T_instance_of_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/instance_of/d/T_instance_of_8.d b/tools/vm-tests/src/dot/junit/opcodes/instance_of/d/T_instance_of_8.d
deleted file mode 100644
index 2853ade..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/instance_of/d/T_instance_of_8.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_byte/Test_int_to_byte.java b/tools/vm-tests/src/dot/junit/opcodes/int_to_byte/Test_int_to_byte.java
deleted file mode 100644
index 55e07fc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_byte/Test_int_to_byte.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_1.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_1.d
deleted file mode 100644
index bfbd201..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_1.java b/tools/vm-tests/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_1.java
deleted file mode 100644
index 1397f49..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_2.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_2.d
deleted file mode 100644
index 6d18c51..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_3.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_3.d
deleted file mode 100644
index 6136a49..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_4.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_4.d
deleted file mode 100644
index 5049465..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_5.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_5.d
deleted file mode 100644
index 78fa37c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_5.java b/tools/vm-tests/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_5.java
deleted file mode 100644
index 7580b7c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_6.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_6.d
deleted file mode 100644
index 66b3071..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_byte/d/T_int_to_byte_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_char/Test_int_to_char.java b/tools/vm-tests/src/dot/junit/opcodes/int_to_char/Test_int_to_char.java
deleted file mode 100644
index b426473..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_char/Test_int_to_char.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_1.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_1.d
deleted file mode 100644
index c469970..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_1.java b/tools/vm-tests/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_1.java
deleted file mode 100644
index 42ad201..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_2.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_2.d
deleted file mode 100644
index df98cf1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_3.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_3.d
deleted file mode 100644
index e67ac88..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_4.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_4.d
deleted file mode 100644
index 72477b6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_5.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_5.d
deleted file mode 100644
index c00482b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_5.java b/tools/vm-tests/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_5.java
deleted file mode 100644
index 7ebbc1a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_6.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_6.d
deleted file mode 100644
index 91c0397..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_char/d/T_int_to_char_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_double/Test_int_to_double.java b/tools/vm-tests/src/dot/junit/opcodes/int_to_double/Test_int_to_double.java
deleted file mode 100644
index ae32560..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_double/Test_int_to_double.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_1.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_1.d
deleted file mode 100644
index 19a17f4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_1.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_1.java b/tools/vm-tests/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_1.java
deleted file mode 100644
index 5277313..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_3.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_3.d
deleted file mode 100644
index adc6bfb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_4.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_4.d
deleted file mode 100644
index 51f6966..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_5.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_5.d
deleted file mode 100644
index 9d8382d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_5.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_6.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_6.d
deleted file mode 100644
index 529f23e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_6.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_6.java b/tools/vm-tests/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_6.java
deleted file mode 100644
index 213dc7a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_7.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_7.d
deleted file mode 100644
index 06b12b4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_double/d/T_int_to_double_7.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_float/Test_int_to_float.java b/tools/vm-tests/src/dot/junit/opcodes/int_to_float/Test_int_to_float.java
deleted file mode 100644
index 8b6e978..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_float/Test_int_to_float.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_1.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_1.d
deleted file mode 100644
index 16b6f1a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_1.java b/tools/vm-tests/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_1.java
deleted file mode 100644
index 777d81e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_2.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_2.d
deleted file mode 100644
index c2fdf91..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_3.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_3.d
deleted file mode 100644
index 4f16417..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_4.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_4.d
deleted file mode 100644
index e31d685..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_5.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_5.d
deleted file mode 100644
index c5bd602..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_5.java b/tools/vm-tests/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_5.java
deleted file mode 100644
index 3324016..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_6.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_6.d
deleted file mode 100644
index 37db947..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_float/d/T_int_to_float_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_long/Test_int_to_long.java b/tools/vm-tests/src/dot/junit/opcodes/int_to_long/Test_int_to_long.java
deleted file mode 100644
index 3147723..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_long/Test_int_to_long.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_1.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_1.d
deleted file mode 100644
index 4f91de2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_1.java b/tools/vm-tests/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_1.java
deleted file mode 100644
index 03becc7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_2.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_2.d
deleted file mode 100644
index eab475b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_3.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_3.d
deleted file mode 100644
index 05527d4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_4.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_4.d
deleted file mode 100644
index 9f26670..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_5.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_5.d
deleted file mode 100644
index f006048..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_5.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_6.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_6.d
deleted file mode 100644
index f71a28d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_6.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_6.java b/tools/vm-tests/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_6.java
deleted file mode 100644
index da307c7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_7.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_7.d
deleted file mode 100644
index c2db686..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_long/d/T_int_to_long_7.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_short/Test_int_to_short.java b/tools/vm-tests/src/dot/junit/opcodes/int_to_short/Test_int_to_short.java
deleted file mode 100644
index 7e4c6a2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_short/Test_int_to_short.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_1.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_1.d
deleted file mode 100644
index fcf1727..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_1.java b/tools/vm-tests/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_1.java
deleted file mode 100644
index 2188088..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_2.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_2.d
deleted file mode 100644
index 9c1154b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_3.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_3.d
deleted file mode 100644
index 5f83549..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_4.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_4.d
deleted file mode 100644
index 147fb66..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_5.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_5.d
deleted file mode 100644
index 8ca83e6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_5.java b/tools/vm-tests/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_5.java
deleted file mode 100644
index 2749fc0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_6.d b/tools/vm-tests/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_6.d
deleted file mode 100644
index 8d6f0ec..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/int_to_short/d/T_int_to_short_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct/TAbstract.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/TAbstract.java
deleted file mode 100644
index f6d0ed0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/TAbstract.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_direct/TPlain.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/TPlain.java
deleted file mode 100644
index a6db3d4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/TPlain.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_direct/TSuper.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/TSuper.java
deleted file mode 100644
index 03026ee..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/TSuper.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_direct/Test_invoke_direct.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/Test_invoke_direct.java
deleted file mode 100644
index e7c6a0b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/Test_invoke_direct.java
+++ /dev/null
@@ -1,337 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_1.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_1.d
deleted file mode 100644
index 65a8a32..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_1.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_1.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_1.java
deleted file mode 100644
index b692683..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_1.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_10.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_10.d
deleted file mode 100644
index 08b22c9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_10.d
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_11.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_11.d
deleted file mode 100644
index 6566718..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_11.d
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_12.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_12.d
deleted file mode 100644
index 6230fa9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_12.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_12.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_12.java
deleted file mode 100644
index 2911abf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_12.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_13.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_13.d
deleted file mode 100644
index 23d4378..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_13.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_13.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_13.java
deleted file mode 100644
index df8d0d5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_13.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_14.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_14.d
deleted file mode 100644
index 4d10ce8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_14.d
+++ /dev/null
@@ -1,70 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_15.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_15.d
deleted file mode 100644
index 55b7d3c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_15.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_16.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_16.d
deleted file mode 100644
index 10e041d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_16.d
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_16.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_16.java
deleted file mode 100644
index cae7ae8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_16.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_17.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_17.d
deleted file mode 100644
index 35a54d9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_17.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_18.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_18.d
deleted file mode 100644
index 602cbeb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_18.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_2.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_2.d
deleted file mode 100644
index 0c11388..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_2.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_2.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_2.java
deleted file mode 100644
index ab6e1ae..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_2.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_21.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_21.d
deleted file mode 100644
index d6653fc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_21.d
+++ /dev/null
@@ -1,70 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_21.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_21.java
deleted file mode 100644
index cec52ef..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_21.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_24.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_24.d
deleted file mode 100644
index 83fd3db..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_24.d
+++ /dev/null
@@ -1,70 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_25.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_25.d
deleted file mode 100644
index 8d872ad..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_25.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_26.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_26.d
deleted file mode 100644
index 40cce50..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_26.d
+++ /dev/null
@@ -1,58 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_27.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_27.d
deleted file mode 100644
index 0ac6b37..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_27.d
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_3.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_3.d
deleted file mode 100644
index 6aa7821..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_3.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_3.dfh b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_3.dfh
deleted file mode 100644
index 993ee4e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_3.dfh
+++ /dev/null
@@ -1,285 +0,0 @@
-// 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_4.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_4.d
deleted file mode 100644
index e6e7511..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_5.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_5.d
deleted file mode 100644
index c4dac34..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_5.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_6.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_6.d
deleted file mode 100644
index 6bb8833..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_6.d
+++ /dev/null
@@ -1,27 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_6.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_6.java
deleted file mode 100644
index 6f95a12..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_6.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_7.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_7.d
deleted file mode 100644
index 2c1b99b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_7.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_7.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_7.java
deleted file mode 100644
index b640fa3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_8.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_8.d
deleted file mode 100644
index 99b510b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_8.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_8.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_8.java
deleted file mode 100644
index 8c9825d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_9.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_9.d
deleted file mode 100644
index 262b5ff..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_9.d
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_9.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_9.java
deleted file mode 100644
index c0913ab..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_direct_range/TAbstract.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/TAbstract.java
deleted file mode 100644
index 8c5ab27..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/TAbstract.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_direct_range/TPlain.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/TPlain.java
deleted file mode 100644
index 3e4aab1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/TPlain.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_direct_range/TSuper.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/TSuper.java
deleted file mode 100644
index c8cbc0a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/TSuper.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_direct_range/Test_invoke_direct_range.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/Test_invoke_direct_range.java
deleted file mode 100644
index 1682c68..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/Test_invoke_direct_range.java
+++ /dev/null
@@ -1,338 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_1.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_1.d
deleted file mode 100644
index 7123eb9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_1.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_1.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_1.java
deleted file mode 100644
index 243b923..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_1.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_10.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_10.d
deleted file mode 100644
index 2dcf576..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_10.d
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_11.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_11.d
deleted file mode 100644
index 772fc10..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_11.d
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_12.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_12.d
deleted file mode 100644
index a107ac3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_12.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_12.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_12.java
deleted file mode 100644
index e01b4f7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_12.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_13.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_13.d
deleted file mode 100644
index 830c367..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_13.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_13.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_13.java
deleted file mode 100644
index 39c9977..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_13.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_14.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_14.d
deleted file mode 100644
index a59d5ad..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_14.d
+++ /dev/null
@@ -1,70 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_15.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_15.d
deleted file mode 100644
index 343eafd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_15.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_16.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_16.d
deleted file mode 100644
index 82b85d8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_16.d
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_16.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_16.java
deleted file mode 100644
index c593d95..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_16.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_17.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_17.d
deleted file mode 100644
index add1dc9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_17.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_18.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_18.d
deleted file mode 100644
index 3922d1b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_18.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_2.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_2.d
deleted file mode 100644
index 3d4e23c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_2.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_2.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_2.java
deleted file mode 100644
index 09fa293..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_2.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_21.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_21.d
deleted file mode 100644
index 234de66..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_21.d
+++ /dev/null
@@ -1,70 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_21.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_21.java
deleted file mode 100644
index 537d238..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_21.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_24.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_24.d
deleted file mode 100644
index 31a24c4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_24.d
+++ /dev/null
@@ -1,70 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_25.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_25.d
deleted file mode 100644
index 6c2334e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_25.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_26.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_26.d
deleted file mode 100644
index 6160fe5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_26.d
+++ /dev/null
@@ -1,58 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_27.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_27.d
deleted file mode 100644
index 1073241..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_27.d
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_3.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_3.d
deleted file mode 100644
index 056f2c2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_3.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_3.dfh b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_3.dfh
deleted file mode 100644
index 9772f88..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_3.dfh
+++ /dev/null
@@ -1,287 +0,0 @@
-// 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_4.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_4.d
deleted file mode 100644
index a7aeae9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_5.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_5.d
deleted file mode 100644
index 4ec85bb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_5.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_6.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_6.d
deleted file mode 100644
index cda9caf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_6.d
+++ /dev/null
@@ -1,27 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_6.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_6.java
deleted file mode 100644
index b1e3a6e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_6.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_7.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_7.d
deleted file mode 100644
index f0254f4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_7.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_7.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_7.java
deleted file mode 100644
index f68ed92..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_7.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_8.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_8.d
deleted file mode 100644
index 946c65f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_8.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_8.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_8.java
deleted file mode 100644
index bde2e71..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_9.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_9.d
deleted file mode 100644
index 567bd84..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_9.d
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_9.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_9.java
deleted file mode 100644
index db73113..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_interface/ITest.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/ITest.java
deleted file mode 100644
index 79917a7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/ITest.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_interface/ITestImpl.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/ITestImpl.java
deleted file mode 100644
index cf0c0c2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/ITestImpl.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_interface/ITestImplAbstract.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/ITestImplAbstract.java
deleted file mode 100644
index af7a36029..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/ITestImplAbstract.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_interface/Test_invoke_interface.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/Test_invoke_interface.java
deleted file mode 100644
index 377cc58..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/Test_invoke_interface.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_1.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_1.d
deleted file mode 100644
index 72c1843..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_1.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_1.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_1.java
deleted file mode 100644
index 4e0f991..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_10.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_10.d
deleted file mode 100644
index 65ca5f2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_10.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_11.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_11.d
deleted file mode 100644
index 110d826..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_11.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_11.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_11.java
deleted file mode 100644
index 1bde245..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_12.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_12.d
deleted file mode 100644
index c623612..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_12.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_12.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_12.java
deleted file mode 100644
index 344e3d6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_12.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_13.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_13.d
deleted file mode 100644
index 8d696af..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_13.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_13.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_13.java
deleted file mode 100644
index d0cd67d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_13.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_14.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_14.d
deleted file mode 100644
index d6ce02a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_14.d
+++ /dev/null
@@ -1,54 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_14.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_14.java
deleted file mode 100644
index 11a8128..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_14.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_16.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_16.d
deleted file mode 100644
index 3c972ce..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_16.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_16.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_16.java
deleted file mode 100644
index f244ea3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_16.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_18.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_18.d
deleted file mode 100644
index f792a3b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_18.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_18.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_18.java
deleted file mode 100644
index b9f9ccc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_18.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_2.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_2.d
deleted file mode 100644
index 9c5e86d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_2.dfh b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_2.dfh
deleted file mode 100644
index d1d1886..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_2.dfh
+++ /dev/null
@@ -1,294 +0,0 @@
-// 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_20.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_20.d
deleted file mode 100644
index c2465e7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_20.d
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_20.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_20.java
deleted file mode 100644
index f40b587..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_20.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_21.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_21.d
deleted file mode 100644
index f8b0dea..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_21.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_21.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_21.java
deleted file mode 100644
index f777a6b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_21.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_22.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_22.d
deleted file mode 100644
index 7c27ad2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_22.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_3.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_3.d
deleted file mode 100644
index debf41a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_3.d
+++ /dev/null
@@ -1,29 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_3.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_3.java
deleted file mode 100644
index 8c63c18..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_3.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_4.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_4.d
deleted file mode 100644
index a8de67b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_4.d
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_4.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_4.java
deleted file mode 100644
index 4f751fe..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_4.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_5.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_5.d
deleted file mode 100644
index adf7abe..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_5.d
+++ /dev/null
@@ -1,28 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_5.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_5.java
deleted file mode 100644
index 7615134..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_5.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_7.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_7.d
deleted file mode 100644
index c96f200..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_7.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_7.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_7.java
deleted file mode 100644
index b249ded..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_7.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_8.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_8.d
deleted file mode 100644
index 8bf956e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_8.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_9.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_9.d
deleted file mode 100644
index 2fc4a90..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_9.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface_range/ITest.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/ITest.java
deleted file mode 100644
index 404787e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/ITest.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_interface_range/ITestImpl.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/ITestImpl.java
deleted file mode 100644
index e1d871a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/ITestImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_interface_range/ITestImplAbstract.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/ITestImplAbstract.java
deleted file mode 100644
index aee0064..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/ITestImplAbstract.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_interface_range/Test_invoke_interface_range.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/Test_invoke_interface_range.java
deleted file mode 100644
index abb4855..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/Test_invoke_interface_range.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_1.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_1.d
deleted file mode 100644
index 70fee02..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_1.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_1.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_1.java
deleted file mode 100644
index fa6fd15..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_10.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_10.d
deleted file mode 100644
index d78f6c6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_10.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_11.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_11.d
deleted file mode 100644
index d0fe868..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_11.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_11.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_11.java
deleted file mode 100644
index d990613..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_12.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_12.d
deleted file mode 100644
index 7463912..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_12.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_12.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_12.java
deleted file mode 100644
index b5a2167..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_12.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_13.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_13.d
deleted file mode 100644
index 4b0ea65..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_13.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_13.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_13.java
deleted file mode 100644
index 1d9989b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_13.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_14.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_14.d
deleted file mode 100644
index ce6cd80..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_14.d
+++ /dev/null
@@ -1,55 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_14.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_14.java
deleted file mode 100644
index ac996f9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_14.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_16.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_16.d
deleted file mode 100644
index 2cfcc5e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_16.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_16.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_16.java
deleted file mode 100644
index ada5988..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_16.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_18.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_18.d
deleted file mode 100644
index 0174a71..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_18.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_18.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_18.java
deleted file mode 100644
index 5c93b22..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_18.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_2.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_2.d
deleted file mode 100644
index cd8bc3e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_2.dfh b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_2.dfh
deleted file mode 100644
index 9bc316f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_2.dfh
+++ /dev/null
@@ -1,294 +0,0 @@
-// 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_20.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_20.d
deleted file mode 100644
index 3dd1bcd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_20.d
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_20.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_20.java
deleted file mode 100644
index a28964c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_20.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_21.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_21.d
deleted file mode 100644
index f8b1b95..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_21.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_21.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_21.java
deleted file mode 100644
index b26ae98..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_21.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_22.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_22.d
deleted file mode 100644
index 3b2a521..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_22.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_3.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_3.d
deleted file mode 100644
index ca4948d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_3.d
+++ /dev/null
@@ -1,29 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_3.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_3.java
deleted file mode 100644
index f39dca5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_3.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_4.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_4.d
deleted file mode 100644
index 8a21324..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_4.d
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_4.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_4.java
deleted file mode 100644
index aa0b9ab..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_4.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_5.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_5.d
deleted file mode 100644
index a0e0905..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_5.d
+++ /dev/null
@@ -1,28 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_5.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_5.java
deleted file mode 100644
index cfbcd8c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_7.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_7.d
deleted file mode 100644
index 13a63d6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_7.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_7.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_7.java
deleted file mode 100644
index 82b6c7c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_8.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_8.d
deleted file mode 100644
index f81692c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_8.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_9.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_9.d
deleted file mode 100644
index cd73a85..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_9.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static/TestClass.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/TestClass.java
deleted file mode 100644
index 3db9673..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/TestClass.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_static/Test_invoke_static.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/Test_invoke_static.java
deleted file mode 100644
index c7b77aa..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/Test_invoke_static.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_1.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_1.d
deleted file mode 100644
index 04c88aa..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_1.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_1.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_1.java
deleted file mode 100644
index a6b001f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_10.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_10.d
deleted file mode 100644
index 365afbb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_10.d
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_11.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_11.d
deleted file mode 100644
index 227b52c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_11.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_13.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_13.d
deleted file mode 100644
index 2e78a06..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_13.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_13.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_13.java
deleted file mode 100644
index a51532c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_13.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_14.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_14.d
deleted file mode 100644
index ed2aa2b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_14.d
+++ /dev/null
@@ -1,50 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_14.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_14.java
deleted file mode 100644
index c4efea3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_14.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_15.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_15.d
deleted file mode 100644
index 58bccb9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_15.d
+++ /dev/null
@@ -1,56 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_15.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_15.java
deleted file mode 100644
index 0db7ec5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_15.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_16.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_16.d
deleted file mode 100644
index 883edbe..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_16.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_17.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_17.d
deleted file mode 100644
index 1ce4ed4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_17.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_17.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_17.java
deleted file mode 100644
index 194ef10..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_17.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_18.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_18.d
deleted file mode 100644
index 7332bce..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_18.d
+++ /dev/null
@@ -1,53 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_18.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_18.java
deleted file mode 100644
index 776b488..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_18.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_19.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_19.d
deleted file mode 100644
index e94e2a3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_19.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_19.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_19.java
deleted file mode 100644
index 1682c92..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_19.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_2.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_2.d
deleted file mode 100644
index 1c53ad3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_2.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_2.java
deleted file mode 100644
index 2e6bfd9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_2.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_20.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_20.d
deleted file mode 100644
index 9ef67a0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_20.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_24.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_24.d
deleted file mode 100644
index 9a2871f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_24.d
+++ /dev/null
@@ -1,58 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_3.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_3.d
deleted file mode 100644
index 321761f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_3.dfh b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_3.dfh
deleted file mode 100644
index 9c4f6eb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_3.dfh
+++ /dev/null
@@ -1,283 +0,0 @@
-// 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_4.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_4.d
deleted file mode 100644
index 4212854..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_4.d
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_4.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_4.java
deleted file mode 100644
index c9e1dd6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_4.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_5.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_5.d
deleted file mode 100644
index a3c8c91..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_5.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_5.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_5.java
deleted file mode 100644
index ace37b8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_5.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_6.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_6.d
deleted file mode 100644
index 969e499..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_6.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_6.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_6.java
deleted file mode 100644
index 1cdffb1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_6.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_7.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_7.d
deleted file mode 100644
index b58d3b2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_7.d
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_7.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_7.java
deleted file mode 100644
index 55a2327..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_8.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_8.d
deleted file mode 100644
index 9a4d964..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_8.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_8.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_8.java
deleted file mode 100644
index 61acbc9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_8.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_static_range/TestClass.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/TestClass.java
deleted file mode 100644
index 90f65a8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/TestClass.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_static_range/Test_invoke_static_range.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/Test_invoke_static_range.java
deleted file mode 100644
index c62b333..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/Test_invoke_static_range.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_1.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_1.d
deleted file mode 100644
index 1f8dac7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_1.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_1.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_1.java
deleted file mode 100644
index e95213e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_10.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_10.d
deleted file mode 100644
index 994973f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_10.d
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_11.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_11.d
deleted file mode 100644
index 2b7131f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_11.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_13.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_13.d
deleted file mode 100644
index dca327b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_13.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_13.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_13.java
deleted file mode 100644
index b3278c4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_13.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_14.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_14.d
deleted file mode 100644
index e4c1bd3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_14.d
+++ /dev/null
@@ -1,50 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_14.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_14.java
deleted file mode 100644
index b5b135b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_14.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_15.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_15.d
deleted file mode 100644
index c56d3c0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_15.d
+++ /dev/null
@@ -1,56 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_15.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_15.java
deleted file mode 100644
index 696de4b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_15.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_16.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_16.d
deleted file mode 100644
index c66089b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_16.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_17.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_17.d
deleted file mode 100644
index b2ce948..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_17.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_17.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_17.java
deleted file mode 100644
index 4b020b1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_17.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_18.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_18.d
deleted file mode 100644
index 19fec09..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_18.d
+++ /dev/null
@@ -1,53 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_18.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_18.java
deleted file mode 100644
index 34d0098..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_18.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_19.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_19.d
deleted file mode 100644
index 051df3f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_19.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_19.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_19.java
deleted file mode 100644
index 204e39a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_19.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_2.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_2.d
deleted file mode 100644
index 67e9a13..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_2.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_2.java
deleted file mode 100644
index eb5f3c8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_2.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_20.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_20.d
deleted file mode 100644
index 5819881..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_20.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_24.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_24.d
deleted file mode 100644
index 6ee8671..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_24.d
+++ /dev/null
@@ -1,58 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_3.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_3.d
deleted file mode 100644
index b3734a5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_3.dfh b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_3.dfh
deleted file mode 100644
index 624ef70..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_3.dfh
+++ /dev/null
@@ -1,283 +0,0 @@
-// 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_4.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_4.d
deleted file mode 100644
index c07542c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_4.d
+++ /dev/null
@@ -1,75 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_4.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_4.java
deleted file mode 100644
index 9f91e19..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_4.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_5.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_5.d
deleted file mode 100644
index 14cbfd6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_5.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_5.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_5.java
deleted file mode 100644
index 3e1f9cb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_5.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_6.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_6.d
deleted file mode 100644
index a739336..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_6.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_6.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_6.java
deleted file mode 100644
index ab00d04..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_6.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_7.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_7.d
deleted file mode 100644
index a7615ce..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_7.d
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_7.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_7.java
deleted file mode 100644
index 5e81cca..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_8.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_8.d
deleted file mode 100644
index a494912..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_8.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_8.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_8.java
deleted file mode 100644
index ac8e6c3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_8.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_super/ATest.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/ATest.java
deleted file mode 100644
index af69eaf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/ATest.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_super/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/TestStubs.java
deleted file mode 100644
index 28fc156..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/TestStubs.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_super/Test_invoke_super.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/Test_invoke_super.java
deleted file mode 100644
index 6efac8b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/Test_invoke_super.java
+++ /dev/null
@@ -1,349 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_super/d/TPlain.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/TPlain.d
deleted file mode 100644
index 5eaf417..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/TPlain.d
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/invoke_super/d/TSuper.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/TSuper.d
deleted file mode 100644
index c7993b7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/TSuper.d
+++ /dev/null
@@ -1,70 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/invoke_super/d/TSuper.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/TSuper.java
deleted file mode 100644
index 7767485..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/TSuper.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_super/d/TSuper2.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/TSuper2.d
deleted file mode 100644
index b74842f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/TSuper2.d
+++ /dev/null
@@ -1,30 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_1.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_1.d
deleted file mode 100644
index 829c67f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_1.d
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_1.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_1.java
deleted file mode 100644
index 2c1f61d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_10.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_10.d
deleted file mode 100644
index bc38f2f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_10.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_10.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_10.java
deleted file mode 100644
index 76fff9d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_10.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_11.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_11.d
deleted file mode 100644
index 97683ca..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_11.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_12.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_12.d
deleted file mode 100644
index 0b6efa2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_12.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_13.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_13.d
deleted file mode 100644
index a030b72..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_13.d
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_14.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_14.d
deleted file mode 100644
index b70f691..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_14.d
+++ /dev/null
@@ -1,61 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_14.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_14.java
deleted file mode 100644
index 7dfcf14..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_14.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_15.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_15.d
deleted file mode 100644
index 32c2700..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_15.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_15.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_15.java
deleted file mode 100644
index f3e30f8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_15.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_16.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_16.d
deleted file mode 100644
index 92f6c2f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_16.d
+++ /dev/null
@@ -1,26 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_17.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_17.d
deleted file mode 100644
index de24bf3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_17.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_17.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_17.java
deleted file mode 100644
index cb68374..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_17.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_18.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_18.d
deleted file mode 100644
index e3d61e7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_18.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_18.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_18.java
deleted file mode 100644
index 9c256a2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_18.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_19.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_19.d
deleted file mode 100644
index 847e743..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_19.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_19.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_19.java
deleted file mode 100644
index 15256e1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_19.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_2.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_2.d
deleted file mode 100644
index 0144130..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_2.d
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_2.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_2.java
deleted file mode 100644
index 474115a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_20.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_20.d
deleted file mode 100644
index eb429ee..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_20.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_20.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_20.java
deleted file mode 100644
index 2ae592e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_20.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_22.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_22.d
deleted file mode 100644
index fbeb8e8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_22.d
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_23.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_23.d
deleted file mode 100644
index f1d2a6f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_23.d
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_24.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_24.d
deleted file mode 100644
index 55303d3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_24.d
+++ /dev/null
@@ -1,58 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_25.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_25.d
deleted file mode 100644
index f6e763c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_25.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_4.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_4.d
deleted file mode 100644
index 3f80ff8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_4.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_4.java
deleted file mode 100644
index 316909f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_4.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_5.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_5.d
deleted file mode 100644
index af16744..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_5.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_5.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_5.java
deleted file mode 100644
index c633829..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_5.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_6.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_6.d
deleted file mode 100644
index 94361b9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_6.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_6.java
deleted file mode 100644
index 47cf76f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_6.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_7.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_7.d
deleted file mode 100644
index a62a1e5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_7.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_7.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_7.java
deleted file mode 100644
index 2f45567..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_7.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_8.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_8.d
deleted file mode 100644
index 48e9bdd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_8.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_8.dfh b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_8.dfh
deleted file mode 100644
index 8501c68..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_8.dfh
+++ /dev/null
@@ -1,266 +0,0 @@
-// 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/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_9.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_9.d
deleted file mode 100644
index 79626b9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_9.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super_range/ATest.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/ATest.java
deleted file mode 100644
index 20e9c5e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/ATest.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_super_range/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/TestStubs.java
deleted file mode 100644
index 22b5046..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/TestStubs.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_super_range/Test_invoke_super_range.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/Test_invoke_super_range.java
deleted file mode 100644
index d65b8d4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/Test_invoke_super_range.java
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_super_range/d/TPlain.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/TPlain.d
deleted file mode 100644
index ba9512e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/TPlain.d
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/invoke_super_range/d/TSuper.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/TSuper.d
deleted file mode 100644
index e9d0ff1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/TSuper.d
+++ /dev/null
@@ -1,70 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/invoke_super_range/d/TSuper.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/TSuper.java
deleted file mode 100644
index 004b573..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/TSuper.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_super_range/d/TSuper2.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/TSuper2.d
deleted file mode 100644
index 90baf5d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/TSuper2.d
+++ /dev/null
@@ -1,30 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_1.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_1.d
deleted file mode 100644
index 4181eed..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_1.d
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_1.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_1.java
deleted file mode 100644
index 0844d80..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_10.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_10.d
deleted file mode 100644
index baca689..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_10.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_10.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_10.java
deleted file mode 100644
index 3ff5490..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_10.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_11.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_11.d
deleted file mode 100644
index 7cc537c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_11.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_12.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_12.d
deleted file mode 100644
index 38cd7d2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_12.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_13.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_13.d
deleted file mode 100644
index d177e76..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_13.d
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_14.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_14.d
deleted file mode 100644
index c90b576..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_14.d
+++ /dev/null
@@ -1,61 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_14.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_14.java
deleted file mode 100644
index 32af085..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_14.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_15.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_15.d
deleted file mode 100644
index 7c57710..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_15.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_15.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_15.java
deleted file mode 100644
index dfd335a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_15.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_16.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_16.d
deleted file mode 100644
index 90d9a21..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_16.d
+++ /dev/null
@@ -1,26 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_17.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_17.d
deleted file mode 100644
index 962adb5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_17.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_17.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_17.java
deleted file mode 100644
index 5d87c2d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_17.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_18.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_18.d
deleted file mode 100644
index 709fad6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_18.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_18.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_18.java
deleted file mode 100644
index fec68ae..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_18.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_19.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_19.d
deleted file mode 100644
index d30cc05..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_19.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_19.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_19.java
deleted file mode 100644
index d359454..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_19.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_2.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_2.d
deleted file mode 100644
index b8c9051..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_2.d
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_2.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_2.java
deleted file mode 100644
index c9a5f0f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_20.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_20.d
deleted file mode 100644
index 7ea46f1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_20.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_20.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_20.java
deleted file mode 100644
index 2e9724c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_20.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_22.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_22.d
deleted file mode 100644
index efe22e4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_22.d
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_23.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_23.d
deleted file mode 100644
index 5877042..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_23.d
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_24.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_24.d
deleted file mode 100644
index dcc399d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_24.d
+++ /dev/null
@@ -1,58 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_25.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_25.d
deleted file mode 100644
index 1a9d17a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_25.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_4.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_4.d
deleted file mode 100644
index eb1a1f5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_4.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_4.java
deleted file mode 100644
index d9b6b9a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_4.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_5.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_5.d
deleted file mode 100644
index bf38cab..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_5.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_5.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_5.java
deleted file mode 100644
index aa448e6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_5.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_6.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_6.d
deleted file mode 100644
index bb9161c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_6.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_6.java
deleted file mode 100644
index 64229eb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_6.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_7.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_7.d
deleted file mode 100644
index f170aac..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_7.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_7.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_7.java
deleted file mode 100644
index d09e351..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_7.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_8.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_8.d
deleted file mode 100644
index ed4d3ab..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_8.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_8.dfh b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_8.dfh
deleted file mode 100644
index 3b8efa1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_8.dfh
+++ /dev/null
@@ -1,288 +0,0 @@
-// 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/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_9.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_9.d
deleted file mode 100644
index e97d513..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_9.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual/ATest.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/ATest.java
deleted file mode 100644
index f102992..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/ATest.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_virtual/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/TestStubs.java
deleted file mode 100644
index e495f54..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/TestStubs.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_virtual/Test_invoke_virtual.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/Test_invoke_virtual.java
deleted file mode 100644
index 6e41ec1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/Test_invoke_virtual.java
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_virtual/d/TPlain.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/TPlain.d
deleted file mode 100644
index f0328ca..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/TPlain.d
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/invoke_virtual/d/TSuper.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/TSuper.d
deleted file mode 100644
index 3b7a591..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/TSuper.d
+++ /dev/null
@@ -1,67 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/invoke_virtual/d/TSuper.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/TSuper.java
deleted file mode 100644
index eb0b27a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/TSuper.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_virtual/d/TSuper2.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/TSuper2.d
deleted file mode 100644
index 2137c4c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/TSuper2.d
+++ /dev/null
@@ -1,30 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_1.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_1.d
deleted file mode 100644
index 3192c0d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_1.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_1.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_1.java
deleted file mode 100644
index f242600..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_10.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_10.d
deleted file mode 100644
index 2c5c909..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_10.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_10.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_10.java
deleted file mode 100644
index 24898f4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_10.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_11.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_11.d
deleted file mode 100644
index 68ca8c7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_11.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_12.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_12.d
deleted file mode 100644
index 02d509a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_12.d
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_13.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_13.d
deleted file mode 100644
index dcf28f8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_13.d
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_14.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_14.d
deleted file mode 100644
index 743ddf4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_14.d
+++ /dev/null
@@ -1,56 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_14.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_14.java
deleted file mode 100644
index d0a8d40..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_14.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_15.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_15.d
deleted file mode 100644
index ad196c9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_15.d
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_15.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_15.java
deleted file mode 100644
index a3d1b68..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_15.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_16.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_16.d
deleted file mode 100644
index 0f0ab56..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_16.d
+++ /dev/null
@@ -1,26 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_17.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_17.d
deleted file mode 100644
index da55ec7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_17.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_17.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_17.java
deleted file mode 100644
index 918e3b7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_17.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_18.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_18.d
deleted file mode 100644
index 32097da..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_18.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_18.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_18.java
deleted file mode 100644
index c6b0c6f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_18.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_19.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_19.d
deleted file mode 100644
index ce0b550..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_19.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_19.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_19.java
deleted file mode 100644
index 36e3515..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_19.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_20.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_20.d
deleted file mode 100644
index f655091..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_20.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_20.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_20.java
deleted file mode 100644
index 0954ddb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_20.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_22.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_22.d
deleted file mode 100644
index 135f037..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_22.d
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_23.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_23.d
deleted file mode 100644
index 071a91f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_23.d
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_24.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_24.d
deleted file mode 100644
index 1804cce..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_24.d
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_25.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_25.d
deleted file mode 100644
index 7816b12..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_25.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_4.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_4.d
deleted file mode 100644
index 5de2f49..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_4.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_4.java
deleted file mode 100644
index 40cc1fa..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_4.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_5.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_5.d
deleted file mode 100644
index 6f18698..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_5.d
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_5.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_5.java
deleted file mode 100644
index a2e32f8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_6.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_6.d
deleted file mode 100644
index a3f42ae..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_6.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_6.java
deleted file mode 100644
index fd8e058..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_6.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_7.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_7.d
deleted file mode 100644
index 2e3a6a7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_7.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_7.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_7.java
deleted file mode 100644
index 27b16ba..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_7.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_8.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_8.d
deleted file mode 100644
index c6ef760..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_8.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_8.dfh b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_8.dfh
deleted file mode 100644
index a556dba..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_8.dfh
+++ /dev/null
@@ -1,288 +0,0 @@
-// 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/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_9.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_9.d
deleted file mode 100644
index f695913..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_9.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual_range/ATest.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/ATest.java
deleted file mode 100644
index e6ebd5a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/ATest.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_virtual_range/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/TestStubs.java
deleted file mode 100644
index d00c43e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/TestStubs.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_virtual_range/Test_invoke_virtual_range.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/Test_invoke_virtual_range.java
deleted file mode 100644
index 2368dc3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/Test_invoke_virtual_range.java
+++ /dev/null
@@ -1,347 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_virtual_range/d/Snippet.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/Snippet.java
deleted file mode 100644
index 14c735e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/Snippet.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package dot.junit.opcodes.invoke_virtual_range.d;
-
-public class Snippet {
-    public void test() {
-    }
-}
-
diff --git a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/TPlain.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/TPlain.d
deleted file mode 100644
index c39399e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/TPlain.d
+++ /dev/null
@@ -1,31 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/invoke_virtual_range/d/TSuper.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/TSuper.d
deleted file mode 100644
index 7b4d7b6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/TSuper.d
+++ /dev/null
@@ -1,67 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/invoke_virtual_range/d/TSuper2.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/TSuper2.d
deleted file mode 100644
index 882b227..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/TSuper2.d
+++ /dev/null
@@ -1,30 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_1.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_1.d
deleted file mode 100644
index b7f13d5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_1.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_1.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_1.java
deleted file mode 100644
index 2c49efe..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_10.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_10.d
deleted file mode 100644
index 3f327a8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_10.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_10.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_10.java
deleted file mode 100644
index bc32697..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_10.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_11.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_11.d
deleted file mode 100644
index b109ace..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_11.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_12.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_12.d
deleted file mode 100644
index 9b63ef8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_12.d
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_13.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_13.d
deleted file mode 100644
index fd6de25..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_13.d
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_14.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_14.d
deleted file mode 100644
index 32cd481..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_14.d
+++ /dev/null
@@ -1,57 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_14.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_14.java
deleted file mode 100644
index c3b8e0c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_14.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_15.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_15.d
deleted file mode 100644
index d42643b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_15.d
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_15.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_15.java
deleted file mode 100644
index 969a1ab..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_15.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_16.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_16.d
deleted file mode 100644
index 5a71786..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_16.d
+++ /dev/null
@@ -1,26 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_17.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_17.d
deleted file mode 100644
index 173c6bd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_17.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_17.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_17.java
deleted file mode 100644
index 689f741..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_17.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_18.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_18.d
deleted file mode 100644
index cc11d06..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_18.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_18.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_18.java
deleted file mode 100644
index 8f01c30..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_18.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_19.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_19.d
deleted file mode 100644
index 704726b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_19.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_19.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_19.java
deleted file mode 100644
index fefa96d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_19.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_2.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_2.d
deleted file mode 100644
index eac70b4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_2.d
+++ /dev/null
@@ -1,77 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_2.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_2.java
deleted file mode 100644
index bc934f4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_20.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_20.d
deleted file mode 100644
index ab7a4cd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_20.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_20.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_20.java
deleted file mode 100644
index 77c639d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_20.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_22.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_22.d
deleted file mode 100644
index 6f6fad5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_22.d
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_23.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_23.d
deleted file mode 100644
index cf21428..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_23.d
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_24.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_24.d
deleted file mode 100644
index 9e2022f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_24.d
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_25.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_25.d
deleted file mode 100644
index 1d39236..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_25.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_4.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_4.d
deleted file mode 100644
index f68a194..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_4.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_4.java
deleted file mode 100644
index 3b6eff0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_4.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_5.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_5.d
deleted file mode 100644
index 361e00c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_5.d
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_5.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_5.java
deleted file mode 100644
index b14ffb7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_6.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_6.d
deleted file mode 100644
index 2dcf120..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_6.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_6.java
deleted file mode 100644
index 52bdea9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_6.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_7.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_7.d
deleted file mode 100644
index b5c44f4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_7.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_7.java b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_7.java
deleted file mode 100644
index 333e3ec..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_7.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_8.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_8.d
deleted file mode 100644
index e2538f4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_8.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_8.dfh b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_8.dfh
deleted file mode 100644
index 390f2a4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_8.dfh
+++ /dev/null
@@ -1,290 +0,0 @@
-// 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/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_9.d b/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_9.d
deleted file mode 100644
index 393f733..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_9.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/iput/TestStubs.java
deleted file mode 100644
index 8ebe9bc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/TestStubs.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput/Test_iput.java b/tools/vm-tests/src/dot/junit/opcodes/iput/Test_iput.java
deleted file mode 100644
index f69b308..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/Test_iput.java
+++ /dev/null
@@ -1,343 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput/d/T_iput_1.d b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_1.d
deleted file mode 100644
index 062a5f8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_1.d
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput/d/T_iput_1.java b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_1.java
deleted file mode 100644
index b508414..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_1.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput/d/T_iput_10.d b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_10.d
deleted file mode 100644
index 782486a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_10.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput/d/T_iput_10.java b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_10.java
deleted file mode 100644
index 4f630e7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_10.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput/d/T_iput_11.d b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_11.d
deleted file mode 100644
index 9fb06de..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_11.d
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput/d/T_iput_11.java b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_11.java
deleted file mode 100644
index 9c47bd5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_11.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput/d/T_iput_12.d b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_12.d
deleted file mode 100644
index 73104b6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_12.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput/d/T_iput_12.java b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_12.java
deleted file mode 100644
index 4fbe9c2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_12.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput/d/T_iput_13.d b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_13.d
deleted file mode 100644
index 3760a4f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_13.d
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput/d/T_iput_13.java b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_13.java
deleted file mode 100644
index 53423f9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_13.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput/d/T_iput_14.d b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_14.d
deleted file mode 100644
index ba404d6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_14.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput/d/T_iput_14.java b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_14.java
deleted file mode 100644
index 7d7e102..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_14.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput/d/T_iput_15.d b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_15.d
deleted file mode 100644
index 8864195..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_15.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput/d/T_iput_15.java b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_15.java
deleted file mode 100644
index f432d27..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_15.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput/d/T_iput_17.d b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_17.d
deleted file mode 100644
index e0b35ef..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_17.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput/d/T_iput_17.java b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_17.java
deleted file mode 100644
index 0c1bb0c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_17.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput/d/T_iput_18.d b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_18.d
deleted file mode 100644
index 1ec565d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_18.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput/d/T_iput_19.d b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_19.d
deleted file mode 100644
index f7f8997..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_19.d
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput/d/T_iput_19.java b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_19.java
deleted file mode 100644
index bf6deee..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_19.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput/d/T_iput_2.d b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_2.d
deleted file mode 100644
index a89c29d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_2.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput/d/T_iput_20.d b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_20.d
deleted file mode 100644
index 0161449..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_20.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput/d/T_iput_21.d b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_21.d
deleted file mode 100644
index f189066..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_21.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput/d/T_iput_22.d b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_22.d
deleted file mode 100644
index 71b8cdf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_22.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput/d/T_iput_23.d b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_23.d
deleted file mode 100644
index e0bf2a0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_23.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput/d/T_iput_24.d b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_24.d
deleted file mode 100644
index 4e6d187..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_24.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput/d/T_iput_3.d b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_3.d
deleted file mode 100644
index bdb6b35..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_3.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput/d/T_iput_3.dfh b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_3.dfh
deleted file mode 100644
index 0474f19..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_3.dfh
+++ /dev/null
@@ -1,261 +0,0 @@
-// 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/src/dot/junit/opcodes/iput/d/T_iput_30.d b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_30.d
deleted file mode 100644
index 08df316..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_30.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput/d/T_iput_4.d b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_4.d
deleted file mode 100644
index f324be4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput/d/T_iput_5.d b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_5.d
deleted file mode 100644
index c34dbac..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_5.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput/d/T_iput_5.java b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_5.java
deleted file mode 100644
index 6df6a7f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput/d/T_iput_7.d b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_7.d
deleted file mode 100644
index af7b003..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_7.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput/d/T_iput_7.java b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_7.java
deleted file mode 100644
index c7407e0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_7.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput/d/T_iput_8.d b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_8.d
deleted file mode 100644
index 6c1ed20..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_8.d
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput/d/T_iput_8.java b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_8.java
deleted file mode 100644
index 264aef0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_8.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput/d/T_iput_9.d b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_9.d
deleted file mode 100644
index 7c7d755..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_9.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput/d/T_iput_9.java b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_9.java
deleted file mode 100644
index a3c1695..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_iput_9.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput/d/T_sput_3.dfh b/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_sput_3.dfh
deleted file mode 100644
index f7d95ea..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput/d/T_sput_3.dfh
+++ /dev/null
@@ -1,261 +0,0 @@
-// 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/src/dot/junit/opcodes/iput_boolean/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/TestStubs.java
deleted file mode 100644
index 07919e1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/TestStubs.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_boolean/Test_iput_boolean.java b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/Test_iput_boolean.java
deleted file mode 100644
index 6a2419b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/Test_iput_boolean.java
+++ /dev/null
@@ -1,329 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_1.d b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_1.d
deleted file mode 100644
index 47ee9dc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_1.d
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_1.java b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_1.java
deleted file mode 100644
index 14d2b98..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_1.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_10.d b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_10.d
deleted file mode 100644
index 77f762a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_10.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_10.java b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_10.java
deleted file mode 100644
index 7279fe0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_10.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_11.d b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_11.d
deleted file mode 100644
index 9f8d148..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_11.d
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_11.java b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_11.java
deleted file mode 100644
index 77de3e5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_11.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_12.d b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_12.d
deleted file mode 100644
index 327fef6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_12.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_12.java b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_12.java
deleted file mode 100644
index 4321bfb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_12.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_13.d b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_13.d
deleted file mode 100644
index cbe6560..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_13.d
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_13.java b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_13.java
deleted file mode 100644
index c523c5d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_13.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_14.d b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_14.d
deleted file mode 100644
index 8a7f23e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_14.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_14.java b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_14.java
deleted file mode 100644
index e708762..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_14.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_15.d b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_15.d
deleted file mode 100644
index 605fab5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_15.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_15.java b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_15.java
deleted file mode 100644
index 893595b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_15.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_17.d b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_17.d
deleted file mode 100644
index 2d0e858..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_17.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_17.java b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_17.java
deleted file mode 100644
index c7dbaeb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_17.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_18.d b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_18.d
deleted file mode 100644
index 5ca6791..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_18.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_19.d b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_19.d
deleted file mode 100644
index aed12db..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_19.d
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_19.java b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_19.java
deleted file mode 100644
index 3828d90..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_19.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_2.d b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_2.d
deleted file mode 100644
index 20ba2cf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_2.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_20.d b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_20.d
deleted file mode 100644
index b7bb68c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_20.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_21.d b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_21.d
deleted file mode 100644
index a05e7d9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_21.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_22.d b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_22.d
deleted file mode 100644
index 5953110..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_22.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_23.d b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_23.d
deleted file mode 100644
index 3d51bf4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_23.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_24.d b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_24.d
deleted file mode 100644
index ccd56a1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_24.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_3.d b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_3.d
deleted file mode 100644
index 864852f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_3.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_3.dfh b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_3.dfh
deleted file mode 100644
index 971a7eb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_3.dfh
+++ /dev/null
@@ -1,261 +0,0 @@
-// 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_30.d b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_30.d
deleted file mode 100644
index f68e154..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_30.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_4.d b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_4.d
deleted file mode 100644
index 5b0d440..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_6.d b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_6.d
deleted file mode 100644
index 29230ed..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_6.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_7.d b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_7.d
deleted file mode 100644
index 1c26b25..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_7.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_7.java b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_7.java
deleted file mode 100644
index c48328e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_7.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_8.d b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_8.d
deleted file mode 100644
index ce16612..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_8.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_8.java b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_8.java
deleted file mode 100644
index 6706b11..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_8.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_9.d b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_9.d
deleted file mode 100644
index b740349..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_9.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_9.java b/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_9.java
deleted file mode 100644
index 86c2fbf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_9.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_byte/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/TestStubs.java
deleted file mode 100644
index c8906b4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/TestStubs.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_byte/Test_iput_byte.java b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/Test_iput_byte.java
deleted file mode 100644
index f67e22b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/Test_iput_byte.java
+++ /dev/null
@@ -1,330 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_1.d b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_1.d
deleted file mode 100644
index 860157b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_1.d
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_1.java b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_1.java
deleted file mode 100644
index d926c18..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_1.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_10.d b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_10.d
deleted file mode 100644
index 279b2a2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_10.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_10.java b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_10.java
deleted file mode 100644
index f7278f2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_10.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_11.d b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_11.d
deleted file mode 100644
index 9c80461..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_11.d
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_11.java b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_11.java
deleted file mode 100644
index a77d3c3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_11.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_12.d b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_12.d
deleted file mode 100644
index ee0355b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_12.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_12.java b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_12.java
deleted file mode 100644
index c64063c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_12.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_13.d b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_13.d
deleted file mode 100644
index 26cd104..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_13.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_13.java b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_13.java
deleted file mode 100644
index e907164..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_13.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_14.d b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_14.d
deleted file mode 100644
index 9be11ea..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_14.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_14.java b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_14.java
deleted file mode 100644
index e1bcc4b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_14.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_15.d b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_15.d
deleted file mode 100644
index 2f14e14..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_15.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_15.java b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_15.java
deleted file mode 100644
index 249926f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_15.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_17.d b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_17.d
deleted file mode 100644
index 1f8bd94..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_17.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_17.java b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_17.java
deleted file mode 100644
index 6eca2a9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_17.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_18.d b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_18.d
deleted file mode 100644
index 153aae1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_18.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_2.d b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_2.d
deleted file mode 100644
index 3805c5f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_2.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_20.d b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_20.d
deleted file mode 100644
index 2452e5e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_20.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_21.d b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_21.d
deleted file mode 100644
index 9f8bd0f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_21.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_22.d b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_22.d
deleted file mode 100644
index e0a19be..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_22.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_23.d b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_23.d
deleted file mode 100644
index afae162..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_23.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_24.d b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_24.d
deleted file mode 100644
index ac31166..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_24.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_3.d b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_3.d
deleted file mode 100644
index c3a8828..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_3.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_3.dfh b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_3.dfh
deleted file mode 100644
index 74792e5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_3.dfh
+++ /dev/null
@@ -1,261 +0,0 @@
-// 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_30.d b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_30.d
deleted file mode 100644
index b29c0e0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_30.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_4.d b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_4.d
deleted file mode 100644
index 18a254f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_6.d b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_6.d
deleted file mode 100644
index d349e8e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_6.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_7.d b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_7.d
deleted file mode 100644
index 4ac5aa9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_7.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_7.java b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_7.java
deleted file mode 100644
index 3ff9a3f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_7.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_8.d b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_8.d
deleted file mode 100644
index 34b537c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_8.d
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_8.java b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_8.java
deleted file mode 100644
index 8a29bb2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_8.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_9.d b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_9.d
deleted file mode 100644
index 338b321..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_9.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_9.java b/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_9.java
deleted file mode 100644
index 37f7a6d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_9.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_char/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/iput_char/TestStubs.java
deleted file mode 100644
index a0d947f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/TestStubs.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_char/Test_iput_char.java b/tools/vm-tests/src/dot/junit/opcodes/iput_char/Test_iput_char.java
deleted file mode 100644
index f3a4f9e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/Test_iput_char.java
+++ /dev/null
@@ -1,333 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_1.d b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_1.d
deleted file mode 100644
index 1872727..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_1.d
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_1.java b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_1.java
deleted file mode 100644
index a2a83cd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_1.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_10.d b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_10.d
deleted file mode 100644
index 466cad9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_10.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_10.java b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_10.java
deleted file mode 100644
index 2e2c554..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_10.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_11.d b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_11.d
deleted file mode 100644
index cd32504..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_11.d
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_11.java b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_11.java
deleted file mode 100644
index 629d319..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_11.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_12.d b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_12.d
deleted file mode 100644
index 9aeb2cc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_12.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_12.java b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_12.java
deleted file mode 100644
index b20146a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_12.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_13.d b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_13.d
deleted file mode 100644
index 9cbce64..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_13.d
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_13.java b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_13.java
deleted file mode 100644
index 5f15efc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_13.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_14.d b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_14.d
deleted file mode 100644
index 71dca61..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_14.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_14.java b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_14.java
deleted file mode 100644
index a55800a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_14.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_15.d b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_15.d
deleted file mode 100644
index 4cccb49..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_15.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_15.java b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_15.java
deleted file mode 100644
index 9419df4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_15.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_17.d b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_17.d
deleted file mode 100644
index 61e503d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_17.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_17.java b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_17.java
deleted file mode 100644
index 41d3dfb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_17.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_18.d b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_18.d
deleted file mode 100644
index a9d9ac9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_18.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_2.d b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_2.d
deleted file mode 100644
index cc8cd62..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_2.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_20.d b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_20.d
deleted file mode 100644
index 5aa31b2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_20.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_21.d b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_21.d
deleted file mode 100644
index b9f7cc6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_21.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_22.d b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_22.d
deleted file mode 100644
index ca94dbd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_22.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_23.d b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_23.d
deleted file mode 100644
index 3494a90..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_23.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_24.d b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_24.d
deleted file mode 100644
index d148a4b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_24.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_3.d b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_3.d
deleted file mode 100644
index 05233a1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_3.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_3.dfh b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_3.dfh
deleted file mode 100644
index 95d1306..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_3.dfh
+++ /dev/null
@@ -1,261 +0,0 @@
-// 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_30.d b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_30.d
deleted file mode 100644
index 8182241..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_30.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_4.d b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_4.d
deleted file mode 100644
index 6f78812..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_6.d b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_6.d
deleted file mode 100644
index 5614d67..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_6.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_7.d b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_7.d
deleted file mode 100644
index 13f4e50..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_7.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_7.java b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_7.java
deleted file mode 100644
index 4e148d7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_7.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_8.d b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_8.d
deleted file mode 100644
index 95616a6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_8.d
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_8.java b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_8.java
deleted file mode 100644
index 186ce0b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_8.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_9.d b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_9.d
deleted file mode 100644
index d2efaae..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_9.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_char/d/T_iput_char_9.java b/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_9.java
deleted file mode 100644
index 3cb3667..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_char/d/T_iput_char_9.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_object/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/iput_object/TestStubs.java
deleted file mode 100644
index d8354b2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/TestStubs.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_object/Test_iput_object.java b/tools/vm-tests/src/dot/junit/opcodes/iput_object/Test_iput_object.java
deleted file mode 100644
index e2f8fa4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/Test_iput_object.java
+++ /dev/null
@@ -1,333 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_1.d b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_1.d
deleted file mode 100644
index 6a9215e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_1.d
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_1.java b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_1.java
deleted file mode 100644
index fdedfda..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_1.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_10.d b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_10.d
deleted file mode 100644
index 92f9cff..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_10.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_10.java b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_10.java
deleted file mode 100644
index 01e9cb6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_10.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_11.d b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_11.d
deleted file mode 100644
index f75accc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_11.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_11.java b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_11.java
deleted file mode 100644
index 03c14d1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_11.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_12.d b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_12.d
deleted file mode 100644
index 69f1309..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_12.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_12.java b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_12.java
deleted file mode 100644
index 4a6da45..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_12.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_13.d b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_13.d
deleted file mode 100644
index f282745..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_13.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_13.java b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_13.java
deleted file mode 100644
index 334f14e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_13.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_14.d b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_14.d
deleted file mode 100644
index 4e420fc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_14.d
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_14.java b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_14.java
deleted file mode 100644
index 2bc9c2a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_14.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_15.d b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_15.d
deleted file mode 100644
index 35aeab9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_15.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_15.java b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_15.java
deleted file mode 100644
index 84667f8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_15.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_17.d b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_17.d
deleted file mode 100644
index 71eb363..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_17.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_17.java b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_17.java
deleted file mode 100644
index 6db4b58..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_17.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_18.d b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_18.d
deleted file mode 100644
index 56d8da8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_18.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_2.d b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_2.d
deleted file mode 100644
index 805388f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_2.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_20.d b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_20.d
deleted file mode 100644
index a9b90be..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_20.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_21.d b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_21.d
deleted file mode 100644
index 19aa1cf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_21.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_22.d b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_22.d
deleted file mode 100644
index 8d7272e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_22.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_23.d b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_23.d
deleted file mode 100644
index 296a14b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_23.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_24.d b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_24.d
deleted file mode 100644
index 51bbb2d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_24.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_3.d b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_3.d
deleted file mode 100644
index fa05a78..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_3.dfh b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_3.dfh
deleted file mode 100644
index 8a922e5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_3.dfh
+++ /dev/null
@@ -1,253 +0,0 @@
-// 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_30.d b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_30.d
deleted file mode 100644
index ace5b2c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_30.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_4.d b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_4.d
deleted file mode 100644
index 8906abe..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_6.d b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_6.d
deleted file mode 100644
index 5e9f811..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_6.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_7.d b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_7.d
deleted file mode 100644
index 25768ff..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_7.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_7.java b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_7.java
deleted file mode 100644
index 60bba2f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_7.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_8.d b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_8.d
deleted file mode 100644
index 971dec4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_8.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_8.java b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_8.java
deleted file mode 100644
index f104e78..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_8.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_9.d b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_9.d
deleted file mode 100644
index 3fd712b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_9.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_object/d/T_iput_object_9.java b/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_9.java
deleted file mode 100644
index 7b53911..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_object/d/T_iput_object_9.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_short/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/iput_short/TestStubs.java
deleted file mode 100644
index 8cee31e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/TestStubs.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_short/Test_iput_short.java b/tools/vm-tests/src/dot/junit/opcodes/iput_short/Test_iput_short.java
deleted file mode 100644
index 0ea32e5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/Test_iput_short.java
+++ /dev/null
@@ -1,332 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_1.d b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_1.d
deleted file mode 100644
index 8aca472..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_1.d
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_1.java b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_1.java
deleted file mode 100644
index a804c96..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_1.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_10.d b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_10.d
deleted file mode 100644
index 7feaba8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_10.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_10.java b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_10.java
deleted file mode 100644
index eb01ab1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_10.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_11.d b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_11.d
deleted file mode 100644
index 23539d3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_11.d
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_11.java b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_11.java
deleted file mode 100644
index dc23c74..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_11.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_12.d b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_12.d
deleted file mode 100644
index b0f2f15..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_12.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_12.java b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_12.java
deleted file mode 100644
index eaacd89..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_12.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_13.d b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_13.d
deleted file mode 100644
index 4472907..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_13.d
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_13.java b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_13.java
deleted file mode 100644
index 2ba3c63..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_13.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_14.d b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_14.d
deleted file mode 100644
index f7b07c6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_14.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_14.java b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_14.java
deleted file mode 100644
index 8a33e07..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_14.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_15.d b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_15.d
deleted file mode 100644
index 5732b91..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_15.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_15.java b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_15.java
deleted file mode 100644
index 17398b7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_15.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_17.d b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_17.d
deleted file mode 100644
index bd8966a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_17.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_17.java b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_17.java
deleted file mode 100644
index b89d34b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_17.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_18.d b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_18.d
deleted file mode 100644
index 5d543c4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_18.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_2.d b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_2.d
deleted file mode 100644
index ae98945..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_2.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_20.d b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_20.d
deleted file mode 100644
index b7524dc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_20.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_21.d b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_21.d
deleted file mode 100644
index 7b80f03..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_21.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_22.d b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_22.d
deleted file mode 100644
index 4f969d5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_22.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_23.d b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_23.d
deleted file mode 100644
index 6f2cdc1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_23.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_24.d b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_24.d
deleted file mode 100644
index 326cd78..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_24.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_3.d b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_3.d
deleted file mode 100644
index 0a091e4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_3.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_3.dfh b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_3.dfh
deleted file mode 100644
index f055d5f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_3.dfh
+++ /dev/null
@@ -1,259 +0,0 @@
-// 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_30.d b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_30.d
deleted file mode 100644
index 51d2ea8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_30.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_4.d b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_4.d
deleted file mode 100644
index f201a30..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_6.d b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_6.d
deleted file mode 100644
index ba79d41..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_6.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_7.d b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_7.d
deleted file mode 100644
index b395108..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_7.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_7.java b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_7.java
deleted file mode 100644
index 6969f12..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_7.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_8.d b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_8.d
deleted file mode 100644
index 05b5100..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_8.d
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_8.java b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_8.java
deleted file mode 100644
index 689c54b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_8.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_9.d b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_9.d
deleted file mode 100644
index 1a1555e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_9.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_short/d/T_iput_short_9.java b/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_9.java
deleted file mode 100644
index 7f81b96..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_short/d/T_iput_short_9.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_wide/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/TestStubs.java
deleted file mode 100644
index 617b87f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/TestStubs.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_wide/Test_iput_wide.java b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/Test_iput_wide.java
deleted file mode 100644
index a61bb70..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/Test_iput_wide.java
+++ /dev/null
@@ -1,347 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_1.d b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_1.d
deleted file mode 100644
index cae692f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_1.d
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_1.java b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_1.java
deleted file mode 100644
index be11462..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_1.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_10.d b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_10.d
deleted file mode 100644
index 1ba4cac..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_10.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_10.java b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_10.java
deleted file mode 100644
index 9653b55..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_10.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_11.d b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_11.d
deleted file mode 100644
index d3401d0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_11.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_11.java b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_11.java
deleted file mode 100644
index 327d5bd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_11.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_12.d b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_12.d
deleted file mode 100644
index a386a54..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_12.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_12.java b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_12.java
deleted file mode 100644
index d2d6998..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_12.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_13.d b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_13.d
deleted file mode 100644
index cdf7fe6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_13.d
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_13.java b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_13.java
deleted file mode 100644
index 6053aec..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_13.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_14.d b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_14.d
deleted file mode 100644
index 22bafcf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_14.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_14.java b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_14.java
deleted file mode 100644
index f0fb8d3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_14.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_15.d b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_15.d
deleted file mode 100644
index 4e8b2ad..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_15.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_15.java b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_15.java
deleted file mode 100644
index 9818c22..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_15.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_17.d b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_17.d
deleted file mode 100644
index 058d1dc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_17.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_17.java b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_17.java
deleted file mode 100644
index 60c005e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_17.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_18.d b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_18.d
deleted file mode 100644
index 1818bed..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_18.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_2.d b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_2.d
deleted file mode 100644
index 8d6dc36..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_2.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_20.d b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_20.d
deleted file mode 100644
index e0efb25..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_20.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_21.d b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_21.d
deleted file mode 100644
index 064a9a8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_21.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_22.d b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_22.d
deleted file mode 100644
index 80a827d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_22.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_23.d b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_23.d
deleted file mode 100644
index d37bbd0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_23.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_24.d b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_24.d
deleted file mode 100644
index 3f0102f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_24.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_3.d b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_3.d
deleted file mode 100644
index fc4dc02..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_3.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_3.dfh b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_3.dfh
deleted file mode 100644
index a0ada5a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_3.dfh
+++ /dev/null
@@ -1,261 +0,0 @@
-// 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_30.d b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_30.d
deleted file mode 100644
index 9513dc8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_30.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_4.d b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_4.d
deleted file mode 100644
index 6036cc6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_5.d b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_5.d
deleted file mode 100644
index 3c1d9ba..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_5.d
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_5.java b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_5.java
deleted file mode 100644
index a508e8e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_5.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_6.d b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_6.d
deleted file mode 100644
index 31f4f12..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_6.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_7.d b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_7.d
deleted file mode 100644
index df5079c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_7.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_7.java b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_7.java
deleted file mode 100644
index e476c01..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_7.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_8.d b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_8.d
deleted file mode 100644
index 12a0d92..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_8.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_8.java b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_8.java
deleted file mode 100644
index dc2e2bf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_8.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_9.d b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_9.d
deleted file mode 100644
index aecd210..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_9.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_9.java b/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_9.java
deleted file mode 100644
index c9d1da2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/iput_wide/d/T_iput_wide_9.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/long_to_double/Test_long_to_double.java b/tools/vm-tests/src/dot/junit/opcodes/long_to_double/Test_long_to_double.java
deleted file mode 100644
index fb55b8e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/long_to_double/Test_long_to_double.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_1.d b/tools/vm-tests/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_1.d
deleted file mode 100644
index d1e068c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_1.java b/tools/vm-tests/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_1.java
deleted file mode 100644
index f1ce414..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_2.d b/tools/vm-tests/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_2.d
deleted file mode 100644
index 3201a77..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_3.d b/tools/vm-tests/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_3.d
deleted file mode 100644
index 83c423c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_4.d b/tools/vm-tests/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_4.d
deleted file mode 100644
index 03bc7bd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_5.d b/tools/vm-tests/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_5.d
deleted file mode 100644
index 6656834..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_6.d b/tools/vm-tests/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_6.d
deleted file mode 100644
index 8e430fe..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_6.java b/tools/vm-tests/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_6.java
deleted file mode 100644
index f676c16..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/long_to_double/d/T_long_to_double_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/long_to_float/Test_long_to_float.java b/tools/vm-tests/src/dot/junit/opcodes/long_to_float/Test_long_to_float.java
deleted file mode 100644
index 1e06437..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/long_to_float/Test_long_to_float.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_1.d b/tools/vm-tests/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_1.d
deleted file mode 100644
index 3f0602b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_1.java b/tools/vm-tests/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_1.java
deleted file mode 100644
index 67eca97..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_2.d b/tools/vm-tests/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_2.d
deleted file mode 100644
index 0f4a557..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_2.java b/tools/vm-tests/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_2.java
deleted file mode 100644
index 409d2ef..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_3.d b/tools/vm-tests/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_3.d
deleted file mode 100644
index 002e5d5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_4.d b/tools/vm-tests/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_4.d
deleted file mode 100644
index acb99d1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_5.d b/tools/vm-tests/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_5.d
deleted file mode 100644
index 5cb993e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/long_to_float/d/T_long_to_float_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/long_to_int/Test_long_to_int.java b/tools/vm-tests/src/dot/junit/opcodes/long_to_int/Test_long_to_int.java
deleted file mode 100644
index 2440fa5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/long_to_int/Test_long_to_int.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_1.d b/tools/vm-tests/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_1.d
deleted file mode 100644
index 2f73956..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_1.java b/tools/vm-tests/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_1.java
deleted file mode 100644
index 77f6c5d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_2.d b/tools/vm-tests/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_2.d
deleted file mode 100644
index 1732d7f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_2.java b/tools/vm-tests/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_2.java
deleted file mode 100644
index 97b9ac4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_3.d b/tools/vm-tests/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_3.d
deleted file mode 100644
index 1d4665b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_4.d b/tools/vm-tests/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_4.d
deleted file mode 100644
index 50e5889..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_5.d b/tools/vm-tests/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_5.d
deleted file mode 100644
index 5b65864..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_6.d b/tools/vm-tests/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_6.d
deleted file mode 100644
index ad412f0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/long_to_int/d/T_long_to_int_6.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/monitor_enter/Test_monitor_enter.java b/tools/vm-tests/src/dot/junit/opcodes/monitor_enter/Test_monitor_enter.java
deleted file mode 100644
index 3608793..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/monitor_enter/Test_monitor_enter.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_1.d b/tools/vm-tests/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_1.d
deleted file mode 100644
index eb443b7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_1.d
+++ /dev/null
@@ -1,63 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_1.java b/tools/vm-tests/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_1.java
deleted file mode 100644
index 39113fa..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_1.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_2.d b/tools/vm-tests/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_2.d
deleted file mode 100644
index 2e7fc6f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_2.d
+++ /dev/null
@@ -1,85 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_2.java b/tools/vm-tests/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_2.java
deleted file mode 100644
index d2f5add..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_2.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_3.d b/tools/vm-tests/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_3.d
deleted file mode 100644
index 7417a8e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_3.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_3.java b/tools/vm-tests/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_3.java
deleted file mode 100644
index ebb0f17..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_3.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_4.d b/tools/vm-tests/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_4.d
deleted file mode 100644
index 5b3469d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_4.java b/tools/vm-tests/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_4.java
deleted file mode 100644
index 83c41d4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_4.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_5.d b/tools/vm-tests/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_5.d
deleted file mode 100644
index 7078aa0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_5.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_6.d b/tools/vm-tests/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_6.d
deleted file mode 100644
index 754a9e3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_6.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_7.d b/tools/vm-tests/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_7.d
deleted file mode 100644
index 8fb7791..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_7.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_8.d b/tools/vm-tests/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_8.d
deleted file mode 100644
index 3d45716..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_8.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/monitor_exit/Test_monitor_exit.java b/tools/vm-tests/src/dot/junit/opcodes/monitor_exit/Test_monitor_exit.java
deleted file mode 100644
index d4f5842..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/monitor_exit/Test_monitor_exit.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_1.d b/tools/vm-tests/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_1.d
deleted file mode 100644
index bef8390..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_1.d
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_1.java b/tools/vm-tests/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_1.java
deleted file mode 100644
index ff61a53..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_1.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_3.d b/tools/vm-tests/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_3.d
deleted file mode 100644
index 9ef4034..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_3.d
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_3.java b/tools/vm-tests/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_3.java
deleted file mode 100644
index 162dd58..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_3.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_4.d b/tools/vm-tests/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_4.d
deleted file mode 100644
index 334f385..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_5.d b/tools/vm-tests/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_5.d
deleted file mode 100644
index 9def3d7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_6.d b/tools/vm-tests/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_6.d
deleted file mode 100644
index 9635212..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_7.d b/tools/vm-tests/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_7.d
deleted file mode 100644
index c65ae56..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_7.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_8.d b/tools/vm-tests/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_8.d
deleted file mode 100644
index 91be219..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_8.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move/Test_move.java b/tools/vm-tests/src/dot/junit/opcodes/move/Test_move.java
deleted file mode 100644
index d503890..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move/Test_move.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move/d/T_move_1.d b/tools/vm-tests/src/dot/junit/opcodes/move/d/T_move_1.d
deleted file mode 100644
index 1d8e693..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move/d/T_move_1.d
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move/d/T_move_1.java b/tools/vm-tests/src/dot/junit/opcodes/move/d/T_move_1.java
deleted file mode 100644
index 97f538f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move/d/T_move_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move/d/T_move_2.d b/tools/vm-tests/src/dot/junit/opcodes/move/d/T_move_2.d
deleted file mode 100644
index 4a5dfc7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move/d/T_move_2.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move/d/T_move_3.d b/tools/vm-tests/src/dot/junit/opcodes/move/d/T_move_3.d
deleted file mode 100644
index c9d094b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move/d/T_move_3.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move/d/T_move_4.d b/tools/vm-tests/src/dot/junit/opcodes/move/d/T_move_4.d
deleted file mode 100644
index 54adf05..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move/d/T_move_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move/d/T_move_5.d b/tools/vm-tests/src/dot/junit/opcodes/move/d/T_move_5.d
deleted file mode 100644
index 1ab33b6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move/d/T_move_5.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move/d/T_move_6.d b/tools/vm-tests/src/dot/junit/opcodes/move/d/T_move_6.d
deleted file mode 100644
index 91da915..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move/d/T_move_6.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move/d/T_move_7.d b/tools/vm-tests/src/dot/junit/opcodes/move/d/T_move_7.d
deleted file mode 100644
index fa615c1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move/d/T_move_7.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_16/Test_move_16.java b/tools/vm-tests/src/dot/junit/opcodes/move_16/Test_move_16.java
deleted file mode 100644
index f3e2ab0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_16/Test_move_16.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_16/d/T_move_16_1.d b/tools/vm-tests/src/dot/junit/opcodes/move_16/d/T_move_16_1.d
deleted file mode 100644
index bb5335f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_16/d/T_move_16_1.d
+++ /dev/null
@@ -1,53 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_16/d/T_move_16_1.java b/tools/vm-tests/src/dot/junit/opcodes/move_16/d/T_move_16_1.java
deleted file mode 100644
index 203468b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_16/d/T_move_16_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_16/d/T_move_16_2.d b/tools/vm-tests/src/dot/junit/opcodes/move_16/d/T_move_16_2.d
deleted file mode 100644
index 52454ae..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_16/d/T_move_16_2.d
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_16/d/T_move_16_2.java b/tools/vm-tests/src/dot/junit/opcodes/move_16/d/T_move_16_2.java
deleted file mode 100644
index 4729303..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_16/d/T_move_16_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_16/d/T_move_16_3.d b/tools/vm-tests/src/dot/junit/opcodes/move_16/d/T_move_16_3.d
deleted file mode 100644
index 604cbf3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_16/d/T_move_16_3.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_16/d/T_move_16_4.d b/tools/vm-tests/src/dot/junit/opcodes/move_16/d/T_move_16_4.d
deleted file mode 100644
index 2c098a0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_16/d/T_move_16_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_16/d/T_move_16_5.d b/tools/vm-tests/src/dot/junit/opcodes/move_16/d/T_move_16_5.d
deleted file mode 100644
index ccacc33..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_16/d/T_move_16_5.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_16/d/T_move_16_6.d b/tools/vm-tests/src/dot/junit/opcodes/move_16/d/T_move_16_6.d
deleted file mode 100644
index eb4b9c8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_16/d/T_move_16_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_16/d/T_move_16_7.d b/tools/vm-tests/src/dot/junit/opcodes/move_16/d/T_move_16_7.d
deleted file mode 100644
index a6aa1d2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_16/d/T_move_16_7.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_16/d/T_move_16_8.d b/tools/vm-tests/src/dot/junit/opcodes/move_16/d/T_move_16_8.d
deleted file mode 100644
index 8d98954..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_16/d/T_move_16_8.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_exception/Test_move_exception.java b/tools/vm-tests/src/dot/junit/opcodes/move_exception/Test_move_exception.java
deleted file mode 100644
index b4fd87c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_exception/Test_move_exception.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_exception/d/T_move_exception_1.d b/tools/vm-tests/src/dot/junit/opcodes/move_exception/d/T_move_exception_1.d
deleted file mode 100644
index ed7aa2e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_exception/d/T_move_exception_1.d
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_exception/d/T_move_exception_1.java b/tools/vm-tests/src/dot/junit/opcodes/move_exception/d/T_move_exception_1.java
deleted file mode 100644
index 9edf6ea..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_exception/d/T_move_exception_1.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_exception/d/T_move_exception_2.d b/tools/vm-tests/src/dot/junit/opcodes/move_exception/d/T_move_exception_2.d
deleted file mode 100644
index 8713f3a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_exception/d/T_move_exception_2.d
+++ /dev/null
@@ -1,48 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_exception/d/T_move_exception_2.java b/tools/vm-tests/src/dot/junit/opcodes/move_exception/d/T_move_exception_2.java
deleted file mode 100644
index ed66c22..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_exception/d/T_move_exception_2.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_exception/d/T_move_exception_3.d b/tools/vm-tests/src/dot/junit/opcodes/move_exception/d/T_move_exception_3.d
deleted file mode 100644
index 8141ddb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_exception/d/T_move_exception_3.d
+++ /dev/null
@@ -1,31 +0,0 @@
-.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/src/dot/junit/opcodes/move_exception/d/T_move_exception_5.d b/tools/vm-tests/src/dot/junit/opcodes/move_exception/d/T_move_exception_5.d
deleted file mode 100644
index fdad390..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_exception/d/T_move_exception_5.d
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_from16/Test_move_from16.java b/tools/vm-tests/src/dot/junit/opcodes/move_from16/Test_move_from16.java
deleted file mode 100644
index 725cbd8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_from16/Test_move_from16.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_from16/d/T_move_from16_1.d b/tools/vm-tests/src/dot/junit/opcodes/move_from16/d/T_move_from16_1.d
deleted file mode 100644
index e445cea..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_from16/d/T_move_from16_1.d
+++ /dev/null
@@ -1,48 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_from16/d/T_move_from16_1.java b/tools/vm-tests/src/dot/junit/opcodes/move_from16/d/T_move_from16_1.java
deleted file mode 100644
index a32e85c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_from16/d/T_move_from16_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_from16/d/T_move_from16_3.d b/tools/vm-tests/src/dot/junit/opcodes/move_from16/d/T_move_from16_3.d
deleted file mode 100644
index 88b3cae..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_from16/d/T_move_from16_3.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_from16/d/T_move_from16_4.d b/tools/vm-tests/src/dot/junit/opcodes/move_from16/d/T_move_from16_4.d
deleted file mode 100644
index e544a14..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_from16/d/T_move_from16_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_from16/d/T_move_from16_5.d b/tools/vm-tests/src/dot/junit/opcodes/move_from16/d/T_move_from16_5.d
deleted file mode 100644
index 400a01f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_from16/d/T_move_from16_5.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_from16/d/T_move_from16_6.d b/tools/vm-tests/src/dot/junit/opcodes/move_from16/d/T_move_from16_6.d
deleted file mode 100644
index 662e314..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_from16/d/T_move_from16_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_from16/d/T_move_from16_7.d b/tools/vm-tests/src/dot/junit/opcodes/move_from16/d/T_move_from16_7.d
deleted file mode 100644
index 7d2f26c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_from16/d/T_move_from16_7.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_from16/d/T_move_from16_8.d b/tools/vm-tests/src/dot/junit/opcodes/move_from16/d/T_move_from16_8.d
deleted file mode 100644
index 5f8455a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_from16/d/T_move_from16_8.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_object/Test_move_object.java b/tools/vm-tests/src/dot/junit/opcodes/move_object/Test_move_object.java
deleted file mode 100644
index d67be88..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_object/Test_move_object.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_object/d/T_move_object_1.d b/tools/vm-tests/src/dot/junit/opcodes/move_object/d/T_move_object_1.d
deleted file mode 100644
index cc90a5f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_object/d/T_move_object_1.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_object/d/T_move_object_1.java b/tools/vm-tests/src/dot/junit/opcodes/move_object/d/T_move_object_1.java
deleted file mode 100644
index c0b2483..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_object/d/T_move_object_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_object/d/T_move_object_2.d b/tools/vm-tests/src/dot/junit/opcodes/move_object/d/T_move_object_2.d
deleted file mode 100644
index 4df3976..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_object/d/T_move_object_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_object/d/T_move_object_3.d b/tools/vm-tests/src/dot/junit/opcodes/move_object/d/T_move_object_3.d
deleted file mode 100644
index 647a220..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_object/d/T_move_object_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_object/d/T_move_object_4.d b/tools/vm-tests/src/dot/junit/opcodes/move_object/d/T_move_object_4.d
deleted file mode 100644
index f5538f4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_object/d/T_move_object_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_object/d/T_move_object_5.d b/tools/vm-tests/src/dot/junit/opcodes/move_object/d/T_move_object_5.d
deleted file mode 100644
index d7951a5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_object/d/T_move_object_5.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_object/d/T_move_object_6.d b/tools/vm-tests/src/dot/junit/opcodes/move_object/d/T_move_object_6.d
deleted file mode 100644
index 7db5136..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_object/d/T_move_object_6.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_object/d/T_move_object_7.d b/tools/vm-tests/src/dot/junit/opcodes/move_object/d/T_move_object_7.d
deleted file mode 100644
index 0fe5509..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_object/d/T_move_object_7.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_object_16/Test_move_object_16.java b/tools/vm-tests/src/dot/junit/opcodes/move_object_16/Test_move_object_16.java
deleted file mode 100644
index c3780cf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_object_16/Test_move_object_16.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_1.d b/tools/vm-tests/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_1.d
deleted file mode 100644
index b60a448..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_1.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_1.java b/tools/vm-tests/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_1.java
deleted file mode 100644
index d0b85bf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_3.d b/tools/vm-tests/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_3.d
deleted file mode 100644
index aad9893..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_3.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_4.d b/tools/vm-tests/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_4.d
deleted file mode 100644
index 463646c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_4.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_5.d b/tools/vm-tests/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_5.d
deleted file mode 100644
index 8cceaff..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_6.d b/tools/vm-tests/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_6.d
deleted file mode 100644
index 6a5035d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_7.d b/tools/vm-tests/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_7.d
deleted file mode 100644
index 0fce2b6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_7.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_8.d b/tools/vm-tests/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_8.d
deleted file mode 100644
index 8f0d925..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_object_16/d/T_move_object_16_8.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_object_from16/Test_move_object_from16.java b/tools/vm-tests/src/dot/junit/opcodes/move_object_from16/Test_move_object_from16.java
deleted file mode 100644
index 2fe17d3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_object_from16/Test_move_object_from16.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_1.d b/tools/vm-tests/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_1.d
deleted file mode 100644
index 434737e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_1.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_1.java b/tools/vm-tests/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_1.java
deleted file mode 100644
index 75f4bac..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_3.d b/tools/vm-tests/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_3.d
deleted file mode 100644
index c2f4512..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_3.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_4.d b/tools/vm-tests/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_4.d
deleted file mode 100644
index 360ae14..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_5.d b/tools/vm-tests/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_5.d
deleted file mode 100644
index 94acfb9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_6.d b/tools/vm-tests/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_6.d
deleted file mode 100644
index d41f1f7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_7.d b/tools/vm-tests/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_7.d
deleted file mode 100644
index 09abc65..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_7.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_8.d b/tools/vm-tests/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_8.d
deleted file mode 100644
index 93ff685..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_object_from16/d/T_move_object_from16_8.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_result/Test_move_result.java b/tools/vm-tests/src/dot/junit/opcodes/move_result/Test_move_result.java
deleted file mode 100644
index 9a0eaba..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result/Test_move_result.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_result/d/T_move_result_1.d b/tools/vm-tests/src/dot/junit/opcodes/move_result/d/T_move_result_1.d
deleted file mode 100644
index 50c2eb2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result/d/T_move_result_1.d
+++ /dev/null
@@ -1,55 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_result/d/T_move_result_1.java b/tools/vm-tests/src/dot/junit/opcodes/move_result/d/T_move_result_1.java
deleted file mode 100644
index 0f97613..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result/d/T_move_result_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_result/d/T_move_result_2.d b/tools/vm-tests/src/dot/junit/opcodes/move_result/d/T_move_result_2.d
deleted file mode 100644
index ad1b45c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result/d/T_move_result_2.d
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_result/d/T_move_result_3.d b/tools/vm-tests/src/dot/junit/opcodes/move_result/d/T_move_result_3.d
deleted file mode 100644
index 481f158..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result/d/T_move_result_3.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_result/d/T_move_result_4.d b/tools/vm-tests/src/dot/junit/opcodes/move_result/d/T_move_result_4.d
deleted file mode 100644
index 655aa7e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result/d/T_move_result_4.d
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_result/d/T_move_result_5.d b/tools/vm-tests/src/dot/junit/opcodes/move_result/d/T_move_result_5.d
deleted file mode 100644
index 711b142..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result/d/T_move_result_5.d
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_result/d/T_move_result_6.d b/tools/vm-tests/src/dot/junit/opcodes/move_result/d/T_move_result_6.d
deleted file mode 100644
index 9afeb48..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result/d/T_move_result_6.d
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_result/d/T_move_result_7.d b/tools/vm-tests/src/dot/junit/opcodes/move_result/d/T_move_result_7.d
deleted file mode 100644
index aaea908..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result/d/T_move_result_7.d
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_result/d/T_move_result_8.d b/tools/vm-tests/src/dot/junit/opcodes/move_result/d/T_move_result_8.d
deleted file mode 100644
index da32cd0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result/d/T_move_result_8.d
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_result_object/Test_move_result_object.java b/tools/vm-tests/src/dot/junit/opcodes/move_result_object/Test_move_result_object.java
deleted file mode 100644
index 9ee2ed1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result_object/Test_move_result_object.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_1.d b/tools/vm-tests/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_1.d
deleted file mode 100644
index 433b86f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_1.d
+++ /dev/null
@@ -1,53 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_1.java b/tools/vm-tests/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_1.java
deleted file mode 100644
index 76cdb0d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_2.d b/tools/vm-tests/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_2.d
deleted file mode 100644
index 22c1b0c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_2.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_3.d b/tools/vm-tests/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_3.d
deleted file mode 100644
index a788844..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_3.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_4.d b/tools/vm-tests/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_4.d
deleted file mode 100644
index b3229b7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_4.d
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_5.d b/tools/vm-tests/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_5.d
deleted file mode 100644
index 6216f18..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_5.d
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_6.d b/tools/vm-tests/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_6.d
deleted file mode 100644
index 8de3274..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_6.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_7.d b/tools/vm-tests/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_7.d
deleted file mode 100644
index 088b386..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_7.d
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_8.d b/tools/vm-tests/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_8.d
deleted file mode 100644
index 0cbb044..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_8.d
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_8.java b/tools/vm-tests/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_8.java
deleted file mode 100644
index 3eb0ea1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_8.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_9.d b/tools/vm-tests/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_9.d
deleted file mode 100644
index 92600b9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result_object/d/T_move_result_object_9.d
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_result_wide/Test_move_result_wide.java b/tools/vm-tests/src/dot/junit/opcodes/move_result_wide/Test_move_result_wide.java
deleted file mode 100644
index 6c849dc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result_wide/Test_move_result_wide.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_1.d b/tools/vm-tests/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_1.d
deleted file mode 100644
index e0d80c0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_1.d
+++ /dev/null
@@ -1,56 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_1.java b/tools/vm-tests/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_1.java
deleted file mode 100644
index 4c7ef16..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_2.d b/tools/vm-tests/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_2.d
deleted file mode 100644
index 35eb63c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_2.d
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_3.d b/tools/vm-tests/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_3.d
deleted file mode 100644
index 5f53fa3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_3.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_4.d b/tools/vm-tests/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_4.d
deleted file mode 100644
index 3c10cab..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_4.d
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_5.d b/tools/vm-tests/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_5.d
deleted file mode 100644
index 9126ee2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_5.d
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_6.d b/tools/vm-tests/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_6.d
deleted file mode 100644
index a499958..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_6.d
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_7.d b/tools/vm-tests/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_7.d
deleted file mode 100644
index f6d47eb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_7.d
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_8.d b/tools/vm-tests/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_8.d
deleted file mode 100644
index f385a2d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_result_wide/d/T_move_result_wide_8.d
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_wide/Test_move_wide.java b/tools/vm-tests/src/dot/junit/opcodes/move_wide/Test_move_wide.java
deleted file mode 100644
index 4ab7421..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide/Test_move_wide.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_wide/d/T_move_wide_1.d b/tools/vm-tests/src/dot/junit/opcodes/move_wide/d/T_move_wide_1.d
deleted file mode 100644
index b0597f8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide/d/T_move_wide_1.d
+++ /dev/null
@@ -1,49 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_wide/d/T_move_wide_1.java b/tools/vm-tests/src/dot/junit/opcodes/move_wide/d/T_move_wide_1.java
deleted file mode 100644
index 8ddde82..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide/d/T_move_wide_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_wide/d/T_move_wide_2.d b/tools/vm-tests/src/dot/junit/opcodes/move_wide/d/T_move_wide_2.d
deleted file mode 100644
index 22e992b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide/d/T_move_wide_2.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_wide/d/T_move_wide_3.d b/tools/vm-tests/src/dot/junit/opcodes/move_wide/d/T_move_wide_3.d
deleted file mode 100644
index b8e3db0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide/d/T_move_wide_3.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_wide/d/T_move_wide_4.d b/tools/vm-tests/src/dot/junit/opcodes/move_wide/d/T_move_wide_4.d
deleted file mode 100644
index 3eb95df..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide/d/T_move_wide_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_wide/d/T_move_wide_5.d b/tools/vm-tests/src/dot/junit/opcodes/move_wide/d/T_move_wide_5.d
deleted file mode 100644
index 92e67dc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide/d/T_move_wide_5.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_wide/d/T_move_wide_6.d b/tools/vm-tests/src/dot/junit/opcodes/move_wide/d/T_move_wide_6.d
deleted file mode 100644
index 4fecf88..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide/d/T_move_wide_6.d
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_wide/d/T_move_wide_6.java b/tools/vm-tests/src/dot/junit/opcodes/move_wide/d/T_move_wide_6.java
deleted file mode 100644
index bd5de04..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide/d/T_move_wide_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_wide/d/T_move_wide_7.d b/tools/vm-tests/src/dot/junit/opcodes/move_wide/d/T_move_wide_7.d
deleted file mode 100644
index 9324fef..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide/d/T_move_wide_7.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_wide_16/Test_move_wide_16.java b/tools/vm-tests/src/dot/junit/opcodes/move_wide_16/Test_move_wide_16.java
deleted file mode 100644
index a2b776d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide_16/Test_move_wide_16.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_1.d b/tools/vm-tests/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_1.d
deleted file mode 100644
index 282edb4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_1.d
+++ /dev/null
@@ -1,55 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_1.java b/tools/vm-tests/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_1.java
deleted file mode 100644
index 66b4da1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_2.d b/tools/vm-tests/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_2.d
deleted file mode 100644
index 57c7c93..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_2.d
+++ /dev/null
@@ -1,49 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_2.java b/tools/vm-tests/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_2.java
deleted file mode 100644
index e5f4966..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_3.d b/tools/vm-tests/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_3.d
deleted file mode 100644
index e1e0ac7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_3.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_4.d b/tools/vm-tests/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_4.d
deleted file mode 100644
index 3f12810..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_5.d b/tools/vm-tests/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_5.d
deleted file mode 100644
index 7e61df4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_5.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_6.d b/tools/vm-tests/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_6.d
deleted file mode 100644
index 2cea620..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_7.d b/tools/vm-tests/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_7.d
deleted file mode 100644
index 7826131..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_7.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_8.d b/tools/vm-tests/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_8.d
deleted file mode 100644
index c5e006d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_8.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_9.d b/tools/vm-tests/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_9.d
deleted file mode 100644
index aa8cdce..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_9.d
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_9.java b/tools/vm-tests/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_9.java
deleted file mode 100644
index f66146b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide_16/d/T_move_wide_16_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_wide_from16/Test_move_wide_from16.java b/tools/vm-tests/src/dot/junit/opcodes/move_wide_from16/Test_move_wide_from16.java
deleted file mode 100644
index 2434e92..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide_from16/Test_move_wide_from16.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_1.d b/tools/vm-tests/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_1.d
deleted file mode 100644
index 21aaca8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_1.d
+++ /dev/null
@@ -1,49 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_1.java b/tools/vm-tests/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_1.java
deleted file mode 100644
index 8dfcd57..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_2.d b/tools/vm-tests/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_2.d
deleted file mode 100644
index d2e6700..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_2.d
+++ /dev/null
@@ -1,39 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_2.java b/tools/vm-tests/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_2.java
deleted file mode 100644
index b320731..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_3.d b/tools/vm-tests/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_3.d
deleted file mode 100644
index 8f95101..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_3.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_4.d b/tools/vm-tests/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_4.d
deleted file mode 100644
index e5f282a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_5.d b/tools/vm-tests/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_5.d
deleted file mode 100644
index 21ec075..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_5.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_6.d b/tools/vm-tests/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_6.d
deleted file mode 100644
index 784e31a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_7.d b/tools/vm-tests/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_7.d
deleted file mode 100644
index 1790fe5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_7.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_8.d b/tools/vm-tests/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_8.d
deleted file mode 100644
index 80d80e9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/move_wide_from16/d/T_move_wide_from16_8.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_double/Test_mul_double.java b/tools/vm-tests/src/dot/junit/opcodes/mul_double/Test_mul_double.java
deleted file mode 100644
index 9a63412..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_double/Test_mul_double.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_double/d/T_mul_double_1.d b/tools/vm-tests/src/dot/junit/opcodes/mul_double/d/T_mul_double_1.d
deleted file mode 100644
index 8f7a9a1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_double/d/T_mul_double_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_double/d/T_mul_double_1.java b/tools/vm-tests/src/dot/junit/opcodes/mul_double/d/T_mul_double_1.java
deleted file mode 100644
index a70f250..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_double/d/T_mul_double_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_double/d/T_mul_double_2.d b/tools/vm-tests/src/dot/junit/opcodes/mul_double/d/T_mul_double_2.d
deleted file mode 100644
index 99dd815..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_double/d/T_mul_double_2.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_double/d/T_mul_double_3.d b/tools/vm-tests/src/dot/junit/opcodes/mul_double/d/T_mul_double_3.d
deleted file mode 100644
index 54a26c2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_double/d/T_mul_double_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_double/d/T_mul_double_4.d b/tools/vm-tests/src/dot/junit/opcodes/mul_double/d/T_mul_double_4.d
deleted file mode 100644
index 54df7a5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_double/d/T_mul_double_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_double/d/T_mul_double_4.java b/tools/vm-tests/src/dot/junit/opcodes/mul_double/d/T_mul_double_4.java
deleted file mode 100644
index a707538..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_double/d/T_mul_double_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_double/d/T_mul_double_5.d b/tools/vm-tests/src/dot/junit/opcodes/mul_double/d/T_mul_double_5.d
deleted file mode 100644
index d3d6ec3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_double/d/T_mul_double_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_double_2addr/Test_mul_double_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/mul_double_2addr/Test_mul_double_2addr.java
deleted file mode 100644
index 2637e18..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_double_2addr/Test_mul_double_2addr.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_1.d
deleted file mode 100644
index 373a854..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_1.java
deleted file mode 100644
index f5bdb4b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_2.d
deleted file mode 100644
index 05485d8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_2.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_3.d
deleted file mode 100644
index d981779..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_4.d
deleted file mode 100644
index 1654300..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_4.java b/tools/vm-tests/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_4.java
deleted file mode 100644
index 8a17e15..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_5.d
deleted file mode 100644
index ef36f48..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_double_2addr/d/T_mul_double_2addr_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_float/Test_mul_float.java b/tools/vm-tests/src/dot/junit/opcodes/mul_float/Test_mul_float.java
deleted file mode 100644
index 6359122..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_float/Test_mul_float.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_float/d/T_mul_float_1.d b/tools/vm-tests/src/dot/junit/opcodes/mul_float/d/T_mul_float_1.d
deleted file mode 100644
index 8be7048..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_float/d/T_mul_float_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_float/d/T_mul_float_1.java b/tools/vm-tests/src/dot/junit/opcodes/mul_float/d/T_mul_float_1.java
deleted file mode 100644
index 4010691..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_float/d/T_mul_float_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_float/d/T_mul_float_2.d b/tools/vm-tests/src/dot/junit/opcodes/mul_float/d/T_mul_float_2.d
deleted file mode 100644
index 2647599..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_float/d/T_mul_float_2.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_float/d/T_mul_float_3.d b/tools/vm-tests/src/dot/junit/opcodes/mul_float/d/T_mul_float_3.d
deleted file mode 100644
index 13a31f3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_float/d/T_mul_float_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_float/d/T_mul_float_4.d b/tools/vm-tests/src/dot/junit/opcodes/mul_float/d/T_mul_float_4.d
deleted file mode 100644
index a92ef8f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_float/d/T_mul_float_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_float/d/T_mul_float_5.d b/tools/vm-tests/src/dot/junit/opcodes/mul_float/d/T_mul_float_5.d
deleted file mode 100644
index 9f99d59..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_float/d/T_mul_float_5.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/mul_float/d/T_mul_float_6.d b/tools/vm-tests/src/dot/junit/opcodes/mul_float/d/T_mul_float_6.d
deleted file mode 100644
index 7b3b61a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_float/d/T_mul_float_6.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/mul_float/d/T_mul_float_6.java b/tools/vm-tests/src/dot/junit/opcodes/mul_float/d/T_mul_float_6.java
deleted file mode 100644
index abccc0c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_float/d/T_mul_float_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_float_2addr/Test_mul_float_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/mul_float_2addr/Test_mul_float_2addr.java
deleted file mode 100644
index 0686a9b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_float_2addr/Test_mul_float_2addr.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_1.d
deleted file mode 100644
index 05faaba..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_1.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_1.java
deleted file mode 100644
index 1f6b647..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_2.d
deleted file mode 100644
index 11fef7b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_2.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_3.d
deleted file mode 100644
index 9d83fef..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_4.d
deleted file mode 100644
index eebb510..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_5.d
deleted file mode 100644
index 03a888b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_5.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_6.d b/tools/vm-tests/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_6.d
deleted file mode 100644
index 67cccbd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_6.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_6.java b/tools/vm-tests/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_6.java
deleted file mode 100644
index f580894..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_float_2addr/d/T_mul_float_2addr_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_int/Test_mul_int.java b/tools/vm-tests/src/dot/junit/opcodes/mul_int/Test_mul_int.java
deleted file mode 100644
index f9252c4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int/Test_mul_int.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_int/d/T_mul_int_1.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int/d/T_mul_int_1.d
deleted file mode 100644
index 3b4a63f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int/d/T_mul_int_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int/d/T_mul_int_1.java b/tools/vm-tests/src/dot/junit/opcodes/mul_int/d/T_mul_int_1.java
deleted file mode 100644
index 4ac3bea..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int/d/T_mul_int_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_int/d/T_mul_int_2.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int/d/T_mul_int_2.d
deleted file mode 100644
index ed71fa1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int/d/T_mul_int_2.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int/d/T_mul_int_3.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int/d/T_mul_int_3.d
deleted file mode 100644
index 059f7b4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int/d/T_mul_int_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int/d/T_mul_int_4.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int/d/T_mul_int_4.d
deleted file mode 100644
index 67c0e37..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int/d/T_mul_int_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int/d/T_mul_int_5.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int/d/T_mul_int_5.d
deleted file mode 100644
index 04be572..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int/d/T_mul_int_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int/d/T_mul_int_6.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int/d/T_mul_int_6.d
deleted file mode 100644
index e181e71..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int/d/T_mul_int_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int/d/T_mul_int_6.java b/tools/vm-tests/src/dot/junit/opcodes/mul_int/d/T_mul_int_6.java
deleted file mode 100644
index a4e6a07..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int/d/T_mul_int_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_int_2addr/Test_mul_int_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/mul_int_2addr/Test_mul_int_2addr.java
deleted file mode 100644
index 010896c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_2addr/Test_mul_int_2addr.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_1.d
deleted file mode 100644
index 86a6c9a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_1.java
deleted file mode 100644
index b4878b5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_2.d
deleted file mode 100644
index 744c214..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_3.d
deleted file mode 100644
index 8c14a36..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_3.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_4.d
deleted file mode 100644
index 64e0ba1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_5.d
deleted file mode 100644
index 9a22395..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_6.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_6.d
deleted file mode 100644
index c8bbcd2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_6.java b/tools/vm-tests/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_6.java
deleted file mode 100644
index 71f6655..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_2addr/d/T_mul_int_2addr_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_int_lit16/Test_mul_int_lit16.java b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/Test_mul_int_lit16.java
deleted file mode 100644
index d77dd0a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/Test_mul_int_lit16.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_1.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_1.d
deleted file mode 100644
index d7dd6f3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_1.java b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_1.java
deleted file mode 100644
index e4b1503..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_10.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_10.d
deleted file mode 100644
index 91c550c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_10.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_10.java b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_10.java
deleted file mode 100644
index 54d82de..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_10.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_2.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_2.d
deleted file mode 100644
index 200afbe..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_2.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_2.java b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_2.java
deleted file mode 100644
index 33fab36..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_3.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_3.d
deleted file mode 100644
index aed3dd4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_3.java b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_3.java
deleted file mode 100644
index 959ac8d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_4.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_4.d
deleted file mode 100644
index 532ce52..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_4.java b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_4.java
deleted file mode 100644
index e4abf30..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_5.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_5.d
deleted file mode 100644
index 0d4d3ea..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_5.java b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_5.java
deleted file mode 100644
index 4ca4f63..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_6.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_6.d
deleted file mode 100644
index a719ab3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_6.java b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_6.java
deleted file mode 100644
index d926570..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_7.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_7.d
deleted file mode 100644
index 511de2d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_7.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_7.java b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_7.java
deleted file mode 100644
index a891dd9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_8.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_8.d
deleted file mode 100644
index 288f649..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_8.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_8.java b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_8.java
deleted file mode 100644
index d639850..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_9.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_9.d
deleted file mode 100644
index e8d0737..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_9.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_9.java b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_9.java
deleted file mode 100644
index b7f8085..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit16/d/T_mul_int_lit16_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_int_lit8/Test_mul_int_lit8.java b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/Test_mul_int_lit8.java
deleted file mode 100644
index e2dae07..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/Test_mul_int_lit8.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_1.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_1.d
deleted file mode 100644
index 8aebfd4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_1.java b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_1.java
deleted file mode 100644
index dd87288..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_10.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_10.d
deleted file mode 100644
index 716726e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_10.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_10.java b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_10.java
deleted file mode 100644
index a50d3d1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_10.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_2.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_2.d
deleted file mode 100644
index c4d9174..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_2.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_2.java b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_2.java
deleted file mode 100644
index 97e30cb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_3.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_3.d
deleted file mode 100644
index fc70d45..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_3.java b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_3.java
deleted file mode 100644
index dc7352a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_4.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_4.d
deleted file mode 100644
index a9cf5e7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_4.java b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_4.java
deleted file mode 100644
index 4e395c7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_5.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_5.d
deleted file mode 100644
index 1e08af2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_5.java b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_5.java
deleted file mode 100644
index 1b7c65f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_6.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_6.d
deleted file mode 100644
index bfcfcc2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_6.java b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_6.java
deleted file mode 100644
index 6a723c2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_7.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_7.d
deleted file mode 100644
index fe88ffb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_7.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_7.java b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_7.java
deleted file mode 100644
index 34f5fde..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_8.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_8.d
deleted file mode 100644
index fc6ec8a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_8.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_8.java b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_8.java
deleted file mode 100644
index 8fb46ae..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_9.d b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_9.d
deleted file mode 100644
index 943b9ee..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_9.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_9.java b/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_9.java
deleted file mode 100644
index c7ebd3d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_int_lit8/d/T_mul_int_lit8_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_long/Test_mul_long.java b/tools/vm-tests/src/dot/junit/opcodes/mul_long/Test_mul_long.java
deleted file mode 100644
index 1abf57e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_long/Test_mul_long.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_long/d/T_mul_long_1.d b/tools/vm-tests/src/dot/junit/opcodes/mul_long/d/T_mul_long_1.d
deleted file mode 100644
index de4736d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_long/d/T_mul_long_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_long/d/T_mul_long_1.java b/tools/vm-tests/src/dot/junit/opcodes/mul_long/d/T_mul_long_1.java
deleted file mode 100644
index 5cb0074..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_long/d/T_mul_long_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_long/d/T_mul_long_2.d b/tools/vm-tests/src/dot/junit/opcodes/mul_long/d/T_mul_long_2.d
deleted file mode 100644
index 4e0d25c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_long/d/T_mul_long_2.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_long/d/T_mul_long_3.d b/tools/vm-tests/src/dot/junit/opcodes/mul_long/d/T_mul_long_3.d
deleted file mode 100644
index f2faf7d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_long/d/T_mul_long_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_long/d/T_mul_long_3.java b/tools/vm-tests/src/dot/junit/opcodes/mul_long/d/T_mul_long_3.java
deleted file mode 100644
index ab7743f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_long/d/T_mul_long_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_long/d/T_mul_long_4.d b/tools/vm-tests/src/dot/junit/opcodes/mul_long/d/T_mul_long_4.d
deleted file mode 100644
index bd62f75..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_long/d/T_mul_long_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_long/d/T_mul_long_5.d b/tools/vm-tests/src/dot/junit/opcodes/mul_long/d/T_mul_long_5.d
deleted file mode 100644
index 3d1d09e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_long/d/T_mul_long_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_long/d/T_mul_long_6.d b/tools/vm-tests/src/dot/junit/opcodes/mul_long/d/T_mul_long_6.d
deleted file mode 100644
index 656ec8c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_long/d/T_mul_long_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_long_2addr/Test_mul_long_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/mul_long_2addr/Test_mul_long_2addr.java
deleted file mode 100644
index 3996c60..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_long_2addr/Test_mul_long_2addr.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_1.d
deleted file mode 100644
index 1175bf4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_1.java
deleted file mode 100644
index 886761f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_2.d
deleted file mode 100644
index c044257..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_2.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_3.d
deleted file mode 100644
index 6735fe5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_3.java b/tools/vm-tests/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_3.java
deleted file mode 100644
index 122cf54..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_4.d
deleted file mode 100644
index e708710..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_5.d
deleted file mode 100644
index 365e8ca..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_6.d b/tools/vm-tests/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_6.d
deleted file mode 100644
index bd6d465..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/mul_long_2addr/d/T_mul_long_2addr_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/neg_double/Test_neg_double.java b/tools/vm-tests/src/dot/junit/opcodes/neg_double/Test_neg_double.java
deleted file mode 100644
index 53fe02b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_double/Test_neg_double.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/neg_double/d/T_neg_double_1.d b/tools/vm-tests/src/dot/junit/opcodes/neg_double/d/T_neg_double_1.d
deleted file mode 100644
index b094774..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_double/d/T_neg_double_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/neg_double/d/T_neg_double_1.java b/tools/vm-tests/src/dot/junit/opcodes/neg_double/d/T_neg_double_1.java
deleted file mode 100644
index dcf3da6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_double/d/T_neg_double_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/neg_double/d/T_neg_double_2.d b/tools/vm-tests/src/dot/junit/opcodes/neg_double/d/T_neg_double_2.d
deleted file mode 100644
index a99ecff..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_double/d/T_neg_double_2.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/neg_double/d/T_neg_double_3.d b/tools/vm-tests/src/dot/junit/opcodes/neg_double/d/T_neg_double_3.d
deleted file mode 100644
index 26d6715..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_double/d/T_neg_double_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/neg_double/d/T_neg_double_4.d b/tools/vm-tests/src/dot/junit/opcodes/neg_double/d/T_neg_double_4.d
deleted file mode 100644
index d7a51d5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_double/d/T_neg_double_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/neg_double/d/T_neg_double_4.java b/tools/vm-tests/src/dot/junit/opcodes/neg_double/d/T_neg_double_4.java
deleted file mode 100644
index d7507ae..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_double/d/T_neg_double_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/neg_double/d/T_neg_double_5.d b/tools/vm-tests/src/dot/junit/opcodes/neg_double/d/T_neg_double_5.d
deleted file mode 100644
index b8cbb4b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_double/d/T_neg_double_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/neg_double/d/T_neg_double_6.d b/tools/vm-tests/src/dot/junit/opcodes/neg_double/d/T_neg_double_6.d
deleted file mode 100644
index 33e252a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_double/d/T_neg_double_6.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/neg_float/Test_neg_float.java b/tools/vm-tests/src/dot/junit/opcodes/neg_float/Test_neg_float.java
deleted file mode 100644
index cfd7edf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_float/Test_neg_float.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/neg_float/d/T_neg_float_1.d b/tools/vm-tests/src/dot/junit/opcodes/neg_float/d/T_neg_float_1.d
deleted file mode 100644
index 3259f41..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_float/d/T_neg_float_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/neg_float/d/T_neg_float_1.java b/tools/vm-tests/src/dot/junit/opcodes/neg_float/d/T_neg_float_1.java
deleted file mode 100644
index 9709099..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_float/d/T_neg_float_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/neg_float/d/T_neg_float_2.d b/tools/vm-tests/src/dot/junit/opcodes/neg_float/d/T_neg_float_2.d
deleted file mode 100644
index 966cbe7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_float/d/T_neg_float_2.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/neg_float/d/T_neg_float_3.d b/tools/vm-tests/src/dot/junit/opcodes/neg_float/d/T_neg_float_3.d
deleted file mode 100644
index 6c6be2e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_float/d/T_neg_float_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/neg_float/d/T_neg_float_4.d b/tools/vm-tests/src/dot/junit/opcodes/neg_float/d/T_neg_float_4.d
deleted file mode 100644
index 3b9c963..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_float/d/T_neg_float_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/neg_float/d/T_neg_float_5.d b/tools/vm-tests/src/dot/junit/opcodes/neg_float/d/T_neg_float_5.d
deleted file mode 100644
index 7a391f4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_float/d/T_neg_float_5.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/neg_float/d/T_neg_float_6.d b/tools/vm-tests/src/dot/junit/opcodes/neg_float/d/T_neg_float_6.d
deleted file mode 100644
index 897725b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_float/d/T_neg_float_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/neg_float/d/T_neg_float_6.java b/tools/vm-tests/src/dot/junit/opcodes/neg_float/d/T_neg_float_6.java
deleted file mode 100644
index f597964..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_float/d/T_neg_float_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/neg_int/Test_neg_int.java b/tools/vm-tests/src/dot/junit/opcodes/neg_int/Test_neg_int.java
deleted file mode 100644
index 817e03a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_int/Test_neg_int.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/neg_int/d/T_neg_int_1.d b/tools/vm-tests/src/dot/junit/opcodes/neg_int/d/T_neg_int_1.d
deleted file mode 100644
index 0ff47de..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_int/d/T_neg_int_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/neg_int/d/T_neg_int_1.java b/tools/vm-tests/src/dot/junit/opcodes/neg_int/d/T_neg_int_1.java
deleted file mode 100644
index fc2a24b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_int/d/T_neg_int_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/neg_int/d/T_neg_int_2.d b/tools/vm-tests/src/dot/junit/opcodes/neg_int/d/T_neg_int_2.d
deleted file mode 100644
index f66368b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_int/d/T_neg_int_2.d
+++ /dev/null
@@ -1,29 +0,0 @@
-.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/src/dot/junit/opcodes/neg_int/d/T_neg_int_2.java b/tools/vm-tests/src/dot/junit/opcodes/neg_int/d/T_neg_int_2.java
deleted file mode 100644
index f37b31d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_int/d/T_neg_int_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/neg_int/d/T_neg_int_3.d b/tools/vm-tests/src/dot/junit/opcodes/neg_int/d/T_neg_int_3.d
deleted file mode 100644
index 90c16f9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_int/d/T_neg_int_3.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/neg_int/d/T_neg_int_4.d b/tools/vm-tests/src/dot/junit/opcodes/neg_int/d/T_neg_int_4.d
deleted file mode 100644
index 4d2c14b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_int/d/T_neg_int_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/neg_int/d/T_neg_int_5.d b/tools/vm-tests/src/dot/junit/opcodes/neg_int/d/T_neg_int_5.d
deleted file mode 100644
index aa67eff..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_int/d/T_neg_int_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/neg_int/d/T_neg_int_6.d b/tools/vm-tests/src/dot/junit/opcodes/neg_int/d/T_neg_int_6.d
deleted file mode 100644
index af24f55..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_int/d/T_neg_int_6.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/neg_int/d/T_neg_int_7.d b/tools/vm-tests/src/dot/junit/opcodes/neg_int/d/T_neg_int_7.d
deleted file mode 100644
index b1fc23d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_int/d/T_neg_int_7.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/neg_int/d/T_neg_int_7.java b/tools/vm-tests/src/dot/junit/opcodes/neg_int/d/T_neg_int_7.java
deleted file mode 100644
index 24e130c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_int/d/T_neg_int_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/neg_long/Test_neg_long.java b/tools/vm-tests/src/dot/junit/opcodes/neg_long/Test_neg_long.java
deleted file mode 100644
index f731c64..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_long/Test_neg_long.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/neg_long/d/T_neg_long_1.d b/tools/vm-tests/src/dot/junit/opcodes/neg_long/d/T_neg_long_1.d
deleted file mode 100644
index 7973f10..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_long/d/T_neg_long_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/neg_long/d/T_neg_long_1.java b/tools/vm-tests/src/dot/junit/opcodes/neg_long/d/T_neg_long_1.java
deleted file mode 100644
index dea3c8c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_long/d/T_neg_long_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/neg_long/d/T_neg_long_2.d b/tools/vm-tests/src/dot/junit/opcodes/neg_long/d/T_neg_long_2.d
deleted file mode 100644
index 03891af..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_long/d/T_neg_long_2.d
+++ /dev/null
@@ -1,33 +0,0 @@
-.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/src/dot/junit/opcodes/neg_long/d/T_neg_long_2.java b/tools/vm-tests/src/dot/junit/opcodes/neg_long/d/T_neg_long_2.java
deleted file mode 100644
index dcf67e1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_long/d/T_neg_long_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/neg_long/d/T_neg_long_3.d b/tools/vm-tests/src/dot/junit/opcodes/neg_long/d/T_neg_long_3.d
deleted file mode 100644
index ab92394..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_long/d/T_neg_long_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/neg_long/d/T_neg_long_4.d b/tools/vm-tests/src/dot/junit/opcodes/neg_long/d/T_neg_long_4.d
deleted file mode 100644
index 98fe8da..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_long/d/T_neg_long_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/neg_long/d/T_neg_long_4.java b/tools/vm-tests/src/dot/junit/opcodes/neg_long/d/T_neg_long_4.java
deleted file mode 100644
index 20631a2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_long/d/T_neg_long_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/neg_long/d/T_neg_long_5.d b/tools/vm-tests/src/dot/junit/opcodes/neg_long/d/T_neg_long_5.d
deleted file mode 100644
index bd3a364..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_long/d/T_neg_long_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/neg_long/d/T_neg_long_6.d b/tools/vm-tests/src/dot/junit/opcodes/neg_long/d/T_neg_long_6.d
deleted file mode 100644
index a936135..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_long/d/T_neg_long_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/neg_long/d/T_neg_long_7.d b/tools/vm-tests/src/dot/junit/opcodes/neg_long/d/T_neg_long_7.d
deleted file mode 100644
index 66af380..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/neg_long/d/T_neg_long_7.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/new_array/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/new_array/TestStubs.java
deleted file mode 100644
index 587b4d1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_array/TestStubs.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/new_array/Test_new_array.java b/tools/vm-tests/src/dot/junit/opcodes/new_array/Test_new_array.java
deleted file mode 100644
index 44aedaa..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_array/Test_new_array.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/new_array/d/T_new_array_1.d b/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_1.d
deleted file mode 100644
index e681faf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/new_array/d/T_new_array_1.java b/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_1.java
deleted file mode 100644
index 7455164..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/new_array/d/T_new_array_10.d b/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_10.d
deleted file mode 100644
index 4c99085..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_10.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/new_array/d/T_new_array_10.java b/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_10.java
deleted file mode 100644
index 81b7a7e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_10.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/new_array/d/T_new_array_11.d b/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_11.d
deleted file mode 100644
index 3f0b3da..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_11.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/new_array/d/T_new_array_11.java b/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_11.java
deleted file mode 100644
index e37e1ec..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_11.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/new_array/d/T_new_array_2.d b/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_2.d
deleted file mode 100644
index de7b8dd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/new_array/d/T_new_array_2.java b/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_2.java
deleted file mode 100644
index 27103b1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/new_array/d/T_new_array_3.d b/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_3.d
deleted file mode 100644
index d560ca6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_3.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/new_array/d/T_new_array_3.java b/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_3.java
deleted file mode 100644
index 47a28c3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/new_array/d/T_new_array_4.d b/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_4.d
deleted file mode 100644
index 2f75ff1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/new_array/d/T_new_array_5.d b/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_5.d
deleted file mode 100644
index 9ce7d3e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_5.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/new_array/d/T_new_array_6.d b/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_6.d
deleted file mode 100644
index 885beba..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/new_array/d/T_new_array_6.dfh b/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_6.dfh
deleted file mode 100644
index 0794b49..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_6.dfh
+++ /dev/null
@@ -1,270 +0,0 @@
-// 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/src/dot/junit/opcodes/new_array/d/T_new_array_7.d b/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_7.d
deleted file mode 100644
index f6f2588..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_7.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/new_array/d/T_new_array_8.d b/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_8.d
deleted file mode 100644
index a221fc2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_8.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/new_array/d/T_new_array_9.d b/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_9.d
deleted file mode 100644
index 914322a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_array/d/T_new_array_9.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/new_instance/TTestClass.java b/tools/vm-tests/src/dot/junit/opcodes/new_instance/TTestClass.java
deleted file mode 100644
index 679e665..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_instance/TTestClass.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/new_instance/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/new_instance/TestStubs.java
deleted file mode 100644
index ca22946..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_instance/TestStubs.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/new_instance/Test_new_instance.java b/tools/vm-tests/src/dot/junit/opcodes/new_instance/Test_new_instance.java
deleted file mode 100644
index d994f65..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_instance/Test_new_instance.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/new_instance/d/T_new_instance_1.d b/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_1.d
deleted file mode 100644
index 0cff87a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_1.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/new_instance/d/T_new_instance_1.java b/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_1.java
deleted file mode 100644
index c8f4878..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/new_instance/d/T_new_instance_10.d b/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_10.d
deleted file mode 100644
index cd9096d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_10.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/new_instance/d/T_new_instance_11.d b/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_11.d
deleted file mode 100644
index 75fb804..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_11.d
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/new_instance/d/T_new_instance_12.d b/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_12.d
deleted file mode 100644
index e4b025e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_12.d
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/new_instance/d/T_new_instance_2.d b/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_2.d
deleted file mode 100644
index 2a8eefb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_2.d
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/new_instance/d/T_new_instance_3.d b/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_3.d
deleted file mode 100644
index f6cd6fe..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_3.d
+++ /dev/null
@@ -1,49 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/new_instance/d/T_new_instance_3.java b/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_3.java
deleted file mode 100644
index dd8bb15..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_3.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/new_instance/d/T_new_instance_4.d b/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_4.d
deleted file mode 100644
index a92c597..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_4.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/new_instance/d/T_new_instance_4.java b/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_4.java
deleted file mode 100644
index 9ed269f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/new_instance/d/T_new_instance_5.d b/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_5.d
deleted file mode 100644
index 4651f6a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_5.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/new_instance/d/T_new_instance_5.java b/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_5.java
deleted file mode 100644
index 7c6b0c0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/new_instance/d/T_new_instance_6.d b/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_6.d
deleted file mode 100644
index 0565aea..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_6.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/new_instance/d/T_new_instance_6.dfh b/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_6.dfh
deleted file mode 100644
index 91ac7e5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_6.dfh
+++ /dev/null
@@ -1,279 +0,0 @@
-// 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/src/dot/junit/opcodes/new_instance/d/T_new_instance_7.d b/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_7.d
deleted file mode 100644
index f2e7fcf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_7.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/new_instance/d/T_new_instance_7.java b/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_7.java
deleted file mode 100644
index f93c886..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/new_instance/d/T_new_instance_8.d b/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_8.d
deleted file mode 100644
index f474fe9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_8.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/new_instance/d/T_new_instance_8.java b/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_8.java
deleted file mode 100644
index 1ca9c38..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/new_instance/d/T_new_instance_9.d b/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_9.d
deleted file mode 100644
index 7af9f46..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_9.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/new_instance/d/T_new_instance_9.java b/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_9.java
deleted file mode 100644
index 9f1d2bf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/T_new_instance_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/new_instance/d/TestAbstractClass.d b/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/TestAbstractClass.d
deleted file mode 100644
index ea321c4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/TestAbstractClass.d
+++ /dev/null
@@ -1,22 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/new_instance/d/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/TestStubs.java
deleted file mode 100644
index cb28c6a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/new_instance/d/TestStubs.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/nop/Test_nop.java b/tools/vm-tests/src/dot/junit/opcodes/nop/Test_nop.java
deleted file mode 100644
index 9044e8c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/nop/Test_nop.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/nop/d/T_nop_1.d b/tools/vm-tests/src/dot/junit/opcodes/nop/d/T_nop_1.d
deleted file mode 100644
index 59a85e1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/nop/d/T_nop_1.d
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/nop/d/T_nop_1.java b/tools/vm-tests/src/dot/junit/opcodes/nop/d/T_nop_1.java
deleted file mode 100644
index ec16b22..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/nop/d/T_nop_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/not_int/Test_not_int.java b/tools/vm-tests/src/dot/junit/opcodes/not_int/Test_not_int.java
deleted file mode 100644
index 0960e32..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/not_int/Test_not_int.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/not_int/d/T_not_int_1.d b/tools/vm-tests/src/dot/junit/opcodes/not_int/d/T_not_int_1.d
deleted file mode 100644
index 2b04225..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/not_int/d/T_not_int_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/not_int/d/T_not_int_1.java b/tools/vm-tests/src/dot/junit/opcodes/not_int/d/T_not_int_1.java
deleted file mode 100644
index b8ac929..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/not_int/d/T_not_int_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/not_int/d/T_not_int_2.d b/tools/vm-tests/src/dot/junit/opcodes/not_int/d/T_not_int_2.d
deleted file mode 100644
index 3e1ff4a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/not_int/d/T_not_int_2.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/not_int/d/T_not_int_2.java b/tools/vm-tests/src/dot/junit/opcodes/not_int/d/T_not_int_2.java
deleted file mode 100644
index 679acb7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/not_int/d/T_not_int_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/not_int/d/T_not_int_3.d b/tools/vm-tests/src/dot/junit/opcodes/not_int/d/T_not_int_3.d
deleted file mode 100644
index a42823e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/not_int/d/T_not_int_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/not_int/d/T_not_int_4.d b/tools/vm-tests/src/dot/junit/opcodes/not_int/d/T_not_int_4.d
deleted file mode 100644
index 1182ead..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/not_int/d/T_not_int_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/not_int/d/T_not_int_5.d b/tools/vm-tests/src/dot/junit/opcodes/not_int/d/T_not_int_5.d
deleted file mode 100644
index a144392..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/not_int/d/T_not_int_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/not_int/d/T_not_int_6.d b/tools/vm-tests/src/dot/junit/opcodes/not_int/d/T_not_int_6.d
deleted file mode 100644
index c22438f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/not_int/d/T_not_int_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/not_long/Test_not_long.java b/tools/vm-tests/src/dot/junit/opcodes/not_long/Test_not_long.java
deleted file mode 100644
index a40cdd1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/not_long/Test_not_long.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/not_long/d/T_not_long_1.d b/tools/vm-tests/src/dot/junit/opcodes/not_long/d/T_not_long_1.d
deleted file mode 100644
index 9d27053..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/not_long/d/T_not_long_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/not_long/d/T_not_long_1.java b/tools/vm-tests/src/dot/junit/opcodes/not_long/d/T_not_long_1.java
deleted file mode 100644
index 535d69d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/not_long/d/T_not_long_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/not_long/d/T_not_long_2.d b/tools/vm-tests/src/dot/junit/opcodes/not_long/d/T_not_long_2.d
deleted file mode 100644
index cd253a7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/not_long/d/T_not_long_2.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/not_long/d/T_not_long_2.java b/tools/vm-tests/src/dot/junit/opcodes/not_long/d/T_not_long_2.java
deleted file mode 100644
index 9f93955..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/not_long/d/T_not_long_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/not_long/d/T_not_long_3.d b/tools/vm-tests/src/dot/junit/opcodes/not_long/d/T_not_long_3.d
deleted file mode 100644
index b9eda02..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/not_long/d/T_not_long_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/not_long/d/T_not_long_4.d b/tools/vm-tests/src/dot/junit/opcodes/not_long/d/T_not_long_4.d
deleted file mode 100644
index 3ecd0f1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/not_long/d/T_not_long_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/not_long/d/T_not_long_5.d b/tools/vm-tests/src/dot/junit/opcodes/not_long/d/T_not_long_5.d
deleted file mode 100644
index 31c1dfc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/not_long/d/T_not_long_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/not_long/d/T_not_long_6.d b/tools/vm-tests/src/dot/junit/opcodes/not_long/d/T_not_long_6.d
deleted file mode 100644
index 4d511df..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/not_long/d/T_not_long_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/opc_const/Test_opc_const.java b/tools/vm-tests/src/dot/junit/opcodes/opc_const/Test_opc_const.java
deleted file mode 100644
index aa19e6c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_const/Test_opc_const.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/opc_const/d/T_opc_const_1.d b/tools/vm-tests/src/dot/junit/opcodes/opc_const/d/T_opc_const_1.d
deleted file mode 100644
index 8246f1b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_const/d/T_opc_const_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/opc_const/d/T_opc_const_1.java b/tools/vm-tests/src/dot/junit/opcodes/opc_const/d/T_opc_const_1.java
deleted file mode 100644
index 1bf4f0f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_const/d/T_opc_const_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/opc_const/d/T_opc_const_2.d b/tools/vm-tests/src/dot/junit/opcodes/opc_const/d/T_opc_const_2.d
deleted file mode 100644
index d651fe9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_const/d/T_opc_const_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/opc_const/d/T_opc_const_2.java b/tools/vm-tests/src/dot/junit/opcodes/opc_const/d/T_opc_const_2.java
deleted file mode 100644
index 07cd52a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_const/d/T_opc_const_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/opc_const/d/T_opc_const_3.d b/tools/vm-tests/src/dot/junit/opcodes/opc_const/d/T_opc_const_3.d
deleted file mode 100644
index d0065db..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_const/d/T_opc_const_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/opc_const/d/T_opc_const_4.d b/tools/vm-tests/src/dot/junit/opcodes/opc_const/d/T_opc_const_4.d
deleted file mode 100644
index f2d5697..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_const/d/T_opc_const_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/opc_goto/Test_opc_goto.java b/tools/vm-tests/src/dot/junit/opcodes/opc_goto/Test_opc_goto.java
deleted file mode 100644
index a3558fe..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_goto/Test_opc_goto.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_1.d b/tools/vm-tests/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_1.d
deleted file mode 100644
index e9b75ae..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_1.d
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_1.java b/tools/vm-tests/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_1.java
deleted file mode 100644
index 30c4e74..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_1.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_2.d b/tools/vm-tests/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_2.d
deleted file mode 100644
index 8cb3602..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_2.dfh b/tools/vm-tests/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_2.dfh
deleted file mode 100644
index 3917c98..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_2.dfh
+++ /dev/null
@@ -1,262 +0,0 @@
-// 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/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_3.d b/tools/vm-tests/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_3.d
deleted file mode 100644
index 8edcca6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_3.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_3.dfh b/tools/vm-tests/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_3.dfh
deleted file mode 100644
index 9da5505..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_3.dfh
+++ /dev/null
@@ -1,262 +0,0 @@
-// 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/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_4.d b/tools/vm-tests/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_4.d
deleted file mode 100644
index 6c29f65..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_4.dfh b/tools/vm-tests/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_4.dfh
deleted file mode 100644
index 5666601..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_goto/d/T_opc_goto_4.dfh
+++ /dev/null
@@ -1,262 +0,0 @@
-// 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/src/dot/junit/opcodes/opc_return/Test_opc_return.java b/tools/vm-tests/src/dot/junit/opcodes/opc_return/Test_opc_return.java
deleted file mode 100644
index 2fe8323..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_return/Test_opc_return.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/opc_return/d/T_opc_return_1.d b/tools/vm-tests/src/dot/junit/opcodes/opc_return/d/T_opc_return_1.d
deleted file mode 100644
index 29ae5bd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_return/d/T_opc_return_1.d
+++ /dev/null
@@ -1,70 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/opc_return/d/T_opc_return_1.java b/tools/vm-tests/src/dot/junit/opcodes/opc_return/d/T_opc_return_1.java
deleted file mode 100644
index 2f5029d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_return/d/T_opc_return_1.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/opc_return/d/T_opc_return_3.d b/tools/vm-tests/src/dot/junit/opcodes/opc_return/d/T_opc_return_3.d
deleted file mode 100644
index 2410da3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_return/d/T_opc_return_3.d
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/opc_return/d/T_opc_return_3.java b/tools/vm-tests/src/dot/junit/opcodes/opc_return/d/T_opc_return_3.java
deleted file mode 100644
index 6b93391..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_return/d/T_opc_return_3.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/opc_return/d/T_opc_return_5.d b/tools/vm-tests/src/dot/junit/opcodes/opc_return/d/T_opc_return_5.d
deleted file mode 100644
index 884ce2d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_return/d/T_opc_return_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/opc_return/d/T_opc_return_6.d b/tools/vm-tests/src/dot/junit/opcodes/opc_return/d/T_opc_return_6.d
deleted file mode 100644
index c19f760..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_return/d/T_opc_return_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/opc_return/d/T_opc_return_7.d b/tools/vm-tests/src/dot/junit/opcodes/opc_return/d/T_opc_return_7.d
deleted file mode 100644
index cec1f9c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_return/d/T_opc_return_7.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/opc_return/d/T_opc_return_8.d b/tools/vm-tests/src/dot/junit/opcodes/opc_return/d/T_opc_return_8.d
deleted file mode 100644
index 1ca6832..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_return/d/T_opc_return_8.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/opc_throw/Test_opc_throw.java b/tools/vm-tests/src/dot/junit/opcodes/opc_throw/Test_opc_throw.java
deleted file mode 100644
index 5055336..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_throw/Test_opc_throw.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_1.d b/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_1.d
deleted file mode 100644
index 90a4a03..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_1.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_1.java b/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_1.java
deleted file mode 100644
index 6aa25db..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_10.d b/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_10.d
deleted file mode 100644
index c3194bb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_10.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_10.java b/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_10.java
deleted file mode 100644
index b57a68c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_10.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_12.d b/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_12.d
deleted file mode 100644
index e096f4c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_12.d
+++ /dev/null
@@ -1,53 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_12.java b/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_12.java
deleted file mode 100644
index 50ef212..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_12.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_2.d b/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_2.d
deleted file mode 100644
index 95c3657..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_2.java b/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_2.java
deleted file mode 100644
index df4c62d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_3.d b/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_3.d
deleted file mode 100644
index 7ef732a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_3.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_4.d b/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_4.d
deleted file mode 100644
index ab5d803..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_4.java b/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_4.java
deleted file mode 100644
index 89c576d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_5.d b/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_5.d
deleted file mode 100644
index 4e23269..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_5.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_5.java b/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_5.java
deleted file mode 100644
index 748e08c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_6.d b/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_6.d
deleted file mode 100644
index 51ca304..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_6.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_7.d b/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_7.d
deleted file mode 100644
index bf85401..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_7.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_8.d b/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_8.d
deleted file mode 100644
index 8b91411..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_8.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_8.java b/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_8.java
deleted file mode 100644
index 30dc98a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_9.java b/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_9.java
deleted file mode 100644
index bd173cc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_int/Test_or_int.java b/tools/vm-tests/src/dot/junit/opcodes/or_int/Test_or_int.java
deleted file mode 100644
index e2ebcbf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int/Test_or_int.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_int/d/T_or_int_1.d b/tools/vm-tests/src/dot/junit/opcodes/or_int/d/T_or_int_1.d
deleted file mode 100644
index bac2513..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int/d/T_or_int_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_int/d/T_or_int_1.java b/tools/vm-tests/src/dot/junit/opcodes/or_int/d/T_or_int_1.java
deleted file mode 100644
index 36da158..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int/d/T_or_int_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_int/d/T_or_int_2.d b/tools/vm-tests/src/dot/junit/opcodes/or_int/d/T_or_int_2.d
deleted file mode 100644
index 9afca45..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int/d/T_or_int_2.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_int/d/T_or_int_3.d b/tools/vm-tests/src/dot/junit/opcodes/or_int/d/T_or_int_3.d
deleted file mode 100644
index cc2a413..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int/d/T_or_int_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_int/d/T_or_int_4.d b/tools/vm-tests/src/dot/junit/opcodes/or_int/d/T_or_int_4.d
deleted file mode 100644
index f47f082..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int/d/T_or_int_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_int/d/T_or_int_5.d b/tools/vm-tests/src/dot/junit/opcodes/or_int/d/T_or_int_5.d
deleted file mode 100644
index 65aee2f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int/d/T_or_int_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_int/d/T_or_int_6.d b/tools/vm-tests/src/dot/junit/opcodes/or_int/d/T_or_int_6.d
deleted file mode 100644
index 5543c18..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int/d/T_or_int_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_int/d/T_or_int_6.java b/tools/vm-tests/src/dot/junit/opcodes/or_int/d/T_or_int_6.java
deleted file mode 100644
index 9450467..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int/d/T_or_int_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_int_2addr/Test_or_int_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/or_int_2addr/Test_or_int_2addr.java
deleted file mode 100644
index 1278e42..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_2addr/Test_or_int_2addr.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_1.d
deleted file mode 100644
index c1d6357..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_1.java
deleted file mode 100644
index d802576..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_2.d
deleted file mode 100644
index 0fe271f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_2.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_3.d
deleted file mode 100644
index f7b8de4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_4.d
deleted file mode 100644
index c29c45a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_5.d
deleted file mode 100644
index 55c9544..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_6.d b/tools/vm-tests/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_6.d
deleted file mode 100644
index 2eb863f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_6.java b/tools/vm-tests/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_6.java
deleted file mode 100644
index 271e8ef..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_2addr/d/T_or_int_2addr_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_int_lit16/Test_or_int_lit16.java b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/Test_or_int_lit16.java
deleted file mode 100644
index 0595a7f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/Test_or_int_lit16.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_1.d b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_1.d
deleted file mode 100644
index 2750eb2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_1.java b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_1.java
deleted file mode 100644
index b9c94bc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_1.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_2.d b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_2.d
deleted file mode 100644
index bbddaa9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_2.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_2.java b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_2.java
deleted file mode 100644
index b87fd5b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_2.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_3.d b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_3.d
deleted file mode 100644
index ee50f62..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_3.java b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_3.java
deleted file mode 100644
index bddbf13..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_3.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_4.d b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_4.d
deleted file mode 100644
index 2bc0910..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_4.java b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_4.java
deleted file mode 100644
index fe01a61..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_4.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_5.d b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_5.d
deleted file mode 100644
index a227848..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_5.java b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_5.java
deleted file mode 100644
index f94b3aa..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_6.d b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_6.d
deleted file mode 100644
index 539491a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_6.java b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_6.java
deleted file mode 100644
index 78c7732..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_6.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_7.d b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_7.d
deleted file mode 100644
index 1e28c75..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_7.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_7.java b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_7.java
deleted file mode 100644
index 784592a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_7.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_8.d b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_8.d
deleted file mode 100644
index 42150a1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_8.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_8.java b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_8.java
deleted file mode 100644
index 0f65388..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_8.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_9.d b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_9.d
deleted file mode 100644
index a810f2d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_9.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_9.java b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_9.java
deleted file mode 100644
index 96c28ae..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit16/d/T_or_int_lit16_9.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_int_lit8/Test_or_int_lit8.java b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/Test_or_int_lit8.java
deleted file mode 100644
index a9b697c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/Test_or_int_lit8.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_1.d b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_1.d
deleted file mode 100644
index 71967f6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_1.java b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_1.java
deleted file mode 100644
index eaedd28..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_1.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_2.d b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_2.d
deleted file mode 100644
index 44143ff..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_2.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_2.java b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_2.java
deleted file mode 100644
index 3a93f0e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_2.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_3.d b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_3.d
deleted file mode 100644
index 9039138..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_3.java b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_3.java
deleted file mode 100644
index 0c93d21..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_3.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_4.d b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_4.d
deleted file mode 100644
index 6e07519..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_4.java b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_4.java
deleted file mode 100644
index 83c991b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_4.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_5.d b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_5.d
deleted file mode 100644
index c765b57..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_5.java b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_5.java
deleted file mode 100644
index 8cc8560..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_6.d b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_6.d
deleted file mode 100644
index 3a70209..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_6.java b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_6.java
deleted file mode 100644
index 5f9478b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_6.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_7.d b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_7.d
deleted file mode 100644
index 8040a0e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_7.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_7.java b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_7.java
deleted file mode 100644
index 578692d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_7.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_8.d b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_8.d
deleted file mode 100644
index e0b4801..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_8.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_8.java b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_8.java
deleted file mode 100644
index a00cb27..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_8.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_9.d b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_9.d
deleted file mode 100644
index 7e44fec..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_9.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_9.java b/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_9.java
deleted file mode 100644
index 1a67d00..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_int_lit8/d/T_or_int_lit8_9.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_long/Test_or_long.java b/tools/vm-tests/src/dot/junit/opcodes/or_long/Test_or_long.java
deleted file mode 100644
index 87c351e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_long/Test_or_long.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_long/d/T_or_long_1.d b/tools/vm-tests/src/dot/junit/opcodes/or_long/d/T_or_long_1.d
deleted file mode 100644
index 6bc5ef8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_long/d/T_or_long_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_long/d/T_or_long_1.java b/tools/vm-tests/src/dot/junit/opcodes/or_long/d/T_or_long_1.java
deleted file mode 100644
index 0e565cc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_long/d/T_or_long_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_long/d/T_or_long_2.d b/tools/vm-tests/src/dot/junit/opcodes/or_long/d/T_or_long_2.d
deleted file mode 100644
index b33694e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_long/d/T_or_long_2.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_long/d/T_or_long_3.d b/tools/vm-tests/src/dot/junit/opcodes/or_long/d/T_or_long_3.d
deleted file mode 100644
index f85ee63..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_long/d/T_or_long_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_long/d/T_or_long_3.java b/tools/vm-tests/src/dot/junit/opcodes/or_long/d/T_or_long_3.java
deleted file mode 100644
index 2a86c48..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_long/d/T_or_long_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_long/d/T_or_long_4.d b/tools/vm-tests/src/dot/junit/opcodes/or_long/d/T_or_long_4.d
deleted file mode 100644
index 89337b0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_long/d/T_or_long_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_long/d/T_or_long_5.d b/tools/vm-tests/src/dot/junit/opcodes/or_long/d/T_or_long_5.d
deleted file mode 100644
index 91fbc4d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_long/d/T_or_long_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_long/d/T_or_long_6.d b/tools/vm-tests/src/dot/junit/opcodes/or_long/d/T_or_long_6.d
deleted file mode 100644
index ee5c07a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_long/d/T_or_long_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_long_2addr/Test_or_long_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/or_long_2addr/Test_or_long_2addr.java
deleted file mode 100644
index 16e34b0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_long_2addr/Test_or_long_2addr.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_1.d
deleted file mode 100644
index a7c4859..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_1.java
deleted file mode 100644
index c82fc8a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_2.d
deleted file mode 100644
index f7db657..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_2.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_3.d
deleted file mode 100644
index 5604162..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_3.java b/tools/vm-tests/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_3.java
deleted file mode 100644
index 98c77b5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_4.d
deleted file mode 100644
index a13b59f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_5.d
deleted file mode 100644
index 7d7667d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_6.d b/tools/vm-tests/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_6.d
deleted file mode 100644
index 65d1c7b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/or_long_2addr/d/T_or_long_2addr_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/packed_switch/Test_packed_switch.java b/tools/vm-tests/src/dot/junit/opcodes/packed_switch/Test_packed_switch.java
deleted file mode 100644
index 780a490..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/packed_switch/Test_packed_switch.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_1.d b/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_1.d
deleted file mode 100644
index bd692e7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_1.d
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_1.java b/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_1.java
deleted file mode 100644
index 4c56e14..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_1.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_11.d b/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_11.d
deleted file mode 100644
index d1d2d03..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_11.d
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_11.dfh b/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_11.dfh
deleted file mode 100644
index 451465e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_11.dfh
+++ /dev/null
@@ -1,272 +0,0 @@
-// 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/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_11.java b/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_11.java
deleted file mode 100644
index 3565f3a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_11.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_12.d b/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_12.d
deleted file mode 100644
index 58afb0b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_12.d
+++ /dev/null
@@ -1,48 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_13.d b/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_13.d
deleted file mode 100644
index 2e7471b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_13.d
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_13.dfh b/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_13.dfh
deleted file mode 100644
index 4bfcca7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_13.dfh
+++ /dev/null
@@ -1,276 +0,0 @@
-// 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/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_2.d b/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_2.d
deleted file mode 100644
index a356eb3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_2.d
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_2.java b/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_2.java
deleted file mode 100644
index 977aea7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_2.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_3.d b/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_3.d
deleted file mode 100644
index 79e9e8d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_3.d
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_4.d b/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_4.d
deleted file mode 100644
index 1c3d42b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_4.d
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_5.d b/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_5.d
deleted file mode 100644
index c648fbb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_5.d
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_6.d b/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_6.d
deleted file mode 100644
index 9a18602..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_6.d
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_7.d b/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_7.d
deleted file mode 100644
index ebf9766..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_7.d
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_7.dfh b/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_7.dfh
deleted file mode 100644
index d30068e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_7.dfh
+++ /dev/null
@@ -1,274 +0,0 @@
-// 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/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_7.java b/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_7.java
deleted file mode 100644
index 53e1806..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_7.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_8.d b/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_8.d
deleted file mode 100644
index b22771c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_8.d
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_8.dfh b/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_8.dfh
deleted file mode 100644
index 71189f2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_8.dfh
+++ /dev/null
@@ -1,276 +0,0 @@
-// 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/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_9.d b/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_9.d
deleted file mode 100644
index 217a917..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_9.d
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_9.dfh b/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_9.dfh
deleted file mode 100644
index f499745..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/packed_switch/d/T_packed_switch_9.dfh
+++ /dev/null
@@ -1,274 +0,0 @@
-// 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/src/dot/junit/opcodes/rem_double/Test_rem_double.java b/tools/vm-tests/src/dot/junit/opcodes/rem_double/Test_rem_double.java
deleted file mode 100644
index bd540d8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_double/Test_rem_double.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_double/d/T_rem_double_1.d b/tools/vm-tests/src/dot/junit/opcodes/rem_double/d/T_rem_double_1.d
deleted file mode 100644
index 2585be4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_double/d/T_rem_double_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_double/d/T_rem_double_1.java b/tools/vm-tests/src/dot/junit/opcodes/rem_double/d/T_rem_double_1.java
deleted file mode 100644
index 11f42f0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_double/d/T_rem_double_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_double/d/T_rem_double_2.d b/tools/vm-tests/src/dot/junit/opcodes/rem_double/d/T_rem_double_2.d
deleted file mode 100644
index bacfdfd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_double/d/T_rem_double_2.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_double/d/T_rem_double_3.d b/tools/vm-tests/src/dot/junit/opcodes/rem_double/d/T_rem_double_3.d
deleted file mode 100644
index 87ce2da..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_double/d/T_rem_double_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_double/d/T_rem_double_4.d b/tools/vm-tests/src/dot/junit/opcodes/rem_double/d/T_rem_double_4.d
deleted file mode 100644
index b917916..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_double/d/T_rem_double_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_double/d/T_rem_double_4.java b/tools/vm-tests/src/dot/junit/opcodes/rem_double/d/T_rem_double_4.java
deleted file mode 100644
index 52b842d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_double/d/T_rem_double_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_double/d/T_rem_double_5.d b/tools/vm-tests/src/dot/junit/opcodes/rem_double/d/T_rem_double_5.d
deleted file mode 100644
index 6a2a11a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_double/d/T_rem_double_5.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/rem_double/d/T_rem_double_6.d b/tools/vm-tests/src/dot/junit/opcodes/rem_double/d/T_rem_double_6.d
deleted file mode 100644
index 5cb0397..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_double/d/T_rem_double_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_double_2addr/Test_rem_double_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/rem_double_2addr/Test_rem_double_2addr.java
deleted file mode 100644
index da7b741..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_double_2addr/Test_rem_double_2addr.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_1.d
deleted file mode 100644
index 898b7db..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_1.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_1.java
deleted file mode 100644
index bf60eb6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_2.d
deleted file mode 100644
index 923864f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_2.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_3.d
deleted file mode 100644
index 5913c80..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_3.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_4.d
deleted file mode 100644
index a146daf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_4.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_4.java b/tools/vm-tests/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_4.java
deleted file mode 100644
index 964d640..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_5.d
deleted file mode 100644
index 92c22bf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_5.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_6.d b/tools/vm-tests/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_6.d
deleted file mode 100644
index 7ea6104..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_double_2addr/d/T_rem_double_2addr_6.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/rem_float/Test_rem_float.java b/tools/vm-tests/src/dot/junit/opcodes/rem_float/Test_rem_float.java
deleted file mode 100644
index 2955a04..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_float/Test_rem_float.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_float/d/T_rem_float_1.d b/tools/vm-tests/src/dot/junit/opcodes/rem_float/d/T_rem_float_1.d
deleted file mode 100644
index a4edaea..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_float/d/T_rem_float_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_float/d/T_rem_float_1.java b/tools/vm-tests/src/dot/junit/opcodes/rem_float/d/T_rem_float_1.java
deleted file mode 100644
index 0c5e640..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_float/d/T_rem_float_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_float/d/T_rem_float_2.d b/tools/vm-tests/src/dot/junit/opcodes/rem_float/d/T_rem_float_2.d
deleted file mode 100644
index 8ce3466..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_float/d/T_rem_float_2.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_float/d/T_rem_float_3.d b/tools/vm-tests/src/dot/junit/opcodes/rem_float/d/T_rem_float_3.d
deleted file mode 100644
index e773a12..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_float/d/T_rem_float_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_float/d/T_rem_float_4.d b/tools/vm-tests/src/dot/junit/opcodes/rem_float/d/T_rem_float_4.d
deleted file mode 100644
index afde65c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_float/d/T_rem_float_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_float/d/T_rem_float_5.d b/tools/vm-tests/src/dot/junit/opcodes/rem_float/d/T_rem_float_5.d
deleted file mode 100644
index 23740bf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_float/d/T_rem_float_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_float/d/T_rem_float_6.d b/tools/vm-tests/src/dot/junit/opcodes/rem_float/d/T_rem_float_6.d
deleted file mode 100644
index 83ac469..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_float/d/T_rem_float_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_float/d/T_rem_float_6.java b/tools/vm-tests/src/dot/junit/opcodes/rem_float/d/T_rem_float_6.java
deleted file mode 100644
index d2592a2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_float/d/T_rem_float_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_float_2addr/Test_rem_float_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/rem_float_2addr/Test_rem_float_2addr.java
deleted file mode 100644
index d0d743a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_float_2addr/Test_rem_float_2addr.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_1.d
deleted file mode 100644
index a5571e5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_1.java
deleted file mode 100644
index 521abb6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_2.d
deleted file mode 100644
index aef48cb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_2.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_3.d
deleted file mode 100644
index 294652e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_4.d
deleted file mode 100644
index 4c5f1f5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_5.d
deleted file mode 100644
index 44c82c2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_6.d b/tools/vm-tests/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_6.d
deleted file mode 100644
index 4957893..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_6.java b/tools/vm-tests/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_6.java
deleted file mode 100644
index 72d01ed..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_float_2addr/d/T_rem_float_2addr_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_int/Test_rem_int.java b/tools/vm-tests/src/dot/junit/opcodes/rem_int/Test_rem_int.java
deleted file mode 100644
index e355a30..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int/Test_rem_int.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_int/d/T_rem_int_1.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int/d/T_rem_int_1.d
deleted file mode 100644
index 25a1ec5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int/d/T_rem_int_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int/d/T_rem_int_1.java b/tools/vm-tests/src/dot/junit/opcodes/rem_int/d/T_rem_int_1.java
deleted file mode 100644
index a24b8a6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int/d/T_rem_int_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_int/d/T_rem_int_2.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int/d/T_rem_int_2.d
deleted file mode 100644
index 1fa948b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int/d/T_rem_int_2.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int/d/T_rem_int_3.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int/d/T_rem_int_3.d
deleted file mode 100644
index 5db617b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int/d/T_rem_int_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int/d/T_rem_int_4.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int/d/T_rem_int_4.d
deleted file mode 100644
index 69aeb8d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int/d/T_rem_int_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int/d/T_rem_int_5.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int/d/T_rem_int_5.d
deleted file mode 100644
index d3b2b76..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int/d/T_rem_int_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int/d/T_rem_int_6.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int/d/T_rem_int_6.d
deleted file mode 100644
index 032b8ae..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int/d/T_rem_int_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int/d/T_rem_int_6.java b/tools/vm-tests/src/dot/junit/opcodes/rem_int/d/T_rem_int_6.java
deleted file mode 100644
index 074fd8d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int/d/T_rem_int_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_int_2addr/Test_rem_int_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/rem_int_2addr/Test_rem_int_2addr.java
deleted file mode 100644
index f45439b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_2addr/Test_rem_int_2addr.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_1.d
deleted file mode 100644
index 25a7fca..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_1.java
deleted file mode 100644
index d19c535..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_2.d
deleted file mode 100644
index 0dee98c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_2.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_3.d
deleted file mode 100644
index b76a76a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_4.d
deleted file mode 100644
index e3828d6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_5.d
deleted file mode 100644
index d684c92..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_6.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_6.d
deleted file mode 100644
index 0e5825c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_6.java b/tools/vm-tests/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_6.java
deleted file mode 100644
index 9508f97..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_2addr/d/T_rem_int_2addr_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_int_lit16/Test_rem_int_lit16.java b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/Test_rem_int_lit16.java
deleted file mode 100644
index 3449f86..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/Test_rem_int_lit16.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_1.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_1.d
deleted file mode 100644
index 84c49ed..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_1.java b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_1.java
deleted file mode 100644
index 75963ac..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_1.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_10.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_10.d
deleted file mode 100644
index 4cd1fe6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_10.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_11.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_11.d
deleted file mode 100644
index a5d81e0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_11.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_12.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_12.d
deleted file mode 100644
index 80cab63..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_12.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_13.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_13.d
deleted file mode 100644
index 2e40ee6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_13.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_2.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_2.d
deleted file mode 100644
index ebba20d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_2.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_2.java b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_2.java
deleted file mode 100644
index 7f40e12..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_2.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_3.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_3.d
deleted file mode 100644
index 0b65731..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_3.java b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_3.java
deleted file mode 100644
index ffd9b90..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_3.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_4.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_4.d
deleted file mode 100644
index 9b96729..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_4.java b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_4.java
deleted file mode 100644
index 759ed42..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_4.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_5.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_5.d
deleted file mode 100644
index 96218a1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_5.java b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_5.java
deleted file mode 100644
index 7dd4dfb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_6.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_6.d
deleted file mode 100644
index 9139eec..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_6.java b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_6.java
deleted file mode 100644
index d59e8a4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_6.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_7.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_7.d
deleted file mode 100644
index 9970a21..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_7.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_7.java b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_7.java
deleted file mode 100644
index 215598b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_7.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_8.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_8.d
deleted file mode 100644
index aa2208b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_8.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_8.java b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_8.java
deleted file mode 100644
index 77a94a2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_8.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_9.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_9.d
deleted file mode 100644
index 91c45f8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_9.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_9.java b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_9.java
deleted file mode 100644
index 6c6d3cc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit16/d/T_rem_int_lit16_9.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_int_lit8/Test_rem_int_lit8.java b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/Test_rem_int_lit8.java
deleted file mode 100644
index ffeeb40..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/Test_rem_int_lit8.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_1.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_1.d
deleted file mode 100644
index 7d69475..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_1.java b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_1.java
deleted file mode 100644
index bf0f39d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_1.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_10.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_10.d
deleted file mode 100644
index 15ce8db..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_10.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_11.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_11.d
deleted file mode 100644
index 9fb2f77..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_11.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_12.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_12.d
deleted file mode 100644
index cc7cd5e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_12.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_13.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_13.d
deleted file mode 100644
index c35575e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_13.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_2.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_2.d
deleted file mode 100644
index 4887086..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_2.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_2.java b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_2.java
deleted file mode 100644
index 3c05ec4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_2.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_3.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_3.d
deleted file mode 100644
index 43413ee..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_3.java b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_3.java
deleted file mode 100644
index 7e97956..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_3.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_4.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_4.d
deleted file mode 100644
index 48cd590..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_4.java b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_4.java
deleted file mode 100644
index 431ee77..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_4.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_5.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_5.d
deleted file mode 100644
index ec86de1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_5.java b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_5.java
deleted file mode 100644
index c02f3e1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_6.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_6.d
deleted file mode 100644
index 8300e22..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_6.java b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_6.java
deleted file mode 100644
index 92ad4d1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_6.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_7.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_7.d
deleted file mode 100644
index b1eeb15..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_7.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_7.java b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_7.java
deleted file mode 100644
index b4369d1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_7.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_8.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_8.d
deleted file mode 100644
index 08b0729..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_8.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_8.java b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_8.java
deleted file mode 100644
index f28f470..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_8.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_9.d b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_9.d
deleted file mode 100644
index 3c28049..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_9.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_9.java b/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_9.java
deleted file mode 100644
index 5368944..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_int_lit8/d/T_rem_int_lit8_9.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_long/Test_rem_long.java b/tools/vm-tests/src/dot/junit/opcodes/rem_long/Test_rem_long.java
deleted file mode 100644
index 271cd75..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_long/Test_rem_long.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_long/d/T_rem_long_1.d b/tools/vm-tests/src/dot/junit/opcodes/rem_long/d/T_rem_long_1.d
deleted file mode 100644
index 37cfd4d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_long/d/T_rem_long_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_long/d/T_rem_long_1.java b/tools/vm-tests/src/dot/junit/opcodes/rem_long/d/T_rem_long_1.java
deleted file mode 100644
index 34e776a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_long/d/T_rem_long_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_long/d/T_rem_long_2.d b/tools/vm-tests/src/dot/junit/opcodes/rem_long/d/T_rem_long_2.d
deleted file mode 100644
index 867c397..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_long/d/T_rem_long_2.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_long/d/T_rem_long_3.d b/tools/vm-tests/src/dot/junit/opcodes/rem_long/d/T_rem_long_3.d
deleted file mode 100644
index 05b4c51..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_long/d/T_rem_long_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_long/d/T_rem_long_3.java b/tools/vm-tests/src/dot/junit/opcodes/rem_long/d/T_rem_long_3.java
deleted file mode 100644
index 33c00a8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_long/d/T_rem_long_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_long/d/T_rem_long_4.d b/tools/vm-tests/src/dot/junit/opcodes/rem_long/d/T_rem_long_4.d
deleted file mode 100644
index 165258a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_long/d/T_rem_long_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_long/d/T_rem_long_5.d b/tools/vm-tests/src/dot/junit/opcodes/rem_long/d/T_rem_long_5.d
deleted file mode 100644
index ab089c0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_long/d/T_rem_long_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_long/d/T_rem_long_6.d b/tools/vm-tests/src/dot/junit/opcodes/rem_long/d/T_rem_long_6.d
deleted file mode 100644
index eb64800..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_long/d/T_rem_long_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_long_2addr/Test_rem_long_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/rem_long_2addr/Test_rem_long_2addr.java
deleted file mode 100644
index e32f69c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_long_2addr/Test_rem_long_2addr.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_1.d
deleted file mode 100644
index 83c111e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_1.java
deleted file mode 100644
index 197ce60..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_2.d
deleted file mode 100644
index 79c9750..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_2.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_3.d
deleted file mode 100644
index 4f62b19..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_3.java b/tools/vm-tests/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_3.java
deleted file mode 100644
index f86c707..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_4.d
deleted file mode 100644
index 2d0d1c6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_5.d
deleted file mode 100644
index 7d4ed96..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_6.d b/tools/vm-tests/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_6.d
deleted file mode 100644
index 8952ae1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rem_long_2addr/d/T_rem_long_2addr_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/return_object/Runner.java b/tools/vm-tests/src/dot/junit/opcodes/return_object/Runner.java
deleted file mode 100644
index a2610ee..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_object/Runner.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/return_object/RunnerGenerator.java b/tools/vm-tests/src/dot/junit/opcodes/return_object/RunnerGenerator.java
deleted file mode 100644
index 04644d7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_object/RunnerGenerator.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/return_object/Test_return_object.java b/tools/vm-tests/src/dot/junit/opcodes/return_object/Test_return_object.java
deleted file mode 100644
index 9336829..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_object/Test_return_object.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/return_object/d/T_return_object_1.d b/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_1.d
deleted file mode 100644
index b537c47..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_1.d
+++ /dev/null
@@ -1,40 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/return_object/d/T_return_object_1.java b/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_1.java
deleted file mode 100644
index ce9aed3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_1.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/return_object/d/T_return_object_10.d b/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_10.d
deleted file mode 100644
index 66e762a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_10.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/return_object/d/T_return_object_11.d b/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_11.d
deleted file mode 100644
index c632133..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_11.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/return_object/d/T_return_object_12.d b/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_12.d
deleted file mode 100644
index ea4c11a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_12.d
+++ /dev/null
@@ -1,43 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/return_object/d/T_return_object_12.java b/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_12.java
deleted file mode 100644
index 9040acc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_12.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/return_object/d/T_return_object_13.d b/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_13.d
deleted file mode 100644
index 4cae4ce..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_13.d
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/return_object/d/T_return_object_13.java b/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_13.java
deleted file mode 100644
index cb180d6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_13.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/return_object/d/T_return_object_14.d b/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_14.d
deleted file mode 100644
index cff2b12..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_14.d
+++ /dev/null
@@ -1,49 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/return_object/d/T_return_object_15.d b/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_15.d
deleted file mode 100644
index 29377fa..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_15.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/return_object/d/T_return_object_16.d b/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_16.d
deleted file mode 100644
index 0b8dc5b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_16.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/return_object/d/T_return_object_2.d b/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_2.d
deleted file mode 100644
index f892233..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/return_object/d/T_return_object_2.java b/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_2.java
deleted file mode 100644
index 916dcdd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/return_object/d/T_return_object_3.d b/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_3.d
deleted file mode 100644
index 089fde7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_3.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/return_object/d/T_return_object_4.d b/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_4.d
deleted file mode 100644
index 9b30169..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/return_object/d/T_return_object_5.d b/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_5.d
deleted file mode 100644
index db9df1b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_5.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/return_object/d/T_return_object_6.d b/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_6.d
deleted file mode 100644
index 582bd74..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_6.d
+++ /dev/null
@@ -1,64 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/return_object/d/T_return_object_6.java b/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_6.java
deleted file mode 100644
index 05cd845..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_6.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/return_object/d/T_return_object_8.d b/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_8.d
deleted file mode 100644
index bc2f85f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_8.d
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/return_object/d/T_return_object_8.java b/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_8.java
deleted file mode 100644
index 65fb8e1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_object/d/T_return_object_8.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/return_object/d/TestStubs.d b/tools/vm-tests/src/dot/junit/opcodes/return_object/d/TestStubs.d
deleted file mode 100644
index 44f819f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_object/d/TestStubs.d
+++ /dev/null
@@ -1,51 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/return_object/d/TetsStubs.java b/tools/vm-tests/src/dot/junit/opcodes/return_object/d/TetsStubs.java
deleted file mode 100644
index 575ec0c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_object/d/TetsStubs.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/return_void/Test_return_void.java b/tools/vm-tests/src/dot/junit/opcodes/return_void/Test_return_void.java
deleted file mode 100644
index e5903e3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_void/Test_return_void.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/return_void/d/T_return_void_1.d b/tools/vm-tests/src/dot/junit/opcodes/return_void/d/T_return_void_1.d
deleted file mode 100644
index 739e288..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_void/d/T_return_void_1.d
+++ /dev/null
@@ -1,65 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/return_void/d/T_return_void_1.java b/tools/vm-tests/src/dot/junit/opcodes/return_void/d/T_return_void_1.java
deleted file mode 100644
index 60615c4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_void/d/T_return_void_1.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/return_void/d/T_return_void_3.d b/tools/vm-tests/src/dot/junit/opcodes/return_void/d/T_return_void_3.d
deleted file mode 100644
index ff12b06..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_void/d/T_return_void_3.d
+++ /dev/null
@@ -1,44 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/return_void/d/T_return_void_3.java b/tools/vm-tests/src/dot/junit/opcodes/return_void/d/T_return_void_3.java
deleted file mode 100644
index de9cb3a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_void/d/T_return_void_3.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/return_void/d/T_return_void_5.d b/tools/vm-tests/src/dot/junit/opcodes/return_void/d/T_return_void_5.d
deleted file mode 100644
index 172f5d0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_void/d/T_return_void_5.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/return_void/d/T_return_void_6.d b/tools/vm-tests/src/dot/junit/opcodes/return_void/d/T_return_void_6.d
deleted file mode 100644
index 001e8b4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_void/d/T_return_void_6.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/return_void/d/T_return_void_7.d b/tools/vm-tests/src/dot/junit/opcodes/return_void/d/T_return_void_7.d
deleted file mode 100644
index 3aee8df..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_void/d/T_return_void_7.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/return_wide/Test_return_wide.java b/tools/vm-tests/src/dot/junit/opcodes/return_wide/Test_return_wide.java
deleted file mode 100644
index c97f0d2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_wide/Test_return_wide.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/return_wide/d/T_return_wide_1.d b/tools/vm-tests/src/dot/junit/opcodes/return_wide/d/T_return_wide_1.d
deleted file mode 100644
index 57ffaf3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_wide/d/T_return_wide_1.d
+++ /dev/null
@@ -1,71 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/return_wide/d/T_return_wide_1.java b/tools/vm-tests/src/dot/junit/opcodes/return_wide/d/T_return_wide_1.java
deleted file mode 100644
index a96cbef..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_wide/d/T_return_wide_1.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/return_wide/d/T_return_wide_3.d b/tools/vm-tests/src/dot/junit/opcodes/return_wide/d/T_return_wide_3.d
deleted file mode 100644
index 1a6fdb6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_wide/d/T_return_wide_3.d
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/return_wide/d/T_return_wide_3.java b/tools/vm-tests/src/dot/junit/opcodes/return_wide/d/T_return_wide_3.java
deleted file mode 100644
index b0bae67..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_wide/d/T_return_wide_3.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/return_wide/d/T_return_wide_5.d b/tools/vm-tests/src/dot/junit/opcodes/return_wide/d/T_return_wide_5.d
deleted file mode 100644
index 692ac2b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_wide/d/T_return_wide_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/return_wide/d/T_return_wide_6.d b/tools/vm-tests/src/dot/junit/opcodes/return_wide/d/T_return_wide_6.d
deleted file mode 100644
index 3360ab7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_wide/d/T_return_wide_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/return_wide/d/T_return_wide_7.d b/tools/vm-tests/src/dot/junit/opcodes/return_wide/d/T_return_wide_7.d
deleted file mode 100644
index 0363fcc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_wide/d/T_return_wide_7.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/return_wide/d/T_return_wide_8.d b/tools/vm-tests/src/dot/junit/opcodes/return_wide/d/T_return_wide_8.d
deleted file mode 100644
index be64ae1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/return_wide/d/T_return_wide_8.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rsub_int/Test_rsub_int.java b/tools/vm-tests/src/dot/junit/opcodes/rsub_int/Test_rsub_int.java
deleted file mode 100644
index bb63e7a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int/Test_rsub_int.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_1.d b/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_1.d
deleted file mode 100644
index b5124e8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_1.d
+++ /dev/null
@@ -1,67 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_1.java b/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_1.java
deleted file mode 100644
index f90f354..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_1.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_10.d b/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_10.d
deleted file mode 100644
index 544a12c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_10.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_11.d b/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_11.d
deleted file mode 100644
index e9a9b26..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_11.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_12.d b/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_12.d
deleted file mode 100644
index 9c1ffec..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_12.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_12.java b/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_12.java
deleted file mode 100644
index d3b3a4d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_12.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_2.d b/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_2.d
deleted file mode 100644
index 4d63eea..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_2.d
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_2.java b/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_2.java
deleted file mode 100644
index b1d8e90..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_2.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_3.d b/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_3.d
deleted file mode 100644
index 23efe0f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_3.java b/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_3.java
deleted file mode 100644
index b060bd2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_3.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_4.d b/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_4.d
deleted file mode 100644
index c37f9da..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_4.java b/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_4.java
deleted file mode 100644
index 5b38c5d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_4.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_5.d b/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_5.d
deleted file mode 100644
index 473020a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_5.java b/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_5.java
deleted file mode 100644
index 259002c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_6.d b/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_6.d
deleted file mode 100644
index e902f19..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_6.java b/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_6.java
deleted file mode 100644
index 221f348..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_6.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_7.d b/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_7.d
deleted file mode 100644
index 6bb3571..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_7.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_7.java b/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_7.java
deleted file mode 100644
index 180e76c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_7.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_8.d b/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_8.d
deleted file mode 100644
index 9494e21..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_8.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_9.d b/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_9.d
deleted file mode 100644
index 12b5fe4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int/d/T_rsub_int_9.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rsub_int_lit8/Test_rsub_int_lit8.java b/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/Test_rsub_int_lit8.java
deleted file mode 100644
index 44dc89a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/Test_rsub_int_lit8.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_1.d b/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_1.d
deleted file mode 100644
index fd45062..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_1.d
+++ /dev/null
@@ -1,67 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_1.java b/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_1.java
deleted file mode 100644
index e489328..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_1.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_10.d b/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_10.d
deleted file mode 100644
index a8e37a1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_10.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_11.d b/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_11.d
deleted file mode 100644
index 615eede..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_11.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_12.d b/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_12.d
deleted file mode 100644
index 7490328..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_12.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_12.java b/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_12.java
deleted file mode 100644
index 9612590..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_12.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_2.d b/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_2.d
deleted file mode 100644
index fa026fc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_2.d
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_2.java b/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_2.java
deleted file mode 100644
index 036ec06..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_2.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_3.d b/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_3.d
deleted file mode 100644
index b9b5c3f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_3.java b/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_3.java
deleted file mode 100644
index deb1885..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_3.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_4.d b/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_4.d
deleted file mode 100644
index b330a45..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_4.java b/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_4.java
deleted file mode 100644
index 72ddcff..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_4.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_5.d b/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_5.d
deleted file mode 100644
index 77a0e8b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_5.java b/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_5.java
deleted file mode 100644
index 1ec8d63..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_6.d b/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_6.d
deleted file mode 100644
index bd5d5ea..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_6.java b/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_6.java
deleted file mode 100644
index bfe342c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_6.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_7.d b/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_7.d
deleted file mode 100644
index 18cd602..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_7.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_7.java b/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_7.java
deleted file mode 100644
index ca23fb0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_7.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_8.d b/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_8.d
deleted file mode 100644
index 69df5ae..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_8.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_9.d b/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_9.d
deleted file mode 100644
index 4db3540..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/rsub_int_lit8/d/T_rsub_int_lit8_9.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/sget/TestStubs.java
deleted file mode 100644
index 4c49c61..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/TestStubs.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget/Test_sget.java b/tools/vm-tests/src/dot/junit/opcodes/sget/Test_sget.java
deleted file mode 100644
index 981b19a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/Test_sget.java
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget/d/T_sget_1.d b/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_1.d
deleted file mode 100644
index 35e5808..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_1.d
+++ /dev/null
@@ -1,51 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget/d/T_sget_1.java b/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_1.java
deleted file mode 100644
index 7514f03..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_1.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget/d/T_sget_11.d b/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_11.d
deleted file mode 100644
index fb446be..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_11.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget/d/T_sget_11.java b/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_11.java
deleted file mode 100644
index 26c6cb3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget/d/T_sget_12.d b/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_12.d
deleted file mode 100644
index b1e9093..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_12.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget/d/T_sget_12.java b/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_12.java
deleted file mode 100644
index f4232d3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_12.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget/d/T_sget_13.d b/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_13.d
deleted file mode 100644
index 7122dbd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_13.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget/d/T_sget_13.java b/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_13.java
deleted file mode 100644
index a1d862f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_13.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget/d/T_sget_14.d b/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_14.d
deleted file mode 100644
index 43ed17b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_14.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget/d/T_sget_15.d b/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_15.d
deleted file mode 100644
index a9d65e5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_15.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget/d/T_sget_16.d b/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_16.d
deleted file mode 100644
index 71602db..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_16.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget/d/T_sget_17.d b/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_17.d
deleted file mode 100644
index e7bdc56..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_17.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget/d/T_sget_18.d b/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_18.d
deleted file mode 100644
index 62dbc28..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_18.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget/d/T_sget_19.d b/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_19.d
deleted file mode 100644
index 0f3374d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_19.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget/d/T_sget_2.d b/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_2.d
deleted file mode 100644
index de5c7cb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_2.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget/d/T_sget_2.java b/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_2.java
deleted file mode 100644
index ff7bdee..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_2.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget/d/T_sget_20.d b/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_20.d
deleted file mode 100644
index e03ccd6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_20.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget/d/T_sget_3.d b/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_3.d
deleted file mode 100644
index 1932bb7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget/d/T_sget_4.d b/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_4.d
deleted file mode 100644
index 761c38f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget/d/T_sget_4.dfh b/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_4.dfh
deleted file mode 100644
index 4e7aba1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_4.dfh
+++ /dev/null
@@ -1,266 +0,0 @@
-// 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/src/dot/junit/opcodes/sget/d/T_sget_5.d b/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_5.d
deleted file mode 100644
index 544f350..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_5.d
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget/d/T_sget_5.java b/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_5.java
deleted file mode 100644
index 1dac50e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_5.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget/d/T_sget_6.d b/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_6.d
deleted file mode 100644
index b78b202..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget/d/T_sget_6.java b/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_6.java
deleted file mode 100644
index 8f81780..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_6.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget/d/T_sget_7.d b/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_7.d
deleted file mode 100644
index 7423dcd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_7.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget/d/T_sget_7.java b/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_7.java
deleted file mode 100644
index 8960240..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_7.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget/d/T_sget_8.d b/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_8.d
deleted file mode 100644
index 915f609..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_8.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget/d/T_sget_8.java b/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_8.java
deleted file mode 100644
index 17e16f0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_8.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget/d/T_sget_9.d b/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_9.d
deleted file mode 100644
index 831c623..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_9.d
+++ /dev/null
@@ -1,52 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/sget/d/T_sget_9.java b/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_9.java
deleted file mode 100644
index 600a586..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget/d/T_sget_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_boolean/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/TestStubs.java
deleted file mode 100644
index b353763..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/TestStubs.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_boolean/Test_sget_boolean.java b/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/Test_sget_boolean.java
deleted file mode 100644
index ccbeb09..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/Test_sget_boolean.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_1.d b/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_1.d
deleted file mode 100644
index 1910152..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_1.d
+++ /dev/null
@@ -1,51 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_1.java b/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_1.java
deleted file mode 100644
index 00604c6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_1.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_11.d b/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_11.d
deleted file mode 100644
index a37791b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_11.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_11.java b/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_11.java
deleted file mode 100644
index 46e332b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_12.d b/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_12.d
deleted file mode 100644
index a6d38b5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_12.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_12.java b/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_12.java
deleted file mode 100644
index 74566c4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_12.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_13.d b/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_13.d
deleted file mode 100644
index f183859..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_13.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_13.java b/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_13.java
deleted file mode 100644
index f69d590..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_13.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_14.d b/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_14.d
deleted file mode 100644
index 90de215..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_14.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_15.d b/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_15.d
deleted file mode 100644
index e09d93c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_15.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_16.d b/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_16.d
deleted file mode 100644
index f6c3529..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_16.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_17.d b/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_17.d
deleted file mode 100644
index 25cadc8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_17.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_18.d b/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_18.d
deleted file mode 100644
index 871ff9b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_18.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_19.d b/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_19.d
deleted file mode 100644
index 1f4f9e8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_19.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_20.d b/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_20.d
deleted file mode 100644
index 79d51ff..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_20.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_3.d b/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_3.d
deleted file mode 100644
index c3271ba..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_4.d b/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_4.d
deleted file mode 100644
index 2ef169f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_4.dfh b/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_4.dfh
deleted file mode 100644
index 2c1995e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_4.dfh
+++ /dev/null
@@ -1,266 +0,0 @@
-// 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/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_5.d b/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_5.d
deleted file mode 100644
index 8edf874..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_5.d
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_5.java b/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_5.java
deleted file mode 100644
index e8c679a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_5.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_6.d b/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_6.d
deleted file mode 100644
index 2bd59dc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_6.java b/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_6.java
deleted file mode 100644
index ecf8943..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_6.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_7.d b/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_7.d
deleted file mode 100644
index 32ef38f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_7.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_7.java b/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_7.java
deleted file mode 100644
index 4db0e16..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_7.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_8.d b/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_8.d
deleted file mode 100644
index 04c780c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_8.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_8.java b/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_8.java
deleted file mode 100644
index 42cf804..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_8.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_9.d b/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_9.d
deleted file mode 100644
index 0cf9a87..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_9.d
+++ /dev/null
@@ -1,53 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_9.java b/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_9.java
deleted file mode 100644
index 0956174..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_boolean/d/T_sget_boolean_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_byte/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/sget_byte/TestStubs.java
deleted file mode 100644
index 3402e8d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_byte/TestStubs.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_byte/Test_sget_byte.java b/tools/vm-tests/src/dot/junit/opcodes/sget_byte/Test_sget_byte.java
deleted file mode 100644
index 9a19f98..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_byte/Test_sget_byte.java
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_1.d b/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_1.d
deleted file mode 100644
index 314c2b6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_1.d
+++ /dev/null
@@ -1,51 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_1.java b/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_1.java
deleted file mode 100644
index e1918b9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_1.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_11.d b/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_11.d
deleted file mode 100644
index 2c6fb91..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_11.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_11.java b/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_11.java
deleted file mode 100644
index bf69487..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_12.d b/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_12.d
deleted file mode 100644
index f2be588..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_12.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_12.java b/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_12.java
deleted file mode 100644
index cbfb2c0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_12.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_13.d b/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_13.d
deleted file mode 100644
index 8da3d7a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_13.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_13.java b/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_13.java
deleted file mode 100644
index b2723ae..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_13.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_14.d b/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_14.d
deleted file mode 100644
index d64eedc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_14.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_15.d b/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_15.d
deleted file mode 100644
index 7c02a3b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_15.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_16.d b/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_16.d
deleted file mode 100644
index 09e1280..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_16.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_17.d b/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_17.d
deleted file mode 100644
index 41d95fb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_17.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_18.d b/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_18.d
deleted file mode 100644
index e95a5eb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_18.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_19.d b/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_19.d
deleted file mode 100644
index 822c286..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_19.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_20.d b/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_20.d
deleted file mode 100644
index e9c6567..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_20.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_3.d b/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_3.d
deleted file mode 100644
index 800e5f2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_4.d b/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_4.d
deleted file mode 100644
index 5e884e3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_4.dfh b/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_4.dfh
deleted file mode 100644
index c17b068..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_4.dfh
+++ /dev/null
@@ -1,266 +0,0 @@
-// 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/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_5.d b/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_5.d
deleted file mode 100644
index ad5d006..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_5.d
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_5.java b/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_5.java
deleted file mode 100644
index 4391486..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_5.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_6.d b/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_6.d
deleted file mode 100644
index 48a4cb8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_6.java b/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_6.java
deleted file mode 100644
index df4e3f9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_6.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_7.d b/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_7.d
deleted file mode 100644
index e887bec..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_7.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_7.java b/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_7.java
deleted file mode 100644
index b865dde..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_7.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_8.d b/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_8.d
deleted file mode 100644
index 96ab1da..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_8.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_8.java b/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_8.java
deleted file mode 100644
index 605616f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_8.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_9.d b/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_9.d
deleted file mode 100644
index aee1a37..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_9.d
+++ /dev/null
@@ -1,53 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_9.java b/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_9.java
deleted file mode 100644
index 3bd966d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_byte/d/T_sget_byte_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_char/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/sget_char/TestStubs.java
deleted file mode 100644
index dc99b6b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_char/TestStubs.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_char/Test_sget_char.java b/tools/vm-tests/src/dot/junit/opcodes/sget_char/Test_sget_char.java
deleted file mode 100644
index 10324a5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_char/Test_sget_char.java
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_char/d/T_sget_char_1.d b/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_1.d
deleted file mode 100644
index 5fc252d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_1.d
+++ /dev/null
@@ -1,51 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_char/d/T_sget_char_1.java b/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_1.java
deleted file mode 100644
index 3a606be..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_1.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_char/d/T_sget_char_11.d b/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_11.d
deleted file mode 100644
index d4d3efb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_11.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_char/d/T_sget_char_11.java b/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_11.java
deleted file mode 100644
index fd73e27..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_char/d/T_sget_char_12.d b/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_12.d
deleted file mode 100644
index 708f2db..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_12.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_char/d/T_sget_char_12.java b/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_12.java
deleted file mode 100644
index f7affdf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_12.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_char/d/T_sget_char_13.d b/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_13.d
deleted file mode 100644
index eb652bc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_13.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_char/d/T_sget_char_13.java b/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_13.java
deleted file mode 100644
index b347b53..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_13.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_char/d/T_sget_char_14.d b/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_14.d
deleted file mode 100644
index c1b8040..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_14.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_char/d/T_sget_char_15.d b/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_15.d
deleted file mode 100644
index dedb8e2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_15.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_char/d/T_sget_char_16.d b/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_16.d
deleted file mode 100644
index 82a5544..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_16.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_char/d/T_sget_char_17.d b/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_17.d
deleted file mode 100644
index abff0e4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_17.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_char/d/T_sget_char_18.d b/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_18.d
deleted file mode 100644
index b73a284..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_18.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_char/d/T_sget_char_19.d b/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_19.d
deleted file mode 100644
index 437c0bd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_19.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_char/d/T_sget_char_20.d b/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_20.d
deleted file mode 100644
index eeaff5d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_20.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_char/d/T_sget_char_3.d b/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_3.d
deleted file mode 100644
index 3c6e95d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_char/d/T_sget_char_4.d b/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_4.d
deleted file mode 100644
index 9aeb10d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_char/d/T_sget_char_4.dfh b/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_4.dfh
deleted file mode 100644
index 42e44bf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_4.dfh
+++ /dev/null
@@ -1,266 +0,0 @@
-// 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/src/dot/junit/opcodes/sget_char/d/T_sget_char_5.d b/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_5.d
deleted file mode 100644
index fe1c7ba..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_5.d
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_char/d/T_sget_char_5.java b/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_5.java
deleted file mode 100644
index 00fb8ba..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_5.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_char/d/T_sget_char_6.d b/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_6.d
deleted file mode 100644
index f984ada..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_char/d/T_sget_char_6.java b/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_6.java
deleted file mode 100644
index 7fc0f38..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_6.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_char/d/T_sget_char_7.d b/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_7.d
deleted file mode 100644
index d7b5e35..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_7.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_char/d/T_sget_char_7.java b/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_7.java
deleted file mode 100644
index 616d9f1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_7.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_char/d/T_sget_char_8.d b/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_8.d
deleted file mode 100644
index 89ac2c8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_8.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_char/d/T_sget_char_8.java b/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_8.java
deleted file mode 100644
index 78e63e9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_8.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_char/d/T_sget_char_9.d b/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_9.d
deleted file mode 100644
index cbb4a54..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_9.d
+++ /dev/null
@@ -1,53 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/sget_char/d/T_sget_char_9.java b/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_9.java
deleted file mode 100644
index bc84d1e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_char/d/T_sget_char_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_object/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/sget_object/TestStubs.java
deleted file mode 100644
index 68b9ec7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/TestStubs.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_object/Test_sget_object.java b/tools/vm-tests/src/dot/junit/opcodes/sget_object/Test_sget_object.java
deleted file mode 100644
index 88aa4cb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/Test_sget_object.java
+++ /dev/null
@@ -1,285 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_object/d/T_sget_object_1.d b/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_1.d
deleted file mode 100644
index e77f532..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_1.d
+++ /dev/null
@@ -1,51 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_object/d/T_sget_object_1.java b/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_1.java
deleted file mode 100644
index bcfe83b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_1.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_object/d/T_sget_object_11.d b/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_11.d
deleted file mode 100644
index 54e497c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_11.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_object/d/T_sget_object_11.java b/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_11.java
deleted file mode 100644
index 9b8ce6e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_object/d/T_sget_object_12.d b/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_12.d
deleted file mode 100644
index b73c407..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_12.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_object/d/T_sget_object_12.java b/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_12.java
deleted file mode 100644
index 0978a26..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_12.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_object/d/T_sget_object_13.d b/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_13.d
deleted file mode 100644
index 37a8cb5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_13.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_object/d/T_sget_object_13.java b/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_13.java
deleted file mode 100644
index 7fe275e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_13.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_object/d/T_sget_object_14.d b/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_14.d
deleted file mode 100644
index 1455ebd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_14.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_object/d/T_sget_object_15.d b/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_15.d
deleted file mode 100644
index 0634476..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_15.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_object/d/T_sget_object_16.d b/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_16.d
deleted file mode 100644
index 42db7a8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_16.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_object/d/T_sget_object_17.d b/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_17.d
deleted file mode 100644
index 0a3ba48..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_17.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_object/d/T_sget_object_18.d b/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_18.d
deleted file mode 100644
index ca498f4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_18.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_object/d/T_sget_object_19.d b/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_19.d
deleted file mode 100644
index dfcad9b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_19.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_object/d/T_sget_object_20.d b/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_20.d
deleted file mode 100644
index 89e7bfb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_20.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_object/d/T_sget_object_21.d b/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_21.d
deleted file mode 100644
index ddb0713..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_21.d
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_object/d/T_sget_object_21.java b/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_21.java
deleted file mode 100644
index 0343390..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_21.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_object/d/T_sget_object_3.d b/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_3.d
deleted file mode 100644
index 498a01a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_object/d/T_sget_object_4.d b/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_4.d
deleted file mode 100644
index d00c4a0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_object/d/T_sget_object_4.dfh b/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_4.dfh
deleted file mode 100644
index 1c40c8c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_4.dfh
+++ /dev/null
@@ -1,262 +0,0 @@
-// 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/src/dot/junit/opcodes/sget_object/d/T_sget_object_5.d b/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_5.d
deleted file mode 100644
index 35687ab..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_5.d
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_object/d/T_sget_object_5.java b/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_5.java
deleted file mode 100644
index 116ae52..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_5.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_object/d/T_sget_object_6.d b/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_6.d
deleted file mode 100644
index 03483da..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_object/d/T_sget_object_6.java b/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_6.java
deleted file mode 100644
index 84714b2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_6.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_object/d/T_sget_object_7.d b/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_7.d
deleted file mode 100644
index eb172eb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_7.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_object/d/T_sget_object_7.java b/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_7.java
deleted file mode 100644
index 56fbd35..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_7.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_object/d/T_sget_object_8.d b/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_8.d
deleted file mode 100644
index 841a454..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_8.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_object/d/T_sget_object_8.java b/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_8.java
deleted file mode 100644
index 87afe69..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_8.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_object/d/T_sget_object_9.d b/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_9.d
deleted file mode 100644
index efd184b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_9.d
+++ /dev/null
@@ -1,53 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/sget_object/d/T_sget_object_9.java b/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_9.java
deleted file mode 100644
index 4fbae55..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_object/d/T_sget_object_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_short/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/sget_short/TestStubs.java
deleted file mode 100644
index 3e5605b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_short/TestStubs.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_short/Test_sget_short.java b/tools/vm-tests/src/dot/junit/opcodes/sget_short/Test_sget_short.java
deleted file mode 100644
index b38ef29..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_short/Test_sget_short.java
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_short/d/T_sget_short_1.d b/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_1.d
deleted file mode 100644
index 777253e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_1.d
+++ /dev/null
@@ -1,51 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_short/d/T_sget_short_1.java b/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_1.java
deleted file mode 100644
index 5cb80f9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_1.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_short/d/T_sget_short_11.d b/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_11.d
deleted file mode 100644
index d0f87a4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_11.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_short/d/T_sget_short_11.java b/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_11.java
deleted file mode 100644
index 790a0de..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_short/d/T_sget_short_12.d b/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_12.d
deleted file mode 100644
index 7a0a307..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_12.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_short/d/T_sget_short_12.java b/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_12.java
deleted file mode 100644
index ea41518..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_12.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_short/d/T_sget_short_13.d b/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_13.d
deleted file mode 100644
index b37df82..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_13.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_short/d/T_sget_short_13.java b/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_13.java
deleted file mode 100644
index 4bc3105..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_13.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_short/d/T_sget_short_14.d b/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_14.d
deleted file mode 100644
index 3d79cd1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_14.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_short/d/T_sget_short_15.d b/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_15.d
deleted file mode 100644
index d8751e5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_15.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_short/d/T_sget_short_16.d b/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_16.d
deleted file mode 100644
index 48f416c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_16.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_short/d/T_sget_short_17.d b/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_17.d
deleted file mode 100644
index 1cc7398..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_17.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_short/d/T_sget_short_18.d b/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_18.d
deleted file mode 100644
index 7f3ff6b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_18.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_short/d/T_sget_short_19.d b/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_19.d
deleted file mode 100644
index b9841ae..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_19.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_short/d/T_sget_short_20.d b/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_20.d
deleted file mode 100644
index 1ae3803..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_20.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_short/d/T_sget_short_3.d b/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_3.d
deleted file mode 100644
index 9dcbd24..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_short/d/T_sget_short_4.d b/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_4.d
deleted file mode 100644
index ab070e6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_short/d/T_sget_short_4.dfh b/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_4.dfh
deleted file mode 100644
index c19a74a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_4.dfh
+++ /dev/null
@@ -1,266 +0,0 @@
-// 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/src/dot/junit/opcodes/sget_short/d/T_sget_short_5.d b/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_5.d
deleted file mode 100644
index b7c451a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_5.d
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_short/d/T_sget_short_5.java b/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_5.java
deleted file mode 100644
index c1dda0c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_5.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_short/d/T_sget_short_6.d b/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_6.d
deleted file mode 100644
index ce1ec34..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_short/d/T_sget_short_6.java b/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_6.java
deleted file mode 100644
index 1499a3c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_6.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_short/d/T_sget_short_7.d b/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_7.d
deleted file mode 100644
index 2c82957..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_7.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_short/d/T_sget_short_7.java b/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_7.java
deleted file mode 100644
index 823e90d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_7.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_short/d/T_sget_short_8.d b/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_8.d
deleted file mode 100644
index 645aa56..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_8.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_short/d/T_sget_short_8.java b/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_8.java
deleted file mode 100644
index 2c3ec32..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_8.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_short/d/T_sget_short_9.d b/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_9.d
deleted file mode 100644
index 85d6755..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_9.d
+++ /dev/null
@@ -1,53 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/sget_short/d/T_sget_short_9.java b/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_9.java
deleted file mode 100644
index 512ef4c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_short/d/T_sget_short_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_wide/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/TestStubs.java
deleted file mode 100644
index 3538a38..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/TestStubs.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_wide/Test_sget_wide.java b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/Test_sget_wide.java
deleted file mode 100644
index 8ecbeb7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/Test_sget_wide.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_1.d b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_1.d
deleted file mode 100644
index ffd5cb4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_1.d
+++ /dev/null
@@ -1,51 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_1.java b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_1.java
deleted file mode 100644
index e995709..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_1.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_11.d b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_11.d
deleted file mode 100644
index 3485b03..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_11.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_11.java b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_11.java
deleted file mode 100644
index 41f07c7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_11.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_12.d b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_12.d
deleted file mode 100644
index 36c4678..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_12.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_12.java b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_12.java
deleted file mode 100644
index 9dc55c6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_12.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_13.d b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_13.d
deleted file mode 100644
index 308bdd1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_13.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_13.java b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_13.java
deleted file mode 100644
index 21fc969..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_13.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_14.d b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_14.d
deleted file mode 100644
index 6e32d54..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_14.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_15.d b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_15.d
deleted file mode 100644
index 685bf22..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_15.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_16.d b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_16.d
deleted file mode 100644
index 5548cdc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_16.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_17.d b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_17.d
deleted file mode 100644
index 961c845..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_17.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_18.d b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_18.d
deleted file mode 100644
index 8dba06c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_18.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_19.d b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_19.d
deleted file mode 100644
index e8d5722..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_19.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_2.d b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_2.d
deleted file mode 100644
index 4e12946..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_2.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_2.java b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_2.java
deleted file mode 100644
index ea40542..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_2.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_20.d b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_20.d
deleted file mode 100644
index 1861a25..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_20.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_3.d b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_3.d
deleted file mode 100644
index e672291..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_4.d b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_4.d
deleted file mode 100644
index 9924345..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_4.dfh b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_4.dfh
deleted file mode 100644
index aa8661b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_4.dfh
+++ /dev/null
@@ -1,266 +0,0 @@
-// 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/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_5.d b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_5.d
deleted file mode 100644
index e323dc0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_5.d
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_5.java b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_5.java
deleted file mode 100644
index 6021edd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_5.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_6.d b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_6.d
deleted file mode 100644
index 48e59f1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_6.java b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_6.java
deleted file mode 100644
index f2744cf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_6.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_7.d b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_7.d
deleted file mode 100644
index b34ddd6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_7.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_7.java b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_7.java
deleted file mode 100644
index e97e416..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_7.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_8.d b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_8.d
deleted file mode 100644
index d53c7dd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_8.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_8.java b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_8.java
deleted file mode 100644
index 95b2dbb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_8.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_9.d b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_9.d
deleted file mode 100644
index e223578..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_9.d
+++ /dev/null
@@ -1,53 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_9.java b/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_9.java
deleted file mode 100644
index a19f781..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sget_wide/d/T_sget_wide_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/shl_int/Test_shl_int.java b/tools/vm-tests/src/dot/junit/opcodes/shl_int/Test_shl_int.java
deleted file mode 100644
index 5b5d6ee..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int/Test_shl_int.java
+++ /dev/null
@@ -1,149 +0,0 @@
-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/src/dot/junit/opcodes/shl_int/d/T_shl_int_1.d b/tools/vm-tests/src/dot/junit/opcodes/shl_int/d/T_shl_int_1.d
deleted file mode 100644
index a9e9ede..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int/d/T_shl_int_1.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_int/d/T_shl_int_1.java b/tools/vm-tests/src/dot/junit/opcodes/shl_int/d/T_shl_int_1.java
deleted file mode 100644
index 4480d75..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int/d/T_shl_int_1.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/shl_int/d/T_shl_int_2.d b/tools/vm-tests/src/dot/junit/opcodes/shl_int/d/T_shl_int_2.d
deleted file mode 100644
index f1955e7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int/d/T_shl_int_2.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_int/d/T_shl_int_3.d b/tools/vm-tests/src/dot/junit/opcodes/shl_int/d/T_shl_int_3.d
deleted file mode 100644
index 88fff38..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int/d/T_shl_int_3.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_int/d/T_shl_int_4.d b/tools/vm-tests/src/dot/junit/opcodes/shl_int/d/T_shl_int_4.d
deleted file mode 100644
index 2b2fd1e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int/d/T_shl_int_4.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_int/d/T_shl_int_5.d b/tools/vm-tests/src/dot/junit/opcodes/shl_int/d/T_shl_int_5.d
deleted file mode 100644
index 1ae15e5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int/d/T_shl_int_5.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_int/d/T_shl_int_6.d b/tools/vm-tests/src/dot/junit/opcodes/shl_int/d/T_shl_int_6.d
deleted file mode 100644
index 1527b6d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int/d/T_shl_int_6.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_int/d/T_shl_int_6.java b/tools/vm-tests/src/dot/junit/opcodes/shl_int/d/T_shl_int_6.java
deleted file mode 100644
index bb6806c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int/d/T_shl_int_6.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/shl_int_2addr/Test_shl_int_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/shl_int_2addr/Test_shl_int_2addr.java
deleted file mode 100644
index 7774bbd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int_2addr/Test_shl_int_2addr.java
+++ /dev/null
@@ -1,149 +0,0 @@
-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/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_1.d
deleted file mode 100644
index 380c8c2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_1.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_1.java
deleted file mode 100644
index 69d8de4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_1.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_2.d
deleted file mode 100644
index bb92f80..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_2.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_3.d
deleted file mode 100644
index 7785e26..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_3.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_4.d
deleted file mode 100644
index 3860a02..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_4.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_5.d
deleted file mode 100644
index affe561..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_5.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_6.d b/tools/vm-tests/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_6.d
deleted file mode 100644
index 2299e9c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_6.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_6.java b/tools/vm-tests/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_6.java
deleted file mode 100644
index f82be9f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int_2addr/d/T_shl_int_2addr_6.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/shl_int_lit8/Test_shl_int_lit8.java b/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/Test_shl_int_lit8.java
deleted file mode 100644
index 186ddba..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/Test_shl_int_lit8.java
+++ /dev/null
@@ -1,153 +0,0 @@
-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/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_1.d b/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_1.d
deleted file mode 100644
index 8230b0f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_1.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_1.java b/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_1.java
deleted file mode 100644
index 31b0543..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_1.java
+++ /dev/null
@@ -1,9 +0,0 @@
-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/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_10.d b/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_10.d
deleted file mode 100644
index ebcef08..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_10.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_2.d b/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_2.d
deleted file mode 100644
index ab5d308..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_2.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_2.java b/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_2.java
deleted file mode 100644
index 14f04e5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_2.java
+++ /dev/null
@@ -1,9 +0,0 @@
-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/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_3.d b/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_3.d
deleted file mode 100644
index b7c3c3b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_3.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_3.java b/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_3.java
deleted file mode 100644
index 7b76307..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_3.java
+++ /dev/null
@@ -1,9 +0,0 @@
-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/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_4.d b/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_4.d
deleted file mode 100644
index 3416035..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_4.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_4.java b/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_4.java
deleted file mode 100644
index 6b80a22..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_4.java
+++ /dev/null
@@ -1,9 +0,0 @@
-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/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_5.d b/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_5.d
deleted file mode 100644
index bb0ebbd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_5.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_5.java b/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_5.java
deleted file mode 100644
index f170338..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_5.java
+++ /dev/null
@@ -1,9 +0,0 @@
-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/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_6.d b/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_6.d
deleted file mode 100644
index 3e2b9d5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_6.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_6.java b/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_6.java
deleted file mode 100644
index e41def3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_6.java
+++ /dev/null
@@ -1,9 +0,0 @@
-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/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_7.d b/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_7.d
deleted file mode 100644
index c2a0301..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_7.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_8.d b/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_8.d
deleted file mode 100644
index 49062a2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_8.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_9.d b/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_9.d
deleted file mode 100644
index 9d91c49..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_int_lit8/d/T_shl_int_lit8_9.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_long/Test_shl_long.java b/tools/vm-tests/src/dot/junit/opcodes/shl_long/Test_shl_long.java
deleted file mode 100644
index d22ba92..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_long/Test_shl_long.java
+++ /dev/null
@@ -1,163 +0,0 @@
-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/src/dot/junit/opcodes/shl_long/d/T_shl_long_1.d b/tools/vm-tests/src/dot/junit/opcodes/shl_long/d/T_shl_long_1.d
deleted file mode 100644
index 0293191..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_long/d/T_shl_long_1.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_long/d/T_shl_long_1.java b/tools/vm-tests/src/dot/junit/opcodes/shl_long/d/T_shl_long_1.java
deleted file mode 100644
index 27e13ba..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_long/d/T_shl_long_1.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/shl_long/d/T_shl_long_2.d b/tools/vm-tests/src/dot/junit/opcodes/shl_long/d/T_shl_long_2.d
deleted file mode 100644
index 1a5fe79..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_long/d/T_shl_long_2.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_long/d/T_shl_long_3.d b/tools/vm-tests/src/dot/junit/opcodes/shl_long/d/T_shl_long_3.d
deleted file mode 100644
index 0f33164..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_long/d/T_shl_long_3.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_long/d/T_shl_long_4.d b/tools/vm-tests/src/dot/junit/opcodes/shl_long/d/T_shl_long_4.d
deleted file mode 100644
index 4392e2a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_long/d/T_shl_long_4.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_long/d/T_shl_long_5.d b/tools/vm-tests/src/dot/junit/opcodes/shl_long/d/T_shl_long_5.d
deleted file mode 100644
index 29ad593..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_long/d/T_shl_long_5.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_long/d/T_shl_long_6.d b/tools/vm-tests/src/dot/junit/opcodes/shl_long/d/T_shl_long_6.d
deleted file mode 100644
index 105c0e7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_long/d/T_shl_long_6.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_long/d/T_shl_long_7.d b/tools/vm-tests/src/dot/junit/opcodes/shl_long/d/T_shl_long_7.d
deleted file mode 100644
index ed9faf0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_long/d/T_shl_long_7.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_long/d/T_shl_long_7.java b/tools/vm-tests/src/dot/junit/opcodes/shl_long/d/T_shl_long_7.java
deleted file mode 100644
index ecc3e1f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_long/d/T_shl_long_7.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/shl_long_2addr/Test_shl_long_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/shl_long_2addr/Test_shl_long_2addr.java
deleted file mode 100644
index 1113905..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_long_2addr/Test_shl_long_2addr.java
+++ /dev/null
@@ -1,163 +0,0 @@
-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/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_1.d
deleted file mode 100644
index b2e3bb9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_1.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_1.java
deleted file mode 100644
index 569531d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_1.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_2.d
deleted file mode 100644
index fd4598a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_2.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_3.d
deleted file mode 100644
index 41c08f5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_3.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_4.d
deleted file mode 100644
index 4c69423..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_4.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_5.d
deleted file mode 100644
index bb9b45b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_5.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_6.d b/tools/vm-tests/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_6.d
deleted file mode 100644
index 50738c4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_6.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_7.d b/tools/vm-tests/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_7.d
deleted file mode 100644
index 42b0717..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_7.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_7.java b/tools/vm-tests/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_7.java
deleted file mode 100644
index f6978ad..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shl_long_2addr/d/T_shl_long_2addr_7.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/shr_int/Test_shr_int.java b/tools/vm-tests/src/dot/junit/opcodes/shr_int/Test_shr_int.java
deleted file mode 100644
index d81d7c8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int/Test_shr_int.java
+++ /dev/null
@@ -1,150 +0,0 @@
-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/src/dot/junit/opcodes/shr_int/d/T_shr_int_1.d b/tools/vm-tests/src/dot/junit/opcodes/shr_int/d/T_shr_int_1.d
deleted file mode 100644
index 9eaa104..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int/d/T_shr_int_1.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_int/d/T_shr_int_1.java b/tools/vm-tests/src/dot/junit/opcodes/shr_int/d/T_shr_int_1.java
deleted file mode 100644
index 68a7062..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int/d/T_shr_int_1.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/shr_int/d/T_shr_int_2.d b/tools/vm-tests/src/dot/junit/opcodes/shr_int/d/T_shr_int_2.d
deleted file mode 100644
index 8800018..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int/d/T_shr_int_2.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_int/d/T_shr_int_3.d b/tools/vm-tests/src/dot/junit/opcodes/shr_int/d/T_shr_int_3.d
deleted file mode 100644
index 1f0c528..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int/d/T_shr_int_3.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_int/d/T_shr_int_4.d b/tools/vm-tests/src/dot/junit/opcodes/shr_int/d/T_shr_int_4.d
deleted file mode 100644
index eede586..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int/d/T_shr_int_4.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_int/d/T_shr_int_5.d b/tools/vm-tests/src/dot/junit/opcodes/shr_int/d/T_shr_int_5.d
deleted file mode 100644
index fe57998..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int/d/T_shr_int_5.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_int/d/T_shr_int_6.d b/tools/vm-tests/src/dot/junit/opcodes/shr_int/d/T_shr_int_6.d
deleted file mode 100644
index 0323c5f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int/d/T_shr_int_6.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_int/d/T_shr_int_6.java b/tools/vm-tests/src/dot/junit/opcodes/shr_int/d/T_shr_int_6.java
deleted file mode 100644
index 86804e4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int/d/T_shr_int_6.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/shr_int_2addr/Test_shr_int_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/shr_int_2addr/Test_shr_int_2addr.java
deleted file mode 100644
index b52cafe..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int_2addr/Test_shr_int_2addr.java
+++ /dev/null
@@ -1,150 +0,0 @@
-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/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_1.d
deleted file mode 100644
index 28765b3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_1.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_1.java
deleted file mode 100644
index e00a03d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_1.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_2.d
deleted file mode 100644
index a7bc7ff..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_2.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_3.d
deleted file mode 100644
index 0a6ea58..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_3.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_4.d
deleted file mode 100644
index 3d4d094..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_4.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_5.d
deleted file mode 100644
index 4b35e2a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_5.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_6.d b/tools/vm-tests/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_6.d
deleted file mode 100644
index b563cc0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_6.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_6.java b/tools/vm-tests/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_6.java
deleted file mode 100644
index f9e057f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int_2addr/d/T_shr_int_2addr_6.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/shr_int_lit8/Test_shr_int_lit8.java b/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/Test_shr_int_lit8.java
deleted file mode 100644
index af03cff..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/Test_shr_int_lit8.java
+++ /dev/null
@@ -1,152 +0,0 @@
-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/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_1.d b/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_1.d
deleted file mode 100644
index d34130f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_1.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_1.java b/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_1.java
deleted file mode 100644
index b784123..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_1.java
+++ /dev/null
@@ -1,9 +0,0 @@
-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/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_10.d b/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_10.d
deleted file mode 100644
index c94aa21..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_10.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_2.d b/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_2.d
deleted file mode 100644
index 1a3b1bd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_2.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_2.java b/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_2.java
deleted file mode 100644
index 1ab910d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_2.java
+++ /dev/null
@@ -1,9 +0,0 @@
-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/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_3.d b/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_3.d
deleted file mode 100644
index 002cadf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_3.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_3.java b/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_3.java
deleted file mode 100644
index 5e85115..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_3.java
+++ /dev/null
@@ -1,9 +0,0 @@
-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/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_4.d b/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_4.d
deleted file mode 100644
index 3b9b507..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_4.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_4.java b/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_4.java
deleted file mode 100644
index cc49861..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_4.java
+++ /dev/null
@@ -1,9 +0,0 @@
-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/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_5.d b/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_5.d
deleted file mode 100644
index 871040a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_5.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_5.java b/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_5.java
deleted file mode 100644
index b27c64b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_5.java
+++ /dev/null
@@ -1,9 +0,0 @@
-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/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_6.d b/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_6.d
deleted file mode 100644
index 761a30e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_6.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_6.java b/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_6.java
deleted file mode 100644
index a24bcb9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_6.java
+++ /dev/null
@@ -1,9 +0,0 @@
-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/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_7.d b/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_7.d
deleted file mode 100644
index 34559e8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_7.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_8.d b/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_8.d
deleted file mode 100644
index d157daf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_8.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_9.d b/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_9.d
deleted file mode 100644
index ed24326..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_int_lit8/d/T_shr_int_lit8_9.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_long/Test_shr_long.java b/tools/vm-tests/src/dot/junit/opcodes/shr_long/Test_shr_long.java
deleted file mode 100644
index 66bc8b4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_long/Test_shr_long.java
+++ /dev/null
@@ -1,162 +0,0 @@
-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/src/dot/junit/opcodes/shr_long/d/T_shr_long_1.d b/tools/vm-tests/src/dot/junit/opcodes/shr_long/d/T_shr_long_1.d
deleted file mode 100644
index 08c82f4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_long/d/T_shr_long_1.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_long/d/T_shr_long_1.java b/tools/vm-tests/src/dot/junit/opcodes/shr_long/d/T_shr_long_1.java
deleted file mode 100644
index e15d414..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_long/d/T_shr_long_1.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/shr_long/d/T_shr_long_2.d b/tools/vm-tests/src/dot/junit/opcodes/shr_long/d/T_shr_long_2.d
deleted file mode 100644
index a87004a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_long/d/T_shr_long_2.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_long/d/T_shr_long_3.d b/tools/vm-tests/src/dot/junit/opcodes/shr_long/d/T_shr_long_3.d
deleted file mode 100644
index 9c78f73..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_long/d/T_shr_long_3.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_long/d/T_shr_long_4.d b/tools/vm-tests/src/dot/junit/opcodes/shr_long/d/T_shr_long_4.d
deleted file mode 100644
index e6691cd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_long/d/T_shr_long_4.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_long/d/T_shr_long_5.d b/tools/vm-tests/src/dot/junit/opcodes/shr_long/d/T_shr_long_5.d
deleted file mode 100644
index f5e4cb9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_long/d/T_shr_long_5.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_long/d/T_shr_long_6.d b/tools/vm-tests/src/dot/junit/opcodes/shr_long/d/T_shr_long_6.d
deleted file mode 100644
index 427d1c2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_long/d/T_shr_long_6.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_long/d/T_shr_long_7.d b/tools/vm-tests/src/dot/junit/opcodes/shr_long/d/T_shr_long_7.d
deleted file mode 100644
index ad83dc8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_long/d/T_shr_long_7.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_long/d/T_shr_long_7.java b/tools/vm-tests/src/dot/junit/opcodes/shr_long/d/T_shr_long_7.java
deleted file mode 100644
index ca42ea9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_long/d/T_shr_long_7.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/shr_long_2addr/Test_shr_long_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/shr_long_2addr/Test_shr_long_2addr.java
deleted file mode 100644
index 22c4530..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_long_2addr/Test_shr_long_2addr.java
+++ /dev/null
@@ -1,163 +0,0 @@
-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/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_1.d
deleted file mode 100644
index 0e9c36b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_1.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_1.java
deleted file mode 100644
index 1c5691e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_1.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_2.d
deleted file mode 100644
index a0ebe17..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_2.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_3.d
deleted file mode 100644
index c07af2f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_3.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_4.d
deleted file mode 100644
index 9db034e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_4.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_5.d
deleted file mode 100644
index f1045cf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_5.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_6.d b/tools/vm-tests/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_6.d
deleted file mode 100644
index 1326e76..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_6.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_7.d b/tools/vm-tests/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_7.d
deleted file mode 100644
index 3b3db0f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_7.d
+++ /dev/null
@@ -1,18 +0,0 @@
-.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/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_7.java b/tools/vm-tests/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_7.java
deleted file mode 100644
index ed3e1e8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/shr_long_2addr/d/T_shr_long_2addr_7.java
+++ /dev/null
@@ -1,8 +0,0 @@
-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/src/dot/junit/opcodes/sparse_switch/Test_sparse_switch.java b/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/Test_sparse_switch.java
deleted file mode 100644
index 66f5c39..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/Test_sparse_switch.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_1.d b/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_1.d
deleted file mode 100644
index bd3aaa5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_1.d
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_1.java b/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_1.java
deleted file mode 100644
index 05d0ba9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_1.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_11.d b/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_11.d
deleted file mode 100644
index 5853adb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_11.d
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_11.dfh b/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_11.dfh
deleted file mode 100644
index 81eac01..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_11.dfh
+++ /dev/null
@@ -1,274 +0,0 @@
-// 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/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_12.d b/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_12.d
deleted file mode 100644
index feff623..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_12.d
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_12.dfh b/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_12.dfh
deleted file mode 100644
index 2d9ee69..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_12.dfh
+++ /dev/null
@@ -1,274 +0,0 @@
-// 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/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_12.java b/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_12.java
deleted file mode 100644
index c8f40c1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_12.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_13.d b/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_13.d
deleted file mode 100644
index 8c7814d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_13.d
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_14.d b/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_14.d
deleted file mode 100644
index 074c119..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_14.d
+++ /dev/null
@@ -1,48 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_14.dfh b/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_14.dfh
deleted file mode 100644
index 3f17abc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_14.dfh
+++ /dev/null
@@ -1,274 +0,0 @@
-// 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/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_2.d b/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_2.d
deleted file mode 100644
index 0f8b90b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_2.d
+++ /dev/null
@@ -1,50 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_2.java b/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_2.java
deleted file mode 100644
index e9344d1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_2.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_3.d b/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_3.d
deleted file mode 100644
index ce82bc9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_3.d
+++ /dev/null
@@ -1,48 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_4.d b/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_4.d
deleted file mode 100644
index 36f8c8b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_4.d
+++ /dev/null
@@ -1,48 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_5.d b/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_5.d
deleted file mode 100644
index dc72c30..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_5.d
+++ /dev/null
@@ -1,48 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_6.d b/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_6.d
deleted file mode 100644
index 25e418f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_6.d
+++ /dev/null
@@ -1,48 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_7.d b/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_7.d
deleted file mode 100644
index 67f3328..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_7.d
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_7.dfh b/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_7.dfh
deleted file mode 100644
index 47d52d4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_7.dfh
+++ /dev/null
@@ -1,276 +0,0 @@
-// 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/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_7.java b/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_7.java
deleted file mode 100644
index d7a7a59..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_7.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_8.d b/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_8.d
deleted file mode 100644
index ba0dae3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_8.d
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_8.dfh b/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_8.dfh
deleted file mode 100644
index f65851b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_8.dfh
+++ /dev/null
@@ -1,276 +0,0 @@
-// 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/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_8.java b/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_8.java
deleted file mode 100644
index a7176dd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_8.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_9.d b/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_9.d
deleted file mode 100644
index 2566813..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_9.d
+++ /dev/null
@@ -1,47 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_9.dfh b/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_9.dfh
deleted file mode 100644
index d5d171a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sparse_switch/d/T_sparse_switch_9.dfh
+++ /dev/null
@@ -1,276 +0,0 @@
-// 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/src/dot/junit/opcodes/sput/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/sput/TestStubs.java
deleted file mode 100644
index 581e945..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/TestStubs.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput/Test_sput.java b/tools/vm-tests/src/dot/junit/opcodes/sput/Test_sput.java
deleted file mode 100644
index 8b73bb5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/Test_sput.java
+++ /dev/null
@@ -1,330 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput/d/T_sput_1.d b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_1.d
deleted file mode 100644
index 748fd1c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_1.d
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput/d/T_sput_1.java b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_1.java
deleted file mode 100644
index 3bc4484..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_1.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput/d/T_sput_10.d b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_10.d
deleted file mode 100644
index d753fd4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_10.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput/d/T_sput_10.java b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_10.java
deleted file mode 100644
index 01a9d6b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_10.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput/d/T_sput_11.d b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_11.d
deleted file mode 100644
index 90cc7c0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_11.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput/d/T_sput_11.java b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_11.java
deleted file mode 100644
index 1f7ca52..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_11.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput/d/T_sput_12.d b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_12.d
deleted file mode 100644
index 6543443..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_12.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput/d/T_sput_12.java b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_12.java
deleted file mode 100644
index 8e5f7a9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_12.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput/d/T_sput_13.d b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_13.d
deleted file mode 100644
index f6c9d9f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_13.d
+++ /dev/null
@@ -1,53 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/sput/d/T_sput_13.java b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_13.java
deleted file mode 100644
index 4693899..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_13.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput/d/T_sput_14.d b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_14.d
deleted file mode 100644
index 89cab9e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_14.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput/d/T_sput_14.java b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_14.java
deleted file mode 100644
index 102f226..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_14.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput/d/T_sput_15.d b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_15.d
deleted file mode 100644
index e2723fe..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_15.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput/d/T_sput_15.java b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_15.java
deleted file mode 100644
index 25944f3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_15.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput/d/T_sput_16.java b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_16.java
deleted file mode 100644
index 3360d43..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_16.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput/d/T_sput_17.d b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_17.d
deleted file mode 100644
index ce6a0a8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_17.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput/d/T_sput_17.java b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_17.java
deleted file mode 100644
index c96b5eb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_17.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput/d/T_sput_18.d b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_18.d
deleted file mode 100644
index 7a79061..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_18.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput/d/T_sput_19.d b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_19.d
deleted file mode 100644
index d0f53cf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_19.d
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput/d/T_sput_19.java b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_19.java
deleted file mode 100644
index 854e9fd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_19.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput/d/T_sput_2.d b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_2.d
deleted file mode 100644
index 9989c88..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_2.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput/d/T_sput_20.d b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_20.d
deleted file mode 100644
index 9229d34..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_20.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput/d/T_sput_21.d b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_21.d
deleted file mode 100644
index bc08d1d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_21.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput/d/T_sput_22.d b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_22.d
deleted file mode 100644
index ff17473..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_22.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput/d/T_sput_23.d b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_23.d
deleted file mode 100644
index 10cdb15..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_23.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput/d/T_sput_24.d b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_24.d
deleted file mode 100644
index 5b6bac3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_24.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput/d/T_sput_3.d b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_3.d
deleted file mode 100644
index 22aaeef..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_3.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput/d/T_sput_3.dfh b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_3.dfh
deleted file mode 100644
index f7d95ea..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_3.dfh
+++ /dev/null
@@ -1,261 +0,0 @@
-// 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/src/dot/junit/opcodes/sput/d/T_sput_4.d b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_4.d
deleted file mode 100644
index 2ca3434..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput/d/T_sput_5.d b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_5.d
deleted file mode 100644
index 25a88ba..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_5.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput/d/T_sput_5.java b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_5.java
deleted file mode 100644
index 1625283..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_5.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput/d/T_sput_7.d b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_7.d
deleted file mode 100644
index 7bad17d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_7.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput/d/T_sput_7.java b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_7.java
deleted file mode 100644
index 8b22c00..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_7.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput/d/T_sput_8.d b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_8.d
deleted file mode 100644
index f1b1561..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_8.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput/d/T_sput_8.java b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_8.java
deleted file mode 100644
index 5ccae38..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_8.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput/d/T_sput_9.d b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_9.d
deleted file mode 100644
index 2e4fe0e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_9.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput/d/T_sput_9.java b/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_9.java
deleted file mode 100644
index b8f71e7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput/d/T_sput_9.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_boolean/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/TestStubs.java
deleted file mode 100644
index c6bbc0b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/TestStubs.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_boolean/Test_sput_boolean.java b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/Test_sput_boolean.java
deleted file mode 100644
index f503ec6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/Test_sput_boolean.java
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_1.d b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_1.d
deleted file mode 100644
index 8078d65..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_1.d
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_1.java b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_1.java
deleted file mode 100644
index 3e28038..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_1.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_10.d b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_10.d
deleted file mode 100644
index 672420d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_10.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_10.java b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_10.java
deleted file mode 100644
index 1bb1f7a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_10.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_11.d b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_11.d
deleted file mode 100644
index 796ac2a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_11.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_11.java b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_11.java
deleted file mode 100644
index a69a474..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_11.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_12.d b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_12.d
deleted file mode 100644
index d6db6ac..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_12.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_12.java b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_12.java
deleted file mode 100644
index 8721911..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_12.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_13.d b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_13.d
deleted file mode 100644
index 0f89bc2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_13.d
+++ /dev/null
@@ -1,53 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_13.java b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_13.java
deleted file mode 100644
index 20d2977..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_13.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_14.d b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_14.d
deleted file mode 100644
index cbaa0e6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_14.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_14.java b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_14.java
deleted file mode 100644
index 376f60f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_14.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_15.d b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_15.d
deleted file mode 100644
index 4adc0ad..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_15.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_15.java b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_15.java
deleted file mode 100644
index 467fc55..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_15.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_17.d b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_17.d
deleted file mode 100644
index 53dbe8f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_17.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_17.java b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_17.java
deleted file mode 100644
index 5e126b5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_17.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_18.d b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_18.d
deleted file mode 100644
index 080e547..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_18.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_19.d b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_19.d
deleted file mode 100644
index f7922af..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_19.d
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_19.java b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_19.java
deleted file mode 100644
index 1cf93cc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_19.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_2.d b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_2.d
deleted file mode 100644
index 9e6fe7f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_2.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_20.d b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_20.d
deleted file mode 100644
index abc0227..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_20.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_21.d b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_21.d
deleted file mode 100644
index b1e5f5f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_21.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_22.d b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_22.d
deleted file mode 100644
index e13f364..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_22.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_23.d b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_23.d
deleted file mode 100644
index 9a5ae68..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_23.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_24.d b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_24.d
deleted file mode 100644
index 3fe5b45..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_24.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_3.d b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_3.d
deleted file mode 100644
index 874c5f2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_3.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_3.dfh b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_3.dfh
deleted file mode 100644
index db54511..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_3.dfh
+++ /dev/null
@@ -1,261 +0,0 @@
-// 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_4.d b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_4.d
deleted file mode 100644
index d0a7422..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_6.d b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_6.d
deleted file mode 100644
index d50c573..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_6.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_7.d b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_7.d
deleted file mode 100644
index c6b97f0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_7.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_7.java b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_7.java
deleted file mode 100644
index 7a97328..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_7.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_8.d b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_8.d
deleted file mode 100644
index 4b781da..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_8.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_8.java b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_8.java
deleted file mode 100644
index 8d738ae..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_8.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_9.d b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_9.d
deleted file mode 100644
index 6deddd6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_9.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_9.java b/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_9.java
deleted file mode 100644
index 6028d28..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_9.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_byte/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/TestStubs.java
deleted file mode 100644
index 7b530ea..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/TestStubs.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_byte/Test_sput_byte.java b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/Test_sput_byte.java
deleted file mode 100644
index c64f876..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/Test_sput_byte.java
+++ /dev/null
@@ -1,316 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_1.d b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_1.d
deleted file mode 100644
index ec9b61c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_1.d
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_1.java b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_1.java
deleted file mode 100644
index 56c52c1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_1.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_10.d b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_10.d
deleted file mode 100644
index f0a420c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_10.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_10.java b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_10.java
deleted file mode 100644
index 0b49e2e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_10.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_11.d b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_11.d
deleted file mode 100644
index 7a3faff..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_11.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_11.java b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_11.java
deleted file mode 100644
index 1cf3e6c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_11.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_12.d b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_12.d
deleted file mode 100644
index 41e2aff..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_12.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_12.java b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_12.java
deleted file mode 100644
index 4e438a0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_12.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_13.d b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_13.d
deleted file mode 100644
index 2271ca2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_13.d
+++ /dev/null
@@ -1,53 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_13.java b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_13.java
deleted file mode 100644
index 5270328..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_13.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_14.d b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_14.d
deleted file mode 100644
index 1b216a7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_14.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_14.java b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_14.java
deleted file mode 100644
index 67075e7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_14.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_15.d b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_15.d
deleted file mode 100644
index 8fd5828..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_15.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_15.java b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_15.java
deleted file mode 100644
index c797268..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_15.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_17.d b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_17.d
deleted file mode 100644
index 76bd507..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_17.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_17.java b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_17.java
deleted file mode 100644
index 4ee32fc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_17.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_18.d b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_18.d
deleted file mode 100644
index 159ef4d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_18.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_2.d b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_2.d
deleted file mode 100644
index c9520be..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_2.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_20.d b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_20.d
deleted file mode 100644
index 9a77ec6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_20.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_21.d b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_21.d
deleted file mode 100644
index 15a924b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_21.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_22.d b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_22.d
deleted file mode 100644
index 3501490..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_22.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_23.d b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_23.d
deleted file mode 100644
index a34f665..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_23.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_24.d b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_24.d
deleted file mode 100644
index 07265af..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_24.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_3.d b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_3.d
deleted file mode 100644
index 128d14b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_3.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_3.dfh b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_3.dfh
deleted file mode 100644
index 86678ff..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_3.dfh
+++ /dev/null
@@ -1,261 +0,0 @@
-// 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_4.d b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_4.d
deleted file mode 100644
index fc64b62..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_6.d b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_6.d
deleted file mode 100644
index f41929a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_6.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_7.d b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_7.d
deleted file mode 100644
index 8e90c22..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_7.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_7.java b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_7.java
deleted file mode 100644
index 8871136..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_7.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_8.d b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_8.d
deleted file mode 100644
index f4a000f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_8.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_8.java b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_8.java
deleted file mode 100644
index 0e1605f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_8.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_9.d b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_9.d
deleted file mode 100644
index 59ecb38..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_9.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_9.java b/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_9.java
deleted file mode 100644
index 0262d88..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_9.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_char/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/sput_char/TestStubs.java
deleted file mode 100644
index fb91f68..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/TestStubs.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_char/Test_sput_char.java b/tools/vm-tests/src/dot/junit/opcodes/sput_char/Test_sput_char.java
deleted file mode 100644
index 120b45a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/Test_sput_char.java
+++ /dev/null
@@ -1,316 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_1.d b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_1.d
deleted file mode 100644
index 8603349..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_1.d
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_1.java b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_1.java
deleted file mode 100644
index 0437a31..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_1.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_10.d b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_10.d
deleted file mode 100644
index ff47c26..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_10.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_10.java b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_10.java
deleted file mode 100644
index 10f88f3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_10.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_11.d b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_11.d
deleted file mode 100644
index 6e23f44..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_11.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_11.java b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_11.java
deleted file mode 100644
index 600cc9d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_11.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_12.d b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_12.d
deleted file mode 100644
index 8cb984f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_12.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_12.java b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_12.java
deleted file mode 100644
index cd1f810..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_12.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_13.d b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_13.d
deleted file mode 100644
index 5b97bc4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_13.d
+++ /dev/null
@@ -1,53 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_13.java b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_13.java
deleted file mode 100644
index 786f121..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_13.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_14.d b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_14.d
deleted file mode 100644
index f682166..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_14.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_14.java b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_14.java
deleted file mode 100644
index 409b51c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_14.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_15.d b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_15.d
deleted file mode 100644
index cccb96b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_15.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_15.java b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_15.java
deleted file mode 100644
index 2b4d7d2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_15.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_17.d b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_17.d
deleted file mode 100644
index 22af6be..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_17.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_17.java b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_17.java
deleted file mode 100644
index 349eaa2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_17.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_18.d b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_18.d
deleted file mode 100644
index f1fbeb6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_18.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_2.d b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_2.d
deleted file mode 100644
index aa5f7d6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_2.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_20.d b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_20.d
deleted file mode 100644
index 92d2e6e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_20.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_21.d b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_21.d
deleted file mode 100644
index bdf6fe3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_21.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_22.d b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_22.d
deleted file mode 100644
index fa16663..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_22.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_23.d b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_23.d
deleted file mode 100644
index fd69e4f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_23.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_24.d b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_24.d
deleted file mode 100644
index 8862e51..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_24.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_3.d b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_3.d
deleted file mode 100644
index ff1725f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_3.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_3.dfh b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_3.dfh
deleted file mode 100644
index 45f6af2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_3.dfh
+++ /dev/null
@@ -1,261 +0,0 @@
-// 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_4.d b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_4.d
deleted file mode 100644
index 95cf09b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_6.d b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_6.d
deleted file mode 100644
index a2e504a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_6.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_7.d b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_7.d
deleted file mode 100644
index 8c44574..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_7.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_7.java b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_7.java
deleted file mode 100644
index 7a496f2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_7.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_8.d b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_8.d
deleted file mode 100644
index ac15f64..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_8.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_8.java b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_8.java
deleted file mode 100644
index c4a3e38..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_8.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_9.d b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_9.d
deleted file mode 100644
index 74279c4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_9.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_char/d/T_sput_char_9.java b/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_9.java
deleted file mode 100644
index c38e18c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_char/d/T_sput_char_9.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_object/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/sput_object/TestStubs.java
deleted file mode 100644
index 701ece3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/TestStubs.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_object/Test_sput_object.java b/tools/vm-tests/src/dot/junit/opcodes/sput_object/Test_sput_object.java
deleted file mode 100644
index cd070a7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/Test_sput_object.java
+++ /dev/null
@@ -1,318 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_1.d b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_1.d
deleted file mode 100644
index acb4903..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_1.d
+++ /dev/null
@@ -1,45 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_1.java b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_1.java
deleted file mode 100644
index 1bf8e5c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_1.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_10.d b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_10.d
deleted file mode 100644
index 7f12b99..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_10.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_10.java b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_10.java
deleted file mode 100644
index bbc15c5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_10.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_11.d b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_11.d
deleted file mode 100644
index a09c4af..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_11.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_11.java b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_11.java
deleted file mode 100644
index 7f90df0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_11.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_12.d b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_12.d
deleted file mode 100644
index 562d8ed..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_12.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_12.java b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_12.java
deleted file mode 100644
index 5a592c3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_12.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_13.d b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_13.d
deleted file mode 100644
index d2d59da..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_13.d
+++ /dev/null
@@ -1,53 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_13.java b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_13.java
deleted file mode 100644
index 9e16873..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_13.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_14.d b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_14.d
deleted file mode 100644
index 89ed274..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_14.d
+++ /dev/null
@@ -1,41 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_14.java b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_14.java
deleted file mode 100644
index 87ea8fb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_14.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_15.d b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_15.d
deleted file mode 100644
index 61d48e2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_15.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_15.java b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_15.java
deleted file mode 100644
index 676e4c3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_15.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_17.d b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_17.d
deleted file mode 100644
index b46acdf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_17.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_17.java b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_17.java
deleted file mode 100644
index 6f7ad7c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_17.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_18.d b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_18.d
deleted file mode 100644
index 21c4c5f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_18.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_2.d b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_2.d
deleted file mode 100644
index 5b6c088..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_2.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_20.d b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_20.d
deleted file mode 100644
index 8d6c9df..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_20.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_21.d b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_21.d
deleted file mode 100644
index f09c1a9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_21.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_22.d b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_22.d
deleted file mode 100644
index 4ae60e2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_22.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_23.d b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_23.d
deleted file mode 100644
index b440bb4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_23.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_24.d b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_24.d
deleted file mode 100644
index 63a01e5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_24.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_3.d b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_3.d
deleted file mode 100644
index 080efbc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_3.dfh b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_3.dfh
deleted file mode 100644
index 90b5887..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_3.dfh
+++ /dev/null
@@ -1,253 +0,0 @@
-// 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_4.d b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_4.d
deleted file mode 100644
index 3a3bccd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_6.d b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_6.d
deleted file mode 100644
index b43597a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_6.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_7.d b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_7.d
deleted file mode 100644
index 84988f9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_7.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_7.java b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_7.java
deleted file mode 100644
index 0e5f873..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_7.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_8.d b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_8.d
deleted file mode 100644
index 26495a1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_8.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_8.java b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_8.java
deleted file mode 100644
index d3d7408..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_8.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_9.d b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_9.d
deleted file mode 100644
index 2d35cf1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_9.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_object/d/T_sput_object_9.java b/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_9.java
deleted file mode 100644
index bef9d16..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_object/d/T_sput_object_9.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_short/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/sput_short/TestStubs.java
deleted file mode 100644
index dd67611..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/TestStubs.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_short/Test_sput_short.java b/tools/vm-tests/src/dot/junit/opcodes/sput_short/Test_sput_short.java
deleted file mode 100644
index f14c4a7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/Test_sput_short.java
+++ /dev/null
@@ -1,316 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_1.d b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_1.d
deleted file mode 100644
index f41be35..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_1.d
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_1.java b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_1.java
deleted file mode 100644
index c2d792d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_1.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_10.d b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_10.d
deleted file mode 100644
index 10a12b4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_10.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_10.java b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_10.java
deleted file mode 100644
index 3af3f04..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_10.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_11.d b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_11.d
deleted file mode 100644
index 4351376..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_11.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_11.java b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_11.java
deleted file mode 100644
index 15f6124..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_11.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_12.d b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_12.d
deleted file mode 100644
index a9dbbb0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_12.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_12.java b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_12.java
deleted file mode 100644
index f6edd67..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_12.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_13.d b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_13.d
deleted file mode 100644
index 55d0bf5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_13.d
+++ /dev/null
@@ -1,53 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_13.java b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_13.java
deleted file mode 100644
index 3750c17..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_13.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_14.d b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_14.d
deleted file mode 100644
index a836771..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_14.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_14.java b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_14.java
deleted file mode 100644
index 2aa5061..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_14.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_15.d b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_15.d
deleted file mode 100644
index 4848a3f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_15.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_15.java b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_15.java
deleted file mode 100644
index 04f6a7c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_15.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_17.d b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_17.d
deleted file mode 100644
index 3aba6fb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_17.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_17.java b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_17.java
deleted file mode 100644
index fa56416..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_17.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_18.d b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_18.d
deleted file mode 100644
index e1ef12c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_18.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_2.d b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_2.d
deleted file mode 100644
index f6c1a55..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_2.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_20.d b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_20.d
deleted file mode 100644
index dc42d54..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_20.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_21.d b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_21.d
deleted file mode 100644
index a55af0d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_21.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_22.d b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_22.d
deleted file mode 100644
index 25375e2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_22.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_23.d b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_23.d
deleted file mode 100644
index fc437cc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_23.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_24.d b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_24.d
deleted file mode 100644
index 16b16f1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_24.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_3.d b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_3.d
deleted file mode 100644
index 1246f9a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_3.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_3.dfh b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_3.dfh
deleted file mode 100644
index ac6f1b7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_3.dfh
+++ /dev/null
@@ -1,259 +0,0 @@
-// 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_4.d b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_4.d
deleted file mode 100644
index df600da..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_6.d b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_6.d
deleted file mode 100644
index 1b3904f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_6.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_7.d b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_7.d
deleted file mode 100644
index 99d2bc6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_7.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_7.java b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_7.java
deleted file mode 100644
index cbecc44..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_7.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_8.d b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_8.d
deleted file mode 100644
index ce24cf8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_8.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_8.java b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_8.java
deleted file mode 100644
index 852263e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_8.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_9.d b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_9.d
deleted file mode 100644
index d5aa82f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_9.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_short/d/T_sput_short_9.java b/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_9.java
deleted file mode 100644
index e950c1d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_short/d/T_sput_short_9.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_wide/TestStubs.java b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/TestStubs.java
deleted file mode 100644
index bc99fda..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/TestStubs.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_wide/Test_sput_wide.java b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/Test_sput_wide.java
deleted file mode 100644
index 29ff21b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/Test_sput_wide.java
+++ /dev/null
@@ -1,338 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_1.d b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_1.d
deleted file mode 100644
index 94e2898..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_1.d
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_1.java b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_1.java
deleted file mode 100644
index 422b3c9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_1.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_10.d b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_10.d
deleted file mode 100644
index 65a6012..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_10.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_10.java b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_10.java
deleted file mode 100644
index b275744..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_10.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_11.d b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_11.d
deleted file mode 100644
index 7cf07a0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_11.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_11.java b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_11.java
deleted file mode 100644
index c458f05..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_11.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_12.d b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_12.d
deleted file mode 100644
index 23fc53b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_12.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_12.java b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_12.java
deleted file mode 100644
index 3f0f128..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_12.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_13.d b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_13.d
deleted file mode 100644
index a130809..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_13.d
+++ /dev/null
@@ -1,53 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_13.java b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_13.java
deleted file mode 100644
index ab71754..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_13.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_14.d b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_14.d
deleted file mode 100644
index 38d5ed5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_14.d
+++ /dev/null
@@ -1,42 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_14.java b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_14.java
deleted file mode 100644
index c919ee5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_14.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_15.d b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_15.d
deleted file mode 100644
index 88531b4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_15.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_15.java b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_15.java
deleted file mode 100644
index 376cdd8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_15.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_17.d b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_17.d
deleted file mode 100644
index ab57cb7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_17.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_17.java b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_17.java
deleted file mode 100644
index 244fa5e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_17.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_18.d b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_18.d
deleted file mode 100644
index 463bdbd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_18.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_2.d b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_2.d
deleted file mode 100644
index 84b5622..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_2.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_20.d b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_20.d
deleted file mode 100644
index ca43933..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_20.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_21.d b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_21.d
deleted file mode 100644
index 04cf574..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_21.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_22.d b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_22.d
deleted file mode 100644
index d89d3cf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_22.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_23.d b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_23.d
deleted file mode 100644
index da254f8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_23.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_24.d b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_24.d
deleted file mode 100644
index e663946..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_24.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_3.d b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_3.d
deleted file mode 100644
index 344db70..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_3.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_3.dfh b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_3.dfh
deleted file mode 100644
index 4236b7c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_3.dfh
+++ /dev/null
@@ -1,261 +0,0 @@
-// 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_4.d b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_4.d
deleted file mode 100644
index 0f29358..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_5.d b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_5.d
deleted file mode 100644
index 0918986..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_5.d
+++ /dev/null
@@ -1,38 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_5.java b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_5.java
deleted file mode 100644
index 1147ce0..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_5.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_6.d b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_6.d
deleted file mode 100644
index 1552b40..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_6.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_7.d b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_7.d
deleted file mode 100644
index 726dfff..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_7.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_7.java b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_7.java
deleted file mode 100644
index 4608227..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_7.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_8.d b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_8.d
deleted file mode 100644
index f14a34c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_8.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_8.java b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_8.java
deleted file mode 100644
index 17cf144..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_8.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_9.d b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_9.d
deleted file mode 100644
index 64f57d6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_9.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_9.java b/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_9.java
deleted file mode 100644
index 00355dd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sput_wide/d/T_sput_wide_9.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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/src/dot/junit/opcodes/sub_double/Test_sub_double.java b/tools/vm-tests/src/dot/junit/opcodes/sub_double/Test_sub_double.java
deleted file mode 100644
index 5126c8e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_double/Test_sub_double.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sub_double/d/T_sub_double_1.d b/tools/vm-tests/src/dot/junit/opcodes/sub_double/d/T_sub_double_1.d
deleted file mode 100644
index 99060a2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_double/d/T_sub_double_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_double/d/T_sub_double_1.java b/tools/vm-tests/src/dot/junit/opcodes/sub_double/d/T_sub_double_1.java
deleted file mode 100644
index 7193f2e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_double/d/T_sub_double_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sub_double/d/T_sub_double_2.d b/tools/vm-tests/src/dot/junit/opcodes/sub_double/d/T_sub_double_2.d
deleted file mode 100644
index e202f3c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_double/d/T_sub_double_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_double/d/T_sub_double_3.d b/tools/vm-tests/src/dot/junit/opcodes/sub_double/d/T_sub_double_3.d
deleted file mode 100644
index ac2644e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_double/d/T_sub_double_3.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_double/d/T_sub_double_3.java b/tools/vm-tests/src/dot/junit/opcodes/sub_double/d/T_sub_double_3.java
deleted file mode 100644
index 9b8ee8e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_double/d/T_sub_double_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sub_double/d/T_sub_double_4.d b/tools/vm-tests/src/dot/junit/opcodes/sub_double/d/T_sub_double_4.d
deleted file mode 100644
index cf89f31..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_double/d/T_sub_double_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_double/d/T_sub_double_5.d b/tools/vm-tests/src/dot/junit/opcodes/sub_double/d/T_sub_double_5.d
deleted file mode 100644
index 69bbda7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_double/d/T_sub_double_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_double/d/T_sub_double_6.d b/tools/vm-tests/src/dot/junit/opcodes/sub_double/d/T_sub_double_6.d
deleted file mode 100644
index 6995970..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_double/d/T_sub_double_6.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_double_2addr/Test_sub_double_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/sub_double_2addr/Test_sub_double_2addr.java
deleted file mode 100644
index bdd4206..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_double_2addr/Test_sub_double_2addr.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_1.d
deleted file mode 100644
index 8df12c1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_1.java
deleted file mode 100644
index d99e5ac..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_2.d
deleted file mode 100644
index 0b37443..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_3.d
deleted file mode 100644
index a866a14..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_3.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_3.java b/tools/vm-tests/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_3.java
deleted file mode 100644
index eb60bf7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_4.d
deleted file mode 100644
index a3236ef..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_5.d
deleted file mode 100644
index aa69895..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_6.d b/tools/vm-tests/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_6.d
deleted file mode 100644
index 07bc954..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_double_2addr/d/T_sub_double_2addr_6.d
+++ /dev/null
@@ -1,37 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_float/Test_sub_float.java b/tools/vm-tests/src/dot/junit/opcodes/sub_float/Test_sub_float.java
deleted file mode 100644
index 2e41c99..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_float/Test_sub_float.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sub_float/d/T_sub_float_1.d b/tools/vm-tests/src/dot/junit/opcodes/sub_float/d/T_sub_float_1.d
deleted file mode 100644
index 39f6708..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_float/d/T_sub_float_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_float/d/T_sub_float_1.java b/tools/vm-tests/src/dot/junit/opcodes/sub_float/d/T_sub_float_1.java
deleted file mode 100644
index 573404e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_float/d/T_sub_float_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sub_float/d/T_sub_float_2.d b/tools/vm-tests/src/dot/junit/opcodes/sub_float/d/T_sub_float_2.d
deleted file mode 100644
index c144976..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_float/d/T_sub_float_2.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_float/d/T_sub_float_3.d b/tools/vm-tests/src/dot/junit/opcodes/sub_float/d/T_sub_float_3.d
deleted file mode 100644
index 0456de2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_float/d/T_sub_float_3.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_float/d/T_sub_float_4.d b/tools/vm-tests/src/dot/junit/opcodes/sub_float/d/T_sub_float_4.d
deleted file mode 100644
index 1c73e66..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_float/d/T_sub_float_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_float/d/T_sub_float_5.d b/tools/vm-tests/src/dot/junit/opcodes/sub_float/d/T_sub_float_5.d
deleted file mode 100644
index c851a5b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_float/d/T_sub_float_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_float/d/T_sub_float_5.java b/tools/vm-tests/src/dot/junit/opcodes/sub_float/d/T_sub_float_5.java
deleted file mode 100644
index dd3a944..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_float/d/T_sub_float_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sub_float/d/T_sub_float_6.d b/tools/vm-tests/src/dot/junit/opcodes/sub_float/d/T_sub_float_6.d
deleted file mode 100644
index c069f2d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_float/d/T_sub_float_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_float_2addr/Test_sub_float_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/sub_float_2addr/Test_sub_float_2addr.java
deleted file mode 100644
index 5d934b1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_float_2addr/Test_sub_float_2addr.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_1.d
deleted file mode 100644
index d1c6e61..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_1.java
deleted file mode 100644
index 0838c38..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_2.d
deleted file mode 100644
index 3f3b632..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_2.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_3.d
deleted file mode 100644
index 5a5f610..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_3.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_4.d
deleted file mode 100644
index f60a149..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_5.d
deleted file mode 100644
index 561ed3c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_5.java b/tools/vm-tests/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_5.java
deleted file mode 100644
index 5a0c748..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_6.d b/tools/vm-tests/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_6.d
deleted file mode 100644
index 8d94709..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_float_2addr/d/T_sub_float_2addr_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_int/Test_sub_int.java b/tools/vm-tests/src/dot/junit/opcodes/sub_int/Test_sub_int.java
deleted file mode 100644
index 4a491cf..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_int/Test_sub_int.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sub_int/d/T_sub_int_1.d b/tools/vm-tests/src/dot/junit/opcodes/sub_int/d/T_sub_int_1.d
deleted file mode 100644
index 019f739..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_int/d/T_sub_int_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_int/d/T_sub_int_1.java b/tools/vm-tests/src/dot/junit/opcodes/sub_int/d/T_sub_int_1.java
deleted file mode 100644
index 46c8b3b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_int/d/T_sub_int_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sub_int/d/T_sub_int_2.d b/tools/vm-tests/src/dot/junit/opcodes/sub_int/d/T_sub_int_2.d
deleted file mode 100644
index 2d6c43f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_int/d/T_sub_int_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_int/d/T_sub_int_3.d b/tools/vm-tests/src/dot/junit/opcodes/sub_int/d/T_sub_int_3.d
deleted file mode 100644
index 4ff0912..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_int/d/T_sub_int_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_int/d/T_sub_int_4.d b/tools/vm-tests/src/dot/junit/opcodes/sub_int/d/T_sub_int_4.d
deleted file mode 100644
index f3b57fc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_int/d/T_sub_int_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_int/d/T_sub_int_5.d b/tools/vm-tests/src/dot/junit/opcodes/sub_int/d/T_sub_int_5.d
deleted file mode 100644
index f813789..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_int/d/T_sub_int_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_int/d/T_sub_int_5.java b/tools/vm-tests/src/dot/junit/opcodes/sub_int/d/T_sub_int_5.java
deleted file mode 100644
index ecc613b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_int/d/T_sub_int_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sub_int/d/T_sub_int_6.d b/tools/vm-tests/src/dot/junit/opcodes/sub_int/d/T_sub_int_6.d
deleted file mode 100644
index b45a470..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_int/d/T_sub_int_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_int_2addr/Test_sub_int_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/sub_int_2addr/Test_sub_int_2addr.java
deleted file mode 100644
index cabd0f6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_int_2addr/Test_sub_int_2addr.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_1.d
deleted file mode 100644
index 203da0d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_1.java
deleted file mode 100644
index 03dcff2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_2.d
deleted file mode 100644
index e3e5cab..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_3.d
deleted file mode 100644
index cad0b89..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_4.d
deleted file mode 100644
index efce9cc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_5.d
deleted file mode 100644
index 77b2c6f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_5.java b/tools/vm-tests/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_5.java
deleted file mode 100644
index 14c9b65..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_6.d b/tools/vm-tests/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_6.d
deleted file mode 100644
index 1705eb7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_int_2addr/d/T_sub_int_2addr_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_long/Test_sub_long.java b/tools/vm-tests/src/dot/junit/opcodes/sub_long/Test_sub_long.java
deleted file mode 100644
index 913ed6d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_long/Test_sub_long.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sub_long/d/T_sub_long_1.d b/tools/vm-tests/src/dot/junit/opcodes/sub_long/d/T_sub_long_1.d
deleted file mode 100644
index 4367232..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_long/d/T_sub_long_1.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_long/d/T_sub_long_1.java b/tools/vm-tests/src/dot/junit/opcodes/sub_long/d/T_sub_long_1.java
deleted file mode 100644
index 24a0f90..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_long/d/T_sub_long_1.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sub_long/d/T_sub_long_2.d b/tools/vm-tests/src/dot/junit/opcodes/sub_long/d/T_sub_long_2.d
deleted file mode 100644
index 6e191ac..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_long/d/T_sub_long_2.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_long/d/T_sub_long_2.java b/tools/vm-tests/src/dot/junit/opcodes/sub_long/d/T_sub_long_2.java
deleted file mode 100644
index 733b4dc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_long/d/T_sub_long_2.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sub_long/d/T_sub_long_3.d b/tools/vm-tests/src/dot/junit/opcodes/sub_long/d/T_sub_long_3.d
deleted file mode 100644
index 5fe421f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_long/d/T_sub_long_3.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_long/d/T_sub_long_4.d b/tools/vm-tests/src/dot/junit/opcodes/sub_long/d/T_sub_long_4.d
deleted file mode 100644
index 7ab2d2d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_long/d/T_sub_long_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_long/d/T_sub_long_5.d b/tools/vm-tests/src/dot/junit/opcodes/sub_long/d/T_sub_long_5.d
deleted file mode 100644
index c498408..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_long/d/T_sub_long_5.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_long/d/T_sub_long_6.d b/tools/vm-tests/src/dot/junit/opcodes/sub_long/d/T_sub_long_6.d
deleted file mode 100644
index f9f2065..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_long/d/T_sub_long_6.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_long_2addr/Test_sub_long_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/sub_long_2addr/Test_sub_long_2addr.java
deleted file mode 100644
index 27a3d09..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_long_2addr/Test_sub_long_2addr.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_1.d
deleted file mode 100644
index f416a03..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_1.java
deleted file mode 100644
index 8d66c2b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_1.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_2.d
deleted file mode 100644
index eb91aff..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_2.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_2.java b/tools/vm-tests/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_2.java
deleted file mode 100644
index 33f4b88..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_2.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_3.d
deleted file mode 100644
index bea4aea..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_4.d
deleted file mode 100644
index 57d6c24..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_5.d
deleted file mode 100644
index da99ce1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_6.d b/tools/vm-tests/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_6.d
deleted file mode 100644
index fb874e6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/sub_long_2addr/d/T_sub_long_2addr_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_int/Test_ushr_int.java b/tools/vm-tests/src/dot/junit/opcodes/ushr_int/Test_ushr_int.java
deleted file mode 100644
index 2701607..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int/Test_ushr_int.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_1.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_1.d
deleted file mode 100644
index dd22d10..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_1.java b/tools/vm-tests/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_1.java
deleted file mode 100644
index b633fc2..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_2.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_2.d
deleted file mode 100644
index 75880f7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_3.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_3.d
deleted file mode 100644
index 802f349..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_4.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_4.d
deleted file mode 100644
index 289c777..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_5.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_5.d
deleted file mode 100644
index 2fdf2b6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_5.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_5.java b/tools/vm-tests/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_5.java
deleted file mode 100644
index 4b5c31f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_6.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_6.d
deleted file mode 100644
index b216968..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int/d/T_ushr_int_6.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_int_2addr/Test_ushr_int_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_2addr/Test_ushr_int_2addr.java
deleted file mode 100644
index e1c4217..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_2addr/Test_ushr_int_2addr.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_1.d
deleted file mode 100644
index 5ee3392..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_1.java
deleted file mode 100644
index dd53d3d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_2.d
deleted file mode 100644
index d7be0ea..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_3.d
deleted file mode 100644
index a7e8263..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_3.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_4.d
deleted file mode 100644
index 330ce0a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_4.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_5.d
deleted file mode 100644
index d5906eb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_5.java b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_5.java
deleted file mode 100644
index 3e1776c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_6.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_6.d
deleted file mode 100644
index 0e3753c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_2addr/d/T_ushr_int_2addr_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_int_lit8/Test_ushr_int_lit8.java b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/Test_ushr_int_lit8.java
deleted file mode 100644
index 99b3ac9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/Test_ushr_int_lit8.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_1.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_1.d
deleted file mode 100644
index 3d6d12d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_1.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_1.java b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_1.java
deleted file mode 100644
index 35f5305..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_10.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_10.d
deleted file mode 100644
index 66e89fa..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_10.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_11.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_11.d
deleted file mode 100644
index d0b5a53..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_11.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_12.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_12.d
deleted file mode 100644
index 9925d72..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_12.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_13.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_13.d
deleted file mode 100644
index 431983f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_13.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_13.java b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_13.java
deleted file mode 100644
index 42f09dc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_13.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_14.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_14.d
deleted file mode 100644
index 7bf0d26..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_14.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_2.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_2.d
deleted file mode 100644
index 2727421..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_2.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_2.java b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_2.java
deleted file mode 100644
index 8ef472e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_3.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_3.d
deleted file mode 100644
index d51d0ad..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_3.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_3.java b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_3.java
deleted file mode 100644
index 0917deb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_4.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_4.d
deleted file mode 100644
index c69a8cd..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_4.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_4.java b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_4.java
deleted file mode 100644
index e0224f5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_5.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_5.d
deleted file mode 100644
index 9e75732..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_5.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_5.java b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_5.java
deleted file mode 100644
index b1d83aa..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_6.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_6.d
deleted file mode 100644
index 8387c15..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_6.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_6.java b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_6.java
deleted file mode 100644
index 548014a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_6.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_7.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_7.d
deleted file mode 100644
index 1a49829..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_7.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_7.java b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_7.java
deleted file mode 100644
index 1e0b00f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_8.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_8.d
deleted file mode 100644
index 415d6d6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_8.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_8.java b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_8.java
deleted file mode 100644
index 6e6a65e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_8.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_9.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_9.d
deleted file mode 100644
index 34be720..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_9.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_9.java b/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_9.java
deleted file mode 100644
index a69257a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_int_lit8/d/T_ushr_int_lit8_9.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/ushr_long/Test_ushr_long.java b/tools/vm-tests/src/dot/junit/opcodes/ushr_long/Test_ushr_long.java
deleted file mode 100644
index 338d067..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_long/Test_ushr_long.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_1.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_1.d
deleted file mode 100644
index 5479c4e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_1.java b/tools/vm-tests/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_1.java
deleted file mode 100644
index 1b2517e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_2.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_2.d
deleted file mode 100644
index e8a6322..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_2.java b/tools/vm-tests/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_2.java
deleted file mode 100644
index e278f8a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_3.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_3.d
deleted file mode 100644
index 1a7a9eb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_4.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_4.d
deleted file mode 100644
index 03ae1aa..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_5.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_5.d
deleted file mode 100644
index 05560ac..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_6.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_6.d
deleted file mode 100644
index 6e7d40a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_7.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_7.d
deleted file mode 100644
index d2f672b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_long/d/T_ushr_long_7.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_long_2addr/Test_ushr_long_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/ushr_long_2addr/Test_ushr_long_2addr.java
deleted file mode 100644
index 72747f4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_long_2addr/Test_ushr_long_2addr.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_1.d
deleted file mode 100644
index 4b154c5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_1.java
deleted file mode 100644
index 142cda3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_2.d
deleted file mode 100644
index 22a3e6d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_2.java b/tools/vm-tests/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_2.java
deleted file mode 100644
index af70b1c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_3.d
deleted file mode 100644
index c76441e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_4.d
deleted file mode 100644
index 4f03522..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_5.d
deleted file mode 100644
index 12e930c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_6.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_6.d
deleted file mode 100644
index 0d1898a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_7.d b/tools/vm-tests/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_7.d
deleted file mode 100644
index b645617..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/ushr_long_2addr/d/T_ushr_long_2addr_7.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_int/Test_xor_int.java b/tools/vm-tests/src/dot/junit/opcodes/xor_int/Test_xor_int.java
deleted file mode 100644
index 8d976ca..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int/Test_xor_int.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/xor_int/d/T_xor_int_1.d b/tools/vm-tests/src/dot/junit/opcodes/xor_int/d/T_xor_int_1.d
deleted file mode 100644
index 2c2fbfb..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int/d/T_xor_int_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_int/d/T_xor_int_1.java b/tools/vm-tests/src/dot/junit/opcodes/xor_int/d/T_xor_int_1.java
deleted file mode 100644
index 75f5df4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int/d/T_xor_int_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/xor_int/d/T_xor_int_2.d b/tools/vm-tests/src/dot/junit/opcodes/xor_int/d/T_xor_int_2.d
deleted file mode 100644
index 339a3e9..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int/d/T_xor_int_2.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_int/d/T_xor_int_3.d b/tools/vm-tests/src/dot/junit/opcodes/xor_int/d/T_xor_int_3.d
deleted file mode 100644
index b733277..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int/d/T_xor_int_3.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_int/d/T_xor_int_5.d b/tools/vm-tests/src/dot/junit/opcodes/xor_int/d/T_xor_int_5.d
deleted file mode 100644
index 879afe5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int/d/T_xor_int_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_int/d/T_xor_int_5.java b/tools/vm-tests/src/dot/junit/opcodes/xor_int/d/T_xor_int_5.java
deleted file mode 100644
index 5c50e59..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int/d/T_xor_int_5.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/xor_int/d/T_xor_int_6.d b/tools/vm-tests/src/dot/junit/opcodes/xor_int/d/T_xor_int_6.d
deleted file mode 100644
index 0768d87..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int/d/T_xor_int_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_int_2addr/Test_xor_int_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/xor_int_2addr/Test_xor_int_2addr.java
deleted file mode 100644
index 630bf5d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_2addr/Test_xor_int_2addr.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_1.d
deleted file mode 100644
index 561db60..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_1.java
deleted file mode 100644
index 2d4a699..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_2.d
deleted file mode 100644
index 7d19a9b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_3.d
deleted file mode 100644
index f51a717..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_3.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_4.d
deleted file mode 100644
index cc64eb3..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_4.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_4.java b/tools/vm-tests/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_4.java
deleted file mode 100644
index f779ebc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_5.d
deleted file mode 100644
index 5430394..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_2addr/d/T_xor_int_2addr_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_int_lit16/Test_xor_int_lit16.java b/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit16/Test_xor_int_lit16.java
deleted file mode 100644
index e31a49c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit16/Test_xor_int_lit16.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_1.d b/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_1.d
deleted file mode 100644
index ba07a33..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_1.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_1.java b/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_1.java
deleted file mode 100644
index bff43df..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_2.d b/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_2.d
deleted file mode 100644
index 6b5a110..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_2.java b/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_2.java
deleted file mode 100644
index 938a23d..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_3.d b/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_3.d
deleted file mode 100644
index 56f0458..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_3.java b/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_3.java
deleted file mode 100644
index 2bc9c62..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_4.d b/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_4.d
deleted file mode 100644
index ec92408..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_4.java b/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_4.java
deleted file mode 100644
index 6626871..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_5.d b/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_5.d
deleted file mode 100644
index a0906e6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_5.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_6.d b/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_6.d
deleted file mode 100644
index 5aa6343..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_7.d b/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_7.d
deleted file mode 100644
index ea16bae..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_7.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_7.java b/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_7.java
deleted file mode 100644
index d7b747e..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_8.d b/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_8.d
deleted file mode 100644
index 5d8cb85..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit16/d/T_xor_int_lit16_8.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_int_lit8/Test_xor_int_lit8.java b/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit8/Test_xor_int_lit8.java
deleted file mode 100644
index e06d5e1..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit8/Test_xor_int_lit8.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_1.d b/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_1.d
deleted file mode 100644
index cb4d830..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_1.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_1.java b/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_1.java
deleted file mode 100644
index ff2c78b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_2.d b/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_2.d
deleted file mode 100644
index 8d23bf6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_2.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_2.java b/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_2.java
deleted file mode 100644
index d62fd56..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_3.d b/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_3.d
deleted file mode 100644
index 5953574..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_3.java b/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_3.java
deleted file mode 100644
index 31fa48c..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_3.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_4.d b/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_4.d
deleted file mode 100644
index c2270c4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_4.java b/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_4.java
deleted file mode 100644
index 6b2d4f7..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_4.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_5.d b/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_5.d
deleted file mode 100644
index 3a3da2b..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_5.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_6.d b/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_6.d
deleted file mode 100644
index b3ab7e4..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_7.d b/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_7.d
deleted file mode 100644
index 74bf7e5..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_7.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_7.java b/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_7.java
deleted file mode 100644
index ecd3130..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_7.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_8.d b/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_8.d
deleted file mode 100644
index 0857ea6..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_int_lit8/d/T_xor_int_lit8_8.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_long/Test_xor_long.java b/tools/vm-tests/src/dot/junit/opcodes/xor_long/Test_xor_long.java
deleted file mode 100644
index dac7041..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_long/Test_xor_long.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/xor_long/d/T_xor_long_1.d b/tools/vm-tests/src/dot/junit/opcodes/xor_long/d/T_xor_long_1.d
deleted file mode 100644
index fb345ea..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_long/d/T_xor_long_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_long/d/T_xor_long_1.java b/tools/vm-tests/src/dot/junit/opcodes/xor_long/d/T_xor_long_1.java
deleted file mode 100644
index 9389b63..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_long/d/T_xor_long_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/xor_long/d/T_xor_long_2.d b/tools/vm-tests/src/dot/junit/opcodes/xor_long/d/T_xor_long_2.d
deleted file mode 100644
index 52f7815..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_long/d/T_xor_long_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_long/d/T_xor_long_2.java b/tools/vm-tests/src/dot/junit/opcodes/xor_long/d/T_xor_long_2.java
deleted file mode 100644
index 64a5a9a..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_long/d/T_xor_long_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/xor_long/d/T_xor_long_3.d b/tools/vm-tests/src/dot/junit/opcodes/xor_long/d/T_xor_long_3.d
deleted file mode 100644
index 2042970..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_long/d/T_xor_long_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_long/d/T_xor_long_4.d b/tools/vm-tests/src/dot/junit/opcodes/xor_long/d/T_xor_long_4.d
deleted file mode 100644
index 28e9fff..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_long/d/T_xor_long_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_long/d/T_xor_long_5.d b/tools/vm-tests/src/dot/junit/opcodes/xor_long/d/T_xor_long_5.d
deleted file mode 100644
index a48545f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_long/d/T_xor_long_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_long/d/T_xor_long_6.d b/tools/vm-tests/src/dot/junit/opcodes/xor_long/d/T_xor_long_6.d
deleted file mode 100644
index 0e2c18f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_long/d/T_xor_long_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_long_2addr/Test_xor_long_2addr.java b/tools/vm-tests/src/dot/junit/opcodes/xor_long_2addr/Test_xor_long_2addr.java
deleted file mode 100644
index 8e4a4bc..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_long_2addr/Test_xor_long_2addr.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_1.d b/tools/vm-tests/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_1.d
deleted file mode 100644
index 7d84e33..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_1.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_1.java b/tools/vm-tests/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_1.java
deleted file mode 100644
index f146b32..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_1.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_2.d b/tools/vm-tests/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_2.d
deleted file mode 100644
index 977ce09..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_2.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_2.java b/tools/vm-tests/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_2.java
deleted file mode 100644
index dfa4c0f..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF 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/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_3.d b/tools/vm-tests/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_3.d
deleted file mode 100644
index d578efe..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_3.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_4.d b/tools/vm-tests/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_4.d
deleted file mode 100644
index 98c0cd8..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_4.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_5.d b/tools/vm-tests/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_5.d
deleted file mode 100644
index a69d6ca..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_6.d b/tools/vm-tests/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_6.d
deleted file mode 100644
index 2533783..0000000
--- a/tools/vm-tests/src/dot/junit/opcodes/xor_long_2addr/d/T_xor_long_2addr_6.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/verify/AllTests.java b/tools/vm-tests/src/dot/junit/verify/AllTests.java
deleted file mode 100644
index b4314f8..0000000
--- a/tools/vm-tests/src/dot/junit/verify/AllTests.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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/src/dot/junit/verify/a1/Test_a1.java b/tools/vm-tests/src/dot/junit/verify/a1/Test_a1.java
deleted file mode 100644
index bf8f35e..0000000
--- a/tools/vm-tests/src/dot/junit/verify/a1/Test_a1.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2008  The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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/src/dot/junit/verify/a1/d/T_a1_1.d b/tools/vm-tests/src/dot/junit/verify/a1/d/T_a1_1.d
deleted file mode 100644
index fae89bb..0000000
--- a/tools/vm-tests/src/dot/junit/verify/a1/d/T_a1_1.d
+++ /dev/null
@@ -1,29 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/verify/a1/d/T_a1_1.dfh b/tools/vm-tests/src/dot/junit/verify/a1/d/T_a1_1.dfh
deleted file mode 100644
index 2c11f5f..0000000
--- a/tools/vm-tests/src/dot/junit/verify/a1/d/T_a1_1.dfh
+++ /dev/null
@@ -1,237 +0,0 @@
-// 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/src/dot/junit/verify/a1/d/T_a1_2.java b/tools/vm-tests/src/dot/junit/verify/a1/d/T_a1_2.java
deleted file mode 100644
index c7e6694..0000000
--- a/tools/vm-tests/src/dot/junit/verify/a1/d/T_a1_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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/src/dot/junit/verify/a3/Test_a3.java b/tools/vm-tests/src/dot/junit/verify/a3/Test_a3.java
deleted file mode 100644
index 94d5cb3..0000000
--- a/tools/vm-tests/src/dot/junit/verify/a3/Test_a3.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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/src/dot/junit/verify/a3/d/T_a3_1.d b/tools/vm-tests/src/dot/junit/verify/a3/d/T_a3_1.d
deleted file mode 100644
index 0f8d599..0000000
--- a/tools/vm-tests/src/dot/junit/verify/a3/d/T_a3_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/verify/a3/d/T_a3_1.dfh b/tools/vm-tests/src/dot/junit/verify/a3/d/T_a3_1.dfh
deleted file mode 100644
index 0ca04de..0000000
--- a/tools/vm-tests/src/dot/junit/verify/a3/d/T_a3_1.dfh
+++ /dev/null
@@ -1,241 +0,0 @@
-// 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/src/dot/junit/verify/a3/d/T_a3_2.java b/tools/vm-tests/src/dot/junit/verify/a3/d/T_a3_2.java
deleted file mode 100644
index 9e5fbad..0000000
--- a/tools/vm-tests/src/dot/junit/verify/a3/d/T_a3_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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/src/dot/junit/verify/a5/Test_a5.java b/tools/vm-tests/src/dot/junit/verify/a5/Test_a5.java
deleted file mode 100644
index e821028..0000000
--- a/tools/vm-tests/src/dot/junit/verify/a5/Test_a5.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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/src/dot/junit/verify/a5/d/T_a5_1.d b/tools/vm-tests/src/dot/junit/verify/a5/d/T_a5_1.d
deleted file mode 100644
index 898e900..0000000
--- a/tools/vm-tests/src/dot/junit/verify/a5/d/T_a5_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/verify/a5/d/T_a5_1.dfh b/tools/vm-tests/src/dot/junit/verify/a5/d/T_a5_1.dfh
deleted file mode 100644
index a35f00e..0000000
--- a/tools/vm-tests/src/dot/junit/verify/a5/d/T_a5_1.dfh
+++ /dev/null
@@ -1,241 +0,0 @@
-// 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/src/dot/junit/verify/a5/d/T_a5_2.java b/tools/vm-tests/src/dot/junit/verify/a5/d/T_a5_2.java
deleted file mode 100644
index 5f99d46..0000000
--- a/tools/vm-tests/src/dot/junit/verify/a5/d/T_a5_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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/src/dot/junit/verify/b17/Test_b17.java b/tools/vm-tests/src/dot/junit/verify/b17/Test_b17.java
deleted file mode 100644
index 4c14f08..0000000
--- a/tools/vm-tests/src/dot/junit/verify/b17/Test_b17.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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/src/dot/junit/verify/b17/d/T_b17_1.d b/tools/vm-tests/src/dot/junit/verify/b17/d/T_b17_1.d
deleted file mode 100644
index 11715c2..0000000
--- a/tools/vm-tests/src/dot/junit/verify/b17/d/T_b17_1.d
+++ /dev/null
@@ -1,30 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/verify/b17/d/T_b17_2.java b/tools/vm-tests/src/dot/junit/verify/b17/d/T_b17_2.java
deleted file mode 100644
index d1745e9..0000000
--- a/tools/vm-tests/src/dot/junit/verify/b17/d/T_b17_2.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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/src/dot/junit/verify/b2/Test_b2.java b/tools/vm-tests/src/dot/junit/verify/b2/Test_b2.java
deleted file mode 100644
index 55ea386..0000000
--- a/tools/vm-tests/src/dot/junit/verify/b2/Test_b2.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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/src/dot/junit/verify/b2/d/T_b2_1.d b/tools/vm-tests/src/dot/junit/verify/b2/d/T_b2_1.d
deleted file mode 100644
index 1fe908a..0000000
--- a/tools/vm-tests/src/dot/junit/verify/b2/d/T_b2_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/verify/b2/d/T_b2_1.java b/tools/vm-tests/src/dot/junit/verify/b2/d/T_b2_1.java
deleted file mode 100644
index 9ca108e..0000000
--- a/tools/vm-tests/src/dot/junit/verify/b2/d/T_b2_1.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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/src/dot/junit/verify/b2/d/T_b2_2.d b/tools/vm-tests/src/dot/junit/verify/b2/d/T_b2_2.d
deleted file mode 100644
index a885c41..0000000
--- a/tools/vm-tests/src/dot/junit/verify/b2/d/T_b2_2.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/verify/b2/d/T_b2_3.d b/tools/vm-tests/src/dot/junit/verify/b2/d/T_b2_3.d
deleted file mode 100644
index bf8d6e0..0000000
--- a/tools/vm-tests/src/dot/junit/verify/b2/d/T_b2_3.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/verify/b2/d/T_b2_4.d b/tools/vm-tests/src/dot/junit/verify/b2/d/T_b2_4.d
deleted file mode 100644
index bb158ce..0000000
--- a/tools/vm-tests/src/dot/junit/verify/b2/d/T_b2_4.d
+++ /dev/null
@@ -1,33 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/verify/b2/d/T_b2_5.d b/tools/vm-tests/src/dot/junit/verify/b2/d/T_b2_5.d
deleted file mode 100644
index 483066d..0000000
--- a/tools/vm-tests/src/dot/junit/verify/b2/d/T_b2_5.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/verify/b3/Test_b3.java b/tools/vm-tests/src/dot/junit/verify/b3/Test_b3.java
deleted file mode 100644
index 1aefb11..0000000
--- a/tools/vm-tests/src/dot/junit/verify/b3/Test_b3.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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/src/dot/junit/verify/b3/d/T_b3_0.java b/tools/vm-tests/src/dot/junit/verify/b3/d/T_b3_0.java
deleted file mode 100644
index 0f0a5ce..0000000
--- a/tools/vm-tests/src/dot/junit/verify/b3/d/T_b3_0.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS 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/src/dot/junit/verify/b3/d/T_b3_1.d b/tools/vm-tests/src/dot/junit/verify/b3/d/T_b3_1.d
deleted file mode 100644
index ffcd819..0000000
--- a/tools/vm-tests/src/dot/junit/verify/b3/d/T_b3_1.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/dot/junit/verify/b3/d/T_b3_2.d b/tools/vm-tests/src/dot/junit/verify/b3/d/T_b3_2.d
deleted file mode 100644
index 96feb07..0000000
--- a/tools/vm-tests/src/dot/junit/verify/b3/d/T_b3_2.d
+++ /dev/null
@@ -1,32 +0,0 @@
-; Copyright (C) 2008 The Android Open Source Project
-;
-; Licensed under the Apache License, Version 2.0 (the "License");
-; you may not use this file except in compliance with the License.
-; You may obtain a copy of the License at
-;
-;      http://www.apache.org/licenses/LICENSE-2.0
-;
-; Unless required by applicable law or agreed to in writing, software
-; distributed under the License is distributed on an "AS IS" BASIS,
-; WITHOUT WARRANTIES OR 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/src/util/build/BuildDalvikSuite.java b/tools/vm-tests/src/util/build/BuildDalvikSuite.java
deleted file mode 100644
index f08b651..0000000
--- a/tools/vm-tests/src/util/build/BuildDalvikSuite.java
+++ /dev/null
@@ -1,855 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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>/data/scriptdata will be generated<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";
-
-    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
-        // etc.
-        // class in the respective package.
-        // for the report make sure all N... tests are called first, then B,
-        // then
-        // E, then VFE test methods.
-        // so we need x Main_xxxx methods in a package, and x entries in the
-        // global scriptdata file (read by a bash script for the tests)
-        // e.g. dxc.junit.opcodes.aaload.Test_aaload - testN1() ->
-        // File Main_testN1.java in package dxc.junit.opcodes.aaload
-        // and entry dxc.junit.opcodes.aaload.Main_testN1 in class execution
-        // table.
-        //
-        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 static final String ctsAllTestsB =
-        "package dot.junit;\n" +
-        "import junit.framework.Test;\n" +
-        "import junit.framework.TestSuite;\n" +
-        "import com.android.hosttest.DeviceTestSuite;\n" +
-        "\n" +
-        "public class AllJunitHostTests extends DeviceTestSuite {\n" +
-        "    public static final Test suite() {\n" +
-        "        TestSuite suite = new TestSuite(\"CTS Host tests for all " +
-        " dalvik vm opcodes\");\n";
-
-    private static final String ctsAllTestsE =
-        "    }"+
-        "}";
-
-    private static final String curFileDataE = "}\n";
-
-
-    private String curAllTestsData = ctsAllTestsB;
-    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 ctsFinish() {
-    	flushHostJunitFile();
-    	curAllTestsData+="return suite;\n}\n}\n";
-    	// suite is in package dot.junit.
-    	String allTestsFileName = HOSTJUNIT_SRC_OUTPUT_FOLDER
-    	        + "/dot/junit/AllJunitHostTests.java";
-    	File toWrite = new File(allTestsFileName);
-    	writeToFileMkdir(toWrite, curAllTestsData);
-    	javacHostJunitBuildStep.addSourceFile(toWrite.getAbsolutePath());
-    	javacHostJunitBuildStep.addSourceFile(new File(
-    	        HOSTJUNIT_SRC_OUTPUT_FOLDER + "/dot/junit/DeviceUtil.java").
-    	        getAbsolutePath());
-    }
-
-    private void openCTSHostFileFor(String pName, String classOnlyName) {
-        String sourceName = "JUnit_"+classOnlyName;
-        // Add to AllTests.java
-        String suiteline = "suite.addTestSuite("+pName+"." + sourceName +
-                ".class);\n";
-        curAllTestsData += suiteline;
-        // flush previous JunitFile
-        flushHostJunitFile();
-
-        // prepare current testcase-file
-        curJunitFileName = HOSTJUNIT_SRC_OUTPUT_FOLDER+"/"
-                + pName.replaceAll("\\.","/")+"/"+sourceName+".java";
-        curJunitFileData =
-            "package "+pName+";\n"+
-            "import java.io.IOException;\n"+
-            "import junit.framework.TestCase;\n"+
-            "import com.android.hosttest.DeviceTestCase;\n"+
-            "import dot.junit.DeviceUtil;\n" +
-            "\n" +
-            "public class "+sourceName+" extends DeviceTestCase {\n";
-    }
-
-    private String getADBPushJavaLine(String source, String target) {
-        return "DeviceUtil.adbPush(getDevice(), \"" + source + "\", \"" + target + "\");";
-    }
-
-    private String getADBExecJavaLine(String classpath, String mainclass) {
-        return "DeviceUtil.adbExec(getDevice(), \"" + classpath + "\", \"" +
-                mainclass + "\");";
-    }
-
-    private void addCTSHostMethod(String pName, String method, MethodData md,
-            Set<String> dependentTestClassNames) {
-    	final String targetCoreJarPath = String.format("%s/dexcore.jar", TARGET_JAR_ROOT_PATH);
-    	curJunitFileData+="public void "+method+ "() throws Exception {\n";
-        curJunitFileData+= "    "+getADBPushJavaLine("dot/junit/dexcore.jar",
-        		targetCoreJarPath);
-
-        // push class with Main jar.
-        String mjar = "Main_"+method+".jar";
-        String mainJar = String.format("%s/%s", TARGET_JAR_ROOT_PATH, mjar);
-        String pPath = pName.replaceAll("\\.","/");
-        //System.out.println("adb push "+pPath+"/"+mjar +" "+mainJar);
-        curJunitFileData+= "    "+getADBPushJavaLine(pPath+"/"+mjar, mainJar);
-
-        // for each dependency:
-        // adb push dot/junit/opcodes/add_double_2addr/Main_testN2.jar
-        // /data/local/tmp/Main_testN2.jar
-        String cp = String.format("%s:%s", targetCoreJarPath, mainJar);
-        for (String depFqcn : dependentTestClassNames) {
-            int lastDotPos = depFqcn.lastIndexOf('.');
-            String targetName= String.format("%s/%s.jar", TARGET_JAR_ROOT_PATH,
-                    depFqcn.substring(lastDotPos +1));
-            String sourceName = depFqcn.replaceAll("\\.", "/")+".jar";
-            //System.out.println("adb push "+sourceName+" "+targetName);
-            curJunitFileData+= "    "+getADBPushJavaLine(sourceName, targetName);
-            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+= "    "+getADBExecJavaLine(cp, mainclass);
-        curJunitFileData+= "}\n\n";
-    }
-
-    private void handleTests() throws IOException {
-        System.out.println("collected "+testMethodsCnt+" test methods in " +
-                testClassCnt+" junit test classes");
-        String datafileContent = "";
-        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 = "//autogenerated by "
-                        + this.getClass().getName()
-                        + ", do not change\n"
-                        + "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);
-                // }
-
-
-                // prepare the entry in the data file for the bash script.
-                // e.g.
-                // main class to execute; opcode/constraint; test purpose
-                // dxc.junit.opcodes.aaload.Main_testN1;aaload;normal case test
-                // (#1)
-
-                char ca = method.charAt("test".length()); // either N,B,E,
-                // or V (VFE)
-                String comment;
-                switch (ca) {
-                case 'N':
-                    comment = "Normal #" + method.substring(5);
-                    break;
-                case 'B':
-                    comment = "Boundary #" + method.substring(5);
-                    break;
-                case 'E':
-                    comment = "Exception #" + method.substring(5);
-                    break;
-                case 'V':
-                    comment = "Verifier #" + method.substring(7);
-                    break;
-                default:
-                    throw new RuntimeException("unknown test abbreviation:"
-                            + method + " for " + fqcn);
-                }
-
-                String line = pName + ".Main_" + method + ";";
-                for (String className : dependentTestClassNames) {
-                    line += className + " ";
-                }
-
-
-                // test description
-                String[] pparts = pName.split("\\.");
-                // detail e.g. add_double
-                String detail = pparts[pparts.length-1];
-                // type := opcode | verify
-                String type = pparts[pparts.length-2];
-
-                String description;
-                if ("format".equals(type)) {
-                    description = "format";
-                } else if ("opcodes".equals(type)) {
-                    // Beautify name, so it matches the actual mnemonic
-                    detail = detail.replaceAll("_", "-");
-                    detail = detail.replace("-from16", "/from16");
-                    detail = detail.replace("-high16", "/high16");
-                    detail = detail.replace("-lit8", "/lit8");
-                    detail = detail.replace("-lit16", "/lit16");
-                    detail = detail.replace("-4", "/4");
-                    detail = detail.replace("-16", "/16");
-                    detail = detail.replace("-32", "/32");
-                    detail = detail.replace("-jumbo", "/jumbo");
-                    detail = detail.replace("-range", "/range");
-                    detail = detail.replace("-2addr", "/2addr");
-
-                    // Unescape reserved words
-                    detail = detail.replace("opc-", "");
-
-                    description = detail;
-                } else if ("verify".equals(type)) {
-                    description = "verifier";
-                } else {
-                    description = type + " " + detail;
-                }
-
-                String details = (md.title != null ? md.title : "");
-                if (md.constraint != null) {
-                    details = " Constraint " + md.constraint + ", " + details;
-                }
-                if (details.length() != 0) {
-                    details = details.substring(0, 1).toUpperCase()
-                            + details.substring(1);
-                }
-
-                line += ";" + description + ";" + comment + ";" + details;
-
-                datafileContent += line + "\n";
-                generateBuildStepFor(pName, method, dependentTestClassNames,
-                        targets);
-            }
-
-
-        }
-
-        // write latest HOSTJUNIT generated file and AllTests.java
-        ctsFinish();
-
-        File scriptDataDir = new File(OUTPUT_FOLDER + "/data/");
-        scriptDataDir.mkdirs();
-        writeToFile(new File(scriptDataDir, "scriptdata"), datafileContent);
-
-        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) {
-	    scanner2.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/src/util/build/BuildStep.java b/tools/vm-tests/src/util/build/BuildStep.java
deleted file mode 100644
index dbc6bca..0000000
--- a/tools/vm-tests/src/util/build/BuildStep.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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/src/util/build/DFHBuildStep.java b/tools/vm-tests/src/util/build/DFHBuildStep.java
deleted file mode 100644
index 47a81bf..0000000
--- a/tools/vm-tests/src/util/build/DFHBuildStep.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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/src/util/build/DasmBuildStep.java b/tools/vm-tests/src/util/build/DasmBuildStep.java
deleted file mode 100644
index b77a491..0000000
--- a/tools/vm-tests/src/util/build/DasmBuildStep.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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/src/util/build/DeviceUtil.java.template b/tools/vm-tests/src/util/build/DeviceUtil.java.template
deleted file mode 100644
index a8461cf..0000000
--- a/tools/vm-tests/src/util/build/DeviceUtil.java.template
+++ /dev/null
@@ -1,120 +0,0 @@
-
-package dot.junit;
-
-
-import com.android.ddmlib.IDevice;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.util.Scanner;
-
-public class DeviceUtil {
-
-    private static boolean DEBUG = System.getProperty("cts.vm-tests.debug") != null;
-
-    /**
-     * Executes the command and its arguments in a native process.
-     *
-     * @param commandAndArgs a string array to be passed containing the
-     *            executable and its arguments
-     * @param okIndicator if not null, this String must occur in the stdout of
-     *            the executable (since only checking for the return code is not
-     *            sufficient e.g. for adb shell cmd)
-     * @throws Exception thrown by the underlying command in case of an error.
-     */
-    public static void digestCommand(String[] commandAndArgs, String okIndicator) {
-        RuntimeException re = null;
-        try {
-            String c = "";
-            for (int i = 0; i < commandAndArgs.length; i++) {
-                c += commandAndArgs[i] + " ";
-            }
-            if (DEBUG) System.out.print("com: " + c);
-            StringBuilder sb = new StringBuilder();
-            ProcessBuilder pb = new ProcessBuilder(commandAndArgs).redirectErrorStream(true);
-            Process p = pb.start();
-
-            InputStream is = p.getInputStream();
-            Scanner scanner = new Scanner(is);
-            int retCode = p.waitFor();
-            while (scanner.hasNextLine()) {
-                sb.append(scanner.nextLine());
-            }
-            scanner.close();
-            if (retCode != 0 || (okIndicator != null && !sb.toString().contains(okIndicator))) {
-                String msg = sb.toString() + "\nreturn code: " + retCode;
-                re = new RuntimeException(msg);
-                if (DEBUG) System.out.println("-> error! msg:"+msg);
-            } else {
-                if (DEBUG) System.out.println(" -> " + retCode);
-            }
-        } catch (Exception e) {
-            throw new RuntimeException("Exception occurred: " + e.getClass().getName() + ", msg:"
-                    + e.getMessage());
-        } finally {
-            if (re != null) {
-                throw re;
-            }
-        }
-    }
-
-    public static String createFilePath(String testName) throws IOException {
-        // e.g. /dot/junit/opcodes/add_double/d/T_add_double_1.jar
-        FileOutputStream fos = null;
-        InputStream is = null;
-        File f;
-        try {
-            is = DeviceUtil.class.getResourceAsStream("/tests/" + testName);
-            if (is == null) {
-                throw new RuntimeException("could not find resource /tests" + testName
-                        + " in classpath");
-            }
-            f = File.createTempFile("cts-adbpush-", ".jar");
-            int len = 4096;
-            byte[] bytes = new byte[len];
-            fos = new FileOutputStream(f);
-            int b;
-            while ((b = is.read(bytes)) > 0) {
-                fos.write(bytes, 0, b);
-            }
-        } finally {
-            if (is != null) {
-                is.close();
-            }
-            if (fos != null) {
-                fos.close();
-            }
-        }
-        return f.getAbsolutePath();
-    }
-
-    public static void adbPush(IDevice device, String source, String target)
-            throws IOException {
-        String tmp_source = null;
-        try {
-            tmp_source = DeviceUtil.createFilePath(source);
-            DeviceUtil.digestCommand(new String[] {"adb", "-s", device.getSerialNumber(), "push",
-                tmp_source, target}, null);
-        } finally {
-            // Clean up local temp file after pushing it to device.
-            if (tmp_source != null) {
-                File f = new File(tmp_source);
-                if (f.exists()) {
-                    f.delete();
-                }
-            }
-        }
-    }
-
-    public static void adbExec(IDevice device, String classpath, String mainclass) {
-        DeviceUtil.digestCommand(new String[] {"adb", "-s", device.getSerialNumber(), "shell",
-               "mkdir", "/data/local/tmp/dalvik-cache"}, null);
-        DeviceUtil.digestCommand(new String[] {"adb", "-s", device.getSerialNumber(), "shell",
-               "ANDROID_DATA=/data/local/tmp", "dalvikvm", "-Xint:portable", "-Xmx512M", "-Xss32K",
-               "-Djava.io.tmpdir=/data/local/tmp", "-classpath", classpath, mainclass, "&&",
-               "echo", "mk_dalvikvmok" }, "mk_dalvikvmok");
-    }
- }
diff --git a/tools/vm-tests/src/util/build/DexBuildStep.java b/tools/vm-tests/src/util/build/DexBuildStep.java
deleted file mode 100644
index 6aba51c..0000000
--- a/tools/vm-tests/src/util/build/DexBuildStep.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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/src/util/build/JarBuildStep.java b/tools/vm-tests/src/util/build/JarBuildStep.java
deleted file mode 100644
index 776e905..0000000
--- a/tools/vm-tests/src/util/build/JarBuildStep.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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/src/util/build/JavacBuildStep.java b/tools/vm-tests/src/util/build/JavacBuildStep.java
deleted file mode 100644
index 7d7033f..0000000
--- a/tools/vm-tests/src/util/build/JavacBuildStep.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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/vm-tests.css b/tools/vm-tests/vm-tests.css
deleted file mode 100644
index a315a73..0000000
--- a/tools/vm-tests/vm-tests.css
+++ /dev/null
@@ -1,59 +0,0 @@
-h1 {
-    font-family: serif;
-    color: #222266;
-}
-
-h2 {
-    font-family: serif;
-    border-top-style: solid;
-    border-top-width: 2px;
-    border-color: #ccccdd;
-    padding-top: 12px;
-    margin-top: 48px;
-    margin-bottom: 2px;
-    color: #222266;
-}
-
-@media print {
-    table {
-        font-size: 8pt;
-    }
-}
-
-@media screen {
-    table {
-        font-size: 10pt;
-    }
-}
-
-
-/* general for all tables */
-
-table {
-    border-collapse: collapse;
-    margin-top: 24px;
-    margin-bottom: 24px;
-    margin-left: 48px;
-    margin-right: 48px;
-}
-
-table th {
-    font-family: sans-serif;
-    background: #aabbff;
-    text-align: left;
-}
-
-table td {
-    font-family: sans-serif;
-    border-top-style: solid;
-    border-bottom-style: solid;
-    border-width: 1px;
-    border-color: #aaaaff;
-    padding-top: 4px;
-    padding-bottom: 4px;
-    padding-left: 4px;
-    padding-right: 6px;
-    background: #eeeeff;
-    margin-top: 4pt;
-    margin-bottom: 0pt;
-}
diff --git a/tools/vm-tests/vm-tests.html b/tools/vm-tests/vm-tests.html
deleted file mode 100644
index 1b1e351..0000000
--- a/tools/vm-tests/vm-tests.html
+++ /dev/null
@@ -1,144 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-<html>
-  <head>
-    <title>Dalvik VM Test Suite</title>
-    <link rel=stylesheet href="vm-tests.css">
-  </head>
-
-  <body>
-    <h1>Dalvik VM Test Suite</h1>
-    <p>Version 1.0</p>
-    <p>Copyright &copy; 2008 The Android Open Source Project
-
-    <h2>Overview</h2>
-
-    <p>    
-      This directory contains a test suite for the Dalvik VM. It tests the
-      capabilities of the Dalvik VM in a black-box manner, based on the Dalvik
-      bytecode and <code>.dex</code> file format specifications. The suite does
-      both functional and verifier tests. Regarding the latter, the Dalvik VM is
-      supposed to perform bytecode verification equivalent to that done in other
-      virtual machines. Please see
-        
-      <pre>
-        docs/dalvik/dalvik-bytecode.html
-        docs/dalvik/dalvik-constraints.html
-        docs/dalvik/dex-format.html
-        docs/dalvik/verifier.html
-      </pre>
-        
-      for further details.
-    </p>
-
-    <h2>How to build</h2>
-    
-    <p>
-      The test suite is normally included in a full build of the Android
-      project. If it needs to be built individually, a simple
-        
-      <pre>
-        make vm-tests
-      </pre>
-        
-      or an
-        
-      <pre>
-        mm
-      </pre>
-        
-      in this directory will do.
-    </p>
-
-    <h2>How to run</h2>
-        
-    <p>
-      The suite can be invoked by executing
-    
-      <pre>
-        vm-tests
-      </pre>
-    
-      from any location, assuming the suite has been built. This will run
-      all tests. If you want to limit the suite to the test cases
-      corresponding to a single instruction, you can specifiy the mnemonic
-      as a parameter. For example
-
-      <pre>
-        vm-tests add-int/lit16
-      </pre>
-      
-      executes the tests for the <code>add-int/lit16</code> instruction.
-      Please see the Dalvik VM specification for all the mnemonics. Two
-      additional parameters are possible that don't represent instructions.
-      These run integrity tests for the DEX file format and general
-      verifier tests, respectively: 
-
-      <pre>
-        vm-tests format
-        vm-tests verifier
-      </pre>
-
-      The suite is normally run for the fast version of the interpreter. To run
-      it for the portable interpreter, pass <code>--portable</code> as the first
-      parameter. Passing <code>--help</code> results in a brief overview of the
-      options.
-    </p>
-    
-    <p>      
-      The suite is compatible with both emulator and simulator 
-      builds. For an emulator build, please make sure you have
-      either an emulator running or a device attached via USB before
-      invoking the test suite.
-    </p>
-    
-    <p>
-      The full suite might easily take 30 minutes or more for execution,
-      depending on the environment. It will generate an HTML
-      report with details on all test cases. While running, console output
-      is produced to give a quick impression of the progress and results.
-      For both types of output, each individual test result falls into one of
-      the following categories:
-    </p>
-            
-    <table>
-      <tr>
-        <th>Type in report</th><th>Type on console</th><th>Description</th>
-      </tr>
-      <tr>
-        <td>Success</td>
-        <td>.</td>
-        <td>
-          The test case passed successfully.
-        </td>
-      </tr>
-      <tr>
-        <td>Functional failure</td>
-        <td>F</td>
-        <td>
-          A functional (normal or boundary) or an exception test case
-          failed.
-        </td>
-        </tr>
-        <tr>
-          <td>Verifier failure</td>
-          <td>V</td>
-          <td>
-            A verifier test case failed. Either the verifier accepted
-            some invalid piece of code or it rejected a valid one.
-          </td>
-        </tr>
-        <tr>
-          <td>Console error</td>
-          <td>C</td>
-          <td>
-            The process running the VM returned error messages on the
-            standard output or error stream, but it is not clear what the
-            nature of the problem is. The test case is considered a failure,
-            though. This problem should only occur when running the suite on
-            a simulator build.
-          </td>
-        </tr>
-      </table> 
-  </body>
-</html>
